unpoly-rails 3.0.0.rc2 → 3.0.0.rc4

Sign up to get free protection for your applications and to get access to all the features.
@@ -5,7 +5,7 @@
5
5
  /***/ (() => {
6
6
 
7
7
  window.up = {
8
- version: '3.0.0-rc2'
8
+ version: '3.0.0-rc4'
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,30 @@ 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.isMissing(value)) {
6092
+ return;
6093
+ }
6094
+ if (u.isOptions(value) || u.isArray(value)) {
6095
+ value = u.safeStringifyJSON(value);
6096
+ }
6097
+ this.headers[name] = value;
6156
6098
  }
6157
6099
  static tester(condition, { except } = {}) {
6158
6100
  let testFn;
@@ -6170,8 +6112,7 @@ up.Request = (_a = class Request extends up.Record {
6170
6112
  testFn = (_request) => condition;
6171
6113
  }
6172
6114
  if (except) {
6173
- let exceptCacheKey = except.cacheKey();
6174
- return (request) => (request.cacheKey() !== exceptCacheKey) && testFn(request);
6115
+ return (request) => !up.cache.willHaveSameResponse(request, except) && testFn(request);
6175
6116
  }
6176
6117
  else {
6177
6118
  return testFn;
@@ -6185,39 +6126,146 @@ up.Request = (_a = class Request extends up.Record {
6185
6126
 
6186
6127
 
6187
6128
  /***/ }),
6188
- /* 70 */
6129
+ /* 69 */
6189
6130
  /***/ (() => {
6190
6131
 
6191
- let u = up.util;
6192
- up.Request.Cache = class Cache extends up.Cache {
6193
- maxSize() {
6132
+ const u = up.util;
6133
+ up.Request.Cache = class Cache {
6134
+ constructor() {
6135
+ this.reset();
6136
+ }
6137
+ reset() {
6138
+ this.varyInfo = {};
6139
+ this.map = new Map();
6140
+ }
6141
+ cacheKey(request) {
6142
+ let influencingHeaders = this.getPreviousInfluencingHeaders(request);
6143
+ let varyPart = u.flatMap(influencingHeaders, (headerName) => [headerName, request.header(headerName)]);
6144
+ return [request.description, ...varyPart].join(':');
6145
+ }
6146
+ getPreviousInfluencingHeaders(request) {
6147
+ var _a, _b;
6148
+ return ((_a = this.varyInfo)[_b = request.description] || (_a[_b] = new Set()));
6149
+ }
6150
+ get(request) {
6151
+ request = this.wrap(request);
6152
+ let cacheKey = this.cacheKey(request);
6153
+ let cachedRequest = this.map.get(cacheKey);
6154
+ if (cachedRequest) {
6155
+ if (this.isUsable(cachedRequest)) {
6156
+ return cachedRequest;
6157
+ }
6158
+ else {
6159
+ this.map.delete(cacheKey);
6160
+ }
6161
+ }
6162
+ }
6163
+ get capacity() {
6194
6164
  return up.network.config.cacheSize;
6195
6165
  }
6196
- evictAge() {
6197
- return up.network.config.cacheEvictAge;
6166
+ isUsable(request) {
6167
+ return request.age < up.network.config.cacheEvictAge;
6198
6168
  }
6199
- normalizeStoreKey(request) {
6200
- return u.wrapValue(up.Request, request).cacheKey();
6169
+ async put(request) {
6170
+ request = this.wrap(request);
6171
+ this.makeRoom();
6172
+ let cacheKey = this.updateCacheKey(request);
6173
+ this.map.set(cacheKey, request);
6174
+ }
6175
+ updateCacheKey(request) {
6176
+ let oldCacheKey = this.cacheKey(request);
6177
+ let { response } = request;
6178
+ if (response) {
6179
+ this.mergePreviousHeaderNames(request, response);
6180
+ let newCacheKey = this.cacheKey(request);
6181
+ this.renameMapKey(oldCacheKey, newCacheKey);
6182
+ return newCacheKey;
6183
+ }
6184
+ else {
6185
+ return oldCacheKey;
6186
+ }
6187
+ }
6188
+ renameMapKey(oldKey, newKey) {
6189
+ if (oldKey !== newKey && this.map.has(oldKey)) {
6190
+ this.map.set(newKey, this.map.get(oldKey));
6191
+ this.map.delete(oldKey);
6192
+ }
6193
+ }
6194
+ mergePreviousHeaderNames(request, response) {
6195
+ let headersInfluencingResponse = response.ownInfluncingHeaders;
6196
+ if (headersInfluencingResponse.length) {
6197
+ let previousInfluencingHeaders = this.getPreviousInfluencingHeaders(request);
6198
+ for (let headerName of headersInfluencingResponse) {
6199
+ previousInfluencingHeaders.add(headerName);
6200
+ }
6201
+ }
6202
+ }
6203
+ alias(existingCachedRequest, newRequest) {
6204
+ existingCachedRequest = this.get(existingCachedRequest);
6205
+ if (!existingCachedRequest)
6206
+ return;
6207
+ newRequest = this.wrap(newRequest);
6208
+ this.track(existingCachedRequest, newRequest, { force: true });
6209
+ this.put(newRequest);
6210
+ return newRequest;
6211
+ }
6212
+ async track(existingRequest, newRequest, options = {}) {
6213
+ newRequest.trackedRequest = existingRequest;
6214
+ newRequest.state = 'tracking';
6215
+ let value = await u.always(existingRequest);
6216
+ if (value instanceof up.Response) {
6217
+ if (options.force || this.isCacheCompatible(existingRequest, newRequest)) {
6218
+ newRequest.fromCache = true;
6219
+ newRequest.respondWith(value);
6220
+ u.delegate(newRequest, ['expired', 'state'], () => existingRequest);
6221
+ }
6222
+ else {
6223
+ delete newRequest.trackedRequest;
6224
+ newRequest.state = 'new';
6225
+ options.onIncompatible?.(newRequest);
6226
+ }
6227
+ }
6228
+ else {
6229
+ newRequest.state = existingRequest.state;
6230
+ newRequest.deferred.reject(value);
6231
+ }
6232
+ }
6233
+ willHaveSameResponse(existingRequest, newRequest) {
6234
+ return existingRequest === newRequest || existingRequest === newRequest.trackedRequest;
6235
+ }
6236
+ delete(request) {
6237
+ request = this.wrap(request);
6238
+ let cacheKey = this.cacheKey(request);
6239
+ this.map.delete(cacheKey);
6201
6240
  }
6202
6241
  evict(condition = true, testerOptions) {
6203
- this.eachMatch(condition, testerOptions, ({ key }) => this.map.delete(key));
6242
+ this.eachMatch(condition, testerOptions, (request) => this.delete(request));
6204
6243
  }
6205
6244
  expire(condition = true, testerOptions) {
6206
- this.eachMatch(condition, testerOptions, ({ value: request }) => request.expired = true);
6245
+ this.eachMatch(condition, testerOptions, (request) => request.expired = true);
6246
+ }
6247
+ makeRoom() {
6248
+ while (this.map.size >= this.capacity) {
6249
+ let oldestKey = this.map.keys().next().value;
6250
+ this.map.delete(oldestKey);
6251
+ }
6207
6252
  }
6208
6253
  eachMatch(condition = true, testerOptions, fn) {
6209
6254
  let tester = up.Request.tester(condition, testerOptions);
6210
- for (let record of this.records()) {
6211
- if (tester(record.value)) {
6212
- fn(record);
6213
- }
6214
- }
6255
+ let results = u.filter(this.map.values(), tester);
6256
+ u.each(results, fn);
6257
+ }
6258
+ isCacheCompatible(request1, request2) {
6259
+ return this.cacheKey(request1) === this.cacheKey(request2);
6260
+ }
6261
+ wrap(requestOrOptions) {
6262
+ return u.wrapValue(up.Request, requestOrOptions);
6215
6263
  }
6216
6264
  };
6217
6265
 
6218
6266
 
6219
6267
  /***/ }),
6220
- /* 71 */
6268
+ /* 70 */
6221
6269
  /***/ (() => {
6222
6270
 
6223
6271
  const u = up.util;
@@ -6236,7 +6284,6 @@ up.Request.Queue = class Queue {
6236
6284
  asap(request) {
6237
6285
  request.runQueuedCallbacks();
6238
6286
  u.always(request, responseOrError => this.onRequestSettled(request, responseOrError));
6239
- request.queuedAt = new Date();
6240
6287
  this.scheduleSlowTimer(request);
6241
6288
  this.queueRequest(request);
6242
6289
  u.microtask(() => this.poke());
@@ -6248,7 +6295,7 @@ up.Request.Queue = class Queue {
6248
6295
  }
6249
6296
  }
6250
6297
  scheduleSlowTimer(request) {
6251
- let timeUntilLate = Math.max(request.badResponseTime - request.queueAge, 0);
6298
+ let timeUntilLate = Math.max(request.badResponseTime - request.age, 0);
6252
6299
  u.timer(timeUntilLate, () => this.checkLate());
6253
6300
  }
6254
6301
  getMaxConcurrency() {
@@ -6270,13 +6317,8 @@ up.Request.Queue = class Queue {
6270
6317
  return u.remove(this.queuedRequests, request);
6271
6318
  }
6272
6319
  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();
6320
+ if (request.load()) {
6278
6321
  this.currentRequests.push(request);
6279
- request.load();
6280
6322
  }
6281
6323
  }
6282
6324
  onRequestSettled(request, responseOrError) {
@@ -6325,13 +6367,13 @@ up.Request.Queue = class Queue {
6325
6367
  isLate() {
6326
6368
  const allForegroundRequests = u.reject(this.allRequests, 'background');
6327
6369
  const timerTolerance = 1;
6328
- return u.some(allForegroundRequests, request => request.queueAge >= (request.badResponseTime - timerTolerance));
6370
+ return u.some(allForegroundRequests, (request) => request.age >= (request.badResponseTime - timerTolerance));
6329
6371
  }
6330
6372
  };
6331
6373
 
6332
6374
 
6333
6375
  /***/ }),
6334
- /* 72 */
6376
+ /* 71 */
6335
6377
  /***/ (() => {
6336
6378
 
6337
6379
  const u = up.util;
@@ -6370,7 +6412,7 @@ up.Request.FormRenderer = class FormRenderer {
6370
6412
 
6371
6413
 
6372
6414
  /***/ }),
6373
- /* 73 */
6415
+ /* 72 */
6374
6416
  /***/ (() => {
6375
6417
 
6376
6418
  var _a;
@@ -6388,21 +6430,13 @@ up.Request.XHRRenderer = (_a = class XHRRenderer {
6388
6430
  xhr.timeout = this.request.timeout;
6389
6431
  }
6390
6432
  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
6433
  let contentType = this.getContentType();
6404
6434
  if (contentType) {
6405
- this.addHeader(xhr, 'Content-Type', contentType);
6435
+ xhr.setRequestHeader('Content-Type', contentType);
6436
+ }
6437
+ for (let headerName in this.request.headers) {
6438
+ let headerValue = this.request.headers[headerName];
6439
+ xhr.setRequestHeader(headerName, headerValue);
6406
6440
  }
6407
6441
  Object.assign(xhr, handlers);
6408
6442
  xhr.send(this.getPayload());
@@ -6424,12 +6458,6 @@ up.Request.XHRRenderer = (_a = class XHRRenderer {
6424
6458
  this.finalizePayload();
6425
6459
  return this.payload;
6426
6460
  }
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
6461
  finalizePayload() {
6434
6462
  this.payload = this.request.payload;
6435
6463
  this.contentType = this.request.contentType;
@@ -6456,7 +6484,7 @@ up.Request.XHRRenderer = (_a = class XHRRenderer {
6456
6484
 
6457
6485
 
6458
6486
  /***/ }),
6459
- /* 74 */
6487
+ /* 73 */
6460
6488
  /***/ (() => {
6461
6489
 
6462
6490
  const u = up.util;
@@ -6494,6 +6522,10 @@ up.Response = class Response extends up.Record {
6494
6522
  header(name) {
6495
6523
  return this.headers[name] || this.xhr?.getResponseHeader(name);
6496
6524
  }
6525
+ get ownInfluncingHeaders() {
6526
+ let influencingHeaders = up.protocol.influencingHeadersFromResponse(this);
6527
+ return u.filter(influencingHeaders, (headerName) => this.request.header(headerName));
6528
+ }
6497
6529
  get contentType() {
6498
6530
  return this.header('Content-Type');
6499
6531
  }
@@ -6527,7 +6559,7 @@ up.Response = class Response extends up.Record {
6527
6559
 
6528
6560
 
6529
6561
  /***/ }),
6530
- /* 75 */
6562
+ /* 74 */
6531
6563
  /***/ (() => {
6532
6564
 
6533
6565
  var _a;
@@ -6535,12 +6567,13 @@ const u = up.util;
6535
6567
  const e = up.element;
6536
6568
  up.ResponseDoc = (_a = class ResponseDoc {
6537
6569
  constructor(options) {
6538
- this.noscriptWrapper = new up.HTMLWrapper('noscript');
6539
- this.scriptWrapper = new up.HTMLWrapper('script');
6540
6570
  this.root =
6541
6571
  this.parseDocument(options) ||
6542
6572
  this.parseFragment(options) ||
6543
6573
  this.parseContent(options);
6574
+ if (!up.fragment.config.runScripts) {
6575
+ this.root.querySelectorAll('script').forEach((e) => e.remove());
6576
+ }
6544
6577
  this.cspNonces = options.cspNonces;
6545
6578
  if (options.origin) {
6546
6579
  let originSelector = up.fragment.tryToTarget(options.origin);
@@ -6550,7 +6583,11 @@ up.ResponseDoc = (_a = class ResponseDoc {
6550
6583
  }
6551
6584
  }
6552
6585
  parseDocument(options) {
6553
- return this.parse(options.document, e.createDocumentFromHTML);
6586
+ let document = this.parse(options.document, e.createBrokenDocumentFromHTML);
6587
+ if (document) {
6588
+ this.scriptishNeedFix = true;
6589
+ return document;
6590
+ }
6554
6591
  }
6555
6592
  parseContent(options) {
6556
6593
  let content = options.content || '';
@@ -6558,7 +6595,6 @@ up.ResponseDoc = (_a = class ResponseDoc {
6558
6595
  target = u.map(up.fragment.parseTargetSteps(target), 'selector').join(',');
6559
6596
  const matchingElement = e.createFromSelector(target);
6560
6597
  if (u.isString(content)) {
6561
- content = this.wrapHTML(content);
6562
6598
  matchingElement.innerHTML = content;
6563
6599
  }
6564
6600
  else {
@@ -6571,7 +6607,6 @@ up.ResponseDoc = (_a = class ResponseDoc {
6571
6607
  }
6572
6608
  parse(value, parseFn = e.createFromHTML) {
6573
6609
  if (u.isString(value)) {
6574
- value = this.wrapHTML(value);
6575
6610
  value = parseFn(value);
6576
6611
  }
6577
6612
  return value;
@@ -6579,18 +6614,8 @@ up.ResponseDoc = (_a = class ResponseDoc {
6579
6614
  rootSelector() {
6580
6615
  return up.fragment.toTarget(this.root);
6581
6616
  }
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
6617
  getTitle() {
6593
- return this.root.querySelector("head title")?.textContent;
6618
+ return this.root.querySelector('head title')?.textContent;
6594
6619
  }
6595
6620
  select(selector) {
6596
6621
  let finder = new up.FragmentFinder({
@@ -6601,9 +6626,10 @@ up.ResponseDoc = (_a = class ResponseDoc {
6601
6626
  return finder.find();
6602
6627
  }
6603
6628
  finalizeElement(element) {
6604
- this.noscriptWrapper.unwrap(element);
6605
6629
  up.NonceableCallback.adoptNonces(element, this.cspNonces);
6606
- this.scriptWrapper.unwrap(element);
6630
+ if (this.scriptishNeedFix) {
6631
+ element.querySelectorAll('noscript, script').forEach(e.fixScriptish);
6632
+ }
6607
6633
  }
6608
6634
  },
6609
6635
  (() => {
@@ -6613,7 +6639,7 @@ up.ResponseDoc = (_a = class ResponseDoc {
6613
6639
 
6614
6640
 
6615
6641
  /***/ }),
6616
- /* 76 */
6642
+ /* 75 */
6617
6643
  /***/ (() => {
6618
6644
 
6619
6645
  const e = up.element;
@@ -6707,7 +6733,7 @@ up.RevealMotion = class RevealMotion {
6707
6733
 
6708
6734
 
6709
6735
  /***/ }),
6710
- /* 77 */
6736
+ /* 76 */
6711
6737
  /***/ (() => {
6712
6738
 
6713
6739
  const u = up.util;
@@ -6748,7 +6774,7 @@ up.Selector = class Selector {
6748
6774
 
6749
6775
 
6750
6776
  /***/ }),
6751
- /* 78 */
6777
+ /* 77 */
6752
6778
  /***/ (() => {
6753
6779
 
6754
6780
  const u = up.util;
@@ -6868,7 +6894,7 @@ up.Tether = class Tether {
6868
6894
 
6869
6895
 
6870
6896
  /***/ }),
6871
- /* 79 */
6897
+ /* 78 */
6872
6898
  /***/ (() => {
6873
6899
 
6874
6900
  const u = up.util;
@@ -6948,7 +6974,7 @@ up.URLPattern = class URLPattern {
6948
6974
 
6949
6975
 
6950
6976
  /***/ }),
6951
- /* 80 */
6977
+ /* 79 */
6952
6978
  /***/ (() => {
6953
6979
 
6954
6980
  up.framework = (function () {
@@ -7032,7 +7058,7 @@ up.boot = up.framework.boot;
7032
7058
 
7033
7059
 
7034
7060
  /***/ }),
7035
- /* 81 */
7061
+ /* 80 */
7036
7062
  /***/ (() => {
7037
7063
 
7038
7064
  up.event = (function () {
@@ -7135,7 +7161,7 @@ up.emit = up.event.emit;
7135
7161
 
7136
7162
 
7137
7163
  /***/ }),
7138
- /* 82 */
7164
+ /* 81 */
7139
7165
  /***/ (() => {
7140
7166
 
7141
7167
  up.protocol = (function () {
@@ -7151,6 +7177,9 @@ up.protocol = (function () {
7151
7177
  return parseFn(value);
7152
7178
  }
7153
7179
  };
7180
+ function targetFromXHR(xhr) {
7181
+ return extractHeader(xhr, 'target');
7182
+ }
7154
7183
  function parseModifyCacheValue(value) {
7155
7184
  if (value === 'false') {
7156
7185
  return false;
@@ -7171,6 +7200,9 @@ up.protocol = (function () {
7171
7200
  function methodFromXHR(xhr) {
7172
7201
  return extractHeader(xhr, 'method', u.normalizeMethod);
7173
7202
  }
7203
+ function titleFromXHR(xhr) {
7204
+ return up.migrate.titleFromXHR?.(xhr) ?? extractHeader(xhr, 'title', JSON.parse);
7205
+ }
7174
7206
  function eventPlansFromXHR(xhr) {
7175
7207
  return extractHeader(xhr, 'events', JSON.parse);
7176
7208
  }
@@ -7186,11 +7218,9 @@ up.protocol = (function () {
7186
7218
  function locationFromXHR(xhr) {
7187
7219
  return extractHeader(xhr, 'location') || xhr.responseURL;
7188
7220
  }
7189
- function titleFromXHR(xhr) {
7190
- return extractHeader(xhr, 'title');
7191
- }
7192
- function targetFromXHR(xhr) {
7193
- return extractHeader(xhr, 'target');
7221
+ function influencingHeadersFromResponse(response) {
7222
+ let varyHeaderValue = response.header('Vary');
7223
+ return u.parseTokens(varyHeaderValue, { separator: 'comma' });
7194
7224
  }
7195
7225
  const config = new up.Config(() => ({
7196
7226
  methodParam: '_method',
@@ -7266,12 +7296,13 @@ up.protocol = (function () {
7266
7296
  headerize,
7267
7297
  wrapMethod,
7268
7298
  cspNoncesFromHeader,
7299
+ influencingHeadersFromResponse,
7269
7300
  };
7270
7301
  })();
7271
7302
 
7272
7303
 
7273
7304
  /***/ }),
7274
- /* 83 */
7305
+ /* 82 */
7275
7306
  /***/ (() => {
7276
7307
 
7277
7308
  up.log = (function () {
@@ -7357,7 +7388,7 @@ up.warn = up.log.warn;
7357
7388
 
7358
7389
 
7359
7390
  /***/ }),
7360
- /* 84 */
7391
+ /* 83 */
7361
7392
  /***/ (() => {
7362
7393
 
7363
7394
  up.syntax = (function () {
@@ -7507,7 +7538,7 @@ up.hello = up.syntax.hello;
7507
7538
 
7508
7539
 
7509
7540
  /***/ }),
7510
- /* 85 */
7541
+ /* 84 */
7511
7542
  /***/ (() => {
7512
7543
 
7513
7544
  up.history = (function () {
@@ -7576,7 +7607,7 @@ up.history = (function () {
7576
7607
  }
7577
7608
  function restoreStateOnPop(state) {
7578
7609
  if (!state?.up) {
7579
- up.puts('pop', 'Ignoring a history state not owned by Unpoly');
7610
+ up.puts('popstate', 'Ignoring a history state not owned by Unpoly');
7580
7611
  return;
7581
7612
  }
7582
7613
  let location = currentLocation();
@@ -7643,10 +7674,10 @@ up.history = (function () {
7643
7674
 
7644
7675
 
7645
7676
  /***/ }),
7646
- /* 86 */
7677
+ /* 85 */
7647
7678
  /***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => {
7648
7679
 
7649
- __webpack_require__(87);
7680
+ __webpack_require__(86);
7650
7681
  const u = up.util;
7651
7682
  const e = up.element;
7652
7683
  up.fragment = (function () {
@@ -7697,7 +7728,7 @@ up.fragment = (function () {
7697
7728
  autoRevalidate: (response) => response.expired,
7698
7729
  skipResponse: defaultSkipResponse
7699
7730
  }));
7700
- u.delegate(config, 'mainTargets', () => up.layer.config.any);
7731
+ u.delegate(config, ['mainTargets'], () => up.layer.config.any);
7701
7732
  function reset() {
7702
7733
  config.reset();
7703
7734
  }
@@ -8163,11 +8194,11 @@ up.destroy = up.fragment.destroy;
8163
8194
  up.render = up.fragment.render;
8164
8195
  up.navigate = up.fragment.navigate;
8165
8196
  up.visit = up.fragment.visit;
8166
- u.delegate(up, 'context', () => up.layer.current);
8197
+ u.delegate(up, ['context'], () => up.layer.current);
8167
8198
 
8168
8199
 
8169
8200
  /***/ }),
8170
- /* 87 */
8201
+ /* 86 */
8171
8202
  /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
8172
8203
 
8173
8204
  "use strict";
@@ -8176,10 +8207,10 @@ __webpack_require__.r(__webpack_exports__);
8176
8207
 
8177
8208
 
8178
8209
  /***/ }),
8179
- /* 88 */
8210
+ /* 87 */
8180
8211
  /***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => {
8181
8212
 
8182
- __webpack_require__(89);
8213
+ __webpack_require__(88);
8183
8214
  up.viewport = (function () {
8184
8215
  const u = up.util;
8185
8216
  const e = up.element;
@@ -8361,7 +8392,7 @@ up.viewport = (function () {
8361
8392
  }
8362
8393
  }
8363
8394
  function newStateCache() {
8364
- return new up.Cache({ size: 30, key: up.history.normalizeURL });
8395
+ return new up.FIFOCache({ capacity: 30, normalizeKey: up.history.normalizeURL });
8365
8396
  }
8366
8397
  function parseOptions(args) {
8367
8398
  const options = u.copy(u.extractOptions(args));
@@ -8499,7 +8530,7 @@ up.reveal = up.viewport.reveal;
8499
8530
 
8500
8531
 
8501
8532
  /***/ }),
8502
- /* 89 */
8533
+ /* 88 */
8503
8534
  /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
8504
8535
 
8505
8536
  "use strict";
@@ -8508,7 +8539,7 @@ __webpack_require__.r(__webpack_exports__);
8508
8539
 
8509
8540
 
8510
8541
  /***/ }),
8511
- /* 90 */
8542
+ /* 89 */
8512
8543
  /***/ (() => {
8513
8544
 
8514
8545
  up.motion = (function () {
@@ -8763,10 +8794,10 @@ up.animate = up.motion.animate;
8763
8794
 
8764
8795
 
8765
8796
  /***/ }),
8766
- /* 91 */
8797
+ /* 90 */
8767
8798
  /***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => {
8768
8799
 
8769
- __webpack_require__(92);
8800
+ __webpack_require__(91);
8770
8801
  const u = up.util;
8771
8802
  up.network = (function () {
8772
8803
  const config = new up.Config(() => ({
@@ -8782,7 +8813,6 @@ up.network = (function () {
8782
8813
  autoCache(request) { return request.isSafe(); },
8783
8814
  expireCache(request, _response) { return !request.isSafe(); },
8784
8815
  evictCache: false,
8785
- requestMetaKeys: ['target', 'failTarget', 'mode', 'failMode', 'context', 'failContext'],
8786
8816
  progressBar: true,
8787
8817
  timeout: 90000,
8788
8818
  }));
@@ -8793,14 +8823,14 @@ up.network = (function () {
8793
8823
  abortRequests();
8794
8824
  queue.reset();
8795
8825
  config.reset();
8796
- cache.evict();
8826
+ cache.reset();
8797
8827
  progressBar?.destroy();
8798
8828
  progressBar = null;
8799
8829
  }
8800
8830
  function makeRequest(...args) {
8801
8831
  const options = parseRequestOptions(args);
8802
8832
  const request = new up.Request(options);
8803
- useCachedRequest(request) || queueRequest(request);
8833
+ processRequest(request);
8804
8834
  return request;
8805
8835
  }
8806
8836
  function parseRequestOptions(args) {
@@ -8811,31 +8841,31 @@ up.network = (function () {
8811
8841
  up.migrate.handleRequestOptions?.(options);
8812
8842
  return options;
8813
8843
  }
8814
- function useCachedRequest(request) {
8844
+ function processRequest(request) {
8845
+ useCachedRequest(request) || queueRequest(request);
8846
+ }
8847
+ function useCachedRequest(newRequest) {
8815
8848
  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) {
8849
+ if (newRequest.willCache() && (cachedRequest = cache.get(newRequest))) {
8850
+ up.puts('up.request()', 'Re-using previous request to %s', newRequest.description);
8851
+ if (!newRequest.background) {
8819
8852
  queue.promoteToForeground(cachedRequest);
8820
8853
  }
8821
- request.followState(cachedRequest);
8822
- request.fromCache = true;
8854
+ cache.track(cachedRequest, newRequest, { onIncompatible: processRequest });
8823
8855
  return true;
8824
8856
  }
8825
8857
  }
8826
8858
  function queueRequest(request) {
8827
- if (request.preload && !request.isSafe()) {
8828
- up.fail('Will not preload request to %s', request.description);
8829
- }
8830
8859
  handleCaching(request);
8831
8860
  queue.asap(request);
8832
8861
  return true;
8833
8862
  }
8834
8863
  function handleCaching(request) {
8835
8864
  if (request.willCache()) {
8836
- cache.set(request, request);
8865
+ cache.put(request);
8866
+ request.onLoading = () => cache.put(request);
8837
8867
  }
8838
- return u.always(request, function (response) {
8868
+ u.always(request, function (response) {
8839
8869
  let expireCache = response.expireCache ?? request.expireCache ?? u.evalOption(config.expireCache, request, response);
8840
8870
  if (expireCache) {
8841
8871
  cache.expire(expireCache, { except: request });
@@ -8845,7 +8875,7 @@ up.network = (function () {
8845
8875
  cache.evict(evictCache, { except: request });
8846
8876
  }
8847
8877
  if (cache.get(request)) {
8848
- cache.set(request, request);
8878
+ cache.put(request);
8849
8879
  }
8850
8880
  if (!response.ok) {
8851
8881
  cache.evict(request);
@@ -8910,7 +8940,7 @@ up.cache = up.network.cache;
8910
8940
 
8911
8941
 
8912
8942
  /***/ }),
8913
- /* 92 */
8943
+ /* 91 */
8914
8944
  /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
8915
8945
 
8916
8946
  "use strict";
@@ -8919,10 +8949,10 @@ __webpack_require__.r(__webpack_exports__);
8919
8949
 
8920
8950
 
8921
8951
  /***/ }),
8922
- /* 93 */
8952
+ /* 92 */
8923
8953
  /***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => {
8924
8954
 
8925
- __webpack_require__(94);
8955
+ __webpack_require__(93);
8926
8956
  const u = up.util;
8927
8957
  const e = up.element;
8928
8958
  up.layer = (function () {
@@ -9163,7 +9193,7 @@ up.layer = (function () {
9163
9193
 
9164
9194
 
9165
9195
  /***/ }),
9166
- /* 94 */
9196
+ /* 93 */
9167
9197
  /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
9168
9198
 
9169
9199
  "use strict";
@@ -9172,10 +9202,10 @@ __webpack_require__.r(__webpack_exports__);
9172
9202
 
9173
9203
 
9174
9204
  /***/ }),
9175
- /* 95 */
9205
+ /* 94 */
9176
9206
  /***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => {
9177
9207
 
9178
- __webpack_require__(96);
9208
+ __webpack_require__(95);
9179
9209
  up.link = (function () {
9180
9210
  const u = up.util;
9181
9211
  const e = up.element;
@@ -9323,8 +9353,9 @@ up.link = (function () {
9323
9353
  }
9324
9354
  function preload(link, options) {
9325
9355
  link = up.fragment.get(link);
9326
- if (!shouldPreload()) {
9327
- return Promise.reject(new up.Error('Link preloading is disabled'));
9356
+ let issue = preloadIssue(link);
9357
+ if (issue) {
9358
+ return Promise.reject(new up.Error(issue));
9328
9359
  }
9329
9360
  const guardEvent = up.event.build('up:link:preload', { log: ['Preloading link %o', link] });
9330
9361
  return follow(link, {
@@ -9334,10 +9365,15 @@ up.link = (function () {
9334
9365
  preload: true
9335
9366
  });
9336
9367
  }
9337
- function shouldPreload() {
9338
- let goodConnection = u.negate(up.network.shouldReduceRequests);
9339
- return u.evalAutoOption(config.preloadEnabled, goodConnection);
9368
+ function preloadIssue(link) {
9369
+ if (!u.evalAutoOption(config.preloadEnabled, autoPreloadEnabled, link)) {
9370
+ return 'Preloading is disabled';
9371
+ }
9372
+ else if (!isSafe(link)) {
9373
+ return 'Will not preload an unsafe link';
9374
+ }
9340
9375
  }
9376
+ const autoPreloadEnabled = u.negate(up.network.shouldReduceRequests);
9341
9377
  function followMethod(link, options = {}) {
9342
9378
  return u.normalizeMethod(options.method || link.getAttribute('up-method') || link.getAttribute('data-method'));
9343
9379
  }
@@ -9464,7 +9500,7 @@ up.follow = up.link.follow;
9464
9500
 
9465
9501
 
9466
9502
  /***/ }),
9467
- /* 96 */
9503
+ /* 95 */
9468
9504
  /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
9469
9505
 
9470
9506
  "use strict";
@@ -9473,7 +9509,7 @@ __webpack_require__.r(__webpack_exports__);
9473
9509
 
9474
9510
 
9475
9511
  /***/ }),
9476
- /* 97 */
9512
+ /* 96 */
9477
9513
  /***/ (() => {
9478
9514
 
9479
9515
  up.form = (function () {
@@ -9871,7 +9907,7 @@ up.validate = up.form.validate;
9871
9907
 
9872
9908
 
9873
9909
  /***/ }),
9874
- /* 98 */
9910
+ /* 97 */
9875
9911
  /***/ (() => {
9876
9912
 
9877
9913
  up.feedback = (function () {
@@ -9988,7 +10024,7 @@ up.feedback = (function () {
9988
10024
 
9989
10025
 
9990
10026
  /***/ }),
9991
- /* 99 */
10027
+ /* 98 */
9992
10028
  /***/ (() => {
9993
10029
 
9994
10030
  up.radio = (function () {
@@ -10065,7 +10101,7 @@ up.radio = (function () {
10065
10101
 
10066
10102
 
10067
10103
  /***/ }),
10068
- /* 100 */
10104
+ /* 99 */
10069
10105
  /***/ (() => {
10070
10106
 
10071
10107
  (function () {
@@ -10214,16 +10250,15 @@ __webpack_require__(82);
10214
10250
  __webpack_require__(83);
10215
10251
  __webpack_require__(84);
10216
10252
  __webpack_require__(85);
10217
- __webpack_require__(86);
10218
- __webpack_require__(88);
10253
+ __webpack_require__(87);
10254
+ __webpack_require__(89);
10219
10255
  __webpack_require__(90);
10220
- __webpack_require__(91);
10221
- __webpack_require__(93);
10222
- __webpack_require__(95);
10256
+ __webpack_require__(92);
10257
+ __webpack_require__(94);
10258
+ __webpack_require__(96);
10223
10259
  __webpack_require__(97);
10224
10260
  __webpack_require__(98);
10225
10261
  __webpack_require__(99);
10226
- __webpack_require__(100);
10227
10262
  up.framework.onEvaled();
10228
10263
 
10229
10264
  })();