@hotwired/turbo 7.1.0 → 7.2.0-rc.1

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.
Files changed (73) hide show
  1. package/README.md +4 -0
  2. package/dist/turbo.es2017-esm.js +1139 -630
  3. package/dist/turbo.es2017-umd.js +1153 -637
  4. package/dist/types/core/bardo.d.ts +7 -2
  5. package/dist/types/core/cache.d.ts +10 -0
  6. package/dist/types/core/drive/error_renderer.d.ts +2 -1
  7. package/dist/types/core/drive/form_submission.d.ts +12 -5
  8. package/dist/types/core/drive/head_snapshot.d.ts +3 -3
  9. package/dist/types/core/drive/history.d.ts +1 -1
  10. package/dist/types/core/drive/navigator.d.ts +5 -4
  11. package/dist/types/core/drive/page_renderer.d.ts +11 -5
  12. package/dist/types/core/drive/page_view.d.ts +8 -5
  13. package/dist/types/core/drive/preloader.d.ts +14 -0
  14. package/dist/types/core/drive/progress_bar.d.ts +1 -0
  15. package/dist/types/core/drive/visit.d.ts +17 -5
  16. package/dist/types/core/frames/frame_controller.d.ts +50 -24
  17. package/dist/types/core/frames/frame_redirector.d.ts +12 -10
  18. package/dist/types/core/frames/frame_renderer.d.ts +8 -1
  19. package/dist/types/core/frames/frame_view.d.ts +2 -1
  20. package/dist/types/core/index.d.ts +12 -4
  21. package/dist/types/core/native/adapter.d.ts +3 -2
  22. package/dist/types/core/native/browser_adapter.d.ts +18 -9
  23. package/dist/types/core/renderer.d.ts +11 -5
  24. package/dist/types/core/session.d.ts +81 -21
  25. package/dist/types/core/snapshot.d.ts +5 -2
  26. package/dist/types/core/streams/stream_actions.d.ts +4 -2
  27. package/dist/types/core/streams/stream_message.d.ts +2 -6
  28. package/dist/types/core/streams/stream_message_renderer.d.ts +7 -0
  29. package/dist/types/core/types.d.ts +4 -0
  30. package/dist/types/core/view.d.ts +13 -7
  31. package/dist/types/elements/frame_element.d.ts +10 -6
  32. package/dist/types/elements/index.d.ts +1 -0
  33. package/dist/types/elements/stream_element.d.ts +8 -1
  34. package/dist/types/elements/stream_source_element.d.ts +7 -0
  35. package/dist/types/http/fetch_request.d.ts +11 -3
  36. package/dist/types/http/index.d.ts +1 -0
  37. package/dist/types/index.d.ts +2 -0
  38. package/dist/types/observers/cache_observer.d.ts +1 -1
  39. package/dist/types/observers/form_link_click_observer.d.ts +14 -0
  40. package/dist/types/observers/form_submit_observer.d.ts +2 -1
  41. package/dist/types/observers/link_click_observer.d.ts +5 -4
  42. package/dist/types/polyfills/submit-event.d.ts +1 -7
  43. package/dist/types/tests/functional/async_script_tests.d.ts +1 -6
  44. package/dist/types/tests/functional/autofocus_tests.d.ts +1 -9
  45. package/dist/types/tests/functional/cache_observer_tests.d.ts +1 -5
  46. package/dist/types/tests/functional/drive_custom_body_tests.d.ts +1 -0
  47. package/dist/types/tests/functional/drive_disabled_tests.d.ts +1 -9
  48. package/dist/types/tests/functional/drive_tests.d.ts +1 -8
  49. package/dist/types/tests/functional/form_mode_tests.d.ts +1 -0
  50. package/dist/types/tests/functional/form_submission_tests.d.ts +1 -84
  51. package/dist/types/tests/functional/frame_navigation_tests.d.ts +1 -7
  52. package/dist/types/tests/functional/frame_tests.d.ts +1 -52
  53. package/dist/types/tests/functional/import_tests.d.ts +1 -4
  54. package/dist/types/tests/functional/loading_tests.d.ts +1 -13
  55. package/dist/types/tests/functional/navigation_tests.d.ts +1 -38
  56. package/dist/types/tests/functional/pausable_rendering_tests.d.ts +1 -6
  57. package/dist/types/tests/functional/pausable_requests_tests.d.ts +1 -6
  58. package/dist/types/tests/functional/preloader_tests.d.ts +1 -0
  59. package/dist/types/tests/functional/rendering_tests.d.ts +1 -35
  60. package/dist/types/tests/functional/scroll_restoration_tests.d.ts +1 -6
  61. package/dist/types/tests/functional/stream_tests.d.ts +1 -6
  62. package/dist/types/tests/functional/visit_tests.d.ts +1 -15
  63. package/dist/types/tests/helpers/page.d.ts +50 -0
  64. package/dist/types/tests/unit/deprecated_adapter_support_test.d.ts +10 -10
  65. package/dist/types/util.d.ts +14 -3
  66. package/package.json +23 -9
  67. package/CHANGELOG.md +0 -3
  68. package/dist/types/core/frames/form_interceptor.d.ts +0 -12
  69. package/dist/types/core/frames/link_interceptor.d.ts +0 -16
  70. package/dist/types/tests/functional/index.d.ts +0 -17
  71. package/dist/types/tests/helpers/functional_test_case.d.ts +0 -44
  72. package/dist/types/tests/helpers/remote_channel.d.ts +0 -10
  73. package/dist/types/tests/helpers/turbo_drive_test_case.d.ts +0 -21
