unpoly-rails 3.0.0.rc1 → 3.0.0.rc3

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.
@@ -5,7 +5,7 @@
5
5
  /***/ (() => {
6
6
 
7
7
  window.up = {
8
- version: '3.0.0-rc1'
8
+ version: '3.0.0-rc3'
9
9
  };
10
10
 
11
11
 
@@ -14,13 +14,18 @@ window.up = {
14
14
  /***/ (() => {
15
15
 
16
16
  up.mockable = function (originalFn) {
17
- let spy;
18
- const mockableFn = function () {
19
- return (spy || originalFn).apply(null, arguments);
20
- };
21
- mockableFn.mock = () => spy = jasmine.createSpy('mockable', originalFn);
22
- document.addEventListener('up:framework:reset', () => spy = null);
23
- return mockableFn;
17
+ if (window.jasmine) {
18
+ let name = originalFn.name;
19
+ let obj = { [name]: originalFn };
20
+ let mockableFn = function () {
21
+ return obj[name].apply(this, arguments);
22
+ };
23
+ mockableFn.mock = () => spyOn(obj, name);
24
+ return mockableFn;
25
+ }
26
+ else {
27
+ return originalFn;
28
+ }
24
29
  };
25
30
 
26
31
 
@@ -106,15 +111,15 @@ up.util = (function () {
106
111
  return block;
107
112
  }
108
113
  }
109
- function map(array, block) {
110
- if (array.length === 0) {
114
+ function map(list, block) {
115
+ if (list.length === 0) {
111
116
  return [];
112
117
  }
113
118
  block = iteratee(block);
114
119
  let mapped = [];
115
- for (let i = 0; i < array.length; i++) {
116
- let element = array[i];
117
- mapped.push(block(element, i));
120
+ let i = 0;
121
+ for (let item of list) {
122
+ mapped.push(block(item, i++));
118
123
  }
119
124
  return mapped;
120
125
  }
@@ -126,8 +131,9 @@ up.util = (function () {
126
131
  return map(array, pairer).reduce(merger, {});
127
132
  }
128
133
  function each(array, block) {
129
- for (let i = 0; i < array.length; i++) {
130
- block(array[i], i);
134
+ let i = 0;
135
+ for (let item of array) {
136
+ block(item, i++);
131
137
  }
132
138
  }
133
139
  function isNull(object) {
@@ -304,10 +310,11 @@ up.util = (function () {
304
310
  function some(list, tester) {
305
311
  return !!findResult(list, tester);
306
312
  }
307
- function findResult(array, tester) {
313
+ function findResult(list, tester) {
308
314
  tester = iteratee(tester);
309
- for (let i = 0; i < array.length; i++) {
310
- const result = tester(array[i], i);
315
+ let i = 0;
316
+ for (let item of list) {
317
+ const result = tester(item, i++);
311
318
  if (result) {
312
319
  return result;
313
320
  }
@@ -316,8 +323,9 @@ up.util = (function () {
316
323
  function every(list, tester) {
317
324
  tester = iteratee(tester);
318
325
  let match = true;
319
- for (let i = 0; i < list.length; i++) {
320
- if (!tester(list[i], i)) {
326
+ let i = 0;
327
+ for (let item of list) {
328
+ if (!tester(item, i++)) {
321
329
  match = false;
322
330
  break;
323
331
  }
@@ -489,7 +497,7 @@ up.util = (function () {
489
497
  function flatMap(array, block) {
490
498
  return flatten(map(array, block));
491
499
  }
492
- function always(promise, callback) {
500
+ function always(promise, callback = identity) {
493
501
  return promise.then(callback, callback);
494
502
  }
495
503
  function newDeferred() {
@@ -591,7 +599,7 @@ up.util = (function () {
591
599
  Object.defineProperty(object, prop, { get });
592
600
  }
593
601
  function defineDelegates(object, props, targetProvider) {
594
- wrapList(props).forEach(function (prop) {
602
+ for (let prop of props) {
595
603
  Object.defineProperty(object, prop, {
596
604
  get() {
597
605
  const target = targetProvider.call(this);
@@ -606,7 +614,7 @@ up.util = (function () {
606
614
  target[prop] = newValue;
607
615
  }
608
616
  });
609
- });
617
+ }
610
618
  }
611
619
  function stringifyArg(arg) {
612
620
  let string;
@@ -701,6 +709,14 @@ up.util = (function () {
701
709
  };
702
710
  }
703
711
  }
712
+ function safeStringifyJSON(value) {
713
+ let json = JSON.stringify(value);
714
+ return escapeHighASCII(json);
715
+ }
716
+ function escapeHighASCII(string) {
717
+ let unicodeEscape = (char) => "\\u" + char.charCodeAt(0).toString(16).padStart(4, '0');
718
+ return string.replace(/[^\x00-\x7F]/g, unicodeEscape);
719
+ }
704
720
  return {
705
721
  parseURL,
706
722
  normalizeURL,
@@ -796,7 +812,8 @@ up.util = (function () {
796
812
  sprintf,
797
813
  renameKeys,
798
814
  negate,
799
- memoizeMethod
815
+ memoizeMethod,
816
+ safeStringifyJSON,
800
817
  };
801
818
  })();
802
819
 
@@ -871,12 +888,6 @@ up.browser = (function () {
871
888
  return value;
872
889
  }
873
890
  }
874
- const getJQuery = function () {
875
- if (!canJQuery()) {
876
- up.fail('jQuery must be published as window.jQuery');
877
- }
878
- return jQuery;
879
- };
880
891
  function assertConfirmed(options) {
881
892
  const confirmed = !options.confirm || window.confirm(options.confirm);
882
893
  if (!confirmed) {
@@ -891,7 +902,6 @@ up.browser = (function () {
891
902
  canEval,
892
903
  assertConfirmed,
893
904
  popCookie,
894
- get jQuery() { return getJQuery(); },
895
905
  };
896
906
  })();
897
907
 
@@ -1164,9 +1174,17 @@ up.element = (function () {
1164
1174
  klass = klass.replace(/:/g, '\\:');
1165
1175
  return `.${klass}`;
1166
1176
  }
1167
- function createDocumentFromHTML(html) {
1177
+ function createBrokenDocumentFromHTML(html) {
1168
1178
  return new DOMParser().parseFromString(html, 'text/html');
1169
1179
  }
1180
+ function fixScriptish(scriptish) {
1181
+ let clone = document.createElement(scriptish.tagName);
1182
+ for (let { name, value } of scriptish.attributes) {
1183
+ clone.setAttribute(name, value);
1184
+ }
1185
+ clone.textContent = scriptish.innerHTML;
1186
+ scriptish.replaceWith(clone);
1187
+ }
1170
1188
  function createFromHTML(html) {
1171
1189
  const range = document.createRange();
1172
1190
  range.setStart(document.body, 0);
@@ -1429,7 +1447,8 @@ up.element = (function () {
1429
1447
  isSingleton,
1430
1448
  attrSelector,
1431
1449
  tagName: elementTagName,
1432
- createDocumentFromHTML,
1450
+ createBrokenDocumentFromHTML,
1451
+ fixScriptish,
1433
1452
  createFromHTML,
1434
1453
  get root() { return getRoot(); },
1435
1454
  paint,
@@ -1626,82 +1645,26 @@ up.LogConfig = class LogConfig extends up.Config {
1626
1645
  /***/ (() => {
1627
1646
 
1628
1647
  const u = up.util;
1629
- up.Cache = class Cache {
1630
- constructor(config = {}) {
1631
- this.config = config;
1648
+ up.FIFOCache = class FIFOCache {
1649
+ constructor({ capacity = 10, normalizeKey = u.identity } = {}) {
1632
1650
  this.map = new Map();
1651
+ this.capacity = capacity;
1652
+ this.normalizeKey = normalizeKey;
1633
1653
  }
1634
- size() {
1635
- return this.map.size;
1636
- }
1637
- maxSize() {
1638
- return u.evalOption(this.config.size);
1639
- }
1640
- evictAge() {
1641
- return u.evalOption(this.config.evictAge);
1642
- }
1643
- normalizeStoreKey(key) {
1644
- return key;
1645
- }
1646
- isDisabled() {
1647
- return this.maxSize() === 0 || this.evictAge() === 0;
1648
- }
1649
- evict() {
1650
- this.map.clear();
1651
- }
1652
- records() {
1653
- return this.map.values();
1654
- }
1655
- makeRoomForAnotherRecord() {
1656
- const maxSize = this.maxSize();
1657
- const currentSize = this.size();
1658
- if (!maxSize || currentSize < maxSize)
1659
- return;
1660
- let records = Array.from(this.records());
1661
- records.sort((a, b) => b.createdAt - a.createdAt);
1662
- const overflow = currentSize - maxSize + 1;
1663
- for (let i = 0; i < overflow; i++) {
1664
- let key = records.pop().key;
1665
- this.map.delete(key);
1666
- }
1667
- }
1668
- alias(oldKey, newKey) {
1669
- const value = this.get(oldKey);
1670
- if (u.isDefined(value)) {
1671
- this.set(newKey, value);
1672
- }
1654
+ get(key) {
1655
+ key = this.normalizeKey(key);
1656
+ return this.map.get(key);
1673
1657
  }
1674
1658
  set(key, value) {
1675
- if (this.isDisabled())
1676
- return;
1677
- this.makeRoomForAnotherRecord();
1678
- key = this.normalizeStoreKey(key);
1679
- const createdAt = new Date();
1680
- const record = { key, value, createdAt };
1681
- this.map.set(key, record);
1682
- }
1683
- remove(key) {
1684
- key = this.normalizeStoreKey(key);
1685
- this.map.delete(key);
1686
- }
1687
- isUsable(record) {
1688
- const evictAge = this.evictAge();
1689
- if (!evictAge)
1690
- return true;
1691
- const age = new Date() - record.createdAt;
1692
- return age < evictAge;
1693
- }
1694
- get(key) {
1695
- const storeKey = this.normalizeStoreKey(key);
1696
- let record = this.map.get(storeKey);
1697
- if (record) {
1698
- if (this.isUsable(record)) {
1699
- return record.value;
1700
- }
1701
- else {
1702
- this.remove(key);
1703
- }
1659
+ if (this.map.size === this.capacity) {
1660
+ let oldestKey = this.map.keys().next().value;
1661
+ this.map.delete(oldestKey);
1704
1662
  }
1663
+ key = this.normalizeKey(key);
1664
+ this.map.set(key, value);
1665
+ }
1666
+ clear() {
1667
+ this.map.clear();
1705
1668
  }
1706
1669
  };
1707
1670
 
@@ -1876,7 +1839,7 @@ up.Change.Addition = class Addition extends up.Change {
1876
1839
  setETag({ newElement, etag }) {
1877
1840
  e.setMissingAttr(newElement, 'up-etag', etag || false);
1878
1841
  }
1879
- setMeta(options) {
1842
+ setReloadAttrs(options) {
1880
1843
  this.setSource(options);
1881
1844
  this.setTime(options);
1882
1845
  this.setETag(options);
@@ -2119,9 +2082,9 @@ up.Change.OpenLayer = class OpenLayer extends up.Change.Addition {
2119
2082
  this.layer.createElements(this.content);
2120
2083
  this.layer.setupHandlers();
2121
2084
  this.handleHistory();
2122
- this.setMeta({ newElement: this.content, source: this.options.source });
2085
+ this.setReloadAttrs({ newElement: this.content, source: this.options.source });
2123
2086
  responseDoc.finalizeElement(this.content);
2124
- up.hello(this.layer.element, { layer: this.layer, origin: this.origin });
2087
+ up.hello(this.layer.element, Object.assign(Object.assign({}, this.options), { layer: this.layer }));
2125
2088
  this.handleLayerChangeRequests();
2126
2089
  this.handleScroll();
2127
2090
  let renderResult = new up.RenderResult({
@@ -2290,7 +2253,7 @@ up.Change.UpdateLayer = (_a = class UpdateLayer extends up.Change.Addition {
2290
2253
  this.renderResult.fragments.unshift(...newFragments);
2291
2254
  }
2292
2255
  executeStep(step) {
2293
- this.setMeta(step);
2256
+ this.setReloadAttrs(step);
2294
2257
  switch (step.placement) {
2295
2258
  case 'swap': {
2296
2259
  let keepPlan = this.findKeepPlan(step);
@@ -2781,18 +2744,11 @@ up.Change.FromURL = (_a = class FromURL extends up.Change {
2781
2744
  onRequestSettledWithResponse(response) {
2782
2745
  var _a;
2783
2746
  this.response = response;
2784
- const expiredResponse = this.options.expiredResponse;
2785
- const eventProps = {
2786
- response: this.response,
2787
- renderOptions: this.options,
2788
- revalidating: !!expiredResponse,
2789
- expiredResponse,
2790
- };
2791
- if (up.fragment.config.skipResponse(eventProps)) {
2747
+ if (up.fragment.config.skipResponse(this.loadedEventProps())) {
2792
2748
  this.skip();
2793
2749
  }
2794
2750
  else {
2795
- this.request.assertEmitted('up:fragment:loaded', Object.assign(Object.assign({}, eventProps), { callback: this.options.onLoaded, log: ['Loaded fragment from %s', this.response.description], skip: () => this.skip() }));
2751
+ this.request.assertEmitted('up:fragment:loaded', Object.assign(Object.assign({}, this.loadedEventProps()), { callback: this.options.onLoaded, log: ['Loaded fragment from %s', this.response.description], skip: () => this.skip() }));
2796
2752
  }
2797
2753
  let fail = (_a = u.evalOption(this.options.fail, this.response)) !== null && _a !== void 0 ? _a : !response.ok;
2798
2754
  if (fail) {
@@ -2800,6 +2756,22 @@ up.Change.FromURL = (_a = class FromURL extends up.Change {
2800
2756
  }
2801
2757
  return this.updateContentFromResponse(this.options);
2802
2758
  }
2759
+ compilerPassMeta() {
2760
+ return u.pick(this.loadedEventProps(), [
2761
+ 'revalidating',
2762
+ 'response'
2763
+ ]);
2764
+ }
2765
+ loadedEventProps() {
2766
+ const { expiredResponse } = this.options;
2767
+ return {
2768
+ request: this.request,
2769
+ response: this.response,
2770
+ renderOptions: this.options,
2771
+ revalidating: !!expiredResponse,
2772
+ expiredResponse,
2773
+ };
2774
+ }
2803
2775
  onRequestSettledWithError(error) {
2804
2776
  if (error instanceof up.Offline) {
2805
2777
  this.request.emit('up:fragment:offline', {
@@ -2822,6 +2794,7 @@ up.Change.FromURL = (_a = class FromURL extends up.Change {
2822
2794
  up.puts('up.render()', 'Rendering failed response using fail-prefixed options (https://unpoly.com/failed-responses)');
2823
2795
  }
2824
2796
  this.augmentOptionsFromResponse(finalRenderOptions);
2797
+ finalRenderOptions.meta = this.compilerPassMeta();
2825
2798
  let result = new up.Change.FromContent(finalRenderOptions).execute();
2826
2799
  result.finished = this.finish(result, finalRenderOptions);
2827
2800
  return result;
@@ -2890,6 +2863,7 @@ up.Change.FromURL = (_a = class FromURL extends up.Change {
2890
2863
  (() => {
2891
2864
  u.memoizeMethod(_a.prototype, [
2892
2865
  'getRequestAttrs',
2866
+ 'loadedEventProps',
2893
2867
  ]);
2894
2868
  })(),
2895
2869
  _a);
@@ -2901,12 +2875,14 @@ up.Change.FromURL = (_a = class FromURL extends up.Change {
2901
2875
 
2902
2876
  const u = up.util;
2903
2877
  up.CompilerPass = class CompilerPass {
2904
- constructor(root, compilers, { layer, data, dataMap } = {}) {
2878
+ constructor(root, compilers, { layer, data, dataMap, meta }) {
2879
+ layer || (layer = up.layer.get(root) || up.layer.current);
2905
2880
  this.root = root;
2906
2881
  this.compilers = compilers;
2907
- this.layer = layer || up.layer.get(this.root) || up.layer.current;
2882
+ this.layer = layer;
2908
2883
  this.data = data;
2909
2884
  this.dataMap = dataMap;
2885
+ this.meta = Object.assign({ layer }, meta);
2910
2886
  this.errors = [];
2911
2887
  }
2912
2888
  run() {
@@ -2952,11 +2928,10 @@ up.CompilerPass = class CompilerPass {
2952
2928
  return (_b = (_a = up.migrate).postCompile) === null || _b === void 0 ? void 0 : _b.call(_a, matches, compiler);
2953
2929
  }
2954
2930
  compileOneElement(compiler, element) {
2955
- const elementArg = compiler.jQuery ? up.browser.jQuery(element) : element;
2956
- const compileArgs = [elementArg];
2931
+ const compileArgs = [element];
2957
2932
  if (compiler.length !== 1) {
2958
2933
  const data = up.syntax.data(element);
2959
- compileArgs.push(data);
2934
+ compileArgs.push(data, this.meta);
2960
2935
  }
2961
2936
  const result = this.applyCompilerFunction(compiler, element, compileArgs);
2962
2937
  let destructorOrDestructors = this.destructorPresence(result);
@@ -2965,11 +2940,10 @@ up.CompilerPass = class CompilerPass {
2965
2940
  }
2966
2941
  }
2967
2942
  compileBatch(compiler, elements) {
2968
- const elementsArgs = compiler.jQuery ? up.browser.jQuery(elements) : elements;
2969
- const compileArgs = [elementsArgs];
2943
+ const compileArgs = [elements];
2970
2944
  if (compiler.length !== 1) {
2971
2945
  const dataList = u.map(elements, up.syntax.data);
2972
- compileArgs.push(dataList);
2946
+ compileArgs.push(dataList, this.meta);
2973
2947
  }
2974
2948
  const result = this.applyCompilerFunction(compiler, elements, compileArgs);
2975
2949
  if (this.destructorPresence(result)) {
@@ -3275,7 +3249,6 @@ up.EventListener = class EventListener extends up.Record {
3275
3249
  'eventType',
3276
3250
  'selector',
3277
3251
  'callback',
3278
- 'jQuery',
3279
3252
  'guard',
3280
3253
  'baseLayer',
3281
3254
  'passive',
@@ -3323,8 +3296,7 @@ up.EventListener = class EventListener extends up.Record {
3323
3296
  return;
3324
3297
  }
3325
3298
  if (element) {
3326
- const elementArg = this.jQuery ? up.browser.jQuery(element) : element;
3327
- const args = [event, elementArg];
3299
+ const args = [event, element];
3328
3300
  const expectedArgCount = this.callback.length;
3329
3301
  if (expectedArgCount !== 1 && expectedArgCount !== 2) {
3330
3302
  const data = up.syntax.data(element);
@@ -3380,7 +3352,6 @@ up.EventListenerGroup = class EventListenerGroup extends up.Record {
3380
3352
  'eventTypes',
3381
3353
  'selector',
3382
3354
  'callback',
3383
- 'jQuery',
3384
3355
  'guard',
3385
3356
  'baseLayer',
3386
3357
  'passive',
@@ -4155,44 +4126,6 @@ up.FragmentScrolling = class FragmentScrolling extends up.FragmentProcessor {
4155
4126
  /* 47 */
4156
4127
  /***/ (() => {
4157
4128
 
4158
- const u = up.util;
4159
- const e = up.element;
4160
- up.HTMLWrapper = class HTMLWrapper {
4161
- constructor(tagName) {
4162
- this.tagName = tagName;
4163
- const openTag = `<${this.tagName}[^>]*>`;
4164
- const closeTag = `</${this.tagName}>`;
4165
- const innerHTML = "(.|\\s)*?";
4166
- this.pattern = new RegExp(openTag + innerHTML + closeTag, 'ig');
4167
- this.attrName = `up-wrapped-${this.tagName}`;
4168
- }
4169
- strip(html) {
4170
- return html.replace(this.pattern, '');
4171
- }
4172
- wrap(html) {
4173
- return html.replace(this.pattern, this.wrapMatch.bind(this));
4174
- }
4175
- wrapMatch(match) {
4176
- this.didWrap = true;
4177
- return '<meta name="' + this.attrName + '" value="' + u.escapeHTML(match) + '">';
4178
- }
4179
- unwrap(element) {
4180
- if (!this.didWrap) {
4181
- return;
4182
- }
4183
- for (let wrappedChild of element.querySelectorAll(`meta[name='${this.attrName}']`)) {
4184
- const originalHTML = wrappedChild.getAttribute('value');
4185
- const restoredElement = e.createFromHTML(originalHTML);
4186
- wrappedChild.replaceWith(restoredElement);
4187
- }
4188
- }
4189
- };
4190
-
4191
-
4192
- /***/ }),
4193
- /* 48 */
4194
- /***/ (() => {
4195
-
4196
4129
  const e = up.element;
4197
4130
  const u = up.util;
4198
4131
  up.Layer = class Layer extends up.Record {
@@ -4339,12 +4272,12 @@ up.Layer = class Layer extends up.Record {
4339
4272
  return this.stack.asCurrent(this, fn);
4340
4273
  }
4341
4274
  updateHistory(options) {
4342
- if (u.isString(options.title)) {
4343
- this.title = options.title;
4344
- }
4345
4275
  if (u.isString(options.location)) {
4346
4276
  this.location = options.location;
4347
4277
  }
4278
+ if (u.isString(options.title)) {
4279
+ this.title = options.title;
4280
+ }
4348
4281
  }
4349
4282
  isHistoryVisible() {
4350
4283
  return this.history && (this.isRoot() || this.parent.isHistoryVisible());
@@ -4377,12 +4310,14 @@ up.Layer = class Layer extends up.Record {
4377
4310
  set location(location) {
4378
4311
  const previousLocation = this.location;
4379
4312
  location = up.history.normalizeURL(location);
4380
- if (previousLocation !== location) {
4313
+ if (previousLocation !== location || this.opening) {
4381
4314
  this.savedLocation = location;
4382
- this.emit('up:layer:location:changed', { location, log: false });
4383
4315
  if (this.showsLiveHistory()) {
4384
4316
  up.history.push(location);
4385
4317
  }
4318
+ if (!this.opening) {
4319
+ this.emit('up:layer:location:changed', { location });
4320
+ }
4386
4321
  }
4387
4322
  }
4388
4323
  selector(part) {
@@ -4404,11 +4339,14 @@ up.Layer = class Layer extends up.Record {
4404
4339
  let focusedElement = document.activeElement;
4405
4340
  return focusedElement !== document.body && this.element.contains(focusedElement);
4406
4341
  }
4342
+ reset() {
4343
+ Object.assign(this, this.defaults());
4344
+ }
4407
4345
  };
4408
4346
 
4409
4347
 
4410
4348
  /***/ }),
4411
- /* 49 */
4349
+ /* 48 */
4412
4350
  /***/ (() => {
4413
4351
 
4414
4352
  const e = up.element;
@@ -4688,7 +4626,7 @@ up.Layer.Overlay = class Overlay extends up.Layer {
4688
4626
 
4689
4627
 
4690
4628
  /***/ }),
4691
- /* 50 */
4629
+ /* 49 */
4692
4630
  /***/ (() => {
4693
4631
 
4694
4632
  up.Layer.OverlayWithTether = class OverlayWithTether extends up.Layer.Overlay {
@@ -4725,7 +4663,7 @@ up.Layer.OverlayWithTether = class OverlayWithTether extends up.Layer.Overlay {
4725
4663
 
4726
4664
 
4727
4665
  /***/ }),
4728
- /* 51 */
4666
+ /* 50 */
4729
4667
  /***/ (() => {
4730
4668
 
4731
4669
  var _a;
@@ -4763,7 +4701,7 @@ up.Layer.OverlayWithViewport = (_a = class OverlayWithViewport extends up.Layer.
4763
4701
 
4764
4702
 
4765
4703
  /***/ }),
4766
- /* 52 */
4704
+ /* 51 */
4767
4705
  /***/ (() => {
4768
4706
 
4769
4707
  var _a;
@@ -4800,9 +4738,6 @@ up.Layer.Root = (_a = class Root extends up.Layer {
4800
4738
  cannotCloseRoot() {
4801
4739
  up.fail('Cannot close the root layer');
4802
4740
  }
4803
- reset() {
4804
- Object.assign(this, this.defaults());
4805
- }
4806
4741
  toString() {
4807
4742
  return "root layer";
4808
4743
  }
@@ -4812,7 +4747,7 @@ up.Layer.Root = (_a = class Root extends up.Layer {
4812
4747
 
4813
4748
 
4814
4749
  /***/ }),
4815
- /* 53 */
4750
+ /* 52 */
4816
4751
  /***/ (() => {
4817
4752
 
4818
4753
  var _a;
@@ -4823,7 +4758,7 @@ up.Layer.Modal = (_a = class Modal extends up.Layer.OverlayWithViewport {
4823
4758
 
4824
4759
 
4825
4760
  /***/ }),
4826
- /* 54 */
4761
+ /* 53 */
4827
4762
  /***/ (() => {
4828
4763
 
4829
4764
  var _a;
@@ -4834,7 +4769,7 @@ up.Layer.Popup = (_a = class Popup extends up.Layer.OverlayWithTether {
4834
4769
 
4835
4770
 
4836
4771
  /***/ }),
4837
- /* 55 */
4772
+ /* 54 */
4838
4773
  /***/ (() => {
4839
4774
 
4840
4775
  var _a;
@@ -4845,7 +4780,7 @@ up.Layer.Drawer = (_a = class Drawer extends up.Layer.OverlayWithViewport {
4845
4780
 
4846
4781
 
4847
4782
  /***/ }),
4848
- /* 56 */
4783
+ /* 55 */
4849
4784
  /***/ (() => {
4850
4785
 
4851
4786
  var _a;
@@ -4856,7 +4791,7 @@ up.Layer.Cover = (_a = class Cover extends up.Layer.OverlayWithViewport {
4856
4791
 
4857
4792
 
4858
4793
  /***/ }),
4859
- /* 57 */
4794
+ /* 56 */
4860
4795
  /***/ (() => {
4861
4796
 
4862
4797
  const u = up.util;
@@ -4946,7 +4881,7 @@ up.LayerLookup = class LayerLookup {
4946
4881
 
4947
4882
 
4948
4883
  /***/ }),
4949
- /* 58 */
4884
+ /* 57 */
4950
4885
  /***/ (() => {
4951
4886
 
4952
4887
  const u = up.util;
@@ -5059,7 +4994,7 @@ up.LayerStack = class LayerStack extends Array {
5059
4994
 
5060
4995
 
5061
4996
  /***/ }),
5062
- /* 59 */
4997
+ /* 58 */
5063
4998
  /***/ (() => {
5064
4999
 
5065
5000
  up.LinkFeedbackURLs = class LinkFeedbackURLs {
@@ -5090,7 +5025,7 @@ up.LinkFeedbackURLs = class LinkFeedbackURLs {
5090
5025
 
5091
5026
 
5092
5027
  /***/ }),
5093
- /* 60 */
5028
+ /* 59 */
5094
5029
  /***/ (() => {
5095
5030
 
5096
5031
  const u = up.util;
@@ -5160,7 +5095,7 @@ up.LinkPreloader = class LinkPreloader {
5160
5095
 
5161
5096
 
5162
5097
  /***/ }),
5163
- /* 61 */
5098
+ /* 60 */
5164
5099
  /***/ (function() {
5165
5100
 
5166
5101
  var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
@@ -5269,7 +5204,7 @@ up.MotionController = class MotionController {
5269
5204
 
5270
5205
 
5271
5206
  /***/ }),
5272
- /* 62 */
5207
+ /* 61 */
5273
5208
  /***/ (() => {
5274
5209
 
5275
5210
  const u = up.util;
@@ -5361,7 +5296,7 @@ up.NonceableCallback = class NonceableCallback {
5361
5296
 
5362
5297
 
5363
5298
  /***/ }),
5364
- /* 63 */
5299
+ /* 62 */
5365
5300
  /***/ (() => {
5366
5301
 
5367
5302
  const u = up.util;
@@ -5439,7 +5374,7 @@ up.OptionsParser = class OptionsParser {
5439
5374
 
5440
5375
 
5441
5376
  /***/ }),
5442
- /* 64 */
5377
+ /* 63 */
5443
5378
  /***/ (() => {
5444
5379
 
5445
5380
  const e = up.element;
@@ -5507,7 +5442,7 @@ up.OverlayFocus = class OverlayFocus {
5507
5442
 
5508
5443
 
5509
5444
  /***/ }),
5510
- /* 65 */
5445
+ /* 64 */
5511
5446
  /***/ (() => {
5512
5447
 
5513
5448
  const u = up.util;
@@ -5738,7 +5673,7 @@ up.Params = class Params {
5738
5673
 
5739
5674
 
5740
5675
  /***/ }),
5741
- /* 66 */
5676
+ /* 65 */
5742
5677
  /***/ (() => {
5743
5678
 
5744
5679
  const e = up.element;
@@ -5788,7 +5723,7 @@ up.ProgressBar = class ProgressBar {
5788
5723
 
5789
5724
 
5790
5725
  /***/ }),
5791
- /* 67 */
5726
+ /* 66 */
5792
5727
  /***/ (() => {
5793
5728
 
5794
5729
  const u = up.util;
@@ -5834,7 +5769,7 @@ up.RenderOptions = (function () {
5834
5769
  'history',
5835
5770
  'source',
5836
5771
  'saveScroll',
5837
- 'navigate'
5772
+ 'navigate',
5838
5773
  ]);
5839
5774
  const CONTENT_KEYS = [
5840
5775
  'url',
@@ -5905,7 +5840,7 @@ up.RenderOptions = (function () {
5905
5840
 
5906
5841
 
5907
5842
  /***/ }),
5908
- /* 68 */
5843
+ /* 67 */
5909
5844
  /***/ (() => {
5910
5845
 
5911
5846
  up.RenderResult = class RenderResult extends up.Record {
@@ -5933,7 +5868,7 @@ up.RenderResult = class RenderResult extends up.Record {
5933
5868
 
5934
5869
 
5935
5870
  /***/ }),
5936
- /* 69 */
5871
+ /* 68 */
5937
5872
  /***/ (() => {
5938
5873
 
5939
5874
  var _a;
@@ -5946,7 +5881,7 @@ up.Request = (_a = class Request extends up.Record {
5946
5881
  if (this.wrapMethod == null) {
5947
5882
  this.wrapMethod = up.network.config.wrapMethod;
5948
5883
  }
5949
- this.normalizeForCaching();
5884
+ this.normalize();
5950
5885
  if ((this.target || this.layer || this.origin) && !options.basic) {
5951
5886
  const layerLookupOptions = { origin: this.origin };
5952
5887
  this.layer = up.layer.get(this.layer, layerLookupOptions);
@@ -5958,6 +5893,7 @@ up.Request = (_a = class Request extends up.Record {
5958
5893
  }
5959
5894
  this.deferred = u.newDeferred();
5960
5895
  (_a = this.badResponseTime) !== null && _a !== void 0 ? _a : (this.badResponseTime = u.evalOption(up.network.config.badResponseTime, this));
5896
+ this.addAutoHeaders();
5961
5897
  }
5962
5898
  keys() {
5963
5899
  return [
@@ -5969,7 +5905,6 @@ up.Request = (_a = class Request extends up.Record {
5969
5905
  'failTarget',
5970
5906
  'headers',
5971
5907
  'timeout',
5972
- 'preload',
5973
5908
  'background',
5974
5909
  'cache',
5975
5910
  'expireCache',
@@ -5982,11 +5917,12 @@ up.Request = (_a = class Request extends up.Record {
5982
5917
  'failContext',
5983
5918
  'origin',
5984
5919
  'fragments',
5985
- 'queuedAt',
5920
+ 'builtAt',
5986
5921
  'wrapMethod',
5987
5922
  'contentType',
5988
5923
  'payload',
5989
5924
  'onQueued',
5925
+ 'onLoading',
5990
5926
  'fail',
5991
5927
  'abortable',
5992
5928
  'badResponseTime',
@@ -5997,7 +5933,8 @@ up.Request = (_a = class Request extends up.Record {
5997
5933
  state: 'new',
5998
5934
  abortable: true,
5999
5935
  headers: {},
6000
- timeout: up.network.config.timeout
5936
+ timeout: up.network.config.timeout,
5937
+ builtAt: new Date(),
6001
5938
  };
6002
5939
  }
6003
5940
  get xhr() {
@@ -6020,10 +5957,7 @@ up.Request = (_a = class Request extends up.Record {
6020
5957
  var _a;
6021
5958
  return (_a = this.fragments) === null || _a === void 0 ? void 0 : _a[0];
6022
5959
  }
6023
- followState(sourceRequest) {
6024
- u.delegate(this, ['deferred', 'state', 'preload', 'expired'], () => sourceRequest);
6025
- }
6026
- normalizeForCaching() {
5960
+ normalize() {
6027
5961
  this.method = u.normalizeMethod(this.method);
6028
5962
  this.extractHashFromURL();
6029
5963
  this.transferParamsToURL();
@@ -6070,16 +6004,29 @@ up.Request = (_a = class Request extends up.Record {
6070
6004
  (_a = this.onQueued) === null || _a === void 0 ? void 0 : _a.call(this, this);
6071
6005
  }
6072
6006
  load() {
6007
+ var _a;
6073
6008
  if (this.state !== 'new')
6074
6009
  return;
6075
- this.state = 'loading';
6076
- this.expired = false;
6077
- new up.Request.XHRRenderer(this).buildAndSend({
6078
- onload: () => this.onXHRLoad(),
6079
- onerror: () => this.onXHRError(),
6080
- ontimeout: () => this.onXHRTimeout(),
6081
- onabort: () => this.onXHRAbort()
6082
- });
6010
+ if (this.emitLoad()) {
6011
+ this.state = 'loading';
6012
+ this.normalize();
6013
+ (_a = this.onLoading) === null || _a === void 0 ? void 0 : _a.call(this);
6014
+ this.expired = false;
6015
+ new up.Request.XHRRenderer(this).buildAndSend({
6016
+ onload: () => this.onXHRLoad(),
6017
+ onerror: () => this.onXHRError(),
6018
+ ontimeout: () => this.onXHRTimeout(),
6019
+ onabort: () => this.onXHRAbort()
6020
+ });
6021
+ return true;
6022
+ }
6023
+ else {
6024
+ this.abort({ reason: 'Prevented by event listener' });
6025
+ }
6026
+ }
6027
+ emitLoad() {
6028
+ let event = this.emit('up:request:load', { log: ['Loading %s', this.description] });
6029
+ return !event.defaultPrevented;
6083
6030
  }
6084
6031
  loadPage() {
6085
6032
  up.network.abort();
@@ -6123,18 +6070,19 @@ up.Request = (_a = class Request extends up.Record {
6123
6070
  this.emit('up:request:offline', { log: message });
6124
6071
  }
6125
6072
  respondWith(response) {
6126
- if (this.state !== 'loading')
6073
+ this.response = response;
6074
+ if (this.isSettled())
6127
6075
  return;
6128
6076
  this.state = 'loaded';
6129
6077
  if (response.ok) {
6130
- return this.deferred.resolve(response);
6078
+ this.deferred.resolve(response);
6131
6079
  }
6132
6080
  else {
6133
- return this.deferred.reject(response);
6081
+ this.deferred.reject(response);
6134
6082
  }
6135
6083
  }
6136
6084
  isSettled() {
6137
- return (this.state !== 'new') && (this.state !== 'loading');
6085
+ return (this.state !== 'new') && (this.state !== 'loading') && (this.state !== 'tracking');
6138
6086
  }
6139
6087
  csrfHeader() {
6140
6088
  return up.protocol.csrfHeader();
@@ -6181,24 +6129,6 @@ up.Request = (_a = class Request extends up.Record {
6181
6129
  }
6182
6130
  return new up.Response(responseAttrs);
6183
6131
  }
6184
- cacheKey() {
6185
- return JSON.stringify([
6186
- this.method,
6187
- this.url,
6188
- this.params.toQuery(),
6189
- this.metaProps()
6190
- ]);
6191
- }
6192
- metaProps() {
6193
- const props = {};
6194
- for (let key of u.evalOption(up.network.config.requestMetaKeys, this)) {
6195
- const value = this[key];
6196
- if (u.isGiven(value)) {
6197
- props[key] = value;
6198
- }
6199
- }
6200
- return props;
6201
- }
6202
6132
  buildEventEmitter(args) {
6203
6133
  return up.EventEmitter.fromEmitArgs(args, {
6204
6134
  layer: this.layer,
@@ -6224,9 +6154,27 @@ up.Request = (_a = class Request extends up.Record {
6224
6154
  return u.some(subtreeElements, (subtreeElement) => subtreeElement.contains(fragment));
6225
6155
  });
6226
6156
  }
6227
- get queueAge() {
6228
- const now = new Date();
6229
- return now - this.queuedAt;
6157
+ get age() {
6158
+ return new Date() - this.builtAt;
6159
+ }
6160
+ header(name) {
6161
+ return this.headers[name];
6162
+ }
6163
+ addAutoHeaders() {
6164
+ for (let key of ['target', 'failTarget', 'mode', 'failMode', 'context', 'failContext']) {
6165
+ this.addAutoHeader(up.protocol.headerize(key), this[key]);
6166
+ }
6167
+ let csrfHeader, csrfToken;
6168
+ if ((csrfHeader = this.csrfHeader()) && (csrfToken = this.csrfToken())) {
6169
+ this.addAutoHeader(csrfHeader, csrfToken);
6170
+ }
6171
+ this.addAutoHeader(up.protocol.headerize('version'), up.version);
6172
+ }
6173
+ addAutoHeader(name, value) {
6174
+ if (u.isOptions(value) || u.isArray(value)) {
6175
+ value = u.safeStringifyJSON(value);
6176
+ }
6177
+ this.headers[name] = value;
6230
6178
  }
6231
6179
  static tester(condition, { except } = {}) {
6232
6180
  let testFn;
@@ -6244,8 +6192,7 @@ up.Request = (_a = class Request extends up.Record {
6244
6192
  testFn = (_request) => condition;
6245
6193
  }
6246
6194
  if (except) {
6247
- let exceptCacheKey = except.cacheKey();
6248
- return (request) => (request.cacheKey() !== exceptCacheKey) && testFn(request);
6195
+ return (request) => !up.cache.willHaveSameResponse(request, except) && testFn(request);
6249
6196
  }
6250
6197
  else {
6251
6198
  return testFn;
@@ -6259,39 +6206,158 @@ up.Request = (_a = class Request extends up.Record {
6259
6206
 
6260
6207
 
6261
6208
  /***/ }),
6262
- /* 70 */
6263
- /***/ (() => {
6209
+ /* 69 */
6210
+ /***/ (function() {
6264
6211
 
6265
- let u = up.util;
6266
- up.Request.Cache = class Cache extends up.Cache {
6267
- maxSize() {
6212
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
6213
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
6214
+ return new (P || (P = Promise))(function (resolve, reject) {
6215
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6216
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
6217
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
6218
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
6219
+ });
6220
+ };
6221
+ const u = up.util;
6222
+ up.Request.Cache = class Cache {
6223
+ constructor() {
6224
+ this.reset();
6225
+ }
6226
+ reset() {
6227
+ this.varyInfo = {};
6228
+ this.map = new Map();
6229
+ }
6230
+ cacheKey(request) {
6231
+ let influencingHeaders = this.getPreviousInfluencingHeaders(request);
6232
+ let varyPart = u.flatMap(influencingHeaders, (headerName) => [headerName, request.header(headerName)]);
6233
+ return [request.description, ...varyPart].join(':');
6234
+ }
6235
+ getPreviousInfluencingHeaders(request) {
6236
+ var _a, _b;
6237
+ return ((_a = this.varyInfo)[_b = request.description] || (_a[_b] = new Set()));
6238
+ }
6239
+ get(request) {
6240
+ request = this.wrap(request);
6241
+ let cacheKey = this.cacheKey(request);
6242
+ let cachedRequest = this.map.get(cacheKey);
6243
+ if (cachedRequest) {
6244
+ if (this.isUsable(cachedRequest)) {
6245
+ return cachedRequest;
6246
+ }
6247
+ else {
6248
+ this.map.delete(cacheKey);
6249
+ }
6250
+ }
6251
+ }
6252
+ get capacity() {
6268
6253
  return up.network.config.cacheSize;
6269
6254
  }
6270
- evictAge() {
6271
- return up.network.config.cacheEvictAge;
6255
+ isUsable(request) {
6256
+ return request.age < up.network.config.cacheEvictAge;
6257
+ }
6258
+ put(request) {
6259
+ return __awaiter(this, void 0, void 0, function* () {
6260
+ request = this.wrap(request);
6261
+ this.makeRoom();
6262
+ let cacheKey = this.updateCacheKey(request);
6263
+ this.map.set(cacheKey, request);
6264
+ });
6265
+ }
6266
+ updateCacheKey(request) {
6267
+ let oldCacheKey = this.cacheKey(request);
6268
+ let { response } = request;
6269
+ if (response) {
6270
+ this.mergePreviousHeaderNames(request, response);
6271
+ let newCacheKey = this.cacheKey(request);
6272
+ this.renameMapKey(oldCacheKey, newCacheKey);
6273
+ return newCacheKey;
6274
+ }
6275
+ else {
6276
+ return oldCacheKey;
6277
+ }
6278
+ }
6279
+ renameMapKey(oldKey, newKey) {
6280
+ if (oldKey !== newKey && this.map.has(oldKey)) {
6281
+ this.map.set(newKey, this.map.get(oldKey));
6282
+ this.map.delete(oldKey);
6283
+ }
6284
+ }
6285
+ mergePreviousHeaderNames(request, response) {
6286
+ let headersInfluencingResponse = response.ownInfluncingHeaders;
6287
+ if (headersInfluencingResponse.length) {
6288
+ let previousInfluencingHeaders = this.getPreviousInfluencingHeaders(request);
6289
+ for (let headerName of headersInfluencingResponse) {
6290
+ previousInfluencingHeaders.add(headerName);
6291
+ }
6292
+ }
6293
+ }
6294
+ alias(existingCachedRequest, newRequest) {
6295
+ existingCachedRequest = this.wrap(existingCachedRequest);
6296
+ newRequest = this.wrap(newRequest);
6297
+ this.track(existingCachedRequest, newRequest, { force: true });
6298
+ this.put(newRequest);
6299
+ return newRequest;
6300
+ }
6301
+ track(existingRequest, newRequest, options = {}) {
6302
+ var _a;
6303
+ return __awaiter(this, void 0, void 0, function* () {
6304
+ newRequest.trackedRequest = existingRequest;
6305
+ newRequest.state = 'tracking';
6306
+ let value = yield u.always(existingRequest);
6307
+ if (value instanceof up.Response) {
6308
+ if (options.force || this.isCacheCompatible(existingRequest, newRequest)) {
6309
+ newRequest.fromCache = true;
6310
+ newRequest.respondWith(value);
6311
+ u.delegate(newRequest, ['expired', 'state'], () => existingRequest);
6312
+ }
6313
+ else {
6314
+ delete newRequest.trackedRequest;
6315
+ newRequest.state = 'new';
6316
+ (_a = options.onIncompatible) === null || _a === void 0 ? void 0 : _a.call(options, newRequest);
6317
+ }
6318
+ }
6319
+ else {
6320
+ newRequest.state = existingRequest.state;
6321
+ newRequest.deferred.reject(value);
6322
+ }
6323
+ });
6324
+ }
6325
+ willHaveSameResponse(existingRequest, newRequest) {
6326
+ return existingRequest === newRequest || existingRequest === newRequest.trackedRequest;
6272
6327
  }
6273
- normalizeStoreKey(request) {
6274
- return u.wrapValue(up.Request, request).cacheKey();
6328
+ delete(request) {
6329
+ request = this.wrap(request);
6330
+ let cacheKey = this.cacheKey(request);
6331
+ this.map.delete(cacheKey);
6275
6332
  }
6276
6333
  evict(condition = true, testerOptions) {
6277
- this.eachMatch(condition, testerOptions, ({ key }) => this.map.delete(key));
6334
+ this.eachMatch(condition, testerOptions, (request) => this.delete(request));
6278
6335
  }
6279
6336
  expire(condition = true, testerOptions) {
6280
- this.eachMatch(condition, testerOptions, ({ value: request }) => request.expired = true);
6337
+ this.eachMatch(condition, testerOptions, (request) => request.expired = true);
6338
+ }
6339
+ makeRoom() {
6340
+ while (this.map.size >= this.capacity) {
6341
+ let oldestKey = this.map.keys().next().value;
6342
+ this.map.delete(oldestKey);
6343
+ }
6281
6344
  }
6282
6345
  eachMatch(condition = true, testerOptions, fn) {
6283
6346
  let tester = up.Request.tester(condition, testerOptions);
6284
- for (let record of this.records()) {
6285
- if (tester(record.value)) {
6286
- fn(record);
6287
- }
6288
- }
6347
+ let results = u.filter(this.map.values(), tester);
6348
+ u.each(results, fn);
6349
+ }
6350
+ isCacheCompatible(request1, request2) {
6351
+ return this.cacheKey(request1) === this.cacheKey(request2);
6352
+ }
6353
+ wrap(requestOrOptions) {
6354
+ return u.wrapValue(up.Request, requestOrOptions);
6289
6355
  }
6290
6356
  };
6291
6357
 
6292
6358
 
6293
6359
  /***/ }),
6294
- /* 71 */
6360
+ /* 70 */
6295
6361
  /***/ (() => {
6296
6362
 
6297
6363
  const u = up.util;
@@ -6310,7 +6376,6 @@ up.Request.Queue = class Queue {
6310
6376
  asap(request) {
6311
6377
  request.runQueuedCallbacks();
6312
6378
  u.always(request, responseOrError => this.onRequestSettled(request, responseOrError));
6313
- request.queuedAt = new Date();
6314
6379
  this.scheduleSlowTimer(request);
6315
6380
  this.queueRequest(request);
6316
6381
  u.microtask(() => this.poke());
@@ -6322,7 +6387,7 @@ up.Request.Queue = class Queue {
6322
6387
  }
6323
6388
  }
6324
6389
  scheduleSlowTimer(request) {
6325
- let timeUntilLate = Math.max(request.badResponseTime - request.queueAge, 0);
6390
+ let timeUntilLate = Math.max(request.badResponseTime - request.age, 0);
6326
6391
  u.timer(timeUntilLate, () => this.checkLate());
6327
6392
  }
6328
6393
  getMaxConcurrency() {
@@ -6344,13 +6409,8 @@ up.Request.Queue = class Queue {
6344
6409
  return u.remove(this.queuedRequests, request);
6345
6410
  }
6346
6411
  sendRequestNow(request) {
6347
- if (request.emit('up:request:load', { log: ['Loading %s %s', request.method, request.url] }).defaultPrevented) {
6348
- request.abort({ reason: 'Prevented by event listener' });
6349
- }
6350
- else {
6351
- request.normalizeForCaching();
6412
+ if (request.load()) {
6352
6413
  this.currentRequests.push(request);
6353
- request.load();
6354
6414
  }
6355
6415
  }
6356
6416
  onRequestSettled(request, responseOrError) {
@@ -6400,13 +6460,13 @@ up.Request.Queue = class Queue {
6400
6460
  isLate() {
6401
6461
  const allForegroundRequests = u.reject(this.allRequests, 'background');
6402
6462
  const timerTolerance = 1;
6403
- return u.some(allForegroundRequests, request => request.queueAge >= (request.badResponseTime - timerTolerance));
6463
+ return u.some(allForegroundRequests, (request) => request.age >= (request.badResponseTime - timerTolerance));
6404
6464
  }
6405
6465
  };
6406
6466
 
6407
6467
 
6408
6468
  /***/ }),
6409
- /* 72 */
6469
+ /* 71 */
6410
6470
  /***/ (() => {
6411
6471
 
6412
6472
  const u = up.util;
@@ -6445,7 +6505,7 @@ up.Request.FormRenderer = class FormRenderer {
6445
6505
 
6446
6506
 
6447
6507
  /***/ }),
6448
- /* 73 */
6508
+ /* 72 */
6449
6509
  /***/ (() => {
6450
6510
 
6451
6511
  var _a;
@@ -6463,21 +6523,13 @@ up.Request.XHRRenderer = (_a = class XHRRenderer {
6463
6523
  xhr.timeout = this.request.timeout;
6464
6524
  }
6465
6525
  xhr.open(this.getMethod(), this.request.url);
6466
- const metaProps = this.request.metaProps();
6467
- for (let key in metaProps) {
6468
- this.addHeader(xhr, up.protocol.headerize(key), metaProps[key]);
6469
- }
6470
- for (let header in this.request.headers) {
6471
- this.addHeader(xhr, header, this.request.headers[header]);
6472
- }
6473
- let csrfHeader, csrfToken;
6474
- if ((csrfHeader = this.request.csrfHeader()) && (csrfToken = this.request.csrfToken())) {
6475
- this.addHeader(xhr, csrfHeader, csrfToken);
6476
- }
6477
- this.addHeader(xhr, up.protocol.headerize('version'), up.version);
6478
6526
  let contentType = this.getContentType();
6479
6527
  if (contentType) {
6480
- this.addHeader(xhr, 'Content-Type', contentType);
6528
+ xhr.setRequestHeader('Content-Type', contentType);
6529
+ }
6530
+ for (let headerName in this.request.headers) {
6531
+ let headerValue = this.request.headers[headerName];
6532
+ xhr.setRequestHeader(headerName, headerValue);
6481
6533
  }
6482
6534
  Object.assign(xhr, handlers);
6483
6535
  xhr.send(this.getPayload());
@@ -6499,12 +6551,6 @@ up.Request.XHRRenderer = (_a = class XHRRenderer {
6499
6551
  this.finalizePayload();
6500
6552
  return this.payload;
6501
6553
  }
6502
- addHeader(xhr, header, value) {
6503
- if (u.isOptions(value) || u.isArray(value)) {
6504
- value = JSON.stringify(value);
6505
- }
6506
- xhr.setRequestHeader(header, value);
6507
- }
6508
6554
  finalizePayload() {
6509
6555
  this.payload = this.request.payload;
6510
6556
  this.contentType = this.request.contentType;
@@ -6531,7 +6577,7 @@ up.Request.XHRRenderer = (_a = class XHRRenderer {
6531
6577
 
6532
6578
 
6533
6579
  /***/ }),
6534
- /* 74 */
6580
+ /* 73 */
6535
6581
  /***/ (() => {
6536
6582
 
6537
6583
  const u = up.util;
@@ -6567,24 +6613,28 @@ up.Response = class Response extends up.Record {
6567
6613
  var _a;
6568
6614
  return !u.evalOption((_a = this.fail) !== null && _a !== void 0 ? _a : up.network.config.fail, this);
6569
6615
  }
6570
- getHeader(name) {
6616
+ header(name) {
6571
6617
  var _a;
6572
6618
  return this.headers[name] || ((_a = this.xhr) === null || _a === void 0 ? void 0 : _a.getResponseHeader(name));
6573
6619
  }
6620
+ get ownInfluncingHeaders() {
6621
+ let influencingHeaders = up.protocol.influencingHeadersFromResponse(this);
6622
+ return u.filter(influencingHeaders, (headerName) => this.request.header(headerName));
6623
+ }
6574
6624
  get contentType() {
6575
- return this.getHeader('Content-Type');
6625
+ return this.header('Content-Type');
6576
6626
  }
6577
6627
  get cspNonces() {
6578
- return up.protocol.cspNoncesFromHeader(this.getHeader('Content-Security-Policy'));
6628
+ return up.protocol.cspNoncesFromHeader(this.header('Content-Security-Policy'));
6579
6629
  }
6580
6630
  get lastModified() {
6581
- let header = this.getHeader('Last-Modified');
6631
+ let header = this.header('Last-Modified');
6582
6632
  if (header) {
6583
6633
  return new Date(header);
6584
6634
  }
6585
6635
  }
6586
6636
  get etag() {
6587
- return this.getHeader('ETag');
6637
+ return this.header('ETag');
6588
6638
  }
6589
6639
  get json() {
6590
6640
  return this.parsedJSON || (this.parsedJSON = JSON.parse(this.text));
@@ -6594,7 +6644,8 @@ up.Response = class Response extends up.Record {
6594
6644
  return now - this.loadedAt;
6595
6645
  }
6596
6646
  get expired() {
6597
- return this.age > up.network.config.cacheExpireAge || this.request.expired;
6647
+ return this.age > up.network.config.cacheExpireAge ||
6648
+ this.request.expired;
6598
6649
  }
6599
6650
  get description() {
6600
6651
  return `HTTP ${this.status} response to ${this.request.description}`;
@@ -6603,7 +6654,7 @@ up.Response = class Response extends up.Record {
6603
6654
 
6604
6655
 
6605
6656
  /***/ }),
6606
- /* 75 */
6657
+ /* 74 */
6607
6658
  /***/ (() => {
6608
6659
 
6609
6660
  var _a;
@@ -6611,12 +6662,13 @@ const u = up.util;
6611
6662
  const e = up.element;
6612
6663
  up.ResponseDoc = (_a = class ResponseDoc {
6613
6664
  constructor(options) {
6614
- this.noscriptWrapper = new up.HTMLWrapper('noscript');
6615
- this.scriptWrapper = new up.HTMLWrapper('script');
6616
6665
  this.root =
6617
6666
  this.parseDocument(options) ||
6618
6667
  this.parseFragment(options) ||
6619
6668
  this.parseContent(options);
6669
+ if (!up.fragment.config.runScripts) {
6670
+ this.root.querySelectorAll('script').forEach((e) => e.remove());
6671
+ }
6620
6672
  this.cspNonces = options.cspNonces;
6621
6673
  if (options.origin) {
6622
6674
  let originSelector = up.fragment.tryToTarget(options.origin);
@@ -6626,7 +6678,11 @@ up.ResponseDoc = (_a = class ResponseDoc {
6626
6678
  }
6627
6679
  }
6628
6680
  parseDocument(options) {
6629
- return this.parse(options.document, e.createDocumentFromHTML);
6681
+ let document = this.parse(options.document, e.createBrokenDocumentFromHTML);
6682
+ if (document) {
6683
+ this.scriptishNeedFix = true;
6684
+ return document;
6685
+ }
6630
6686
  }
6631
6687
  parseContent(options) {
6632
6688
  let content = options.content || '';
@@ -6634,7 +6690,6 @@ up.ResponseDoc = (_a = class ResponseDoc {
6634
6690
  target = u.map(up.fragment.parseTargetSteps(target), 'selector').join(',');
6635
6691
  const matchingElement = e.createFromSelector(target);
6636
6692
  if (u.isString(content)) {
6637
- content = this.wrapHTML(content);
6638
6693
  matchingElement.innerHTML = content;
6639
6694
  }
6640
6695
  else {
@@ -6647,7 +6702,6 @@ up.ResponseDoc = (_a = class ResponseDoc {
6647
6702
  }
6648
6703
  parse(value, parseFn = e.createFromHTML) {
6649
6704
  if (u.isString(value)) {
6650
- value = this.wrapHTML(value);
6651
6705
  value = parseFn(value);
6652
6706
  }
6653
6707
  return value;
@@ -6655,19 +6709,9 @@ up.ResponseDoc = (_a = class ResponseDoc {
6655
6709
  rootSelector() {
6656
6710
  return up.fragment.toTarget(this.root);
6657
6711
  }
6658
- wrapHTML(html) {
6659
- html = this.noscriptWrapper.wrap(html);
6660
- if (up.fragment.config.runScripts) {
6661
- html = this.scriptWrapper.wrap(html);
6662
- }
6663
- else {
6664
- html = this.scriptWrapper.strip(html);
6665
- }
6666
- return html;
6667
- }
6668
6712
  getTitle() {
6669
6713
  var _a;
6670
- return (_a = this.root.querySelector("head title")) === null || _a === void 0 ? void 0 : _a.textContent;
6714
+ return (_a = this.root.querySelector('head title')) === null || _a === void 0 ? void 0 : _a.textContent;
6671
6715
  }
6672
6716
  select(selector) {
6673
6717
  let finder = new up.FragmentFinder({
@@ -6678,9 +6722,10 @@ up.ResponseDoc = (_a = class ResponseDoc {
6678
6722
  return finder.find();
6679
6723
  }
6680
6724
  finalizeElement(element) {
6681
- this.noscriptWrapper.unwrap(element);
6682
6725
  up.NonceableCallback.adoptNonces(element, this.cspNonces);
6683
- this.scriptWrapper.unwrap(element);
6726
+ if (this.scriptishNeedFix) {
6727
+ element.querySelectorAll('noscript, script').forEach(e.fixScriptish);
6728
+ }
6684
6729
  }
6685
6730
  },
6686
6731
  (() => {
@@ -6690,7 +6735,7 @@ up.ResponseDoc = (_a = class ResponseDoc {
6690
6735
 
6691
6736
 
6692
6737
  /***/ }),
6693
- /* 76 */
6738
+ /* 75 */
6694
6739
  /***/ (() => {
6695
6740
 
6696
6741
  const e = up.element;
@@ -6785,7 +6830,7 @@ up.RevealMotion = class RevealMotion {
6785
6830
 
6786
6831
 
6787
6832
  /***/ }),
6788
- /* 77 */
6833
+ /* 76 */
6789
6834
  /***/ (() => {
6790
6835
 
6791
6836
  const u = up.util;
@@ -6826,7 +6871,7 @@ up.Selector = class Selector {
6826
6871
 
6827
6872
 
6828
6873
  /***/ }),
6829
- /* 78 */
6874
+ /* 77 */
6830
6875
  /***/ (() => {
6831
6876
 
6832
6877
  const u = up.util;
@@ -6947,7 +6992,7 @@ up.Tether = class Tether {
6947
6992
 
6948
6993
 
6949
6994
  /***/ }),
6950
- /* 79 */
6995
+ /* 78 */
6951
6996
  /***/ (() => {
6952
6997
 
6953
6998
  const u = up.util;
@@ -7028,7 +7073,7 @@ up.URLPattern = class URLPattern {
7028
7073
 
7029
7074
 
7030
7075
  /***/ }),
7031
- /* 80 */
7076
+ /* 79 */
7032
7077
  /***/ (() => {
7033
7078
 
7034
7079
  up.framework = (function () {
@@ -7046,6 +7091,7 @@ up.framework = (function () {
7046
7091
  readyState = 'booting';
7047
7092
  up.emit('up:framework:boot', { log: false });
7048
7093
  readyState = 'booted';
7094
+ up.emit('up:framework:booted', { log: false });
7049
7095
  }
7050
7096
  else {
7051
7097
  console.error("Unpoly cannot boot: %s", issue);
@@ -7111,7 +7157,7 @@ up.boot = up.framework.boot;
7111
7157
 
7112
7158
 
7113
7159
  /***/ }),
7114
- /* 81 */
7160
+ /* 80 */
7115
7161
  /***/ (() => {
7116
7162
 
7117
7163
  up.event = (function () {
@@ -7127,9 +7173,6 @@ up.event = (function () {
7127
7173
  function on(...args) {
7128
7174
  return buildListenerGroup(args).bind();
7129
7175
  }
7130
- function $on(...args) {
7131
- return buildListenerGroup(args, { jQuery: true }).bind();
7132
- }
7133
7176
  function off(...args) {
7134
7177
  return buildListenerGroup(args).unbind();
7135
7178
  }
@@ -7200,7 +7243,6 @@ up.event = (function () {
7200
7243
  on('up:framework:reset', reset);
7201
7244
  return {
7202
7245
  on,
7203
- $on,
7204
7246
  off,
7205
7247
  build,
7206
7248
  emit,
@@ -7213,14 +7255,12 @@ up.event = (function () {
7213
7255
  };
7214
7256
  })();
7215
7257
  up.on = up.event.on;
7216
- up.$on = up.event.$on;
7217
7258
  up.off = up.event.off;
7218
- up.$off = up.event.off;
7219
7259
  up.emit = up.event.emit;
7220
7260
 
7221
7261
 
7222
7262
  /***/ }),
7223
- /* 82 */
7263
+ /* 81 */
7224
7264
  /***/ (() => {
7225
7265
 
7226
7266
  up.protocol = (function () {
@@ -7236,6 +7276,9 @@ up.protocol = (function () {
7236
7276
  return parseFn(value);
7237
7277
  }
7238
7278
  };
7279
+ function targetFromXHR(xhr) {
7280
+ return extractHeader(xhr, 'target');
7281
+ }
7239
7282
  function parseModifyCacheValue(value) {
7240
7283
  if (value === 'false') {
7241
7284
  return false;
@@ -7257,6 +7300,10 @@ up.protocol = (function () {
7257
7300
  function methodFromXHR(xhr) {
7258
7301
  return extractHeader(xhr, 'method', u.normalizeMethod);
7259
7302
  }
7303
+ function titleFromXHR(xhr) {
7304
+ var _a, _b, _c;
7305
+ return (_c = (_b = (_a = up.migrate).titleFromXHR) === null || _b === void 0 ? void 0 : _b.call(_a, xhr)) !== null && _c !== void 0 ? _c : extractHeader(xhr, 'title', JSON.parse);
7306
+ }
7260
7307
  function eventPlansFromXHR(xhr) {
7261
7308
  return extractHeader(xhr, 'events', JSON.parse);
7262
7309
  }
@@ -7272,11 +7319,9 @@ up.protocol = (function () {
7272
7319
  function locationFromXHR(xhr) {
7273
7320
  return extractHeader(xhr, 'location') || xhr.responseURL;
7274
7321
  }
7275
- function titleFromXHR(xhr) {
7276
- return extractHeader(xhr, 'title');
7277
- }
7278
- function targetFromXHR(xhr) {
7279
- return extractHeader(xhr, 'target');
7322
+ function influencingHeadersFromResponse(response) {
7323
+ let varyHeaderValue = response.header('Vary');
7324
+ return u.parseTokens(varyHeaderValue, { separator: 'comma' });
7280
7325
  }
7281
7326
  const config = new up.Config(() => ({
7282
7327
  methodParam: '_method',
@@ -7352,12 +7397,13 @@ up.protocol = (function () {
7352
7397
  headerize,
7353
7398
  wrapMethod,
7354
7399
  cspNoncesFromHeader,
7400
+ influencingHeadersFromResponse,
7355
7401
  };
7356
7402
  })();
7357
7403
 
7358
7404
 
7359
7405
  /***/ }),
7360
- /* 83 */
7406
+ /* 82 */
7361
7407
  /***/ (() => {
7362
7408
 
7363
7409
  up.log = (function () {
@@ -7443,7 +7489,7 @@ up.warn = up.log.warn;
7443
7489
 
7444
7490
 
7445
7491
  /***/ }),
7446
- /* 84 */
7492
+ /* 83 */
7447
7493
  /***/ (() => {
7448
7494
 
7449
7495
  up.syntax = (function () {
@@ -7467,9 +7513,6 @@ up.syntax = (function () {
7467
7513
  const compiler = buildCompiler(args);
7468
7514
  return insertCompiler(registeredCompilers, compiler);
7469
7515
  }
7470
- function registerJQueryCompiler(...args) {
7471
- registerCompiler(...args, { jQuery: true });
7472
- }
7473
7516
  function registerMacro(...args) {
7474
7517
  const macro = buildCompiler(args);
7475
7518
  if (up.framework.evaling) {
@@ -7478,9 +7521,6 @@ up.syntax = (function () {
7478
7521
  }
7479
7522
  return insertCompiler(registeredMacros, macro);
7480
7523
  }
7481
- function registerJQueryMacro(...args) {
7482
- registerMacro(...args, { jQuery: true });
7483
- }
7484
7524
  function detectSystemMacroPriority(macroSelector) {
7485
7525
  macroSelector = u.evalOption(macroSelector);
7486
7526
  for (let substr in SYSTEM_MACRO_PRIORITIES) {
@@ -7504,7 +7544,6 @@ up.syntax = (function () {
7504
7544
  isDefault: up.framework.evaling,
7505
7545
  priority: 0,
7506
7546
  batch: false,
7507
- jQuery: false
7508
7547
  });
7509
7548
  return Object.assign(callback, options);
7510
7549
  }
@@ -7546,10 +7585,10 @@ up.syntax = (function () {
7546
7585
  destructors.push(destructor);
7547
7586
  }
7548
7587
  }
7549
- function hello(element, { layer, data, dataMap } = {}) {
7550
- element = up.fragment.get(element);
7588
+ function hello(element, options = {}) {
7589
+ element = up.fragment.get(element, options);
7551
7590
  up.puts('up.hello()', "Compiling fragment %o", element);
7552
- compile(element, { layer, data, dataMap });
7591
+ compile(element, options);
7553
7592
  up.fragment.emitInserted(element);
7554
7593
  return element;
7555
7594
  }
@@ -7582,8 +7621,6 @@ up.syntax = (function () {
7582
7621
  return {
7583
7622
  compiler: registerCompiler,
7584
7623
  macro: registerMacro,
7585
- $compiler: registerJQueryCompiler,
7586
- $macro: registerJQueryMacro,
7587
7624
  destructor: registerDestructor,
7588
7625
  hello,
7589
7626
  clean,
@@ -7591,16 +7628,14 @@ up.syntax = (function () {
7591
7628
  };
7592
7629
  })();
7593
7630
  up.compiler = up.syntax.compiler;
7594
- up.$compiler = up.syntax.$compiler;
7595
7631
  up.destructor = up.syntax.destructor;
7596
7632
  up.macro = up.syntax.macro;
7597
- up.$macro = up.syntax.$macro;
7598
7633
  up.data = up.syntax.data;
7599
7634
  up.hello = up.syntax.hello;
7600
7635
 
7601
7636
 
7602
7637
  /***/ }),
7603
- /* 85 */
7638
+ /* 84 */
7604
7639
  /***/ (() => {
7605
7640
 
7606
7641
  up.history = (function () {
@@ -7670,7 +7705,7 @@ up.history = (function () {
7670
7705
  }
7671
7706
  function restoreStateOnPop(state) {
7672
7707
  if (!(state === null || state === void 0 ? void 0 : state.up)) {
7673
- up.puts('pop', 'Ignoring a history state not owned by Unpoly');
7708
+ up.puts('popstate', 'Ignoring a history state not owned by Unpoly');
7674
7709
  return;
7675
7710
  }
7676
7711
  let location = currentLocation();
@@ -7737,10 +7772,10 @@ up.history = (function () {
7737
7772
 
7738
7773
 
7739
7774
  /***/ }),
7740
- /* 86 */
7775
+ /* 85 */
7741
7776
  /***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => {
7742
7777
 
7743
- __webpack_require__(87);
7778
+ __webpack_require__(86);
7744
7779
  const u = up.util;
7745
7780
  const e = up.element;
7746
7781
  up.fragment = (function () {
@@ -7791,7 +7826,7 @@ up.fragment = (function () {
7791
7826
  autoRevalidate: (response) => response.expired,
7792
7827
  skipResponse: defaultSkipResponse
7793
7828
  }));
7794
- u.delegate(config, 'mainTargets', () => up.layer.config.any);
7829
+ u.delegate(config, ['mainTargets'], () => up.layer.config.any);
7795
7830
  function reset() {
7796
7831
  config.reset();
7797
7832
  }
@@ -8258,20 +8293,20 @@ up.destroy = up.fragment.destroy;
8258
8293
  up.render = up.fragment.render;
8259
8294
  up.navigate = up.fragment.navigate;
8260
8295
  up.visit = up.fragment.visit;
8261
- u.delegate(up, 'context', () => up.layer.current);
8296
+ u.delegate(up, ['context'], () => up.layer.current);
8262
8297
 
8263
8298
 
8264
8299
  /***/ }),
8265
- /* 87 */
8300
+ /* 86 */
8266
8301
  /***/ (() => {
8267
8302
 
8268
8303
 
8269
8304
 
8270
8305
  /***/ }),
8271
- /* 88 */
8306
+ /* 87 */
8272
8307
  /***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => {
8273
8308
 
8274
- __webpack_require__(89);
8309
+ __webpack_require__(88);
8275
8310
  up.viewport = (function () {
8276
8311
  const u = up.util;
8277
8312
  const e = up.element;
@@ -8454,7 +8489,7 @@ up.viewport = (function () {
8454
8489
  }
8455
8490
  }
8456
8491
  function newStateCache() {
8457
- return new up.Cache({ size: 30, key: up.history.normalizeURL });
8492
+ return new up.FIFOCache({ capacity: 30, normalizeKey: up.history.normalizeURL });
8458
8493
  }
8459
8494
  function parseOptions(args) {
8460
8495
  const options = u.copy(u.extractOptions(args));
@@ -8593,13 +8628,13 @@ up.reveal = up.viewport.reveal;
8593
8628
 
8594
8629
 
8595
8630
  /***/ }),
8596
- /* 89 */
8631
+ /* 88 */
8597
8632
  /***/ (() => {
8598
8633
 
8599
8634
 
8600
8635
 
8601
8636
  /***/ }),
8602
- /* 90 */
8637
+ /* 89 */
8603
8638
  /***/ (function() {
8604
8639
 
8605
8640
  var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
@@ -8865,10 +8900,10 @@ up.animate = up.motion.animate;
8865
8900
 
8866
8901
 
8867
8902
  /***/ }),
8868
- /* 91 */
8903
+ /* 90 */
8869
8904
  /***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => {
8870
8905
 
8871
- __webpack_require__(92);
8906
+ __webpack_require__(91);
8872
8907
  const u = up.util;
8873
8908
  up.network = (function () {
8874
8909
  const config = new up.Config(() => ({
@@ -8884,7 +8919,6 @@ up.network = (function () {
8884
8919
  autoCache(request) { return request.isSafe(); },
8885
8920
  expireCache(request, _response) { return !request.isSafe(); },
8886
8921
  evictCache: false,
8887
- requestMetaKeys: ['target', 'failTarget', 'mode', 'failMode', 'context', 'failContext'],
8888
8922
  progressBar: true,
8889
8923
  timeout: 90000,
8890
8924
  }));
@@ -8895,14 +8929,14 @@ up.network = (function () {
8895
8929
  abortRequests();
8896
8930
  queue.reset();
8897
8931
  config.reset();
8898
- cache.evict();
8932
+ cache.reset();
8899
8933
  progressBar === null || progressBar === void 0 ? void 0 : progressBar.destroy();
8900
8934
  progressBar = null;
8901
8935
  }
8902
8936
  function makeRequest(...args) {
8903
8937
  const options = parseRequestOptions(args);
8904
8938
  const request = new up.Request(options);
8905
- useCachedRequest(request) || queueRequest(request);
8939
+ processRequest(request);
8906
8940
  return request;
8907
8941
  }
8908
8942
  function parseRequestOptions(args) {
@@ -8914,31 +8948,31 @@ up.network = (function () {
8914
8948
  (_b = (_a = up.migrate).handleRequestOptions) === null || _b === void 0 ? void 0 : _b.call(_a, options);
8915
8949
  return options;
8916
8950
  }
8917
- function useCachedRequest(request) {
8951
+ function processRequest(request) {
8952
+ useCachedRequest(request) || queueRequest(request);
8953
+ }
8954
+ function useCachedRequest(newRequest) {
8918
8955
  let cachedRequest;
8919
- if (request.willCache() && (cachedRequest = cache.get(request))) {
8920
- up.puts('up.request()', 'Re-using previous request to %s %s', request.method, request.url);
8921
- if (!request.preload) {
8956
+ if (newRequest.willCache() && (cachedRequest = cache.get(newRequest))) {
8957
+ up.puts('up.request()', 'Re-using previous request to %s', newRequest.description);
8958
+ if (!newRequest.background) {
8922
8959
  queue.promoteToForeground(cachedRequest);
8923
8960
  }
8924
- request.followState(cachedRequest);
8925
- request.fromCache = true;
8961
+ cache.track(cachedRequest, newRequest, { onIncompatible: processRequest });
8926
8962
  return true;
8927
8963
  }
8928
8964
  }
8929
8965
  function queueRequest(request) {
8930
- if (request.preload && !request.isSafe()) {
8931
- up.fail('Will not preload request to %s', request.description);
8932
- }
8933
8966
  handleCaching(request);
8934
8967
  queue.asap(request);
8935
8968
  return true;
8936
8969
  }
8937
8970
  function handleCaching(request) {
8938
8971
  if (request.willCache()) {
8939
- cache.set(request, request);
8972
+ cache.put(request);
8973
+ request.onLoading = () => cache.put(request);
8940
8974
  }
8941
- return u.always(request, function (response) {
8975
+ u.always(request, function (response) {
8942
8976
  var _a, _b, _c, _d;
8943
8977
  let expireCache = (_b = (_a = response.expireCache) !== null && _a !== void 0 ? _a : request.expireCache) !== null && _b !== void 0 ? _b : u.evalOption(config.expireCache, request, response);
8944
8978
  if (expireCache) {
@@ -8949,7 +8983,7 @@ up.network = (function () {
8949
8983
  cache.evict(evictCache, { except: request });
8950
8984
  }
8951
8985
  if (cache.get(request)) {
8952
- cache.set(request, request);
8986
+ cache.put(request);
8953
8987
  }
8954
8988
  if (!response.ok) {
8955
8989
  cache.evict(request);
@@ -9015,13 +9049,13 @@ up.cache = up.network.cache;
9015
9049
 
9016
9050
 
9017
9051
  /***/ }),
9018
- /* 92 */
9052
+ /* 91 */
9019
9053
  /***/ (() => {
9020
9054
 
9021
9055
 
9022
9056
 
9023
9057
  /***/ }),
9024
- /* 93 */
9058
+ /* 92 */
9025
9059
  /***/ (function(__unused_webpack_module, __unused_webpack_exports, __webpack_require__) {
9026
9060
 
9027
9061
  var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
@@ -9033,7 +9067,7 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
9033
9067
  step((generator = generator.apply(thisArg, _arguments || [])).next());
9034
9068
  });
9035
9069
  };
9036
- __webpack_require__(94);
9070
+ __webpack_require__(93);
9037
9071
  const u = up.util;
9038
9072
  const e = up.element;
9039
9073
  up.layer = (function () {
@@ -9160,6 +9194,7 @@ up.layer = (function () {
9160
9194
  options.baseLayer = stack.get('current', Object.assign(Object.assign({}, options), { normalizeLayerOptions: false }));
9161
9195
  }
9162
9196
  function build(options, beforeNew) {
9197
+ var _a;
9163
9198
  const { mode } = options;
9164
9199
  const { Class } = config[mode];
9165
9200
  const configs = u.reverse(modeConfigs(mode));
@@ -9167,6 +9202,7 @@ up.layer = (function () {
9167
9202
  if (handleDeprecatedConfig) {
9168
9203
  configs.forEach(handleDeprecatedConfig);
9169
9204
  }
9205
+ (_a = options.openAnimation) !== null && _a !== void 0 ? _a : (options.openAnimation = u.pluckKey(options, 'animation'));
9170
9206
  options = u.mergeDefined(...configs, { mode, stack }, options);
9171
9207
  if (beforeNew) {
9172
9208
  options = beforeNew(options);
@@ -9272,16 +9308,16 @@ up.layer = (function () {
9272
9308
 
9273
9309
 
9274
9310
  /***/ }),
9275
- /* 94 */
9311
+ /* 93 */
9276
9312
  /***/ (() => {
9277
9313
 
9278
9314
 
9279
9315
 
9280
9316
  /***/ }),
9281
- /* 95 */
9317
+ /* 94 */
9282
9318
  /***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => {
9283
9319
 
9284
- __webpack_require__(96);
9320
+ __webpack_require__(95);
9285
9321
  up.link = (function () {
9286
9322
  const u = up.util;
9287
9323
  const e = up.element;
@@ -9430,16 +9466,22 @@ up.link = (function () {
9430
9466
  }
9431
9467
  function preload(link, options) {
9432
9468
  link = up.fragment.get(link);
9433
- if (!shouldPreload()) {
9434
- return Promise.reject(new up.Error('Link preloading is disabled'));
9469
+ let issue = preloadIssue(link);
9470
+ if (issue) {
9471
+ return Promise.reject(new up.Error(issue));
9435
9472
  }
9436
9473
  const guardEvent = up.event.build('up:link:preload', { log: ['Preloading link %o', link] });
9437
9474
  return follow(link, Object.assign(Object.assign({ abortable: false }, options), { guardEvent, preload: true }));
9438
9475
  }
9439
- function shouldPreload() {
9440
- let goodConnection = u.negate(up.network.shouldReduceRequests);
9441
- return u.evalAutoOption(config.preloadEnabled, goodConnection);
9476
+ function preloadIssue(link) {
9477
+ if (!u.evalAutoOption(config.preloadEnabled, autoPreloadEnabled, link)) {
9478
+ return 'Preloading is disabled';
9479
+ }
9480
+ else if (!isSafe(link)) {
9481
+ return 'Will not preload an unsafe link';
9482
+ }
9442
9483
  }
9484
+ const autoPreloadEnabled = u.negate(up.network.shouldReduceRequests);
9443
9485
  function followMethod(link, options = {}) {
9444
9486
  return u.normalizeMethod(options.method || link.getAttribute('up-method') || link.getAttribute('data-method'));
9445
9487
  }
@@ -9566,13 +9608,13 @@ up.follow = up.link.follow;
9566
9608
 
9567
9609
 
9568
9610
  /***/ }),
9569
- /* 96 */
9611
+ /* 95 */
9570
9612
  /***/ (() => {
9571
9613
 
9572
9614
 
9573
9615
 
9574
9616
  /***/ }),
9575
- /* 97 */
9617
+ /* 96 */
9576
9618
  /***/ (() => {
9577
9619
 
9578
9620
  up.form = (function () {
@@ -9972,7 +10014,7 @@ up.validate = up.form.validate;
9972
10014
 
9973
10015
 
9974
10016
  /***/ }),
9975
- /* 98 */
10017
+ /* 97 */
9976
10018
  /***/ (() => {
9977
10019
 
9978
10020
  up.feedback = (function () {
@@ -10089,7 +10131,7 @@ up.feedback = (function () {
10089
10131
 
10090
10132
 
10091
10133
  /***/ }),
10092
- /* 99 */
10134
+ /* 98 */
10093
10135
  /***/ (() => {
10094
10136
 
10095
10137
  up.radio = (function () {
@@ -10167,7 +10209,7 @@ up.radio = (function () {
10167
10209
 
10168
10210
 
10169
10211
  /***/ }),
10170
- /* 100 */
10212
+ /* 99 */
10171
10213
  /***/ (() => {
10172
10214
 
10173
10215
  (function () {
@@ -10305,16 +10347,15 @@ __webpack_require__(82);
10305
10347
  __webpack_require__(83);
10306
10348
  __webpack_require__(84);
10307
10349
  __webpack_require__(85);
10308
- __webpack_require__(86);
10309
- __webpack_require__(88);
10350
+ __webpack_require__(87);
10351
+ __webpack_require__(89);
10310
10352
  __webpack_require__(90);
10311
- __webpack_require__(91);
10312
- __webpack_require__(93);
10313
- __webpack_require__(95);
10353
+ __webpack_require__(92);
10354
+ __webpack_require__(94);
10355
+ __webpack_require__(96);
10314
10356
  __webpack_require__(97);
10315
10357
  __webpack_require__(98);
10316
10358
  __webpack_require__(99);
10317
- __webpack_require__(100);
10318
10359
  up.framework.onEvaled();
10319
10360
 
10320
10361
  })();