@hotwired/turbo 7.1.0 → 7.3.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.
Files changed (83) hide show
  1. package/README.md +5 -1
  2. package/dist/turbo.es2017-esm.js +1284 -655
  3. package/dist/turbo.es2017-umd.js +1298 -662
  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 +20 -9
  8. package/dist/types/core/drive/head_snapshot.d.ts +6 -6
  9. package/dist/types/core/drive/history.d.ts +4 -4
  10. package/dist/types/core/drive/navigator.d.ts +2 -2
  11. package/dist/types/core/drive/page_renderer.d.ts +12 -7
  12. package/dist/types/core/drive/page_view.d.ts +10 -8
  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 -6
  16. package/dist/types/core/errors.d.ts +2 -0
  17. package/dist/types/core/frames/frame_controller.d.ts +56 -26
  18. package/dist/types/core/frames/frame_redirector.d.ts +10 -8
  19. package/dist/types/core/frames/frame_renderer.d.ts +8 -1
  20. package/dist/types/core/frames/frame_view.d.ts +3 -2
  21. package/dist/types/core/frames/link_interceptor.d.ts +3 -3
  22. package/dist/types/core/index.d.ts +12 -3
  23. package/dist/types/core/native/adapter.d.ts +2 -1
  24. package/dist/types/core/native/browser_adapter.d.ts +17 -8
  25. package/dist/types/core/renderer.d.ts +12 -6
  26. package/dist/types/core/session.d.ts +72 -17
  27. package/dist/types/core/snapshot.d.ts +6 -3
  28. package/dist/types/core/streams/stream_actions.d.ts +4 -2
  29. package/dist/types/core/streams/stream_message.d.ts +2 -6
  30. package/dist/types/core/streams/stream_message_renderer.d.ts +7 -0
  31. package/dist/types/core/types.d.ts +3 -4
  32. package/dist/types/core/url.d.ts +1 -1
  33. package/dist/types/core/view.d.ts +13 -7
  34. package/dist/types/elements/frame_element.d.ts +12 -6
  35. package/dist/types/elements/index.d.ts +1 -0
  36. package/dist/types/elements/stream_element.d.ts +8 -1
  37. package/dist/types/elements/stream_source_element.d.ts +7 -0
  38. package/dist/types/http/fetch_request.d.ts +18 -4
  39. package/dist/types/http/index.d.ts +1 -0
  40. package/dist/types/index.d.ts +2 -0
  41. package/dist/types/observers/appearance_observer.d.ts +6 -6
  42. package/dist/types/observers/cache_observer.d.ts +5 -1
  43. package/dist/types/observers/form_link_click_observer.d.ts +14 -0
  44. package/dist/types/observers/form_submit_observer.d.ts +2 -1
  45. package/dist/types/observers/link_click_observer.d.ts +5 -4
  46. package/dist/types/polyfills/custom-elements-native-shim.d.ts +1 -0
  47. package/dist/types/polyfills/submit-event.d.ts +1 -7
  48. package/dist/types/tests/functional/async_script_tests.d.ts +1 -6
  49. package/dist/types/tests/functional/autofocus_tests.d.ts +1 -9
  50. package/dist/types/tests/functional/cache_observer_tests.d.ts +1 -5
  51. package/dist/types/tests/functional/drive_disabled_tests.d.ts +1 -9
  52. package/dist/types/tests/functional/drive_tests.d.ts +1 -8
  53. package/dist/types/tests/functional/form_mode_tests.d.ts +1 -0
  54. package/dist/types/tests/functional/form_submission_tests.d.ts +1 -84
  55. package/dist/types/tests/functional/frame_navigation_tests.d.ts +1 -7
  56. package/dist/types/tests/functional/frame_tests.d.ts +7 -51
  57. package/dist/types/tests/functional/import_tests.d.ts +1 -4
  58. package/dist/types/tests/functional/loading_tests.d.ts +1 -13
  59. package/dist/types/tests/functional/navigation_tests.d.ts +1 -38
  60. package/dist/types/tests/functional/pausable_rendering_tests.d.ts +1 -6
  61. package/dist/types/tests/functional/pausable_requests_tests.d.ts +1 -6
  62. package/dist/types/tests/functional/preloader_tests.d.ts +1 -0
  63. package/dist/types/tests/functional/rendering_tests.d.ts +1 -35
  64. package/dist/types/tests/functional/scroll_restoration_tests.d.ts +1 -6
  65. package/dist/types/tests/functional/stream_tests.d.ts +1 -6
  66. package/dist/types/tests/functional/visit_tests.d.ts +1 -15
  67. package/dist/types/tests/helpers/dom_test_case.d.ts +1 -2
  68. package/dist/types/tests/helpers/page.d.ts +60 -0
  69. package/dist/types/tests/integration/ujs_tests.d.ts +1 -0
  70. package/dist/types/tests/unit/deprecated_adapter_support_tests.d.ts +1 -0
  71. package/dist/types/tests/unit/export_tests.d.ts +1 -0
  72. package/dist/types/tests/unit/stream_element_tests.d.ts +0 -10
  73. package/dist/types/util.d.ts +15 -3
  74. package/package.json +32 -13
  75. package/CHANGELOG.md +0 -3
  76. package/dist/types/core/frames/form_interceptor.d.ts +0 -12
  77. package/dist/types/tests/functional/index.d.ts +0 -17
  78. package/dist/types/tests/helpers/functional_test_case.d.ts +0 -44
  79. package/dist/types/tests/helpers/intern_test_case.d.ts +0 -20
  80. package/dist/types/tests/helpers/remote_channel.d.ts +0 -10
  81. package/dist/types/tests/helpers/turbo_drive_test_case.d.ts +0 -21
  82. package/dist/types/tests/unit/deprecated_adapter_support_test.d.ts +0 -24
  83. package/dist/types/tests/unit/index.d.ts +0 -2
