@hotwired/turbo 7.2.0-rc.1 → 7.2.0-rc.2
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 +14 -33
- package/dist/turbo.es2017-umd.js +14 -33
- package/dist/types/core/drive/page_renderer.d.ts +1 -4
- package/dist/types/core/index.d.ts +1 -1
- package/dist/types/core/session.d.ts +0 -5
- package/dist/types/http/fetch_request.d.ts +5 -0
- package/dist/types/http/index.d.ts +1 -1
- package/dist/types/util.d.ts +0 -1
- package/package.json +1 -1
package/dist/turbo.es2017-esm.js
CHANGED
|
@@ -448,9 +448,6 @@ function getVisitAction(...elements) {
|
|
|
448
448
|
const action = getAttribute("data-turbo-action", ...elements);
|
|
449
449
|
return isAction(action) ? action : null;
|
|
450
450
|
}
|
|
451
|
-
function getBodyElementId() {
|
|
452
|
-
return getMetaContent("turbo-body");
|
|
453
|
-
}
|
|
454
451
|
function getMetaElement(name) {
|
|
455
452
|
return document.querySelector(`meta[name="${name}"]`);
|
|
456
453
|
}
|
|
@@ -526,7 +523,9 @@ class FetchRequest {
|
|
|
526
523
|
}
|
|
527
524
|
catch (error) {
|
|
528
525
|
if (error.name !== "AbortError") {
|
|
529
|
-
this.
|
|
526
|
+
if (this.willDelegateErrorHandling(error)) {
|
|
527
|
+
this.delegate.requestErrored(this, error);
|
|
528
|
+
}
|
|
530
529
|
throw error;
|
|
531
530
|
}
|
|
532
531
|
}
|
|
@@ -592,6 +591,14 @@ class FetchRequest {
|
|
|
592
591
|
if (event.defaultPrevented)
|
|
593
592
|
await requestInterception;
|
|
594
593
|
}
|
|
594
|
+
willDelegateErrorHandling(error) {
|
|
595
|
+
const event = dispatch("turbo:fetch-request-error", {
|
|
596
|
+
target: this.target,
|
|
597
|
+
cancelable: true,
|
|
598
|
+
detail: { request: this, error: error },
|
|
599
|
+
});
|
|
600
|
+
return !event.defaultPrevented;
|
|
601
|
+
}
|
|
595
602
|
}
|
|
596
603
|
|
|
597
604
|
class AppearanceObserver {
|
|
@@ -789,10 +796,6 @@ class FormSubmission {
|
|
|
789
796
|
}
|
|
790
797
|
requestErrored(request, error) {
|
|
791
798
|
this.result = { success: false, error };
|
|
792
|
-
dispatch("turbo:fetch-request-error", {
|
|
793
|
-
target: this.formElement,
|
|
794
|
-
detail: { request, error },
|
|
795
|
-
});
|
|
796
799
|
this.delegate.formSubmissionErrored(this, error);
|
|
797
800
|
}
|
|
798
801
|
requestFinished(_request) {
|
|
@@ -2562,19 +2565,16 @@ class ErrorRenderer extends Renderer {
|
|
|
2562
2565
|
}
|
|
2563
2566
|
|
|
2564
2567
|
class PageRenderer extends Renderer {
|
|
2565
|
-
static
|
|
2566
|
-
await nextEventLoopTick();
|
|
2568
|
+
static renderElement(currentElement, newElement) {
|
|
2567
2569
|
if (document.body && newElement instanceof HTMLBodyElement) {
|
|
2568
|
-
|
|
2569
|
-
const newBody = PageRenderer.getBodyElement(newElement);
|
|
2570
|
-
currentBody.replaceWith(newBody);
|
|
2570
|
+
document.body.replaceWith(newElement);
|
|
2571
2571
|
}
|
|
2572
2572
|
else {
|
|
2573
2573
|
document.documentElement.appendChild(newElement);
|
|
2574
2574
|
}
|
|
2575
2575
|
}
|
|
2576
2576
|
get shouldRender() {
|
|
2577
|
-
return this.newSnapshot.isVisitable && this.trackedElementsAreIdentical
|
|
2577
|
+
return this.newSnapshot.isVisitable && this.trackedElementsAreIdentical;
|
|
2578
2578
|
}
|
|
2579
2579
|
get reloadReason() {
|
|
2580
2580
|
if (!this.newSnapshot.isVisitable) {
|
|
@@ -2587,11 +2587,6 @@ class PageRenderer extends Renderer {
|
|
|
2587
2587
|
reason: "tracked_element_mismatch",
|
|
2588
2588
|
};
|
|
2589
2589
|
}
|
|
2590
|
-
if (!this.bodyElementMatches) {
|
|
2591
|
-
return {
|
|
2592
|
-
reason: "body_element_mismatch",
|
|
2593
|
-
};
|
|
2594
|
-
}
|
|
2595
2590
|
}
|
|
2596
2591
|
async prepareToRender() {
|
|
2597
2592
|
await this.mergeHead();
|
|
@@ -2632,16 +2627,6 @@ class PageRenderer extends Renderer {
|
|
|
2632
2627
|
get trackedElementsAreIdentical() {
|
|
2633
2628
|
return this.currentHeadSnapshot.trackedElementSignature == this.newHeadSnapshot.trackedElementSignature;
|
|
2634
2629
|
}
|
|
2635
|
-
get bodyElementMatches() {
|
|
2636
|
-
return PageRenderer.getBodyElement(this.newElement) !== null;
|
|
2637
|
-
}
|
|
2638
|
-
static get bodySelector() {
|
|
2639
|
-
const bodyId = getBodyElementId();
|
|
2640
|
-
return bodyId ? `#${bodyId}` : "body";
|
|
2641
|
-
}
|
|
2642
|
-
static getBodyElement(element) {
|
|
2643
|
-
return element.querySelector(this.bodySelector) || element;
|
|
2644
|
-
}
|
|
2645
2630
|
async copyNewHeadStylesheetElements() {
|
|
2646
2631
|
const loadingElements = [];
|
|
2647
2632
|
for (const element of this.newHeadStylesheetElements) {
|
|
@@ -3414,10 +3399,6 @@ class FrameController {
|
|
|
3414
3399
|
}
|
|
3415
3400
|
requestErrored(request, error) {
|
|
3416
3401
|
console.error(error);
|
|
3417
|
-
dispatch("turbo:fetch-request-error", {
|
|
3418
|
-
target: this.element,
|
|
3419
|
-
detail: { request, error },
|
|
3420
|
-
});
|
|
3421
3402
|
this.resolveVisitPromise();
|
|
3422
3403
|
}
|
|
3423
3404
|
requestFinished(_request) {
|
package/dist/turbo.es2017-umd.js
CHANGED
|
@@ -454,9 +454,6 @@ Copyright © 2022 Basecamp, LLC
|
|
|
454
454
|
const action = getAttribute("data-turbo-action", ...elements);
|
|
455
455
|
return isAction(action) ? action : null;
|
|
456
456
|
}
|
|
457
|
-
function getBodyElementId() {
|
|
458
|
-
return getMetaContent("turbo-body");
|
|
459
|
-
}
|
|
460
457
|
function getMetaElement(name) {
|
|
461
458
|
return document.querySelector(`meta[name="${name}"]`);
|
|
462
459
|
}
|
|
@@ -532,7 +529,9 @@ Copyright © 2022 Basecamp, LLC
|
|
|
532
529
|
}
|
|
533
530
|
catch (error) {
|
|
534
531
|
if (error.name !== "AbortError") {
|
|
535
|
-
this.
|
|
532
|
+
if (this.willDelegateErrorHandling(error)) {
|
|
533
|
+
this.delegate.requestErrored(this, error);
|
|
534
|
+
}
|
|
536
535
|
throw error;
|
|
537
536
|
}
|
|
538
537
|
}
|
|
@@ -598,6 +597,14 @@ Copyright © 2022 Basecamp, LLC
|
|
|
598
597
|
if (event.defaultPrevented)
|
|
599
598
|
await requestInterception;
|
|
600
599
|
}
|
|
600
|
+
willDelegateErrorHandling(error) {
|
|
601
|
+
const event = dispatch("turbo:fetch-request-error", {
|
|
602
|
+
target: this.target,
|
|
603
|
+
cancelable: true,
|
|
604
|
+
detail: { request: this, error: error },
|
|
605
|
+
});
|
|
606
|
+
return !event.defaultPrevented;
|
|
607
|
+
}
|
|
601
608
|
}
|
|
602
609
|
|
|
603
610
|
class AppearanceObserver {
|
|
@@ -795,10 +802,6 @@ Copyright © 2022 Basecamp, LLC
|
|
|
795
802
|
}
|
|
796
803
|
requestErrored(request, error) {
|
|
797
804
|
this.result = { success: false, error };
|
|
798
|
-
dispatch("turbo:fetch-request-error", {
|
|
799
|
-
target: this.formElement,
|
|
800
|
-
detail: { request, error },
|
|
801
|
-
});
|
|
802
805
|
this.delegate.formSubmissionErrored(this, error);
|
|
803
806
|
}
|
|
804
807
|
requestFinished(_request) {
|
|
@@ -2568,19 +2571,16 @@ Copyright © 2022 Basecamp, LLC
|
|
|
2568
2571
|
}
|
|
2569
2572
|
|
|
2570
2573
|
class PageRenderer extends Renderer {
|
|
2571
|
-
static
|
|
2572
|
-
await nextEventLoopTick();
|
|
2574
|
+
static renderElement(currentElement, newElement) {
|
|
2573
2575
|
if (document.body && newElement instanceof HTMLBodyElement) {
|
|
2574
|
-
|
|
2575
|
-
const newBody = PageRenderer.getBodyElement(newElement);
|
|
2576
|
-
currentBody.replaceWith(newBody);
|
|
2576
|
+
document.body.replaceWith(newElement);
|
|
2577
2577
|
}
|
|
2578
2578
|
else {
|
|
2579
2579
|
document.documentElement.appendChild(newElement);
|
|
2580
2580
|
}
|
|
2581
2581
|
}
|
|
2582
2582
|
get shouldRender() {
|
|
2583
|
-
return this.newSnapshot.isVisitable && this.trackedElementsAreIdentical
|
|
2583
|
+
return this.newSnapshot.isVisitable && this.trackedElementsAreIdentical;
|
|
2584
2584
|
}
|
|
2585
2585
|
get reloadReason() {
|
|
2586
2586
|
if (!this.newSnapshot.isVisitable) {
|
|
@@ -2593,11 +2593,6 @@ Copyright © 2022 Basecamp, LLC
|
|
|
2593
2593
|
reason: "tracked_element_mismatch",
|
|
2594
2594
|
};
|
|
2595
2595
|
}
|
|
2596
|
-
if (!this.bodyElementMatches) {
|
|
2597
|
-
return {
|
|
2598
|
-
reason: "body_element_mismatch",
|
|
2599
|
-
};
|
|
2600
|
-
}
|
|
2601
2596
|
}
|
|
2602
2597
|
async prepareToRender() {
|
|
2603
2598
|
await this.mergeHead();
|
|
@@ -2638,16 +2633,6 @@ Copyright © 2022 Basecamp, LLC
|
|
|
2638
2633
|
get trackedElementsAreIdentical() {
|
|
2639
2634
|
return this.currentHeadSnapshot.trackedElementSignature == this.newHeadSnapshot.trackedElementSignature;
|
|
2640
2635
|
}
|
|
2641
|
-
get bodyElementMatches() {
|
|
2642
|
-
return PageRenderer.getBodyElement(this.newElement) !== null;
|
|
2643
|
-
}
|
|
2644
|
-
static get bodySelector() {
|
|
2645
|
-
const bodyId = getBodyElementId();
|
|
2646
|
-
return bodyId ? `#${bodyId}` : "body";
|
|
2647
|
-
}
|
|
2648
|
-
static getBodyElement(element) {
|
|
2649
|
-
return element.querySelector(this.bodySelector) || element;
|
|
2650
|
-
}
|
|
2651
2636
|
async copyNewHeadStylesheetElements() {
|
|
2652
2637
|
const loadingElements = [];
|
|
2653
2638
|
for (const element of this.newHeadStylesheetElements) {
|
|
@@ -3420,10 +3405,6 @@ Copyright © 2022 Basecamp, LLC
|
|
|
3420
3405
|
}
|
|
3421
3406
|
requestErrored(request, error) {
|
|
3422
3407
|
console.error(error);
|
|
3423
|
-
dispatch("turbo:fetch-request-error", {
|
|
3424
|
-
target: this.element,
|
|
3425
|
-
detail: { request, error },
|
|
3426
|
-
});
|
|
3427
3408
|
this.resolveVisitPromise();
|
|
3428
3409
|
}
|
|
3429
3410
|
requestFinished(_request) {
|
|
@@ -2,7 +2,7 @@ import { Renderer } from "../renderer";
|
|
|
2
2
|
import { PageSnapshot } from "./page_snapshot";
|
|
3
3
|
import { ReloadReason } from "../native/browser_adapter";
|
|
4
4
|
export declare class PageRenderer extends Renderer<HTMLBodyElement, PageSnapshot> {
|
|
5
|
-
static renderElement(currentElement: HTMLBodyElement, newElement: HTMLBodyElement):
|
|
5
|
+
static renderElement(currentElement: HTMLBodyElement, newElement: HTMLBodyElement): void;
|
|
6
6
|
get shouldRender(): boolean;
|
|
7
7
|
get reloadReason(): ReloadReason;
|
|
8
8
|
prepareToRender(): Promise<void>;
|
|
@@ -14,9 +14,6 @@ export declare class PageRenderer extends Renderer<HTMLBodyElement, PageSnapshot
|
|
|
14
14
|
mergeHead(): Promise<void>;
|
|
15
15
|
replaceBody(): void;
|
|
16
16
|
get trackedElementsAreIdentical(): boolean;
|
|
17
|
-
get bodyElementMatches(): boolean;
|
|
18
|
-
static get bodySelector(): string;
|
|
19
|
-
static getBodyElement(element: HTMLElement): HTMLElement;
|
|
20
17
|
copyNewHeadStylesheetElements(): Promise<void>;
|
|
21
18
|
copyNewHeadScriptElements(): void;
|
|
22
19
|
removeCurrentHeadProvisionalElements(): void;
|
|
@@ -12,7 +12,7 @@ declare const session: Session;
|
|
|
12
12
|
declare const cache: Cache;
|
|
13
13
|
declare const navigator: import("./drive/navigator").Navigator;
|
|
14
14
|
export { navigator, session, cache, PageRenderer, PageSnapshot, FrameRenderer };
|
|
15
|
-
export { TurboBeforeCacheEvent, TurboBeforeRenderEvent, TurboBeforeVisitEvent, TurboClickEvent,
|
|
15
|
+
export { TurboBeforeCacheEvent, TurboBeforeRenderEvent, TurboBeforeVisitEvent, TurboClickEvent, TurboFrameLoadEvent, TurboFrameRenderEvent, TurboLoadEvent, TurboRenderEvent, TurboVisitEvent, } from "./session";
|
|
16
16
|
export { TurboSubmitStartEvent, TurboSubmitEndEvent } from "./drive/form_submission";
|
|
17
17
|
export { TurboFrameMissingEvent } from "./frames/frame_controller";
|
|
18
18
|
export { StreamActions, TurboStreamAction, TurboStreamActions } from "./streams/stream_actions";
|
|
@@ -21,7 +21,6 @@ import { FrameElement } from "../elements/frame_element";
|
|
|
21
21
|
import { FrameViewRenderOptions } from "./frames/frame_view";
|
|
22
22
|
import { FetchResponse } from "../http/fetch_response";
|
|
23
23
|
import { Preloader, PreloaderDelegate } from "./drive/preloader";
|
|
24
|
-
import { FetchRequest } from "../http/fetch_request";
|
|
25
24
|
export declare type FormMode = "on" | "off" | "optin";
|
|
26
25
|
export declare type TimingData = unknown;
|
|
27
26
|
export declare type TurboBeforeCacheEvent = CustomEvent;
|
|
@@ -39,10 +38,6 @@ export declare type TurboFrameLoadEvent = CustomEvent;
|
|
|
39
38
|
export declare type TurboBeforeFrameRenderEvent = CustomEvent<{
|
|
40
39
|
newFrame: FrameElement;
|
|
41
40
|
} & FrameViewRenderOptions>;
|
|
42
|
-
export declare type TurboFetchRequestErrorEvent = CustomEvent<{
|
|
43
|
-
request: FetchRequest;
|
|
44
|
-
error: Error;
|
|
45
|
-
}>;
|
|
46
41
|
export declare type TurboFrameRenderEvent = CustomEvent<{
|
|
47
42
|
fetchResponse: FetchResponse;
|
|
48
43
|
}>;
|
|
@@ -7,6 +7,10 @@ export declare type TurboBeforeFetchRequestEvent = CustomEvent<{
|
|
|
7
7
|
export declare type TurboBeforeFetchResponseEvent = CustomEvent<{
|
|
8
8
|
fetchResponse: FetchResponse;
|
|
9
9
|
}>;
|
|
10
|
+
export declare type TurboFetchRequestErrorEvent = CustomEvent<{
|
|
11
|
+
request: FetchRequest;
|
|
12
|
+
error: Error;
|
|
13
|
+
}>;
|
|
10
14
|
export interface FetchRequestDelegate {
|
|
11
15
|
referrer?: URL;
|
|
12
16
|
prepareHeadersForRequest?(headers: FetchRequestHeaders, request: FetchRequest): void;
|
|
@@ -58,4 +62,5 @@ export declare class FetchRequest {
|
|
|
58
62
|
get abortSignal(): AbortSignal;
|
|
59
63
|
acceptResponseType(mimeType: string): void;
|
|
60
64
|
private allowRequestToBeIntercepted;
|
|
65
|
+
private willDelegateErrorHandling;
|
|
61
66
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
export { TurboBeforeFetchRequestEvent, TurboBeforeFetchResponseEvent } from "./fetch_request";
|
|
1
|
+
export { TurboBeforeFetchRequestEvent, TurboBeforeFetchResponseEvent, TurboFetchRequestErrorEvent, } from "./fetch_request";
|
package/dist/types/util.d.ts
CHANGED
|
@@ -20,7 +20,6 @@ export declare function clearBusyState(...elements: Element[]): void;
|
|
|
20
20
|
export declare function waitForLoad(element: HTMLLinkElement, timeoutInMilliseconds?: number): Promise<void>;
|
|
21
21
|
export declare function getHistoryMethodForAction(action: Action): (data: any, unused: string, url?: string | URL | null | undefined) => void;
|
|
22
22
|
export declare function getVisitAction(...elements: (Element | undefined)[]): Action | null;
|
|
23
|
-
export declare function getBodyElementId(): string | null;
|
|
24
23
|
export declare function getMetaElement(name: string): HTMLMetaElement | null;
|
|
25
24
|
export declare function getMetaContent(name: string): string | null;
|
|
26
25
|
export declare function setMetaContent(name: string, content: string): HTMLMetaElement;
|
package/package.json
CHANGED