@hotwired/turbo 8.0.0-rc.3 → 8.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,5 +1,5 @@
1
1
  /*!
2
- Turbo 8.0.0-rc.3
2
+ Turbo 8.0.0
3
3
  Copyright © 2024 37signals LLC
4
4
  */
5
5
  /**
@@ -3085,8 +3085,7 @@ class History {
3085
3085
 
3086
3086
  class LinkPrefetchObserver {
3087
3087
  started = false
3088
- hoverTriggerEvent = "mouseenter"
3089
- touchTriggerEvent = "touchstart"
3088
+ #prefetchedLink = null
3090
3089
 
3091
3090
  constructor(delegate, eventTarget) {
3092
3091
  this.delegate = delegate;
@@ -3106,27 +3105,29 @@ class LinkPrefetchObserver {
3106
3105
  stop() {
3107
3106
  if (!this.started) return
3108
3107
 
3109
- this.eventTarget.removeEventListener(this.hoverTriggerEvent, this.#tryToPrefetchRequest, {
3108
+ this.eventTarget.removeEventListener("mouseenter", this.#tryToPrefetchRequest, {
3110
3109
  capture: true,
3111
3110
  passive: true
3112
3111
  });
3113
- this.eventTarget.removeEventListener(this.touchTriggerEvent, this.#tryToPrefetchRequest, {
3112
+ this.eventTarget.removeEventListener("mouseleave", this.#cancelRequestIfObsolete, {
3114
3113
  capture: true,
3115
3114
  passive: true
3116
3115
  });
3116
+
3117
3117
  this.eventTarget.removeEventListener("turbo:before-fetch-request", this.#tryToUsePrefetchedRequest, true);
3118
3118
  this.started = false;
3119
3119
  }
3120
3120
 
3121
3121
  #enable = () => {
3122
- this.eventTarget.addEventListener(this.hoverTriggerEvent, this.#tryToPrefetchRequest, {
3122
+ this.eventTarget.addEventListener("mouseenter", this.#tryToPrefetchRequest, {
3123
3123
  capture: true,
3124
3124
  passive: true
3125
3125
  });
3126
- this.eventTarget.addEventListener(this.touchTriggerEvent, this.#tryToPrefetchRequest, {
3126
+ this.eventTarget.addEventListener("mouseleave", this.#cancelRequestIfObsolete, {
3127
3127
  capture: true,
3128
3128
  passive: true
3129
3129
  });
3130
+
3130
3131
  this.eventTarget.addEventListener("turbo:before-fetch-request", this.#tryToUsePrefetchedRequest, true);
3131
3132
  this.started = true;
3132
3133
  }
@@ -3142,6 +3143,8 @@ class LinkPrefetchObserver {
3142
3143
  const location = getLocationForLink(link);
3143
3144
 
3144
3145
  if (this.delegate.canPrefetchRequestToLocation(link, location)) {
3146
+ this.#prefetchedLink = link;
3147
+
3145
3148
  const fetchRequest = new FetchRequest(
3146
3149
  this,
3147
3150
  FetchMethod.get,
@@ -3151,12 +3154,19 @@ class LinkPrefetchObserver {
3151
3154
  );
3152
3155
 
3153
3156
  prefetchCache.setLater(location.toString(), fetchRequest, this.#cacheTtl);
3154
-
3155
- link.addEventListener("mouseleave", () => prefetchCache.clear(), { once: true });
3156
3157
  }
3157
3158
  }
3158
3159
  }
3159
3160
 
3161
+ #cancelRequestIfObsolete = (event) => {
3162
+ if (event.target === this.#prefetchedLink) this.#cancelPrefetchRequest();
3163
+ }
3164
+
3165
+ #cancelPrefetchRequest = () => {
3166
+ prefetchCache.clear();
3167
+ this.#prefetchedLink = null;
3168
+ }
3169
+
3160
3170
  #tryToUsePrefetchedRequest = (event) => {
3161
3171
  if (event.target.tagName !== "FORM" && event.detail.fetchOptions.method === "get") {
3162
3172
  const cached = prefetchCache.get(event.detail.url.toString());
@@ -1,5 +1,5 @@
1
1
  /*!
2
- Turbo 8.0.0-rc.3
2
+ Turbo 8.0.0
3
3
  Copyright © 2024 37signals LLC
4
4
  */
