@hotwired/turbo 8.0.0-rc.2 → 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.
- package/dist/turbo.es2017-esm.js +30 -11
- package/dist/turbo.es2017-umd.js +30 -11
- package/package.json +1 -1
package/dist/turbo.es2017-esm.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/*!
|
|
2
|
-
Turbo 8.0.0
|
|
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
|
-
|
|
3089
|
-
touchTriggerEvent = "touchstart"
|
|
3088
|
+
#prefetchedLink = null
|
|
3090
3089
|
|
|
3091
3090
|
constructor(delegate, eventTarget) {
|
|
3092
3091
|
this.delegate = delegate;
|
|
@@ -3106,33 +3105,35 @@ class LinkPrefetchObserver {
|
|
|
3106
3105
|
stop() {
|
|
3107
3106
|
if (!this.started) return
|
|
3108
3107
|
|
|
3109
|
-
this.eventTarget.removeEventListener(
|
|
3108
|
+
this.eventTarget.removeEventListener("mouseenter", this.#tryToPrefetchRequest, {
|
|
3110
3109
|
capture: true,
|
|
3111
3110
|
passive: true
|
|
3112
3111
|
});
|
|
3113
|
-
this.eventTarget.removeEventListener(
|
|
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(
|
|
3122
|
+
this.eventTarget.addEventListener("mouseenter", this.#tryToPrefetchRequest, {
|
|
3123
3123
|
capture: true,
|
|
3124
3124
|
passive: true
|
|
3125
3125
|
});
|
|
3126
|
-
this.eventTarget.addEventListener(
|
|
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
|
}
|
|
3133
3134
|
|
|
3134
3135
|
#tryToPrefetchRequest = (event) => {
|
|
3135
|
-
if (getMetaContent("turbo-prefetch")
|
|
3136
|
+
if (getMetaContent("turbo-prefetch") === "false") return
|
|
3136
3137
|
|
|
3137
3138
|
const target = event.target;
|
|
3138
3139
|
const isLink = target.matches && target.matches("a[href]:not([target^=_]):not([download])");
|
|
@@ -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());
|
|
@@ -3208,7 +3218,16 @@ class LinkPrefetchObserver {
|
|
|
3208
3218
|
#isPrefetchable(link) {
|
|
3209
3219
|
const href = link.getAttribute("href");
|
|
3210
3220
|
|
|
3211
|
-
if (!href || href
|
|
3221
|
+
if (!href || href.startsWith("#") || link.getAttribute("data-turbo") === "false" || link.getAttribute("data-turbo-prefetch") === "false") {
|
|
3222
|
+
return false
|
|
3223
|
+
}
|
|
3224
|
+
|
|
3225
|
+
const event = dispatch("turbo:before-prefetch", {
|
|
3226
|
+
target: link,
|
|
3227
|
+
cancelable: true
|
|
3228
|
+
});
|
|
3229
|
+
|
|
3230
|
+
if (event.defaultPrevented) {
|
|
3212
3231
|
return false
|
|
3213
3232
|
}
|
|
3214
3233
|
|
package/dist/turbo.es2017-umd.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/*!
|
|
2
|
-
Turbo 8.0.0
|
|
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
|
-
|
|
3095
|
-
touchTriggerEvent = "touchstart"
|
|
3094
|
+
#prefetchedLink = null
|
|
3096
3095
|
|
|
3097
3096
|
constructor(delegate, eventTarget) {
|
|
3098
3097
|
this.delegate = delegate;
|
|
@@ -3112,33 +3111,35 @@ Copyright © 2024 37signals LLC
|
|
|
3112
3111
|
stop() {
|
|
3113
3112
|
if (!this.started) return
|
|
3114
3113
|
|
|
3115
|
-
this.eventTarget.removeEventListener(
|
|
3114
|
+
this.eventTarget.removeEventListener("mouseenter", this.#tryToPrefetchRequest, {
|
|
3116
3115
|
capture: true,
|
|
3117
3116
|
passive: true
|
|
3118
3117
|
});
|
|
3119
|
-
this.eventTarget.removeEventListener(
|
|
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(
|
|
3128
|
+
this.eventTarget.addEventListener("mouseenter", this.#tryToPrefetchRequest, {
|
|
3129
3129
|
capture: true,
|
|
3130
3130
|
passive: true
|
|
3131
3131
|
});
|
|
3132
|
-
this.eventTarget.addEventListener(
|
|
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
|
}
|
|
3139
3140
|
|
|
3140
3141
|
#tryToPrefetchRequest = (event) => {
|
|
3141
|
-
if (getMetaContent("turbo-prefetch")
|
|
3142
|
+
if (getMetaContent("turbo-prefetch") === "false") return
|
|
3142
3143
|
|
|
3143
3144
|
const target = event.target;
|
|
3144
3145
|
const isLink = target.matches && target.matches("a[href]:not([target^=_]):not([download])");
|
|
@@ -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());
|
|
@@ -3214,7 +3224,16 @@ Copyright © 2024 37signals LLC
|
|
|
3214
3224
|
#isPrefetchable(link) {
|
|
3215
3225
|
const href = link.getAttribute("href");
|
|
3216
3226
|
|
|
3217
|
-
if (!href || href
|
|
3227
|
+
if (!href || href.startsWith("#") || link.getAttribute("data-turbo") === "false" || link.getAttribute("data-turbo-prefetch") === "false") {
|
|
3228
|
+
return false
|
|
3229
|
+
}
|
|
3230
|
+
|
|
3231
|
+
const event = dispatch("turbo:before-prefetch", {
|
|
3232
|
+
target: link,
|
|
3233
|
+
cancelable: true
|
|
3234
|
+
});
|
|
3235
|
+
|
|
3236
|
+
if (event.defaultPrevented) {
|
|
3218
3237
|
return false
|
|
3219
3238
|
}
|
|
3220
3239
|
|
package/package.json
CHANGED