@@ -1,8 +1,13 @@
1
1
  import { PermanentElementMap } from "./snapshot";
2
+ export interface BardoDelegate {
3
+ enteringBardo(currentPermanentElement: Element, newPermanentElement: Element): void;
4
+ leavingBardo(currentPermanentElement: Element): void;
5
+ }
2
6
  export declare class Bardo {
3
7
  readonly permanentElementMap: PermanentElementMap;
4
- static preservingPermanentElements(permanentElementMap: PermanentElementMap, callback: () => void): void;
5
- constructor(permanentElementMap: PermanentElementMap);
8
+ readonly delegate: BardoDelegate;
9
+ static preservingPermanentElements(delegate: BardoDelegate, permanentElementMap: PermanentElementMap, callback: () => void): void;
10
+ constructor(delegate: BardoDelegate, permanentElementMap: PermanentElementMap);
6
11
  enter(): void;
7
12
  leave(): void;
8
13
  replaceNewPermanentElementWithPlaceholder(permanentElement: Element): void;
@@ -0,0 +1,10 @@
1
+ import { Session } from "./session";
2
+ export declare class Cache {
3
+ readonly session: Session;
4
+ constructor(session: Session);
5
+ clear(): void;
6
+ resetCacheControl(): void;
7
+ exemptPageFromCache(): void;
8
+ exemptPageFromPreview(): void;
9
+ private setCacheControl;
10
+ }
@@ -1,9 +1,10 @@
1
1
  import { PageSnapshot } from "./page_snapshot";
2
2
  import { Renderer } from "../renderer";
3
3
  export declare class ErrorRenderer extends Renderer<HTMLBodyElement, PageSnapshot> {
4
+ static renderElement(currentElement: HTMLBodyElement, newElement: HTMLBodyElement): void;
4
5
  render(): Promise<void>;
5
6
  replaceHeadAndBody(): void;
6
7
  activateScriptElements(): void;
7
8
  get newHead(): HTMLHeadElement;
8
- get scriptElements(): HTMLScriptElement[];
9
+ get scriptElements(): NodeListOf<HTMLScriptElement>;
9
10
  }
@@ -27,6 +27,14 @@ declare enum FormEnctype {
27
27
  multipart = "multipart/form-data",
28
28
  plain = "text/plain"
29
29
  }
30
+ export declare type TurboSubmitStartEvent = CustomEvent<{
31
+ formSubmission: FormSubmission;
32
+ }>;
33
+ export declare type TurboSubmitEndEvent = CustomEvent<{
34
+ formSubmission: FormSubmission;
35
+ } & {
36
+ [K in keyof FormSubmissionResult]?: FormSubmissionResult[K];
37
+ }>;
30
38
  export declare class FormSubmission {
31
39
  readonly delegate: FormSubmissionDelegate;
32
40
  readonly formElement: HTMLFormElement;
@@ -37,7 +45,7 @@ export declare class FormSubmission {
37
45
  readonly mustRedirect: boolean;
38
46
  state: FormSubmissionState;
39
47
  result?: FormSubmissionResult;
40
- static confirmMethod(message: string, element: HTMLFormElement): boolean;
48
+ static confirmMethod(message: string, _element: HTMLFormElement, _submitter: HTMLElement | undefined): Promise<boolean>;
41
49
  constructor(delegate: FormSubmissionDelegate, formElement: HTMLFormElement, submitter?: HTMLElement, mustRedirect?: boolean);
42
50
  get method(): FetchMethod;
43
51
  get action(): string;
@@ -45,17 +53,16 @@ export declare class FormSubmission {
45
53
  get enctype(): FormEnctype;
46
54
  get isIdempotent(): boolean;
47
55
  get stringFormData(): [string, string][];
48
- get confirmationMessage(): string | null;
49
- get needsConfirmation(): boolean;
50
56
  start(): Promise<void | FetchResponse>;
51
57
  stop(): true | undefined;
52
58
  prepareHeadersForRequest(headers: FetchRequestHeaders, request: FetchRequest): void;
53
- requestStarted(request: FetchRequest): void;
59
+ requestStarted(_request: FetchRequest): void;
54
60
  requestPreventedHandlingResponse(request: FetchRequest, response: FetchResponse): void;
55
61
  requestSucceededWithResponse(request: FetchRequest, response: FetchResponse): void;
56
62
  requestFailedWithResponse(request: FetchRequest, response: FetchResponse): void;
57
63
  requestErrored(request: FetchRequest, error: Error): void;
58
- requestFinished(request: FetchRequest): void;
64
+ requestFinished(_request: FetchRequest): void;
59
65
  requestMustRedirect(request: FetchRequest): boolean;
66
+ requestAcceptsTurboStreamResponse(request: FetchRequest): boolean;
60
67
  }
61
68
  export {};
@@ -11,9 +11,9 @@ declare type ElementType = "script" | "stylesheet";
11
11
  export declare class HeadSnapshot extends Snapshot<HTMLHeadElement> {
12
12
  readonly detailsByOuterHTML: ElementDetailMap;
13
13
  get trackedElementSignature(): string;
14
- getScriptElementsNotInSnapshot(snapshot: HeadSnapshot): Element[];
15
- getStylesheetElementsNotInSnapshot(snapshot: HeadSnapshot): Element[];
16
- getElementsMatchingTypeNotInSnapshot(matchedType: ElementType, snapshot: HeadSnapshot): Element[];
14
+ getScriptElementsNotInSnapshot(snapshot: HeadSnapshot): HTMLScriptElement[];
15
+ getStylesheetElementsNotInSnapshot(snapshot: HeadSnapshot): HTMLLinkElement[];
16
+ getElementsMatchingTypeNotInSnapshot<T extends Element>(matchedType: ElementType, snapshot: HeadSnapshot): T[];
17
17
  get provisionalElements(): Element[];
18
18
  getMetaValue(name: string): string | null;
19
19
  findMetaElementByName(name: string): Element | undefined;
@@ -28,7 +28,7 @@ export declare class History {
28
28
  assumeControlOfScrollRestoration(): void;
29
29
  relinquishControlOfScrollRestoration(): void;
30
30
  onPopState: (event: PopStateEvent) => void;
31
- onPageLoad: (event: Event) => Promise<void>;
31
+ onPageLoad: (_event: Event) => Promise<void>;
32
32
  shouldHandlePopState(): boolean;
33
33
  pageIsLoaded(): boolean;
34
34
  }
@@ -4,17 +4,18 @@ import { FormSubmission } from "./form_submission";
4
4
  import { Locatable } from "../url";
5
5
  import { Visit, VisitDelegate, VisitOptions } from "./visit";
6
6
  export declare type NavigatorDelegate = VisitDelegate & {
7
- allowsVisitingLocationWithAction(location: URL, action?: Action): boolean;
8
- visitProposedToLocation(location: URL, options: Partial<VisitOptions>): void;
7
+ allowsVisitingLocation(location: URL, options: Partial<VisitOptions>): boolean;
8
+ visitProposedToLocation(location: URL, options: Partial<VisitOptions>): Promise<void>;
9
9
  notifyApplicationAfterVisitingSamePageLocation(oldURL: URL, newURL: URL): void;
10
10
  };
11
11
  export declare class Navigator {
12
12
  readonly delegate: NavigatorDelegate;
13
13
  formSubmission?: FormSubmission;
14
14
  currentVisit?: Visit;
15
+ lastVisit?: Visit;
15
16
  constructor(delegate: NavigatorDelegate);
16
- proposeVisit(location: URL, options?: Partial<VisitOptions>): void;
17
- startVisit(locatable: Locatable, restorationIdentifier: string, options?: Partial<VisitOptions>): void;
17
+ proposeVisit(location: URL, options?: Partial<VisitOptions>): Promise<void>;
18
+ startVisit(locatable: Locatable, restorationIdentifier: string, options?: Partial<VisitOptions>): Promise<void>;
18
19
  submitForm(form: HTMLFormElement, submitter?: HTMLElement): void;
19
20
  stop(): void;
20
21
  get adapter(): import("../native/adapter").Adapter;
@@ -1,25 +1,31 @@
1
1
  import { Renderer } from "../renderer";
2
2
  import { PageSnapshot } from "./page_snapshot";
3
+ import { ReloadReason } from "../native/browser_adapter";
3
4
  export declare class PageRenderer extends Renderer<HTMLBodyElement, PageSnapshot> {
5
+ static renderElement(currentElement: HTMLBodyElement, newElement: HTMLBodyElement): Promise<void>;
4
6
  get shouldRender(): boolean;
5
- prepareToRender(): void;
7
+ get reloadReason(): ReloadReason;
8
+ prepareToRender(): Promise<void>;
6
9
  render(): Promise<void>;
7
10
  finishRendering(): void;
8
11
  get currentHeadSnapshot(): import("./head_snapshot").HeadSnapshot;
9
12
  get newHeadSnapshot(): import("./head_snapshot").HeadSnapshot;
10
13
  get newElement(): HTMLBodyElement;
11
- mergeHead(): void;
14
+ mergeHead(): Promise<void>;
12
15
  replaceBody(): void;
13
16
  get trackedElementsAreIdentical(): boolean;
14
- copyNewHeadStylesheetElements(): void;
17
+ get bodyElementMatches(): boolean;
18
+ static get bodySelector(): string;
19
+ static getBodyElement(element: HTMLElement): HTMLElement;
20
+ copyNewHeadStylesheetElements(): Promise<void>;
15
21
  copyNewHeadScriptElements(): void;
16
22
  removeCurrentHeadProvisionalElements(): void;
17
23
  copyNewHeadProvisionalElements(): void;
18
24
  activateNewBody(): void;
19
25
  activateNewBodyScriptElements(): void;
20
26
  assignNewBody(): void;
21
- get newHeadStylesheetElements(): Element[];
22
- get newHeadScriptElements(): Element[];
27
+ get newHeadStylesheetElements(): HTMLLinkElement[];
28
+ get newHeadScriptElements(): HTMLScriptElement[];
23
29
  get currentHeadProvisionalElements(): Element[];
24
30
  get newHeadProvisionalElements(): Element[];
25
31
  get newBodyScriptElements(): NodeListOf<HTMLScriptElement>;
@@ -1,17 +1,20 @@
1
- import { View, ViewDelegate } from "../view";
1
+ import { View, ViewDelegate, ViewRenderOptions } from "../view";
2
2
  import { ErrorRenderer } from "./error_renderer";
3
3
  import { PageRenderer } from "./page_renderer";
4
4
  import { PageSnapshot } from "./page_snapshot";
5
5
  import { SnapshotCache } from "./snapshot_cache";
6
- export interface PageViewDelegate extends ViewDelegate<PageSnapshot> {
6
+ import { Visit } from "./visit";
7
+ export declare type PageViewRenderOptions = ViewRenderOptions<HTMLBodyElement>;
8
+ export interface PageViewDelegate extends ViewDelegate<HTMLBodyElement, PageSnapshot> {
7
9
  viewWillCacheSnapshot(): void;
8
10
  }
9
11
  declare type PageViewRenderer = PageRenderer | ErrorRenderer;
10
- export declare class PageView extends View<Element, PageSnapshot, PageViewRenderer, PageViewDelegate> {
12
+ export declare class PageView extends View<HTMLBodyElement, PageSnapshot, PageViewRenderer, PageViewDelegate> {
11
13
  readonly snapshotCache: SnapshotCache;
12
14
  lastRenderedLocation: URL;
13
- renderPage(snapshot: PageSnapshot, isPreview?: boolean, willRender?: boolean): Promise<void>;
14
- renderError(snapshot: PageSnapshot): Promise<void>;
15
+ forceReloaded: boolean;
16
+ renderPage(snapshot: PageSnapshot, isPreview?: boolean, willRender?: boolean, visit?: Visit): Promise<void>;
17
+ renderError(snapshot: PageSnapshot, visit?: Visit): Promise<void>;
15
18
  clearSnapshotCache(): void;
16
19
  cacheSnapshot(): Promise<PageSnapshot | undefined>;
17
20
  getCachedSnapshotForLocation(location: URL): PageSnapshot | undefined;
@@ -0,0 +1,14 @@
1
+ import { Navigator } from "./navigator";
2
+ import { SnapshotCache } from "./snapshot_cache";
3
+ export interface PreloaderDelegate {
4
+ readonly navigator: Navigator;
5
+ }
6
+ export declare class Preloader {
7
+ readonly delegate: PreloaderDelegate;
8
+ readonly selector: string;
9
+ constructor(delegate: PreloaderDelegate);
10
+ get snapshotCache(): SnapshotCache;
11
+ start(): void;
12
+ preloadOnLoadLinksForView(element: Element): void;
13
+ preloadURL(link: HTMLAnchorElement): Promise<void>;
14
+ }
@@ -21,4 +21,5 @@ export declare class ProgressBar {
21
21
  refresh(): void;
22
22
  createStylesheetElement(): HTMLStyleElement;
23
23
  createProgressElement(): HTMLDivElement;
24
+ get cspNonce(): string | null;
24
25
  }
@@ -1,5 +1,5 @@
1
1
  import { Adapter } from "../native/adapter";
2
- import { FetchRequest, FetchRequestDelegate } from "../../http/fetch_request";
2
+ import { FetchRequest, FetchRequestDelegate, FetchRequestHeaders } from "../../http/fetch_request";
3
3
  import { FetchResponse } from "../../http/fetch_response";
4
4
  import { History } from "./history";
5
5
  import { Snapshot } from "../snapshot";
@@ -39,6 +39,12 @@ export declare type VisitOptions = {
39
39
  response?: VisitResponse;
40
40
  visitCachedSnapshot(snapshot: Snapshot): void;
41
41
  willRender: boolean;
42
+ updateHistory: boolean;
43
+ restorationIdentifier?: string;
44
+ shouldCacheSnapshot: boolean;
45
+ frame?: string;
46
+ acceptsStreamResponse: boolean;
47
+ initiator: Element;
42
48
  };
43
49
  export declare type VisitResponse = {
44
50
  statusCode: number;
@@ -52,13 +58,16 @@ export declare enum SystemStatusCode {
52
58
  }
53
59
  export declare class Visit implements FetchRequestDelegate {
54
60
  readonly delegate: VisitDelegate;
55
- readonly identifier: string;
56
61
  readonly restorationIdentifier: string;
57
62
  readonly action: Action;
58
63
  readonly referrer?: URL;
59
64
  readonly timingMetrics: TimingMetrics;
60
65
  readonly visitCachedSnapshot: (snapshot: Snapshot) => void;
61
66
  readonly willRender: boolean;
67
+ readonly updateHistory: boolean;
68
+ readonly promise: Promise<void>;
69
+ readonly initiator: Element;
70
+ private resolvingFunctions;
62
71
  followedRedirect: boolean;
63
72
  frame?: number;
64
73
  historyChanged: boolean;
@@ -68,6 +77,8 @@ export declare class Visit implements FetchRequestDelegate {
68
77
  request?: FetchRequest;
69
78
  response?: VisitResponse;
70
79
  scrolled: boolean;
80
+ shouldCacheSnapshot: boolean;
81
+ acceptsStreamResponse: boolean;
71
82
  snapshotHTML?: string;
72
83
  snapshotCached: boolean;
73
84
  state: VisitState;
@@ -94,18 +105,19 @@ export declare class Visit implements FetchRequestDelegate {
94
105
  loadCachedSnapshot(): void;
95
106
  followRedirect(): void;
96
107
  goToSamePageAnchor(): void;
108
+ prepareHeadersForRequest(headers: FetchRequestHeaders, request: FetchRequest): void;
97
109
  requestStarted(): void;
98
- requestPreventedHandlingResponse(request: FetchRequest, response: FetchResponse): void;
110
+ requestPreventedHandlingResponse(_request: FetchRequest, _response: FetchResponse): void;
99
111
  requestSucceededWithResponse(request: FetchRequest, response: FetchResponse): Promise<void>;
100
112
  requestFailedWithResponse(request: FetchRequest, response: FetchResponse): Promise<void>;
101
- requestErrored(request: FetchRequest, error: Error): void;
113
+ requestErrored(_request: FetchRequest, _error: Error): void;
102
114
  requestFinished(): void;
103
115
  performScroll(): void;
104
116
  scrollToRestoredPosition(): true | undefined;
105
117
  scrollToAnchor(): true | undefined;
106
118
  recordTimingMetric(metric: TimingMetric): void;
107
119
  getTimingMetrics(): TimingMetrics;
108
- getHistoryMethodForAction(action: Action): (data: any, title: string, url?: string | null | undefined) => void;
120
+ getHistoryMethodForAction(action: Action): (data: any, unused: string, url?: string | URL | null | undefined) => void;
109
121
  hasPreloadedResponse(): boolean;
110
122
  shouldIssueRequest(): boolean;
111
123
  cacheSnapshot(): void;
@@ -4,67 +4,93 @@ import { FetchResponse } from "../../http/fetch_response";
4
4
  import { AppearanceObserver, AppearanceObserverDelegate } from "../../observers/appearance_observer";
5
5
  import { FormSubmission, FormSubmissionDelegate } from "../drive/form_submission";
6
6
  import { Snapshot } from "../snapshot";
7
- import { ViewDelegate } from "../view";
8
- import { FormInterceptor, FormInterceptorDelegate } from "./form_interceptor";
7
+ import { ViewDelegate, ViewRenderOptions } from "../view";
8
+ import { Locatable } from "../url";
9
+ import { FormSubmitObserver, FormSubmitObserverDelegate } from "../../observers/form_submit_observer";
9
10
  import { FrameView } from "./frame_view";
10
- import { LinkInterceptor, LinkInterceptorDelegate } from "./link_interceptor";
11
- export declare class FrameController implements AppearanceObserverDelegate, FetchRequestDelegate, FormInterceptorDelegate, FormSubmissionDelegate, FrameElementDelegate, LinkInterceptorDelegate, ViewDelegate<Snapshot<FrameElement>> {
11
+ import { LinkClickObserver, LinkClickObserverDelegate } from "../../observers/link_click_observer";
12
+ import { FormLinkClickObserver, FormLinkClickObserverDelegate } from "../../observers/form_link_click_observer";
13
+ import { VisitOptions } from "../drive/visit";
14
+ declare type VisitFallback = (location: Response | Locatable, options: Partial<VisitOptions>) => Promise<void>;
15
+ export declare type TurboFrameMissingEvent = CustomEvent<{
16
+ response: Response;
17
+ visit: VisitFallback;
18
+ }>;
19
+ export declare class FrameController implements AppearanceObserverDelegate, FetchRequestDelegate, FormSubmitObserverDelegate, FormSubmissionDelegate, FrameElementDelegate, FormLinkClickObserverDelegate, LinkClickObserverDelegate, ViewDelegate<FrameElement, Snapshot<FrameElement>> {
12
20
  readonly element: FrameElement;
13
21
  readonly view: FrameView;
14
22
  readonly appearanceObserver: AppearanceObserver;
15
- readonly linkInterceptor: LinkInterceptor;
16
- readonly formInterceptor: FormInterceptor;
17
- currentURL?: string | null;
23
+ readonly formLinkClickObserver: FormLinkClickObserver;
24
+ readonly linkClickObserver: LinkClickObserver;
25
+ readonly formSubmitObserver: FormSubmitObserver;
18
26
  formSubmission?: FormSubmission;
19
- fetchResponseLoaded: (fetchResponse: FetchResponse) => void;
27
+ fetchResponseLoaded: (_fetchResponse: FetchResponse) => void;
20
28
  private currentFetchRequest;
21
29
  private resolveVisitPromise;
22
30
  private connected;
23
31
  private hasBeenLoaded;
24
- private settingSourceURL;
32
+ private ignoredAttributes;
33
+ private action;
34
+ private frame?;
35
+ readonly restorationIdentifier: string;
36
+ private previousFrameElement?;
37
+ private currentNavigationElement?;
25
38
  constructor(element: FrameElement);
26
39
  connect(): void;
27
40
  disconnect(): void;
28
41
  disabledChanged(): void;
29
42
  sourceURLChanged(): void;
43
+ completeChanged(): void;
30
44
  loadingStyleChanged(): void;
31
- loadSourceURL(): Promise<void>;
45
+ private loadSourceURL;
32
46
  loadResponse(fetchResponse: FetchResponse): Promise<void>;
33
- elementAppearedInViewport(element: Element): void;
34
- shouldInterceptLinkClick(element: Element, url: string): boolean;
35
- linkClickIntercepted(element: Element, url: string): void;
36
- shouldInterceptFormSubmission(element: HTMLFormElement, submitter?: HTMLElement): boolean;
37
- formSubmissionIntercepted(element: HTMLFormElement, submitter?: HTMLElement): void;
47
+ elementAppearedInViewport(_element: Element): void;
48
+ willSubmitFormLinkToLocation(link: Element): boolean;
49
+ submittedFormLinkToLocation(link: Element, _location: URL, form: HTMLFormElement): void;
50
+ willFollowLinkToLocation(element: Element): boolean;
51
+ followedLinkToLocation(element: Element, location: URL): void;
52
+ willSubmitForm(element: HTMLFormElement, submitter?: HTMLElement): boolean;
53
+ formSubmitted(element: HTMLFormElement, submitter?: HTMLElement): void;
38
54
  prepareHeadersForRequest(headers: FetchRequestHeaders, request: FetchRequest): void;
39
- requestStarted(request: FetchRequest): void;
40
- requestPreventedHandlingResponse(request: FetchRequest, response: FetchResponse): void;
55
+ requestStarted(_request: FetchRequest): void;
56
+ requestPreventedHandlingResponse(_request: FetchRequest, _response: FetchResponse): void;
41
57
  requestSucceededWithResponse(request: FetchRequest, response: FetchResponse): Promise<void>;
42
- requestFailedWithResponse(request: FetchRequest, response: FetchResponse): void;
58
+ requestFailedWithResponse(request: FetchRequest, response: FetchResponse): Promise<void>;
43
59
  requestErrored(request: FetchRequest, error: Error): void;
44
- requestFinished(request: FetchRequest): void;
60
+ requestFinished(_request: FetchRequest): void;
45
61
  formSubmissionStarted({ formElement }: FormSubmission): void;
46
62
  formSubmissionSucceededWithResponse(formSubmission: FormSubmission, response: FetchResponse): void;
47
63
  formSubmissionFailedWithResponse(formSubmission: FormSubmission, fetchResponse: FetchResponse): void;
48
64
  formSubmissionErrored(formSubmission: FormSubmission, error: Error): void;
49
65
  formSubmissionFinished({ formElement }: FormSubmission): void;
50
- allowsImmediateRender(snapshot: Snapshot, resume: (value: any) => void): boolean;
51
- viewRenderedSnapshot(snapshot: Snapshot, isPreview: boolean): void;
66
+ allowsImmediateRender({ element: newFrame }: Snapshot<FrameElement>, options: ViewRenderOptions<FrameElement>): boolean;
67
+ viewRenderedSnapshot(_snapshot: Snapshot, _isPreview: boolean): void;
68
+ preloadOnLoadLinksForView(element: Element): void;
52
69
  viewInvalidated(): void;
70
+ willRenderFrame(currentElement: FrameElement, _newElement: FrameElement): void;
71
+ visitCachedSnapshot: ({ element }: Snapshot) => void;
53
72
  private visit;
54
73
  private navigateFrame;
55
74
  private proposeVisitIfNavigatedWithAction;
75
+ changeHistory(): void;
76
+ private willHandleFrameMissingFromResponse;
77
+ private visitResponse;
56
78
  private findFrameElement;
57
- extractForeignFrameElement(container: ParentNode): Promise<FrameElement>;
79
+ extractForeignFrameElement(container: ParentNode): Promise<FrameElement | null>;
58
80
  private formActionIsVisitable;
59
81
  private shouldInterceptNavigation;
60
82
  get id(): string;
61
83
  get enabled(): boolean;
62
84
  get sourceURL(): string | undefined;
63
- get reloadable(): boolean;
64
- set reloadable(value: boolean);
65
85
  set sourceURL(sourceURL: string | undefined);
66
86
  get loadingStyle(): FrameLoadingStyle;
67
87
  get isLoading(): boolean;
88
+ get complete(): boolean;
89
+ set complete(value: boolean);
68
90
  get isActive(): boolean;
69
91
  get rootLocation(): URL;
92
+ private isIgnoringChangesTo;
93
+ private ignoringChangesToAttribute;
94
+ private withCurrentNavigationElement;
70
95
  }
96
+ export {};
@@ -1,16 +1,18 @@
1
- import { FormInterceptor, FormInterceptorDelegate } from "./form_interceptor";
2
- import { LinkInterceptor, LinkInterceptorDelegate } from "./link_interceptor";
3
- export declare class FrameRedirector implements LinkInterceptorDelegate, FormInterceptorDelegate {
1
+ import { FormSubmitObserver, FormSubmitObserverDelegate } from "../../observers/form_submit_observer";
2
+ import { LinkClickObserver, LinkClickObserverDelegate } from "../../observers/link_click_observer";
3
+ import { Session } from "../session";
4
+ export declare class FrameRedirector implements LinkClickObserverDelegate, FormSubmitObserverDelegate {
5
+ readonly session: Session;
4
6
  readonly element: Element;
5
- readonly linkInterceptor: LinkInterceptor;
6
- readonly formInterceptor: FormInterceptor;
7
- constructor(element: Element);
7
+ readonly linkClickObserver: LinkClickObserver;
8
+ readonly formSubmitObserver: FormSubmitObserver;
9
+ constructor(session: Session, element: Element);
8
10
  start(): void;
9
11
  stop(): void;
10
- shouldInterceptLinkClick(element: Element, url: string): boolean;
11
- linkClickIntercepted(element: Element, url: string): void;
12
- shouldInterceptFormSubmission(element: HTMLFormElement, submitter?: HTMLElement): boolean;
13
- formSubmissionIntercepted(element: HTMLFormElement, submitter?: HTMLElement): void;
12
+ willFollowLinkToLocation(element: Element): boolean;
13
+ followedLinkToLocation(element: Element, url: URL): void;
14
+ willSubmitForm(element: HTMLFormElement, submitter?: HTMLElement): boolean;
15
+ formSubmitted(element: HTMLFormElement, submitter?: HTMLElement): void;
14
16
  private shouldSubmit;
15
17
  private shouldRedirect;
16
18
  private findFrameElement;
@@ -1,6 +1,13 @@
1
1
  import { FrameElement } from "../../elements/frame_element";
2
- import { Renderer } from "../renderer";
2
+ import { Render, Renderer } from "../renderer";
3
+ import { Snapshot } from "../snapshot";
4
+ export interface FrameRendererDelegate {
5
+ willRenderFrame(currentElement: FrameElement, newElement: FrameElement): void;
6
+ }
3
7
  export declare class FrameRenderer extends Renderer<FrameElement> {
8
+ private readonly delegate;
9
+ static renderElement(currentElement: FrameElement, newElement: FrameElement): void;
10
+ constructor(delegate: FrameRendererDelegate, currentSnapshot: Snapshot<FrameElement>, newSnapshot: Snapshot<FrameElement>, renderElement: Render<FrameElement>, isPreview: boolean, willRender?: boolean);
4
11
  get shouldRender(): boolean;
5
12
  render(): Promise<void>;
6
13
  loadFrameElement(): void;
@@ -1,6 +1,7 @@
1
1
  import { FrameElement } from "../../elements";
2
2
  import { Snapshot } from "../snapshot";
3
- import { View } from "../view";
3
+ import { View, ViewRenderOptions } from "../view";
4
+ export declare type FrameViewRenderOptions = ViewRenderOptions<FrameElement>;
4
5
  export declare class FrameView extends View<FrameElement> {
5
6
  invalidate(): void;
6
7
  get snapshot(): Snapshot<FrameElement>;
@@ -1,20 +1,28 @@
1
1
  import { Adapter } from "./native/adapter";
2
- import { Session } from "./session";
2
+ import { FormMode, Session } from "./session";
3
+ import { Cache } from "./cache";
3
4
  import { Locatable } from "./url";
4
5
  import { StreamMessage } from "./streams/stream_message";
5
6
  import { StreamSource } from "./types";
6
7
  import { VisitOptions } from "./drive/visit";
7
8
  import { PageRenderer } from "./drive/page_renderer";
8
9
  import { PageSnapshot } from "./drive/page_snapshot";
10
+ import { FrameRenderer } from "./frames/frame_renderer";
9
11
  declare const session: Session;
12
+ declare const cache: Cache;
10
13
  declare const navigator: import("./drive/navigator").Navigator;
11
- export { navigator, session, PageRenderer, PageSnapshot };
14
+ export { navigator, session, cache, PageRenderer, PageSnapshot, FrameRenderer };
15
+ export { TurboBeforeCacheEvent, TurboBeforeRenderEvent, TurboBeforeVisitEvent, TurboClickEvent, TurboFetchRequestErrorEvent, TurboFrameLoadEvent, TurboFrameRenderEvent, TurboLoadEvent, TurboRenderEvent, TurboVisitEvent, } from "./session";
16
+ export { TurboSubmitStartEvent, TurboSubmitEndEvent } from "./drive/form_submission";
17
+ export { TurboFrameMissingEvent } from "./frames/frame_controller";
18
+ export { StreamActions, TurboStreamAction, TurboStreamActions } from "./streams/stream_actions";
12
19
  export declare function start(): void;
13
20
  export declare function registerAdapter(adapter: Adapter): void;
14
- export declare function visit(location: Locatable, options?: Partial<VisitOptions>): void;
21
+ export declare function visit(location: Locatable, options?: Partial<VisitOptions>): Promise<void>;
15
22
  export declare function connectStreamSource(source: StreamSource): void;
16
23
  export declare function disconnectStreamSource(source: StreamSource): void;
17
24
  export declare function renderStreamMessage(message: StreamMessage | string): void;
18
25
  export declare function clearCache(): void;
19
26
  export declare function setProgressBarDelay(delay: number): void;
20
- export declare function setConfirmMethod(confirmMethod: (message: string, element: HTMLFormElement) => boolean): void;
27
+ export declare function setConfirmMethod(confirmMethod: (message: string, element: HTMLFormElement, submitter: HTMLElement | undefined) => Promise<boolean>): void;
28
+ export declare function setFormMode(mode: FormMode): void;
@@ -1,7 +1,8 @@
1
1
  import { Visit, VisitOptions } from "../drive/visit";
2
2
  import { FormSubmission } from "../drive/form_submission";
3
+ import { ReloadReason } from "./browser_adapter";
3
4
  export interface Adapter {
4
- visitProposedToLocation(location: URL, options?: Partial<VisitOptions>): void;
5
+ visitProposedToLocation(location: URL, options?: Partial<VisitOptions>): Promise<void>;
5
6
  visitStarted(visit: Visit): void;
6
7
  visitCompleted(visit: Visit): void;
7
8
  visitFailed(visit: Visit): void;
@@ -12,5 +13,5 @@ export interface Adapter {
12
13
  visitRendered(visit: Visit): void;
13
14
  formSubmissionStarted?(formSubmission: FormSubmission): void;
14
15
  formSubmissionFinished?(formSubmission: FormSubmission): void;
15
- pageInvalidated(): void;
16
+ pageInvalidated(reason: ReloadReason): void;
16
17
  }
@@ -3,29 +3,38 @@ import { ProgressBar } from "../drive/progress_bar";
3
3
  import { Visit, VisitOptions } from "../drive/visit";
4
4
  import { FormSubmission } from "../drive/form_submission";
5
5
  import { Session } from "../session";
6
+ export declare type ReloadReason = StructuredReason | undefined;
7
+ interface StructuredReason {
8
+ reason: string;
9
+ context?: {
10
+ [key: string]: any;
11
+ };
12
+ }
6
13
  export declare class BrowserAdapter implements Adapter {
7
14
  readonly session: Session;
8
15
  readonly progressBar: ProgressBar;
9
16
  visitProgressBarTimeout?: number;
10
17
  formProgressBarTimeout?: number;
18
+ location?: URL;
11
19
  constructor(session: Session);
12
- visitProposedToLocation(location: URL, options?: Partial<VisitOptions>): void;
20
+ visitProposedToLocation(location: URL, options?: Partial<VisitOptions>): Promise<void>;
13
21
  visitStarted(visit: Visit): void;
14
22
  visitRequestStarted(visit: Visit): void;
15
23
  visitRequestCompleted(visit: Visit): void;
16
24
  visitRequestFailedWithStatusCode(visit: Visit, statusCode: number): void;
17
- visitRequestFinished(visit: Visit): void;
18
- visitCompleted(visit: Visit): void;
19
- pageInvalidated(): void;
20
- visitFailed(visit: Visit): void;
21
- visitRendered(visit: Visit): void;
22
- formSubmissionStarted(formSubmission: FormSubmission): void;
23
- formSubmissionFinished(formSubmission: FormSubmission): void;
25
+ visitRequestFinished(_visit: Visit): void;
26
+ visitCompleted(_visit: Visit): void;
27
+ pageInvalidated(reason: ReloadReason): void;
28
+ visitFailed(_visit: Visit): void;
29
+ visitRendered(_visit: Visit): void;
30
+ formSubmissionStarted(_formSubmission: FormSubmission): void;
31
+ formSubmissionFinished(_formSubmission: FormSubmission): void;
24
32
  showVisitProgressBarAfterDelay(): void;
25
33
  hideVisitProgressBar(): void;
26
34
  showFormProgressBarAfterDelay(): void;
27
35
  hideFormProgressBar(): void;
28
36
  showProgressBar: () => void;
29
- reload(): void;
37
+ reload(reason: ReloadReason): void;
30
38
  get navigator(): import("../drive/navigator").Navigator;
31
39
  }
40
+ export {};
@@ -1,22 +1,28 @@
1
+ import { BardoDelegate } from "./bardo";
1
2
  import { Snapshot } from "./snapshot";
2
- export declare abstract class Renderer<E extends Element, S extends Snapshot<E> = Snapshot<E>> {
3
+ import { ReloadReason } from "./native/browser_adapter";
4
+ export declare type Render<E> = (newElement: E, currentElement: E) => void;
5
+ export declare abstract class Renderer<E extends Element, S extends Snapshot<E> = Snapshot<E>> implements BardoDelegate {
3
6
  readonly currentSnapshot: S;
4
7
  readonly newSnapshot: S;
5
8
  readonly isPreview: boolean;
6
9
  readonly willRender: boolean;
7
10
  readonly promise: Promise<void>;
11
+ renderElement: Render<E>;
8
12
  private resolvingFunctions?;
9
- constructor(currentSnapshot: S, newSnapshot: S, isPreview: boolean, willRender?: boolean);
13
+ private activeElement;
14
+ constructor(currentSnapshot: S, newSnapshot: S, renderElement: Render<E>, isPreview: boolean, willRender?: boolean);
10
15
  get shouldRender(): boolean;
16
+ get reloadReason(): ReloadReason;
11
17
  prepareToRender(): void;
12
18
  abstract render(): Promise<void>;
13
19
  finishRendering(): void;
14
- createScriptElement(element: Element): Element;
15
20
  preservingPermanentElements(callback: () => void): void;
16
21
  focusFirstAutofocusableElement(): void;
22
+ enteringBardo(currentPermanentElement: Element): void;
23
+ leavingBardo(currentPermanentElement: Element): void;
17
24
  get connectedSnapshot(): S;
18
25
  get currentElement(): E;
19
26
  get newElement(): E;
20
- get permanentElementMap(): Record<string, [Element, Element]>;
21
- get cspNonce(): string | null | undefined;
27
+ get permanentElementMap(): import("./snapshot").PermanentElementMap;
22
28
  }