5
5
  (function (global, factory) {
@@ -3091,8 +3091,7 @@ Copyright © 2024 37signals LLC
3091
3091
 
3092
3092
  class LinkPrefetchObserver {
3093
3093
  started = false
3094
- hoverTriggerEvent = "mouseenter"
3095
- touchTriggerEvent = "touchstart"
3094
+ #prefetchedLink = null
3096
3095
 
3097
3096
  constructor(delegate, eventTarget) {
3098
3097
  this.delegate = delegate;
@@ -3112,27 +3111,29 @@ Copyright © 2024 37signals LLC
3112
3111
  stop() {
3113
3112
  if (!this.started) return
3114
3113
 
3115
- this.eventTarget.removeEventListener(this.hoverTriggerEvent, this.#tryToPrefetchRequest, {
3114
+ this.eventTarget.removeEventListener("mouseenter", this.#tryToPrefetchRequest, {
3116
3115
  capture: true,
3117
3116
  passive: true
3118
3117
  });
3119
- this.eventTarget.removeEventListener(this.touchTriggerEvent, this.#tryToPrefetchRequest, {
3118
+ this.eventTarget.removeEventListener("mouseleave", this.#cancelRequestIfObsolete, {
3120
3119
  capture: true,
3121
3120
  passive: true
3122
3121
  });
3122
+
3123
3123
  this.eventTarget.removeEventListener("turbo:before-fetch-request", this.#tryToUsePrefetchedRequest, true);
3124
3124
  this.started = false;
3125
3125
  }
3126
3126
 
3127
3127
  #enable = () => {
3128
- this.eventTarget.addEventListener(this.hoverTriggerEvent, this.#tryToPrefetchRequest, {
3128
+ this.eventTarget.addEventListener("mouseenter", this.#tryToPrefetchRequest, {
3129
3129
  capture: true,
3130
3130
  passive: true
3131
3131
  });
3132
- this.eventTarget.addEventListener(this.touchTriggerEvent, this.#tryToPrefetchRequest, {
3132
+ this.eventTarget.addEventListener("mouseleave", this.#cancelRequestIfObsolete, {
3133
3133
  capture: true,
3134
3134
  passive: true
3135
3135
  });
3136
+
3136
3137
  this.eventTarget.addEventListener("turbo:before-fetch-request", this.#tryToUsePrefetchedRequest, true);
3137
3138
  this.started = true;
3138
3139
  }
@@ -3148,6 +3149,8 @@ Copyright © 2024 37signals LLC
3148
3149
  const location = getLocationForLink(link);
3149
3150
 
3150
3151
  if (this.delegate.canPrefetchRequestToLocation(link, location)) {
3152
+ this.#prefetchedLink = link;
3153
+
3151
3154
  const fetchRequest = new FetchRequest(
3152
3155
  this,
3153
3156
  FetchMethod.get,
@@ -3157,12 +3160,19 @@ Copyright © 2024 37signals LLC
3157
3160
  );
3158
3161
 
3159
3162
  prefetchCache.setLater(location.toString(), fetchRequest, this.#cacheTtl);
3160
-
3161
- link.addEventListener("mouseleave", () => prefetchCache.clear(), { once: true });
3162
3163
  }
3163
3164
  }
3164
3165
  }
3165
3166
 
3167
+ #cancelRequestIfObsolete = (event) => {
3168
+ if (event.target === this.#prefetchedLink) this.#cancelPrefetchRequest();
3169
+ }
3170
+
3171
+ #cancelPrefetchRequest = () => {
3172
+ prefetchCache.clear();
3173
+ this.#prefetchedLink = null;
3174
+ }
3175
+
3166
3176
  #tryToUsePrefetchedRequest = (event) => {
3167
3177
  if (event.target.tagName !== "FORM" && event.detail.fetchOptions.method === "get") {
3168
3178
  const cached = prefetchCache.get(event.detail.url.toString());
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@hotwired/turbo",
3
- "version": "8.0.0-rc.3",
3
+ "version": "8.0.0",
4
4
  "description": "The speed of a single-page web application without having to write any JavaScript",
5
5
  "module": "dist/turbo.es2017-esm.js",
6
6
  "main": "dist/turbo.es2017-umd.js",