unpoly-rails 3.0.0.rc2 → 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-rc2'
8
+ version: '3.0.0-rc3'
9
9
  };
10
10
 
11
11
 
@@ -111,15 +111,15 @@ up.util = (function () {
111
111
  return block;
112
112
  }
113
113
  }
114
- function map(array, block) {
115
- if (array.length === 0) {
114
+ function map(list, block) {
115
+ if (list.length === 0) {
116
116
  return [];
117
117
  }
118
118
  block = iteratee(block);
119
119
  let mapped = [];
120
- for (let i = 0; i < array.length; i++) {
121
- let element = array[i];
122
- mapped.push(block(element, i));
120
+ let i = 0;
121
+ for (let item of list) {
122
+ mapped.push(block(item, i++));
123
123
  }
124
124
  return mapped;
125
125
  }
@@ -131,8 +131,9 @@ up.util = (function () {
131
131
  return map(array, pairer).reduce(merger, {});
132
132
  }
133
133
  function each(array, block) {
134
- for (let i = 0; i < array.length; i++) {
135
- block(array[i], i);
134
+ let i = 0;
135
+ for (let item of array) {
136
+ block(item, i++);
136
137
  }
137
138
  }
138
139
  function isNull(object) {
@@ -308,10 +309,11 @@ up.util = (function () {
308
309
  function some(list, tester) {
309
310
  return !!findResult(list, tester);
310
311
  }
311
- function findResult(array, tester) {
312
+ function findResult(list, tester) {
312
313
  tester = iteratee(tester);
313
- for (let i = 0; i < array.length; i++) {
314
- const result = tester(array[i], i);
314
+ let i = 0;
315
+ for (let item of list) {
316
+ const result = tester(item, i++);
315
317
  if (result) {
316
318
  return result;
317
319
  }
@@ -320,8 +322,9 @@ up.util = (function () {
320
322
  function every(list, tester) {
321
323
  tester = iteratee(tester);
322
324
  let match = true;
323
- for (let i = 0; i < list.length; i++) {
324
- if (!tester(list[i], i)) {
325
+ let i = 0;
326
+ for (let item of list) {
327
+ if (!tester(item, i++)) {
325
328
  match = false;
326
329
  break;
327
330
  }
@@ -493,7 +496,7 @@ up.util = (function () {
493
496
  function flatMap(array, block) {
494
497
  return flatten(map(array, block));
495
498
  }
496
- function always(promise, callback) {
499
+ function always(promise, callback = identity) {
497
500
  return promise.then(callback, callback);
498
501
  }
499
502
  function newDeferred() {
@@ -595,7 +598,7 @@ up.util = (function () {
595
598
  Object.defineProperty(object, prop, { get });
596
599
  }
597
600
  function defineDelegates(object, props, targetProvider) {
598
- wrapList(props).forEach(function (prop) {
601
+ for (let prop of props) {
599
602
  Object.defineProperty(object, prop, {
600
603
  get() {
601
604
  const target = targetProvider.call(this);
@@ -610,7 +613,7 @@ up.util = (function () {
610
613
  target[prop] = newValue;
611
614
  }
612
615
  });
613
- });
616
+ }
614
617
  }
615
618
  function stringifyArg(arg) {
616
619
  let string;
@@ -705,6 +708,14 @@ up.util = (function () {
705
708
  };
706
709
  }
707
710
  }
711
+ function safeStringifyJSON(value) {
712
+ let json = JSON.stringify(value);
713
+ return escapeHighASCII(json);
714
+ }
715
+ function escapeHighASCII(string) {
716
+ let unicodeEscape = (char) => "\\u" + char.charCodeAt(0).toString(16).padStart(4, '0');
717
+ return string.replace(/[^\x00-\x7F]/g, unicodeEscape);
718
+ }
708
719
  return {
709
720
  parseURL,
710
721
  normalizeURL,
@@ -800,7 +811,8 @@ up.util = (function () {
800
811
  sprintf,
801
812
  renameKeys,
802
813
  negate,
803
- memoizeMethod
814
+ memoizeMethod,
815
+ safeStringifyJSON,
804
816
  };
805
817
  })();
806
818
 
@@ -1159,9 +1171,17 @@ up.element = (function () {
1159
1171
  klass = klass.replace(/:/g, '\\:');
1160
1172
  return `.${klass}`;
1161
1173
  }
1162
- function createDocumentFromHTML(html) {
1174
+ function createBrokenDocumentFromHTML(html) {
1163
1175
  return new DOMParser().parseFromString(html, 'text/html');
1164
1176
  }
1177
+ function fixScriptish(scriptish) {
1178
+ let clone = document.createElement(scriptish.tagName);
1179
+ for (let { name, value } of scriptish.attributes) {
1180
+ clone.setAttribute(name, value);
1181
+ }
1182
+ clone.textContent = scriptish.innerHTML;
1183
+ scriptish.replaceWith(clone);
1184
+ }
1165
1185
  function createFromHTML(html) {
1166
1186
  const range = document.createRange();
1167
1187
  range.setStart(document.body, 0);
@@ -1423,7 +1443,8 @@ up.element = (function () {
1423
1443
  isSingleton,
1424
1444
  attrSelector,
1425
1445
  tagName: elementTagName,
1426
- createDocumentFromHTML,
1446
+ createBrokenDocumentFromHTML,
1447
+ fixScriptish,
1427
1448
  createFromHTML,
1428
1449
  get root() { return getRoot(); },
1429
1450
  paint,
@@ -1623,82 +1644,26 @@ up.LogConfig = class LogConfig extends up.Config {
1623
1644
  /***/ (() => {
1624
1645
 
1625
1646
  const u = up.util;
1626
- up.Cache = class Cache {
1627
- constructor(config = {}) {
1628
- this.config = config;
1647
+ up.FIFOCache = class FIFOCache {
1648
+ constructor({ capacity = 10, normalizeKey = u.identity } = {}) {
1629
1649
  this.map = new Map();
1650
+ this.capacity = capacity;
1651
+ this.normalizeKey = normalizeKey;
1630
1652
  }
1631
- size() {
1632
- return this.map.size;
1633
- }
1634
- maxSize() {
1635
- return u.evalOption(this.config.size);
1636
- }
1637
- evictAge() {
1638
- return u.evalOption(this.config.evictAge);
1639
- }
1640
- normalizeStoreKey(key) {
1641
- return key;
1642
- }
1643
- isDisabled() {
1644
- return this.maxSize() === 0 || this.evictAge() === 0;
1645
- }
1646
- evict() {
1647
- this.map.clear();
1648
- }
1649
- records() {
1650
- return this.map.values();
1651
- }
1652
- makeRoomForAnotherRecord() {
1653
- const maxSize = this.maxSize();
1654
- const currentSize = this.size();
1655
- if (!maxSize || currentSize < maxSize)
1656
- return;
1657
- let records = Array.from(this.records());
1658
- records.sort((a, b) => b.createdAt - a.createdAt);
1659
- const overflow = currentSize - maxSize + 1;
1660
- for (let i = 0; i < overflow; i++) {
1661
- let key = records.pop().key;
1662
- this.map.delete(key);
1663
- }
1664
- }
1665
- alias(oldKey, newKey) {
1666
- const value = this.get(oldKey);
1667
- if (u.isDefined(value)) {
1668
- this.set(newKey, value);
1669
- }
1653
+ get(key) {
1654
+ key = this.normalizeKey(key);
1655
+ return this.map.get(key);
1670
1656
  }
1671
1657
  set(key, value) {
1672
- if (this.isDisabled())
1673
- return;
1674
- this.makeRoomForAnotherRecord();
1675
- key = this.normalizeStoreKey(key);
1676
- const createdAt = new Date();
1677
- const record = { key, value, createdAt };
1678
- this.map.set(key, record);
1679
- }
1680
- remove(key) {
1681
- key = this.normalizeStoreKey(key);
1682
- this.map.delete(key);
1683
- }
1684
- isUsable(record) {
1685
- const evictAge = this.evictAge();
1686
- if (!evictAge)
1687
- return true;
1688
- const age = new Date() - record.createdAt;
1689
- return age < evictAge;
1690
- }
1691
- get(key) {
1692
- const storeKey = this.normalizeStoreKey(key);
1693
- let record = this.map.get(storeKey);
1694
- if (record) {
1695
- if (this.isUsable(record)) {
1696
- return record.value;
1697
- }
1698
- else {
1699
- this.remove(key);
1700
- }
1658
+ if (this.map.size === this.capacity) {
1659
+ let oldestKey = this.map.keys().next().value;
1660
+ this.map.delete(oldestKey);
1701
1661
  }
1662
+ key = this.normalizeKey(key);
1663
+ this.map.set(key, value);
1664
+ }
1665
+ clear() {
1666
+ this.map.clear();
1702
1667
  }
1703
1668
  };
1704
1669
 
@@ -4098,44 +4063,6 @@ up.FragmentScrolling = class FragmentScrolling extends up.FragmentProcessor {
4098
4063
  /* 47 */
4099
4064
  /***/ (() => {
4100
4065
 
4101
- const u = up.util;
4102
- const e = up.element;
4103
- up.HTMLWrapper = class HTMLWrapper {
4104
- constructor(tagName) {
4105
- this.tagName = tagName;
4106
- const openTag = `<${this.tagName}[^>]*>`;
4107
- const closeTag = `</${this.tagName}>`;
4108
- const innerHTML = "(.|\\s)*?";
4109
- this.pattern = new RegExp(openTag + innerHTML + closeTag, 'ig');
4110
- this.attrName = `up-wrapped-${this.tagName}`;
4111
- }
4112
- strip(html) {
4113
- return html.replace(this.pattern, '');
4114
- }
4115
- wrap(html) {
4116
- return html.replace(this.pattern, this.wrapMatch.bind(this));
4117
- }
4118
- wrapMatch(match) {
4119
- this.didWrap = true;
4120
- return '<meta name="' + this.attrName + '" value="' + u.escapeHTML(match) + '">';
4121
- }
4122
- unwrap(element) {
4123
- if (!this.didWrap) {
4124
- return;
4125
- }
4126
- for (let wrappedChild of element.querySelectorAll(`meta[name='${this.attrName}']`)) {
4127
- const originalHTML = wrappedChild.getAttribute('value');
4128
- const restoredElement = e.createFromHTML(originalHTML);
4129
- wrappedChild.replaceWith(restoredElement);
4130
- }
4131
- }
4132
- };
4133
-
4134
-
4135
- /***/ }),
4136
- /* 48 */
4137
- /***/ (() => {
4138
-
4139
4066
  const e = up.element;
4140
4067
  const u = up.util;
4141
4068
  up.Layer = class Layer extends up.Record {
@@ -4349,11 +4276,14 @@ up.Layer = class Layer extends up.Record {
4349
4276
  let focusedElement = document.activeElement;
4350
4277
  return focusedElement !== document.body && this.element.contains(focusedElement);
4351
4278
  }
4279
+ reset() {
4280
+ Object.assign(this, this.defaults());
4281
+ }
4352
4282
  };
4353
4283
 
4354
4284
 
4355
4285
  /***/ }),
4356
- /* 49 */
4286
+ /* 48 */
4357
4287
  /***/ (() => {
4358
4288
 
4359
4289
  const e = up.element;
@@ -4628,7 +4558,7 @@ up.Layer.Overlay = class Overlay extends up.Layer {
4628
4558
 
4629
4559
 
4630
4560
  /***/ }),
4631
- /* 50 */
4561
+ /* 49 */
4632
4562
  /***/ (() => {
4633
4563
 
4634
4564
  up.Layer.OverlayWithTether = class OverlayWithTether extends up.Layer.Overlay {
@@ -4665,7 +4595,7 @@ up.Layer.OverlayWithTether = class OverlayWithTether extends up.Layer.Overlay {
4665
4595
 
4666
4596
 
4667
4597
  /***/ }),
4668
- /* 51 */
4598
+ /* 50 */
4669
4599
  /***/ (() => {
4670
4600
 
4671
4601
  var _a;
@@ -4703,7 +4633,7 @@ up.Layer.OverlayWithViewport = (_a = class OverlayWithViewport extends up.Layer.
4703
4633
 
4704
4634
 
4705
4635
  /***/ }),
4706
- /* 52 */
4636
+ /* 51 */
4707
4637
  /***/ (() => {
4708
4638
 
4709
4639
  var _a;
@@ -4740,9 +4670,6 @@ up.Layer.Root = (_a = class Root extends up.Layer {
4740
4670
  cannotCloseRoot() {
4741
4671
  up.fail('Cannot close the root layer');
4742
4672
  }
4743
- reset() {
4744
- Object.assign(this, this.defaults());
4745
- }
4746
4673
  toString() {
4747
4674
  return "root layer";
4748
4675
  }
@@ -4752,7 +4679,7 @@ up.Layer.Root = (_a = class Root extends up.Layer {
4752
4679
 
4753
4680
 
4754
4681
  /***/ }),
4755
- /* 53 */
4682
+ /* 52 */
4756
4683
  /***/ (() => {
4757
4684
 
4758
4685
  var _a;
@@ -4763,7 +4690,7 @@ up.Layer.Modal = (_a = class Modal extends up.Layer.OverlayWithViewport {
4763
4690
 
4764
4691
 
4765
4692
  /***/ }),
4766
- /* 54 */
4693
+ /* 53 */
4767
4694
  /***/ (() => {
4768
4695
 
4769
4696
  var _a;
@@ -4774,7 +4701,7 @@ up.Layer.Popup = (_a = class Popup extends up.Layer.OverlayWithTether {
4774
4701
 
4775
4702
 
4776
4703
  /***/ }),
4777
- /* 55 */
4704
+ /* 54 */
4778
4705
  /***/ (() => {
4779
4706
 
4780
4707
  var _a;
@@ -4785,7 +4712,7 @@ up.Layer.Drawer = (_a = class Drawer extends up.Layer.OverlayWithViewport {
4785
4712
 
4786
4713
 
4787
4714
  /***/ }),
4788
- /* 56 */
4715
+ /* 55 */
4789
4716
  /***/ (() => {
4790
4717
 
4791
4718
  var _a;
@@ -4796,7 +4723,7 @@ up.Layer.Cover = (_a = class Cover extends up.Layer.OverlayWithViewport {
4796
4723
 
4797
4724
 
4798
4725
  /***/ }),
4799
- /* 57 */
4726
+ /* 56 */
4800
4727
  /***/ (() => {
4801
4728
 
4802
4729
  const u = up.util;
@@ -4886,7 +4813,7 @@ up.LayerLookup = class LayerLookup {
4886
4813
 
4887
4814
 
4888
4815
  /***/ }),
4889
- /* 58 */
4816
+ /* 57 */
4890
4817
  /***/ (() => {
4891
4818
 
4892
4819
  const u = up.util;
@@ -4999,7 +4926,7 @@ up.LayerStack = class LayerStack extends Array {
4999
4926
 
5000
4927
 
5001
4928
  /***/ }),
5002
- /* 59 */
4929
+ /* 58 */
5003
4930
  /***/ (() => {
5004
4931
 
5005
4932
  up.LinkFeedbackURLs = class LinkFeedbackURLs {
@@ -5030,7 +4957,7 @@ up.LinkFeedbackURLs = class LinkFeedbackURLs {
5030
4957
 
5031
4958
 
5032
4959
  /***/ }),
5033
- /* 60 */
4960
+ /* 59 */
5034
4961
  /***/ (() => {
5035
4962
 
5036
4963
  const u = up.util;
@@ -5098,7 +5025,7 @@ up.LinkPreloader = class LinkPreloader {
5098
5025
 
5099
5026
 
5100
5027
  /***/ }),
5101
- /* 61 */
5028
+ /* 60 */
5102
5029
  /***/ (() => {
5103
5030
 
5104
5031
  const u = up.util;
@@ -5194,7 +5121,7 @@ up.MotionController = class MotionController {
5194
5121
 
5195
5122
 
5196
5123
  /***/ }),
5197
- /* 62 */
5124
+ /* 61 */
5198
5125
  /***/ (() => {
5199
5126
 
5200
5127
  const u = up.util;
@@ -5286,7 +5213,7 @@ up.NonceableCallback = class NonceableCallback {
5286
5213
 
5287
5214
 
5288
5215
  /***/ }),
5289
- /* 63 */
5216
+ /* 62 */
5290
5217
  /***/ (() => {
5291
5218
 
5292
5219
  const u = up.util;
@@ -5363,7 +5290,7 @@ up.OptionsParser = class OptionsParser {
5363
5290
 
5364
5291
 
5365
5292
  /***/ }),
5366
- /* 64 */
5293
+ /* 63 */
5367
5294
  /***/ (() => {
5368
5295
 
5369
5296
  const e = up.element;
@@ -5431,7 +5358,7 @@ up.OverlayFocus = class OverlayFocus {
5431
5358
 
5432
5359
 
5433
5360
  /***/ }),
5434
- /* 65 */
5361
+ /* 64 */
5435
5362
  /***/ (() => {
5436
5363
 
5437
5364
  const u = up.util;
@@ -5662,7 +5589,7 @@ up.Params = class Params {
5662
5589
 
5663
5590
 
5664
5591
  /***/ }),
5665
- /* 66 */
5592
+ /* 65 */
5666
5593
  /***/ (() => {
5667
5594
 
5668
5595
  const e = up.element;
@@ -5712,7 +5639,7 @@ up.ProgressBar = class ProgressBar {
5712
5639
 
5713
5640
 
5714
5641
  /***/ }),
5715
- /* 67 */
5642
+ /* 66 */
5716
5643
  /***/ (() => {
5717
5644
 
5718
5645
  const u = up.util;
@@ -5836,7 +5763,7 @@ up.RenderOptions = (function () {
5836
5763
 
5837
5764
 
5838
5765
  /***/ }),
5839
- /* 68 */
5766
+ /* 67 */
5840
5767
  /***/ (() => {
5841
5768
 
5842
5769
  up.RenderResult = class RenderResult extends up.Record {
@@ -5864,7 +5791,7 @@ up.RenderResult = class RenderResult extends up.Record {
5864
5791
 
5865
5792
 
5866
5793
  /***/ }),
5867
- /* 69 */
5794
+ /* 68 */
5868
5795
  /***/ (() => {
5869
5796
 
5870
5797
  var _a;
@@ -5876,7 +5803,7 @@ up.Request = (_a = class Request extends up.Record {
5876
5803
  if (this.wrapMethod == null) {
5877
5804
  this.wrapMethod = up.network.config.wrapMethod;
5878
5805
  }
5879
- this.normalizeForCaching();
5806
+ this.normalize();
5880
5807
  if ((this.target || this.layer || this.origin) && !options.basic) {
5881
5808
  const layerLookupOptions = { origin: this.origin };
5882
5809
  this.layer = up.layer.get(this.layer, layerLookupOptions);
@@ -5888,6 +5815,7 @@ up.Request = (_a = class Request extends up.Record {
5888
5815
  }
5889
5816
  this.deferred = u.newDeferred();
5890
5817
  this.badResponseTime ?? (this.badResponseTime = u.evalOption(up.network.config.badResponseTime, this));
5818
+ this.addAutoHeaders();
5891
5819
  }
5892
5820
  keys() {
5893
5821
  return [
@@ -5899,7 +5827,6 @@ up.Request = (_a = class Request extends up.Record {
5899
5827
  'failTarget',
5900
5828
  'headers',
5901
5829
  'timeout',
5902
- 'preload',
5903
5830
  'background',
5904
5831
  'cache',
5905
5832
  'expireCache',
@@ -5912,11 +5839,12 @@ up.Request = (_a = class Request extends up.Record {
5912
5839
  'failContext',
5913
5840
  'origin',
5914
5841
  'fragments',
5915
- 'queuedAt',
5842
+ 'builtAt',
5916
5843
  'wrapMethod',
5917
5844
  'contentType',
5918
5845
  'payload',
5919
5846
  'onQueued',
5847
+ 'onLoading',
5920
5848
  'fail',
5921
5849
  'abortable',
5922
5850
  'badResponseTime',
@@ -5927,7 +5855,8 @@ up.Request = (_a = class Request extends up.Record {
5927
5855
  state: 'new',
5928
5856
  abortable: true,
5929
5857
  headers: {},
5930
- timeout: up.network.config.timeout
5858
+ timeout: up.network.config.timeout,
5859
+ builtAt: new Date(),
5931
5860
  };
5932
5861
  }
5933
5862
  get xhr() {
@@ -5948,10 +5877,7 @@ up.Request = (_a = class Request extends up.Record {
5948
5877
  get fragment() {
5949
5878
  return this.fragments?.[0];
5950
5879
  }
5951
- followState(sourceRequest) {
5952
- u.delegate(this, ['deferred', 'state', 'preload', 'expired'], () => sourceRequest);
5953
- }
5954
- normalizeForCaching() {
5880
+ normalize() {
5955
5881
  this.method = u.normalizeMethod(this.method);
5956
5882
  this.extractHashFromURL();
5957
5883
  this.transferParamsToURL();
@@ -5998,14 +5924,26 @@ up.Request = (_a = class Request extends up.Record {
5998
5924
  load() {
5999
5925
  if (this.state !== 'new')
6000
5926
  return;
6001
- this.state = 'loading';
6002
- this.expired = false;
6003
- new up.Request.XHRRenderer(this).buildAndSend({
6004
- onload: () => this.onXHRLoad(),
6005
- onerror: () => this.onXHRError(),
6006
- ontimeout: () => this.onXHRTimeout(),
6007
- onabort: () => this.onXHRAbort()
6008
- });
5927
+ if (this.emitLoad()) {
5928
+ this.state = 'loading';
5929
+ this.normalize();
5930
+ this.onLoading?.();
5931
+ this.expired = false;
5932
+ new up.Request.XHRRenderer(this).buildAndSend({
5933
+ onload: () => this.onXHRLoad(),
5934
+ onerror: () => this.onXHRError(),
5935
+ ontimeout: () => this.onXHRTimeout(),
5936
+ onabort: () => this.onXHRAbort()
5937
+ });
5938
+ return true;
5939
+ }
5940
+ else {
5941
+ this.abort({ reason: 'Prevented by event listener' });
5942
+ }
5943
+ }
5944
+ emitLoad() {
5945
+ let event = this.emit('up:request:load', { log: ['Loading %s', this.description] });
5946
+ return !event.defaultPrevented;
6009
5947
  }
6010
5948
  loadPage() {
6011
5949
  up.network.abort();
@@ -6049,18 +5987,19 @@ up.Request = (_a = class Request extends up.Record {
6049
5987
  this.emit('up:request:offline', { log: message });
6050
5988
  }
6051
5989
  respondWith(response) {
6052
- if (this.state !== 'loading')
5990
+ this.response = response;
5991
+ if (this.isSettled())
6053
5992
  return;
6054
5993
  this.state = 'loaded';
6055
5994
  if (response.ok) {
6056
- return this.deferred.resolve(response);
5995
+ this.deferred.resolve(response);
6057
5996
  }
6058
5997
  else {
6059
- return this.deferred.reject(response);
5998
+ this.deferred.reject(response);
6060
5999
  }
6061
6000
  }
6062
6001
  isSettled() {
6063
- return (this.state !== 'new') && (this.state !== 'loading');
6002
+ return (this.state !== 'new') && (this.state !== 'loading') && (this.state !== 'tracking');
6064
6003
  }
6065
6004
  csrfHeader() {
6066
6005
  return up.protocol.csrfHeader();
@@ -6107,24 +6046,6 @@ up.Request = (_a = class Request extends up.Record {
6107
6046
  }
6108
6047
  return new up.Response(responseAttrs);
6109
6048
  }
6110
- cacheKey() {
6111
- return JSON.stringify([
6112
- this.method,
6113
- this.url,
6114
- this.params.toQuery(),
6115
- this.metaProps()
6116
- ]);
6117
- }
6118
- metaProps() {
6119
- const props = {};
6120
- for (let key of u.evalOption(up.network.config.requestMetaKeys, this)) {
6121
- const value = this[key];
6122
- if (u.isGiven(value)) {
6123
- props[key] = value;
6124
- }
6125
- }
6126
- return props;
6127
- }
6128
6049
  buildEventEmitter(args) {
6129
6050
  return up.EventEmitter.fromEmitArgs(args, {
6130
6051
  layer: this.layer,
@@ -6150,9 +6071,27 @@ up.Request = (_a = class Request extends up.Record {
6150
6071
  return u.some(subtreeElements, (subtreeElement) => subtreeElement.contains(fragment));
6151
6072
  });
6152
6073
  }
6153
- get queueAge() {
6154
- const now = new Date();
6155
- return now - this.queuedAt;
6074
+ get age() {
6075
+ return new Date() - this.builtAt;
6076
+ }
6077
+ header(name) {
6078
+ return this.headers[name];
6079
+ }
6080
+ addAutoHeaders() {
6081
+ for (let key of ['target', 'failTarget', 'mode', 'failMode', 'context', 'failContext']) {
6082
+ this.addAutoHeader(up.protocol.headerize(key), this[key]);
6083
+ }
6084
+ let csrfHeader, csrfToken;
6085
+ if ((csrfHeader = this.csrfHeader()) && (csrfToken = this.csrfToken())) {
6086
+ this.addAutoHeader(csrfHeader, csrfToken);
6087
+ }
6088
+ this.addAutoHeader(up.protocol.headerize('version'), up.version);
6089
+ }
6090
+ addAutoHeader(name, value) {
6091
+ if (u.isOptions(value) || u.isArray(value)) {
6092
+ value = u.safeStringifyJSON(value);
6093
+ }
6094
+ this.headers[name] = value;
6156
6095
  }
6157
6096
  static tester(condition, { except } = {}) {
6158
6097
  let testFn;
@@ -6170,8 +6109,7 @@ up.Request = (_a = class Request extends up.Record {
6170
6109
  testFn = (_request) => condition;
6171
6110
  }
6172
6111
  if (except) {
6173
- let exceptCacheKey = except.cacheKey();
6174
- return (request) => (request.cacheKey() !== exceptCacheKey) && testFn(request);
6112
+ return (request) => !up.cache.willHaveSameResponse(request, except) && testFn(request);
6175
6113
  }
6176
6114
  else {
6177
6115
  return testFn;
@@ -6185,39 +6123,144 @@ up.Request = (_a = class Request extends up.Record {
6185
6123
 
6186
6124
 
6187
6125
  /***/ }),
6188
- /* 70 */
6126
+ /* 69 */
6189
6127
  /***/ (() => {
6190
6128
 
6191
- let u = up.util;
6192
- up.Request.Cache = class Cache extends up.Cache {
6193
- maxSize() {
6129
+ const u = up.util;
6130
+ up.Request.Cache = class Cache {
6131
+ constructor() {
6132
+ this.reset();
6133
+ }
6134
+ reset() {
6135
+ this.varyInfo = {};
6136
+ this.map = new Map();
6137
+ }
6138
+ cacheKey(request) {
6139
+ let influencingHeaders = this.getPreviousInfluencingHeaders(request);
6140
+ let varyPart = u.flatMap(influencingHeaders, (headerName) => [headerName, request.header(headerName)]);
6141
+ return [request.description, ...varyPart].join(':');
6142
+ }
6143
+ getPreviousInfluencingHeaders(request) {
6144
+ var _a, _b;
6145
+ return ((_a = this.varyInfo)[_b = request.description] || (_a[_b] = new Set()));
6146
+ }
6147
+ get(request) {
6148
+ request = this.wrap(request);
6149
+ let cacheKey = this.cacheKey(request);
6150
+ let cachedRequest = this.map.get(cacheKey);
6151
+ if (cachedRequest) {
6152
+ if (this.isUsable(cachedRequest)) {
6153
+ return cachedRequest;
6154
+ }
6155
+ else {
6156
+ this.map.delete(cacheKey);
6157
+ }
6158
+ }
6159
+ }
6160
+ get capacity() {
6194
6161
  return up.network.config.cacheSize;
6195
6162
  }
6196
- evictAge() {
6197
- return up.network.config.cacheEvictAge;
6163
+ isUsable(request) {
6164
+ return request.age < up.network.config.cacheEvictAge;
6165
+ }
6166
+ async put(request) {
6167
+ request = this.wrap(request);
6168
+ this.makeRoom();
6169
+ let cacheKey = this.updateCacheKey(request);
6170
+ this.map.set(cacheKey, request);
6198
6171
  }
6199
- normalizeStoreKey(request) {
6200
- return u.wrapValue(up.Request, request).cacheKey();
6172
+ updateCacheKey(request) {
6173
+ let oldCacheKey = this.cacheKey(request);
6174
+ let { response } = request;
6175
+ if (response) {
6176
+ this.mergePreviousHeaderNames(request, response);
6177
+ let newCacheKey = this.cacheKey(request);
6178
+ this.renameMapKey(oldCacheKey, newCacheKey);
6179
+ return newCacheKey;
6180
+ }
6181
+ else {
6182
+ return oldCacheKey;
6183
+ }
6184
+ }
6185
+ renameMapKey(oldKey, newKey) {
6186
+ if (oldKey !== newKey && this.map.has(oldKey)) {
6187
+ this.map.set(newKey, this.map.get(oldKey));
6188
+ this.map.delete(oldKey);
6189
+ }
6190
+ }
6191
+ mergePreviousHeaderNames(request, response) {
6192
+ let headersInfluencingResponse = response.ownInfluncingHeaders;
6193
+ if (headersInfluencingResponse.length) {
6194
+ let previousInfluencingHeaders = this.getPreviousInfluencingHeaders(request);
6195
+ for (let headerName of headersInfluencingResponse) {
6196
+ previousInfluencingHeaders.add(headerName);
6197
+ }
6198
+ }
6199
+ }
6200
+ alias(existingCachedRequest, newRequest) {
6201
+ existingCachedRequest = this.wrap(existingCachedRequest);
6202
+ newRequest = this.wrap(newRequest);
6203
+ this.track(existingCachedRequest, newRequest, { force: true });
6204
+ this.put(newRequest);
6205
+ return newRequest;
6206
+ }
6207
+ async track(existingRequest, newRequest, options = {}) {
6208
+ newRequest.trackedRequest = existingRequest;
6209
+ newRequest.state = 'tracking';
6210
+ let value = await u.always(existingRequest);
6211
+ if (value instanceof up.Response) {
6212
+ if (options.force || this.isCacheCompatible(existingRequest, newRequest)) {
6213
+ newRequest.fromCache = true;
6214
+ newRequest.respondWith(value);
6215
+ u.delegate(newRequest, ['expired', 'state'], () => existingRequest);
6216
+ }
6217
+ else {
6218
+ delete newRequest.trackedRequest;
6219
+ newRequest.state = 'new';
6220
+ options.onIncompatible?.(newRequest);
6221
+ }
6222
+ }
6223
+ else {
6224
+ newRequest.state = existingRequest.state;
6225
+ newRequest.deferred.reject(value);
6226
+ }
6227
+ }
6228
+ willHaveSameResponse(existingRequest, newRequest) {
6229
+ return existingRequest === newRequest || existingRequest === newRequest.trackedRequest;
6230
+ }
6231
+ delete(request) {
6232
+ request = this.wrap(request);
6233
+ let cacheKey = this.cacheKey(request);
6234
+ this.map.delete(cacheKey);
6201
6235
  }
6202
6236
  evict(condition = true, testerOptions) {
6203
- this.eachMatch(condition, testerOptions, ({ key }) => this.map.delete(key));
6237
+ this.eachMatch(condition, testerOptions, (request) => this.delete(request));
6204
6238
  }
6205
6239
  expire(condition = true, testerOptions) {
6206
- this.eachMatch(condition, testerOptions, ({ value: request }) => request.expired = true);
6240
+ this.eachMatch(condition, testerOptions, (request) => request.expired = true);
6241
+ }
6242
+ makeRoom() {
6243
+ while (this.map.size >= this.capacity) {
6244
+ let oldestKey = this.map.keys().next().value;
6245
+ this.map.delete(oldestKey);
6246
+ }
6207
6247
  }
6208
6248
  eachMatch(condition = true, testerOptions, fn) {
6209
6249
  let tester = up.Request.tester(condition, testerOptions);
6210
- for (let record of this.records()) {
6211
- if (tester(record.value)) {
6212
- fn(record);
6213
- }
6214
- }
6250
+ let results = u.filter(this.map.values(), tester);
6251
+ u.each(results, fn);
6252
+ }
6253
+ isCacheCompatible(request1, request2) {
6254
+ return this.cacheKey(request1) === this.cacheKey(request2);
6255
+ }
6256
+ wrap(requestOrOptions) {
6257
+ return u.wrapValue(up.Request, requestOrOptions);
6215
6258
  }
6216
6259
  };
6217
6260
 
6218
6261
 
6219
6262
  /***/ }),
6220
- /* 71 */
6263
+ /* 70 */
6221
6264
  /***/ (() => {
6222
6265
 
6223
6266
  const u = up.util;
@@ -6236,7 +6279,6 @@ up.Request.Queue = class Queue {
6236
6279
  asap(request) {
6237
6280
  request.runQueuedCallbacks();
6238
6281
  u.always(request, responseOrError => this.onRequestSettled(request, responseOrError));
6239
- request.queuedAt = new Date();
6240
6282
  this.scheduleSlowTimer(request);
6241
6283
  this.queueRequest(request);
6242
6284
  u.microtask(() => this.poke());
@@ -6248,7 +6290,7 @@ up.Request.Queue = class Queue {
6248
6290
  }
6249
6291
  }
6250
6292
  scheduleSlowTimer(request) {
6251
- let timeUntilLate = Math.max(request.badResponseTime - request.queueAge, 0);
6293
+ let timeUntilLate = Math.max(request.badResponseTime - request.age, 0);
6252
6294
  u.timer(timeUntilLate, () => this.checkLate());
6253
6295
  }
6254
6296
  getMaxConcurrency() {
@@ -6270,13 +6312,8 @@ up.Request.Queue = class Queue {
6270
6312
  return u.remove(this.queuedRequests, request);
6271
6313
  }
6272
6314
  sendRequestNow(request) {
6273
- if (request.emit('up:request:load', { log: ['Loading %s %s', request.method, request.url] }).defaultPrevented) {
6274
- request.abort({ reason: 'Prevented by event listener' });
6275
- }
6276
- else {
6277
- request.normalizeForCaching();
6315
+ if (request.load()) {
6278
6316
  this.currentRequests.push(request);
6279
- request.load();
6280
6317
  }
6281
6318
  }
6282
6319
  onRequestSettled(request, responseOrError) {
@@ -6325,13 +6362,13 @@ up.Request.Queue = class Queue {
6325
6362
  isLate() {
6326
6363
  const allForegroundRequests = u.reject(this.allRequests, 'background');
6327
6364
  const timerTolerance = 1;
6328
- return u.some(allForegroundRequests, request => request.queueAge >= (request.badResponseTime - timerTolerance));
6365
+ return u.some(allForegroundRequests, (request) => request.age >= (request.badResponseTime - timerTolerance));
6329
6366
  }
6330
6367
  };
6331
6368
 
6332
6369
 
6333
6370
  /***/ }),
6334
- /* 72 */
6371
+ /* 71 */
6335
6372
  /***/ (() => {
6336
6373
 
6337
6374
  const u = up.util;
@@ -6370,7 +6407,7 @@ up.Request.FormRenderer = class FormRenderer {
6370
6407
 
6371
6408
 
6372
6409
  /***/ }),
6373
- /* 73 */
6410
+ /* 72 */
6374
6411
  /***/ (() => {
6375
6412
 
6376
6413
  var _a;
@@ -6388,21 +6425,13 @@ up.Request.XHRRenderer = (_a = class XHRRenderer {
6388
6425
  xhr.timeout = this.request.timeout;
6389
6426
  }
6390
6427
  xhr.open(this.getMethod(), this.request.url);
6391
- const metaProps = this.request.metaProps();
6392
- for (let key in metaProps) {
6393
- this.addHeader(xhr, up.protocol.headerize(key), metaProps[key]);
6394
- }
6395
- for (let header in this.request.headers) {
6396
- this.addHeader(xhr, header, this.request.headers[header]);
6397
- }
6398
- let csrfHeader, csrfToken;
6399
- if ((csrfHeader = this.request.csrfHeader()) && (csrfToken = this.request.csrfToken())) {
6400
- this.addHeader(xhr, csrfHeader, csrfToken);
6401
- }
6402
- this.addHeader(xhr, up.protocol.headerize('version'), up.version);
6403
6428
  let contentType = this.getContentType();
6404
6429
  if (contentType) {
6405
- this.addHeader(xhr, 'Content-Type', contentType);
6430
+ xhr.setRequestHeader('Content-Type', contentType);
6431
+ }
6432
+ for (let headerName in this.request.headers) {
6433
+ let headerValue = this.request.headers[headerName];
6434
+ xhr.setRequestHeader(headerName, headerValue);
6406
6435
  }
6407
6436
  Object.assign(xhr, handlers);
6408
6437
  xhr.send(this.getPayload());
@@ -6424,12 +6453,6 @@ up.Request.XHRRenderer = (_a = class XHRRenderer {
6424
6453
  this.finalizePayload();
6425
6454
  return this.payload;
6426
6455
  }
6427
- addHeader(xhr, header, value) {
6428
- if (u.isOptions(value) || u.isArray(value)) {
6429
- value = JSON.stringify(value);
6430
- }
6431
- xhr.setRequestHeader(header, value);
6432
- }
6433
6456
  finalizePayload() {
6434
6457
  this.payload = this.request.payload;
6435
6458
  this.contentType = this.request.contentType;
@@ -6456,7 +6479,7 @@ up.Request.XHRRenderer = (_a = class XHRRenderer {
6456
6479
 
6457
6480
 
6458
6481
  /***/ }),
6459
- /* 74 */
6482
+ /* 73 */
6460
6483
  /***/ (() => {
6461
6484
 
6462
6485
  const u = up.util;
@@ -6494,6 +6517,10 @@ up.Response = class Response extends up.Record {
6494
6517
  header(name) {
6495
6518
  return this.headers[name] || this.xhr?.getResponseHeader(name);
6496
6519
  }
6520
+ get ownInfluncingHeaders() {
6521
+ let influencingHeaders = up.protocol.influencingHeadersFromResponse(this);
6522
+ return u.filter(influencingHeaders, (headerName) => this.request.header(headerName));
6523
+ }
6497
6524
  get contentType() {
6498
6525
  return this.header('Content-Type');
6499
6526
  }
@@ -6527,7 +6554,7 @@ up.Response = class Response extends up.Record {
6527
6554
 
6528
6555
 
6529
6556
  /***/ }),
6530
- /* 75 */
6557
+ /* 74 */
6531
6558
  /***/ (() => {
6532
6559
 
6533
6560
  var _a;
@@ -6535,12 +6562,13 @@ const u = up.util;
6535
6562
  const e = up.element;
6536
6563
  up.ResponseDoc = (_a = class ResponseDoc {
6537
6564
  constructor(options) {
6538
- this.noscriptWrapper = new up.HTMLWrapper('noscript');
6539
- this.scriptWrapper = new up.HTMLWrapper('script');
6540
6565
  this.root =
6541
6566
  this.parseDocument(options) ||
6542
6567
  this.parseFragment(options) ||
6543
6568
  this.parseContent(options);
6569
+ if (!up.fragment.config.runScripts) {
6570
+ this.root.querySelectorAll('script').forEach((e) => e.remove());
6571
+ }
6544
6572
  this.cspNonces = options.cspNonces;
6545
6573
  if (options.origin) {
6546
6574
  let originSelector = up.fragment.tryToTarget(options.origin);
@@ -6550,7 +6578,11 @@ up.ResponseDoc = (_a = class ResponseDoc {
6550
6578
  }
6551
6579
  }
6552
6580
  parseDocument(options) {
6553
- return this.parse(options.document, e.createDocumentFromHTML);
6581
+ let document = this.parse(options.document, e.createBrokenDocumentFromHTML);
6582
+ if (document) {
6583
+ this.scriptishNeedFix = true;
6584
+ return document;
6585
+ }
6554
6586
  }
6555
6587
  parseContent(options) {
6556
6588
  let content = options.content || '';
@@ -6558,7 +6590,6 @@ up.ResponseDoc = (_a = class ResponseDoc {
6558
6590
  target = u.map(up.fragment.parseTargetSteps(target), 'selector').join(',');
6559
6591
  const matchingElement = e.createFromSelector(target);
6560
6592
  if (u.isString(content)) {
6561
- content = this.wrapHTML(content);
6562
6593
  matchingElement.innerHTML = content;
6563
6594
  }
6564
6595
  else {
@@ -6571,7 +6602,6 @@ up.ResponseDoc = (_a = class ResponseDoc {
6571
6602
  }
6572
6603
  parse(value, parseFn = e.createFromHTML) {
6573
6604
  if (u.isString(value)) {
6574
- value = this.wrapHTML(value);
6575
6605
  value = parseFn(value);
6576
6606
  }
6577
6607
  return value;
@@ -6579,18 +6609,8 @@ up.ResponseDoc = (_a = class ResponseDoc {
6579
6609
  rootSelector() {
6580
6610
  return up.fragment.toTarget(this.root);
6581
6611
  }
6582
- wrapHTML(html) {
6583
- html = this.noscriptWrapper.wrap(html);
6584
- if (up.fragment.config.runScripts) {
6585
- html = this.scriptWrapper.wrap(html);
6586
- }
6587
- else {
6588
- html = this.scriptWrapper.strip(html);
6589
- }
6590
- return html;
6591
- }
6592
6612
  getTitle() {
6593
- return this.root.querySelector("head title")?.textContent;
6613
+ return this.root.querySelector('head title')?.textContent;
6594
6614
  }
6595
6615
  select(selector) {
6596
6616
  let finder = new up.FragmentFinder({
@@ -6601,9 +6621,10 @@ up.ResponseDoc = (_a = class ResponseDoc {
6601
6621
  return finder.find();
6602
6622
  }
6603
6623
  finalizeElement(element) {
6604
- this.noscriptWrapper.unwrap(element);
6605
6624
  up.NonceableCallback.adoptNonces(element, this.cspNonces);
6606
- this.scriptWrapper.unwrap(element);
6625
+ if (this.scriptishNeedFix) {
6626
+ element.querySelectorAll('noscript, script').forEach(e.fixScriptish);
6627
+ }
6607
6628
  }
6608
6629
  },
6609
6630
  (() => {
@@ -6613,7 +6634,7 @@ up.ResponseDoc = (_a = class ResponseDoc {
6613
6634
 
6614
6635
 
6615
6636
  /***/ }),
6616
- /* 76 */
6637
+ /* 75 */
6617
6638
  /***/ (() => {
6618
6639
 
6619
6640
  const e = up.element;
@@ -6707,7 +6728,7 @@ up.RevealMotion = class RevealMotion {
6707
6728
 
6708
6729
 
6709
6730
  /***/ }),
6710
- /* 77 */
6731
+ /* 76 */
6711
6732
  /***/ (() => {
6712
6733
 
6713
6734
  const u = up.util;
@@ -6748,7 +6769,7 @@ up.Selector = class Selector {
6748
6769
 
6749
6770
 
6750
6771
  /***/ }),
6751
- /* 78 */
6772
+ /* 77 */
6752
6773
  /***/ (() => {
6753
6774
 
6754
6775
  const u = up.util;
@@ -6868,7 +6889,7 @@ up.Tether = class Tether {
6868
6889
 
6869
6890
 
6870
6891
  /***/ }),
6871
- /* 79 */
6892
+ /* 78 */
6872
6893
  /***/ (() => {
6873
6894
 
6874
6895
  const u = up.util;
@@ -6948,7 +6969,7 @@ up.URLPattern = class URLPattern {
6948
6969
 
6949
6970
 
6950
6971
  /***/ }),
6951
- /* 80 */
6972
+ /* 79 */
6952
6973
  /***/ (() => {
6953
6974
 
6954
6975
  up.framework = (function () {
@@ -7032,7 +7053,7 @@ up.boot = up.framework.boot;
7032
7053
 
7033
7054
 
7034
7055
  /***/ }),
7035
- /* 81 */
7056
+ /* 80 */
7036
7057
  /***/ (() => {
7037
7058
 
7038
7059
  up.event = (function () {
@@ -7135,7 +7156,7 @@ up.emit = up.event.emit;
7135
7156
 
7136
7157
 
7137
7158
  /***/ }),
7138
- /* 82 */
7159
+ /* 81 */
7139
7160
  /***/ (() => {
7140
7161
 
7141
7162
  up.protocol = (function () {
@@ -7151,6 +7172,9 @@ up.protocol = (function () {
7151
7172
  return parseFn(value);
7152
7173
  }
7153
7174
  };
7175
+ function targetFromXHR(xhr) {
7176
+ return extractHeader(xhr, 'target');
7177
+ }
7154
7178
  function parseModifyCacheValue(value) {
7155
7179
  if (value === 'false') {
7156
7180
  return false;
@@ -7171,6 +7195,9 @@ up.protocol = (function () {
7171
7195
  function methodFromXHR(xhr) {
7172
7196
  return extractHeader(xhr, 'method', u.normalizeMethod);
7173
7197
  }
7198
+ function titleFromXHR(xhr) {
7199
+ return up.migrate.titleFromXHR?.(xhr) ?? extractHeader(xhr, 'title', JSON.parse);
7200
+ }
7174
7201
  function eventPlansFromXHR(xhr) {
7175
7202
  return extractHeader(xhr, 'events', JSON.parse);
7176
7203
  }
@@ -7186,11 +7213,9 @@ up.protocol = (function () {
7186
7213
  function locationFromXHR(xhr) {
7187
7214
  return extractHeader(xhr, 'location') || xhr.responseURL;
7188
7215
  }
7189
- function titleFromXHR(xhr) {
7190
- return extractHeader(xhr, 'title');
7191
- }
7192
- function targetFromXHR(xhr) {
7193
- return extractHeader(xhr, 'target');
7216
+ function influencingHeadersFromResponse(response) {
7217
+ let varyHeaderValue = response.header('Vary');
7218
+ return u.parseTokens(varyHeaderValue, { separator: 'comma' });
7194
7219
  }
7195
7220
  const config = new up.Config(() => ({
7196
7221
  methodParam: '_method',
@@ -7266,12 +7291,13 @@ up.protocol = (function () {
7266
7291
  headerize,
7267
7292
  wrapMethod,
7268
7293
  cspNoncesFromHeader,
7294
+ influencingHeadersFromResponse,
7269
7295
  };
7270
7296
  })();
7271
7297
 
7272
7298
 
7273
7299
  /***/ }),
7274
- /* 83 */
7300
+ /* 82 */
7275
7301
  /***/ (() => {
7276
7302
 
7277
7303
  up.log = (function () {
@@ -7357,7 +7383,7 @@ up.warn = up.log.warn;
7357
7383
 
7358
7384
 
7359
7385
  /***/ }),
7360
- /* 84 */
7386
+ /* 83 */
7361
7387
  /***/ (() => {
7362
7388
 
7363
7389
  up.syntax = (function () {
@@ -7507,7 +7533,7 @@ up.hello = up.syntax.hello;
7507
7533
 
7508
7534
 
7509
7535
  /***/ }),
7510
- /* 85 */
7536
+ /* 84 */
7511
7537
  /***/ (() => {
7512
7538
 
7513
7539
  up.history = (function () {
@@ -7576,7 +7602,7 @@ up.history = (function () {
7576
7602
  }
7577
7603
  function restoreStateOnPop(state) {
7578
7604
  if (!state?.up) {
7579
- up.puts('pop', 'Ignoring a history state not owned by Unpoly');
7605
+ up.puts('popstate', 'Ignoring a history state not owned by Unpoly');
7580
7606
  return;
7581
7607
  }
7582
7608
  let location = currentLocation();
@@ -7643,10 +7669,10 @@ up.history = (function () {
7643
7669
 
7644
7670
 
7645
7671
  /***/ }),
7646
- /* 86 */
7672
+ /* 85 */
7647
7673
  /***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => {
7648
7674
 
7649
- __webpack_require__(87);
7675
+ __webpack_require__(86);
7650
7676
  const u = up.util;
7651
7677
  const e = up.element;
7652
7678
  up.fragment = (function () {
@@ -7697,7 +7723,7 @@ up.fragment = (function () {
7697
7723
  autoRevalidate: (response) => response.expired,
7698
7724
  skipResponse: defaultSkipResponse
7699
7725
  }));
7700
- u.delegate(config, 'mainTargets', () => up.layer.config.any);
7726
+ u.delegate(config, ['mainTargets'], () => up.layer.config.any);
7701
7727
  function reset() {
7702
7728
  config.reset();
7703
7729
  }
@@ -8163,11 +8189,11 @@ up.destroy = up.fragment.destroy;
8163
8189
  up.render = up.fragment.render;
8164
8190
  up.navigate = up.fragment.navigate;
8165
8191
  up.visit = up.fragment.visit;
8166
- u.delegate(up, 'context', () => up.layer.current);
8192
+ u.delegate(up, ['context'], () => up.layer.current);
8167
8193
 
8168
8194
 
8169
8195
  /***/ }),
8170
- /* 87 */
8196
+ /* 86 */
8171
8197
  /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
8172
8198
 
8173
8199
  "use strict";
@@ -8176,10 +8202,10 @@ __webpack_require__.r(__webpack_exports__);
8176
8202
 
8177
8203
 
8178
8204
  /***/ }),
8179
- /* 88 */
8205
+ /* 87 */
8180
8206
  /***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => {
8181
8207
 
8182
- __webpack_require__(89);
8208
+ __webpack_require__(88);
8183
8209
  up.viewport = (function () {
8184
8210
  const u = up.util;
8185
8211
  const e = up.element;
@@ -8361,7 +8387,7 @@ up.viewport = (function () {
8361
8387
  }
8362
8388
  }
8363
8389
  function newStateCache() {
8364
- return new up.Cache({ size: 30, key: up.history.normalizeURL });
8390
+ return new up.FIFOCache({ capacity: 30, normalizeKey: up.history.normalizeURL });
8365
8391
  }
8366
8392
  function parseOptions(args) {
8367
8393
  const options = u.copy(u.extractOptions(args));
@@ -8499,7 +8525,7 @@ up.reveal = up.viewport.reveal;
8499
8525
 
8500
8526
 
8501
8527
  /***/ }),
8502
- /* 89 */
8528
+ /* 88 */
8503
8529
  /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
8504
8530
 
8505
8531
  "use strict";
@@ -8508,7 +8534,7 @@ __webpack_require__.r(__webpack_exports__);
8508
8534
 
8509
8535
 
8510
8536
  /***/ }),
8511
- /* 90 */
8537
+ /* 89 */
8512
8538
  /***/ (() => {
8513
8539
 
8514
8540
  up.motion = (function () {
@@ -8763,10 +8789,10 @@ up.animate = up.motion.animate;
8763
8789
 
8764
8790
 
8765
8791
  /***/ }),
8766
- /* 91 */
8792
+ /* 90 */
8767
8793
  /***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => {
8768
8794
 
8769
- __webpack_require__(92);
8795
+ __webpack_require__(91);
8770
8796
  const u = up.util;
8771
8797
  up.network = (function () {
8772
8798
  const config = new up.Config(() => ({
@@ -8782,7 +8808,6 @@ up.network = (function () {
8782
8808
  autoCache(request) { return request.isSafe(); },
8783
8809
  expireCache(request, _response) { return !request.isSafe(); },
8784
8810
  evictCache: false,
8785
- requestMetaKeys: ['target', 'failTarget', 'mode', 'failMode', 'context', 'failContext'],
8786
8811
  progressBar: true,
8787
8812
  timeout: 90000,
8788
8813
  }));
@@ -8793,14 +8818,14 @@ up.network = (function () {
8793
8818
  abortRequests();
8794
8819
  queue.reset();
8795
8820
  config.reset();
8796
- cache.evict();
8821
+ cache.reset();
8797
8822
  progressBar?.destroy();
8798
8823
  progressBar = null;
8799
8824
  }
8800
8825
  function makeRequest(...args) {
8801
8826
  const options = parseRequestOptions(args);
8802
8827
  const request = new up.Request(options);
8803
- useCachedRequest(request) || queueRequest(request);
8828
+ processRequest(request);
8804
8829
  return request;
8805
8830
  }
8806
8831
  function parseRequestOptions(args) {
@@ -8811,31 +8836,31 @@ up.network = (function () {
8811
8836
  up.migrate.handleRequestOptions?.(options);
8812
8837
  return options;
8813
8838
  }
8814
- function useCachedRequest(request) {
8839
+ function processRequest(request) {
8840
+ useCachedRequest(request) || queueRequest(request);
8841
+ }
8842
+ function useCachedRequest(newRequest) {
8815
8843
  let cachedRequest;
8816
- if (request.willCache() && (cachedRequest = cache.get(request))) {
8817
- up.puts('up.request()', 'Re-using previous request to %s %s', request.method, request.url);
8818
- if (!request.preload) {
8844
+ if (newRequest.willCache() && (cachedRequest = cache.get(newRequest))) {
8845
+ up.puts('up.request()', 'Re-using previous request to %s', newRequest.description);
8846
+ if (!newRequest.background) {
8819
8847
  queue.promoteToForeground(cachedRequest);
8820
8848
  }
8821
- request.followState(cachedRequest);
8822
- request.fromCache = true;
8849
+ cache.track(cachedRequest, newRequest, { onIncompatible: processRequest });
8823
8850
  return true;
8824
8851
  }
8825
8852
  }
8826
8853
  function queueRequest(request) {
8827
- if (request.preload && !request.isSafe()) {
8828
- up.fail('Will not preload request to %s', request.description);
8829
- }
8830
8854
  handleCaching(request);
8831
8855
  queue.asap(request);
8832
8856
  return true;
8833
8857
  }
8834
8858
  function handleCaching(request) {
8835
8859
  if (request.willCache()) {
8836
- cache.set(request, request);
8860
+ cache.put(request);
8861
+ request.onLoading = () => cache.put(request);
8837
8862
  }
8838
- return u.always(request, function (response) {
8863
+ u.always(request, function (response) {
8839
8864
  let expireCache = response.expireCache ?? request.expireCache ?? u.evalOption(config.expireCache, request, response);
8840
8865
  if (expireCache) {
8841
8866
  cache.expire(expireCache, { except: request });
@@ -8845,7 +8870,7 @@ up.network = (function () {
8845
8870
  cache.evict(evictCache, { except: request });
8846
8871
  }
8847
8872
  if (cache.get(request)) {
8848
- cache.set(request, request);
8873
+ cache.put(request);
8849
8874
  }
8850
8875
  if (!response.ok) {
8851
8876
  cache.evict(request);
@@ -8910,7 +8935,7 @@ up.cache = up.network.cache;
8910
8935
 
8911
8936
 
8912
8937
  /***/ }),
8913
- /* 92 */
8938
+ /* 91 */
8914
8939
  /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
8915
8940
 
8916
8941
  "use strict";
@@ -8919,10 +8944,10 @@ __webpack_require__.r(__webpack_exports__);
8919
8944
 
8920
8945
 
8921
8946
  /***/ }),
8922
- /* 93 */
8947
+ /* 92 */
8923
8948
  /***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => {
8924
8949
 
8925
- __webpack_require__(94);
8950
+ __webpack_require__(93);
8926
8951
  const u = up.util;
8927
8952
  const e = up.element;
8928
8953
  up.layer = (function () {
@@ -9163,7 +9188,7 @@ up.layer = (function () {
9163
9188
 
9164
9189
 
9165
9190
  /***/ }),
9166
- /* 94 */
9191
+ /* 93 */
9167
9192
  /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
9168
9193
 
9169
9194
  "use strict";
@@ -9172,10 +9197,10 @@ __webpack_require__.r(__webpack_exports__);
9172
9197
 
9173
9198
 
9174
9199
  /***/ }),
9175
- /* 95 */
9200
+ /* 94 */
9176
9201
  /***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => {
9177
9202
 
9178
- __webpack_require__(96);
9203
+ __webpack_require__(95);
9179
9204
  up.link = (function () {
9180
9205
  const u = up.util;
9181
9206
  const e = up.element;
@@ -9323,8 +9348,9 @@ up.link = (function () {
9323
9348
  }
9324
9349
  function preload(link, options) {
9325
9350
  link = up.fragment.get(link);
9326
- if (!shouldPreload()) {
9327
- return Promise.reject(new up.Error('Link preloading is disabled'));
9351
+ let issue = preloadIssue(link);
9352
+ if (issue) {
9353
+ return Promise.reject(new up.Error(issue));
9328
9354
  }
9329
9355
  const guardEvent = up.event.build('up:link:preload', { log: ['Preloading link %o', link] });
9330
9356
  return follow(link, {
@@ -9334,10 +9360,15 @@ up.link = (function () {
9334
9360
  preload: true
9335
9361
  });
9336
9362
  }
9337
- function shouldPreload() {
9338
- let goodConnection = u.negate(up.network.shouldReduceRequests);
9339
- return u.evalAutoOption(config.preloadEnabled, goodConnection);
9363
+ function preloadIssue(link) {
9364
+ if (!u.evalAutoOption(config.preloadEnabled, autoPreloadEnabled, link)) {
9365
+ return 'Preloading is disabled';
9366
+ }
9367
+ else if (!isSafe(link)) {
9368
+ return 'Will not preload an unsafe link';
9369
+ }
9340
9370
  }
9371
+ const autoPreloadEnabled = u.negate(up.network.shouldReduceRequests);
9341
9372
  function followMethod(link, options = {}) {
9342
9373
  return u.normalizeMethod(options.method || link.getAttribute('up-method') || link.getAttribute('data-method'));
9343
9374
  }
@@ -9464,7 +9495,7 @@ up.follow = up.link.follow;
9464
9495
 
9465
9496
 
9466
9497
  /***/ }),
9467
- /* 96 */
9498
+ /* 95 */
9468
9499
  /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
9469
9500
 
9470
9501
  "use strict";
@@ -9473,7 +9504,7 @@ __webpack_require__.r(__webpack_exports__);
9473
9504
 
9474
9505
 
9475
9506
  /***/ }),
9476
- /* 97 */
9507
+ /* 96 */
9477
9508
  /***/ (() => {
9478
9509
 
9479
9510
  up.form = (function () {
@@ -9871,7 +9902,7 @@ up.validate = up.form.validate;
9871
9902
 
9872
9903
 
9873
9904
  /***/ }),
9874
- /* 98 */
9905
+ /* 97 */
9875
9906
  /***/ (() => {
9876
9907
 
9877
9908
  up.feedback = (function () {
@@ -9988,7 +10019,7 @@ up.feedback = (function () {
9988
10019
 
9989
10020
 
9990
10021
  /***/ }),
9991
- /* 99 */
10022
+ /* 98 */
9992
10023
  /***/ (() => {
9993
10024
 
9994
10025
  up.radio = (function () {
@@ -10065,7 +10096,7 @@ up.radio = (function () {
10065
10096
 
10066
10097
 
10067
10098
  /***/ }),
10068
- /* 100 */
10099
+ /* 99 */
10069
10100
  /***/ (() => {
10070
10101
 
10071
10102
  (function () {
@@ -10214,16 +10245,15 @@ __webpack_require__(82);
10214
10245
  __webpack_require__(83);
10215
10246
  __webpack_require__(84);
10216
10247
  __webpack_require__(85);
10217
- __webpack_require__(86);
10218
- __webpack_require__(88);
10248
+ __webpack_require__(87);
10249
+ __webpack_require__(89);
10219
10250
  __webpack_require__(90);
10220
- __webpack_require__(91);
10221
- __webpack_require__(93);
10222
- __webpack_require__(95);
10251
+ __webpack_require__(92);
10252
+ __webpack_require__(94);
10253
+ __webpack_require__(96);
10223
10254
  __webpack_require__(97);
10224
10255
  __webpack_require__(98);
10225
10256
  __webpack_require__(99);
10226
- __webpack_require__(100);
10227
10257
  up.framework.onEvaled();
10228
10258
 
10229
10259
  })();