@@ -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): Promise<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
  }
@@ -1,4 +1,4 @@
1
- import { FetchRequest, FetchMethod, FetchRequestHeaders } from "../../http/fetch_request";
1
+ import { FetchRequest, FetchMethod } from "../../http/fetch_request";
2
2
  import { FetchResponse } from "../../http/fetch_response";
3
3
  export interface FormSubmissionDelegate {
4
4
  formSubmissionStarted(formSubmission: FormSubmission): void;
@@ -7,7 +7,7 @@ export interface FormSubmissionDelegate {
7
7
  formSubmissionErrored(formSubmission: FormSubmission, error: Error): void;
8
8
  formSubmissionFinished(formSubmission: FormSubmission): void;
9
9
  }
10
- export declare type FormSubmissionResult = {
10
+ export type FormSubmissionResult = {
11
11
  success: boolean;
12
12
  fetchResponse: FetchResponse;
13
13
  } | {
@@ -27,6 +27,14 @@ declare enum FormEnctype {
27
27
  multipart = "multipart/form-data",
28
28
  plain = "text/plain"
29
29
  }
30
+ export type TurboSubmitStartEvent = CustomEvent<{
31
+ formSubmission: FormSubmission;
32
+ }>;
33
+ export 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,25 +45,28 @@ 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
+ originalSubmitText?: string;
49
+ static confirmMethod(message: string, _element: HTMLFormElement, _submitter: HTMLElement | undefined): Promise<boolean>;
41
50
  constructor(delegate: FormSubmissionDelegate, formElement: HTMLFormElement, submitter?: HTMLElement, mustRedirect?: boolean);
42
51
  get method(): FetchMethod;
43
52
  get action(): string;
44
53
  get body(): FormData;
45
54
  get enctype(): FormEnctype;
46
- get isIdempotent(): boolean;
55
+ get isSafe(): boolean;
47
56
  get stringFormData(): [string, string][];
48
- get confirmationMessage(): string | null;
49
- get needsConfirmation(): boolean;
50
57
  start(): Promise<void | FetchResponse>;
51
58
  stop(): true | undefined;
52
- prepareHeadersForRequest(headers: FetchRequestHeaders, request: FetchRequest): void;
53
- requestStarted(request: FetchRequest): void;
59
+ prepareRequest(request: FetchRequest): void;
60
+ requestStarted(_request: FetchRequest): void;
54
61
  requestPreventedHandlingResponse(request: FetchRequest, response: FetchResponse): void;
55
62
  requestSucceededWithResponse(request: FetchRequest, response: FetchResponse): void;
56
63
  requestFailedWithResponse(request: FetchRequest, response: FetchResponse): void;
57
64
  requestErrored(request: FetchRequest, error: Error): void;
58
- requestFinished(request: FetchRequest): void;
65
+ requestFinished(_request: FetchRequest): void;
66
+ setSubmitsWith(): void;
67
+ resetSubmitterText(): void;
59
68
  requestMustRedirect(request: FetchRequest): boolean;
69
+ requestAcceptsTurboStreamResponse(request: FetchRequest): boolean;
70
+ get submitsWith(): string | null | undefined;
60
71
  }
61
72
  export {};
@@ -1,19 +1,19 @@
1
1
  import { Snapshot } from "../snapshot";
2
- declare type ElementDetailMap = {
2
+ type ElementDetailMap = {
3
3
  [outerHTML: string]: ElementDetails;
4
4
  };
5
- declare type ElementDetails = {
5
+ type ElementDetails = {
6
6
  type?: ElementType;
7
7
  tracked: boolean;
8
8
  elements: Element[];
9
9
  };
10
- declare type ElementType = "script" | "stylesheet";
10
+ 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;
@@ -2,11 +2,11 @@ import { Position } from "../types";
2
2
  export interface HistoryDelegate {
3
3
  historyPoppedToLocationWithRestorationIdentifier(location: URL, restorationIdentifier: string): void;
4
4
  }
5
- declare type HistoryMethod = (this: typeof history, state: any, title: string, url?: string | null | undefined) => void;
6
- export declare type RestorationData = {
5
+ type HistoryMethod = (this: typeof history, state: any, title: string, url?: string | null | undefined) => void;
6
+ export type RestorationData = {
7
7
  scrollPosition?: Position;
8
8
  };
9
- export declare type RestorationDataMap = {
9
+ export type RestorationDataMap = {
10
10
  [restorationIdentifier: string]: RestorationData;
11
11
  };
12
12
  export declare class History {
@@ -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
  }
@@ -3,7 +3,7 @@ import { FetchResponse } from "../../http/fetch_response";
3
3
  import { FormSubmission } from "./form_submission";
4
4
  import { Locatable } from "../url";
5
5
  import { Visit, VisitDelegate, VisitOptions } from "./visit";
6
- export declare type NavigatorDelegate = VisitDelegate & {
6
+ export type NavigatorDelegate = VisitDelegate & {
7
7
  allowsVisitingLocationWithAction(location: URL, action?: Action): boolean;
8
8
  visitProposedToLocation(location: URL, options: Partial<VisitOptions>): void;
9
9
  notifyApplicationAfterVisitingSamePageLocation(oldURL: URL, newURL: URL): void;
@@ -31,5 +31,5 @@ export declare class Navigator {
31
31
  visitScrolledToSamePageLocation(oldURL: URL, newURL: URL): void;
32
32
  get location(): URL;
33
33
  get restorationIdentifier(): string;
34
- getActionForFormSubmission(formSubmission: FormSubmission): Action;
34
+ getActionForFormSubmission({ submitter, formElement }: FormSubmission): Action;
35
35
  }
@@ -1,25 +1,30 @@
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): 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;
12
- replaceBody(): void;
14
+ mergeHead(): Promise<void>;
15
+ replaceBody(): Promise<void>;
13
16
  get trackedElementsAreIdentical(): boolean;
14
- copyNewHeadStylesheetElements(): void;
17
+ copyNewHeadStylesheetElements(): Promise<void>;
15
18
  copyNewHeadScriptElements(): void;
19
+ mergeProvisionalElements(): Promise<void>;
20
+ isCurrentElementInElementList(element: Element, elementList: Element[]): boolean;
16
21
  removeCurrentHeadProvisionalElements(): void;
17
22
  copyNewHeadProvisionalElements(): void;
18
23
  activateNewBody(): void;
19
24
  activateNewBodyScriptElements(): void;
20
- assignNewBody(): void;
21
- get newHeadStylesheetElements(): Element[];
22
- get newHeadScriptElements(): Element[];
25
+ assignNewBody(): Promise<void>;
26
+ get newHeadStylesheetElements(): HTMLLinkElement[];
27
+ get newHeadScriptElements(): HTMLScriptElement[];
23
28
  get currentHeadProvisionalElements(): Element[];
24
29
  get newHeadProvisionalElements(): Element[];
25
30
  get newBodyScriptElements(): NodeListOf<HTMLScriptElement>;
@@ -1,21 +1,23 @@
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 type PageViewRenderOptions = ViewRenderOptions<HTMLBodyElement>;
8
+ export interface PageViewDelegate extends ViewDelegate<HTMLBodyElement, PageSnapshot> {
7
9
  viewWillCacheSnapshot(): void;
8
10
  }
9
- declare type PageViewRenderer = PageRenderer | ErrorRenderer;
10
- export declare class PageView extends View<Element, PageSnapshot, PageViewRenderer, PageViewDelegate> {
11
+ type PageViewRenderer = PageRenderer | ErrorRenderer;
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
- cacheSnapshot(): Promise<PageSnapshot | undefined>;
19
+ cacheSnapshot(snapshot?: PageSnapshot): Promise<PageSnapshot | undefined>;
17
20
  getCachedSnapshotForLocation(location: URL): PageSnapshot | undefined;
18
21
  get snapshot(): PageSnapshot;
19
- get shouldCacheSnapshot(): boolean;
20
22
  }
21
23
  export {};
@@ -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
  }
@@ -21,7 +21,7 @@ export declare enum TimingMetric {
21
21
  requestEnd = "requestEnd",
22
22
  visitEnd = "visitEnd"
23
23
  }
24
- export declare type TimingMetrics = Partial<{
24
+ export type TimingMetrics = Partial<{
25
25
  [metric in TimingMetric]: any;
26
26
  }>;
27
27
  export declare enum VisitState {
@@ -31,16 +31,22 @@ export declare enum VisitState {
31
31
  failed = "failed",
32
32
  completed = "completed"
33
33
  }
34
- export declare type VisitOptions = {
34
+ export type VisitOptions = {
35
35
  action: Action;
36
36
  historyChanged: boolean;
37
37
  referrer?: URL;
38
+ snapshot?: PageSnapshot;
38
39
  snapshotHTML?: string;
39
40
  response?: VisitResponse;
40
41
  visitCachedSnapshot(snapshot: Snapshot): void;
41
42
  willRender: boolean;
43
+ updateHistory: boolean;
44
+ restorationIdentifier?: string;
45
+ shouldCacheSnapshot: boolean;
46
+ frame?: string;
47
+ acceptsStreamResponse: boolean;
42
48
  };
43
- export declare type VisitResponse = {
49
+ export type VisitResponse = {
44
50
  statusCode: number;
45
51
  redirected: boolean;
46
52
  responseHTML?: string;
@@ -59,6 +65,7 @@ export declare class Visit implements FetchRequestDelegate {
59
65
  readonly timingMetrics: TimingMetrics;
60
66
  readonly visitCachedSnapshot: (snapshot: Snapshot) => void;
61
67
  readonly willRender: boolean;
68
+ readonly updateHistory: boolean;
62
69
  followedRedirect: boolean;
63
70
  frame?: number;
64
71
  historyChanged: boolean;
@@ -68,9 +75,12 @@ export declare class Visit implements FetchRequestDelegate {
68
75
  request?: FetchRequest;
69
76
  response?: VisitResponse;
70
77
  scrolled: boolean;
78
+ shouldCacheSnapshot: boolean;
79
+ acceptsStreamResponse: boolean;
71
80
  snapshotHTML?: string;
72
81
  snapshotCached: boolean;
73
82
  state: VisitState;
83
+ snapshot?: PageSnapshot;
74
84
  constructor(delegate: VisitDelegate, location: URL, restorationIdentifier: string | undefined, options?: Partial<VisitOptions>);
75
85
  get adapter(): Adapter;
76
86
  get view(): PageView;
@@ -94,18 +104,19 @@ export declare class Visit implements FetchRequestDelegate {
94
104
  loadCachedSnapshot(): void;
95
105
  followRedirect(): void;
96
106
  goToSamePageAnchor(): void;
107
+ prepareRequest(request: FetchRequest): void;
97
108
  requestStarted(): void;
98
- requestPreventedHandlingResponse(request: FetchRequest, response: FetchResponse): void;
109
+ requestPreventedHandlingResponse(_request: FetchRequest, _response: FetchResponse): void;
99
110
  requestSucceededWithResponse(request: FetchRequest, response: FetchResponse): Promise<void>;
100
111
  requestFailedWithResponse(request: FetchRequest, response: FetchResponse): Promise<void>;
101
- requestErrored(request: FetchRequest, error: Error): void;
112
+ requestErrored(_request: FetchRequest, _error: Error): void;
102
113
  requestFinished(): void;
103
114
  performScroll(): void;
104
115
  scrollToRestoredPosition(): true | undefined;
105
116
  scrollToAnchor(): true | undefined;
106
117
  recordTimingMetric(metric: TimingMetric): void;
107
118
  getTimingMetrics(): TimingMetrics;
108
- getHistoryMethodForAction(action: Action): (data: any, title: string, url?: string | null | undefined) => void;
119
+ getHistoryMethodForAction(action: Action): (data: any, unused: string, url?: string | URL | null | undefined) => void;
109
120
  hasPreloadedResponse(): boolean;
110
121
  shouldIssueRequest(): boolean;
111
122
  cacheSnapshot(): void;
@@ -0,0 +1,2 @@
1
+ export declare class TurboFrameMissingError extends Error {
2
+ }
@@ -1,70 +1,100 @@
1
1
  import { FrameElement, FrameElementDelegate, FrameLoadingStyle } from "../../elements/frame_element";
2
- import { FetchRequest, FetchRequestDelegate, FetchRequestHeaders } from "../../http/fetch_request";
2
+ import { FetchRequest, FetchRequestDelegate } from "../../http/fetch_request";
3
3
  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
11
  import { LinkInterceptor, LinkInterceptorDelegate } from "./link_interceptor";
11
- export declare class FrameController implements AppearanceObserverDelegate, FetchRequestDelegate, FormInterceptorDelegate, FormSubmissionDelegate, FrameElementDelegate, LinkInterceptorDelegate, ViewDelegate<Snapshot<FrameElement>> {
12
+ import { FormLinkClickObserver, FormLinkClickObserverDelegate } from "../../observers/form_link_click_observer";
13
+ import { VisitOptions } from "../drive/visit";
14
+ type VisitFallback = (location: Response | Locatable, options: Partial<VisitOptions>) => Promise<void>;
15
+ export type TurboFrameMissingEvent = CustomEvent<{
16
+ response: Response;
17
+ visit: VisitFallback;
18
+ }>;
19
+ export declare class FrameController implements AppearanceObserverDelegate<FrameElement>, FetchRequestDelegate, FormSubmitObserverDelegate, FormSubmissionDelegate, FrameElementDelegate, FormLinkClickObserverDelegate, LinkInterceptorDelegate, ViewDelegate<FrameElement, Snapshot<FrameElement>> {
12
20
  readonly element: FrameElement;
13
21
  readonly view: FrameView;
14
- readonly appearanceObserver: AppearanceObserver;
22
+ readonly appearanceObserver: AppearanceObserver<FrameElement>;
23
+ readonly formLinkClickObserver: FormLinkClickObserver;
15
24
  readonly linkInterceptor: LinkInterceptor;
16
- readonly formInterceptor: FormInterceptor;
17
- currentURL?: string | null;
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
+ readonly restorationIdentifier: string;
35
+ private previousFrameElement?;
36
+ private currentNavigationElement?;
25
37
  constructor(element: FrameElement);
26
38
  connect(): void;
27
39
  disconnect(): void;
28
40
  disabledChanged(): void;
29
41
  sourceURLChanged(): void;
42
+ sourceURLReloaded(): Promise<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;
38
- prepareHeadersForRequest(headers: FetchRequestHeaders, request: FetchRequest): void;
39
- requestStarted(request: FetchRequest): void;
40
- requestPreventedHandlingResponse(request: FetchRequest, response: FetchResponse): void;
47
+ elementAppearedInViewport(element: FrameElement): void;
48
+ willSubmitFormLinkToLocation(link: Element): boolean;
49
+ submittedFormLinkToLocation(link: Element, _location: URL, form: HTMLFormElement): void;
50
+ shouldInterceptLinkClick(element: Element, _location: string, _event: MouseEvent): boolean;
51
+ linkClickIntercepted(element: Element, location: string): void;
52
+ willSubmitForm(element: HTMLFormElement, submitter?: HTMLElement): boolean;
53
+ formSubmitted(element: HTMLFormElement, submitter?: HTMLElement): void;
54
+ prepareRequest(request: FetchRequest): 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;
72
+ private loadFrameResponse;
53
73
  private visit;
54
74
  private navigateFrame;
55
- private proposeVisitIfNavigatedWithAction;
75
+ proposeVisitIfNavigatedWithAction(frame: FrameElement, element: Element, submitter?: HTMLElement): void;
76
+ changeHistory(): void;
77
+ private handleUnvisitableFrameResponse;
78
+ private willHandleFrameMissingFromResponse;
79
+ private handleFrameMissingFromResponse;
80
+ private throwFrameMissingError;
81
+ private visitResponse;
56
82
  private findFrameElement;
57
- extractForeignFrameElement(container: ParentNode): Promise<FrameElement>;
83
+ extractForeignFrameElement(container: ParentNode): Promise<FrameElement | null>;
58
84
  private formActionIsVisitable;
59
85
  private shouldInterceptNavigation;
60
86
  get id(): string;
61
87
  get enabled(): boolean;
62
88
  get sourceURL(): string | undefined;
63
- get reloadable(): boolean;
64
- set reloadable(value: boolean);
65
89
  set sourceURL(sourceURL: string | undefined);
66
90
  get loadingStyle(): FrameLoadingStyle;
67
91
  get isLoading(): boolean;
92
+ get complete(): boolean;
93
+ set complete(value: boolean);
68
94
  get isActive(): boolean;
69
95
  get rootLocation(): URL;
96
+ private isIgnoringChangesTo;
97
+ private ignoringChangesToAttribute;
98
+ private withCurrentNavigationElement;
70
99
  }
100
+ export {};
@@ -1,16 +1,18 @@
1
- import { FormInterceptor, FormInterceptorDelegate } from "./form_interceptor";
1
+ import { FormSubmitObserver, FormSubmitObserverDelegate } from "../../observers/form_submit_observer";
2
2
  import { LinkInterceptor, LinkInterceptorDelegate } from "./link_interceptor";
3
- export declare class FrameRedirector implements LinkInterceptorDelegate, FormInterceptorDelegate {
3
+ import { Session } from "../session";
4
+ export declare class FrameRedirector implements LinkInterceptorDelegate, FormSubmitObserverDelegate {
5
+ readonly session: Session;
4
6
  readonly element: Element;
5
7
  readonly linkInterceptor: LinkInterceptor;
6
- readonly formInterceptor: FormInterceptor;
7
- constructor(element: Element);
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
+ shouldInterceptLinkClick(element: Element, _location: string, _event: MouseEvent): boolean;
13
+ linkClickIntercepted(element: Element, url: string, event: MouseEvent): 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,7 +1,8 @@
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 type FrameViewRenderOptions = ViewRenderOptions<FrameElement>;
4
5
  export declare class FrameView extends View<FrameElement> {
5
- invalidate(): void;
6
+ missing(): void;
6
7
  get snapshot(): Snapshot<FrameElement>;
7
8
  }
@@ -1,6 +1,6 @@
1
1
  export interface LinkInterceptorDelegate {
2
- shouldInterceptLinkClick(element: Element, url: string): boolean;
3
- linkClickIntercepted(element: Element, url: string): void;
2
+ shouldInterceptLinkClick(element: Element, url: string, originalEvent: MouseEvent): boolean;
3
+ linkClickIntercepted(element: Element, url: string, originalEvent: MouseEvent): void;
4
4
  }
5
5
  export declare class LinkInterceptor {
6
6
  readonly delegate: LinkInterceptorDelegate;
@@ -11,6 +11,6 @@ export declare class LinkInterceptor {
11
11
  stop(): void;
12
12
  clickBubbled: (event: Event) => void;
13
13
  linkClicked: EventListener;
14
- willVisit: () => void;
14
+ willVisit: EventListener;
15
15
  respondsToEventTarget(target: EventTarget | null): boolean | null;
16
16
  }
@@ -1,14 +1,22 @@
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 type { TurboBeforeCacheEvent, TurboBeforeRenderEvent, TurboBeforeVisitEvent, TurboClickEvent, TurboBeforeFrameRenderEvent, TurboFrameLoadEvent, TurboFrameRenderEvent, TurboLoadEvent, TurboRenderEvent, TurboVisitEvent, } from "./session";
16
+ export type { TurboSubmitStartEvent, TurboSubmitEndEvent } from "./drive/form_submission";
17
+ export type { TurboFrameMissingEvent } from "./frames/frame_controller";
18
+ export { StreamActions } from "./streams/stream_actions";
19
+ export type { TurboStreamAction, TurboStreamActions } from "./streams/stream_actions";
12
20
  export declare function start(): void;
13
21
  export declare function registerAdapter(adapter: Adapter): void;
14
22
  export declare function visit(location: Locatable, options?: Partial<VisitOptions>): void;
@@ -17,4 +25,5 @@ export declare function disconnectStreamSource(source: StreamSource): void;
17
25
  export declare function renderStreamMessage(message: StreamMessage | string): void;
18
26
  export declare function clearCache(): void;
19
27
  export declare function setProgressBarDelay(delay: number): void;
20
- export declare function setConfirmMethod(confirmMethod: (message: string, element: HTMLFormElement) => boolean): void;
28
+ export declare function setConfirmMethod(confirmMethod: (message: string, element: HTMLFormElement, submitter: HTMLElement | undefined) => Promise<boolean>): void;
29
+ export declare function setFormMode(mode: FormMode): void;
@@ -1,5 +1,6 @@
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
5
  visitProposedToLocation(location: URL, options?: Partial<VisitOptions>): void;
5
6
  visitStarted(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
  }