@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.
@@ -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.delegate.requestErrored(this, error);
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 async renderElement(currentElement, newElement) {
2566
- await nextEventLoopTick();
2568
+ static renderElement(currentElement, newElement) {
2567
2569
  if (document.body && newElement instanceof HTMLBodyElement) {
2568
- const currentBody = PageRenderer.getBodyElement(currentElement);
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 && this.bodyElementMatches;
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) {
@@ -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.delegate.requestErrored(this, error);
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 async renderElement(currentElement, newElement) {
2572
- await nextEventLoopTick();
2574
+ static renderElement(currentElement, newElement) {
2573
2575
  if (document.body && newElement instanceof HTMLBodyElement) {
2574
- const currentBody = PageRenderer.getBodyElement(currentElement);
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 && this.bodyElementMatches;
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): Promise<void>;
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, TurboFetchRequestErrorEvent, TurboFrameLoadEvent, TurboFrameRenderEvent, TurboLoadEvent, TurboRenderEvent, TurboVisitEvent, } from "./session";
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";
@@ -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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@hotwired/turbo",
3
- "version": "7.2.0-rc.1",
3
+ "version": "7.2.0-rc.2",
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",