@hotwired/turbo 7.1.0 → 7.2.0-beta.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 (60) hide show
  1. package/dist/turbo.es2017-esm.js +712 -364
  2. package/dist/turbo.es2017-umd.js +717 -365
  3. package/dist/types/core/bardo.d.ts +7 -2
  4. package/dist/types/core/cache.d.ts +10 -0
  5. package/dist/types/core/drive/error_renderer.d.ts +1 -0
  6. package/dist/types/core/drive/form_submission.d.ts +12 -3
  7. package/dist/types/core/drive/history.d.ts +1 -1
  8. package/dist/types/core/drive/navigator.d.ts +1 -0
  9. package/dist/types/core/drive/page_renderer.d.ts +3 -0
  10. package/dist/types/core/drive/page_view.d.ts +8 -5
  11. package/dist/types/core/drive/preloader.d.ts +14 -0
  12. package/dist/types/core/drive/progress_bar.d.ts +1 -0
  13. package/dist/types/core/drive/visit.d.ts +3 -3
  14. package/dist/types/core/frames/frame_controller.d.ts +26 -16
  15. package/dist/types/core/frames/frame_redirector.d.ts +1 -1
  16. package/dist/types/core/frames/frame_renderer.d.ts +8 -1
  17. package/dist/types/core/frames/frame_view.d.ts +2 -1
  18. package/dist/types/core/frames/link_interceptor.d.ts +1 -1
  19. package/dist/types/core/index.d.ts +11 -2
  20. package/dist/types/core/native/adapter.d.ts +2 -1
  21. package/dist/types/core/native/browser_adapter.d.ts +17 -8
  22. package/dist/types/core/renderer.d.ts +12 -4
  23. package/dist/types/core/session.d.ts +68 -16
  24. package/dist/types/core/snapshot.d.ts +2 -1
  25. package/dist/types/core/view.d.ts +12 -6
  26. package/dist/types/elements/frame_element.d.ts +5 -1
  27. package/dist/types/elements/stream_element.d.ts +1 -0
  28. package/dist/types/elements/stream_source_element.d.ts +7 -0
  29. package/dist/types/http/fetch_request.d.ts +8 -0
  30. package/dist/types/observers/cache_observer.d.ts +1 -1
  31. package/dist/types/observers/form_link_interceptor.d.ts +14 -0
  32. package/dist/types/observers/link_click_observer.d.ts +2 -2
  33. package/dist/types/polyfills/submit-event.d.ts +1 -7
  34. package/dist/types/tests/functional/async_script_tests.d.ts +1 -6
  35. package/dist/types/tests/functional/autofocus_tests.d.ts +1 -9
  36. package/dist/types/tests/functional/cache_observer_tests.d.ts +1 -5
  37. package/dist/types/tests/functional/drive_disabled_tests.d.ts +1 -9
  38. package/dist/types/tests/functional/drive_tests.d.ts +1 -8
  39. package/dist/types/tests/functional/form_submission_tests.d.ts +1 -84
  40. package/dist/types/tests/functional/frame_navigation_tests.d.ts +1 -7
  41. package/dist/types/tests/functional/frame_tests.d.ts +1 -52
  42. package/dist/types/tests/functional/import_tests.d.ts +1 -4
  43. package/dist/types/tests/functional/loading_tests.d.ts +1 -13
  44. package/dist/types/tests/functional/navigation_tests.d.ts +1 -38
  45. package/dist/types/tests/functional/pausable_rendering_tests.d.ts +1 -6
  46. package/dist/types/tests/functional/pausable_requests_tests.d.ts +1 -6
  47. package/dist/types/tests/functional/preloader_tests.d.ts +1 -0
  48. package/dist/types/tests/functional/rendering_tests.d.ts +1 -35
  49. package/dist/types/tests/functional/scroll_restoration_tests.d.ts +1 -6
  50. package/dist/types/tests/functional/stream_tests.d.ts +1 -6
  51. package/dist/types/tests/functional/visit_tests.d.ts +1 -15
  52. package/dist/types/tests/helpers/page.d.ts +44 -0
  53. package/dist/types/tests/unit/deprecated_adapter_support_test.d.ts +10 -10
  54. package/dist/types/util.d.ts +6 -3
  55. package/package.json +22 -8
  56. package/CHANGELOG.md +0 -3
  57. package/dist/types/tests/functional/index.d.ts +0 -17
  58. package/dist/types/tests/helpers/functional_test_case.d.ts +0 -44
  59. package/dist/types/tests/helpers/remote_channel.d.ts +0 -10
  60. 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,6 +1,7 @@
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;
@@ -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): Promise<boolean>;
41
49
  constructor(delegate: FormSubmissionDelegate, formElement: HTMLFormElement, submitter?: HTMLElement, mustRedirect?: boolean);
42
50
  get method(): FetchMethod;
43
51
  get action(): string;
@@ -50,12 +58,13 @@ export declare class FormSubmission {
50
58
  start(): Promise<void | FetchResponse>;
51
59
  stop(): true | undefined;
52
60
  prepareHeadersForRequest(headers: FetchRequestHeaders, request: FetchRequest): void;
53
- requestStarted(request: FetchRequest): void;
61
+ requestStarted(_request: FetchRequest): void;
54
62
  requestPreventedHandlingResponse(request: FetchRequest, response: FetchResponse): void;
55
63
  requestSucceededWithResponse(request: FetchRequest, response: FetchResponse): void;
56
64
  requestFailedWithResponse(request: FetchRequest, response: FetchResponse): void;
57
65
  requestErrored(request: FetchRequest, error: Error): void;
58
- requestFinished(request: FetchRequest): void;
66
+ requestFinished(_request: FetchRequest): void;
59
67
  requestMustRedirect(request: FetchRequest): boolean;
68
+ requestAcceptsTurboStreamResponse(request: FetchRequest): boolean;
60
69
  }
61
70
  export {};
@@ -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
  }
@@ -12,6 +12,7 @@ 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
17
  proposeVisit(location: URL, options?: Partial<VisitOptions>): void;
17
18
  startVisit(locatable: Locatable, restorationIdentifier: string, options?: Partial<VisitOptions>): void;
@@ -1,7 +1,10 @@
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;
7
+ get reloadReason(): ReloadReason;
5
8
  prepareToRender(): void;
6
9
  render(): Promise<void>;
7
10
  finishRendering(): void;
@@ -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
  }
@@ -95,17 +95,17 @@ export declare class Visit implements FetchRequestDelegate {
95
95
  followRedirect(): void;
96
96
  goToSamePageAnchor(): void;
97
97
  requestStarted(): void;
98
- requestPreventedHandlingResponse(request: FetchRequest, response: FetchResponse): void;
98
+ requestPreventedHandlingResponse(_request: FetchRequest, _response: FetchResponse): void;
99
99
  requestSucceededWithResponse(request: FetchRequest, response: FetchResponse): Promise<void>;
100
100
  requestFailedWithResponse(request: FetchRequest, response: FetchResponse): Promise<void>;
101
- requestErrored(request: FetchRequest, error: Error): void;
101
+ requestErrored(_request: FetchRequest, _error: Error): void;
102
102
  requestFinished(): void;
103
103
  performScroll(): void;
104
104
  scrollToRestoredPosition(): true | undefined;
105
105
  scrollToAnchor(): true | undefined;
106
106
  recordTimingMetric(metric: TimingMetric): void;
107
107
  getTimingMetrics(): TimingMetrics;
108
- getHistoryMethodForAction(action: Action): (data: any, title: string, url?: string | null | undefined) => void;
108
+ getHistoryMethodForAction(action: Action): (data: any, unused: string, url?: string | URL | null | undefined) => void;
109
109
  hasPreloadedResponse(): boolean;
110
110
  shouldIssueRequest(): boolean;
111
111
  cacheSnapshot(): void;
@@ -4,52 +4,60 @@ 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";
7
+ import { ViewDelegate, ViewRenderOptions } from "../view";
8
8
  import { FormInterceptor, FormInterceptorDelegate } from "./form_interceptor";
9
9
  import { FrameView } from "./frame_view";
10
10
  import { LinkInterceptor, LinkInterceptorDelegate } from "./link_interceptor";
11
- export declare class FrameController implements AppearanceObserverDelegate, FetchRequestDelegate, FormInterceptorDelegate, FormSubmissionDelegate, FrameElementDelegate, LinkInterceptorDelegate, ViewDelegate<Snapshot<FrameElement>> {
11
+ import { FormLinkInterceptor, FormLinkInterceptorDelegate } from "../../observers/form_link_interceptor";
12
+ export declare class FrameController implements AppearanceObserverDelegate, FetchRequestDelegate, FormInterceptorDelegate, FormSubmissionDelegate, FrameElementDelegate, FormLinkInterceptorDelegate, LinkInterceptorDelegate, ViewDelegate<FrameElement, Snapshot<FrameElement>> {
12
13
  readonly element: FrameElement;
13
14
  readonly view: FrameView;
14
15
  readonly appearanceObserver: AppearanceObserver;
16
+ readonly formLinkInterceptor: FormLinkInterceptor;
15
17
  readonly linkInterceptor: LinkInterceptor;
16
18
  readonly formInterceptor: FormInterceptor;
17
- currentURL?: string | null;
18
19
  formSubmission?: FormSubmission;
19
- fetchResponseLoaded: (fetchResponse: FetchResponse) => void;
20
+ fetchResponseLoaded: (_fetchResponse: FetchResponse) => void;
20
21
  private currentFetchRequest;
21
22
  private resolveVisitPromise;
22
23
  private connected;
23
24
  private hasBeenLoaded;
24
- private settingSourceURL;
25
+ private ignoredAttributes;
26
+ private previousFrameElement?;
25
27
  constructor(element: FrameElement);
26
28
  connect(): void;
27
29
  disconnect(): void;
28
30
  disabledChanged(): void;
29
31
  sourceURLChanged(): void;
32
+ completeChanged(): void;
30
33
  loadingStyleChanged(): void;
31
- loadSourceURL(): Promise<void>;
34
+ private loadSourceURL;
32
35
  loadResponse(fetchResponse: FetchResponse): Promise<void>;
33
- elementAppearedInViewport(element: Element): void;
34
- shouldInterceptLinkClick(element: Element, url: string): boolean;
36
+ elementAppearedInViewport(_element: Element): void;
37
+ shouldInterceptFormLinkClick(link: Element): boolean;
38
+ formLinkClickIntercepted(link: Element, form: HTMLFormElement): void;
39
+ shouldInterceptLinkClick(element: Element, _url: string): boolean;
35
40
  linkClickIntercepted(element: Element, url: string): void;
36
41
  shouldInterceptFormSubmission(element: HTMLFormElement, submitter?: HTMLElement): boolean;
37
42
  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;
43
+ prepareHeadersForRequest(headers: FetchRequestHeaders, _request: FetchRequest): void;
44
+ requestStarted(_request: FetchRequest): void;
45
+ requestPreventedHandlingResponse(_request: FetchRequest, _response: FetchResponse): void;
41
46
  requestSucceededWithResponse(request: FetchRequest, response: FetchResponse): Promise<void>;
42
47
  requestFailedWithResponse(request: FetchRequest, response: FetchResponse): void;
43
48
  requestErrored(request: FetchRequest, error: Error): void;
44
- requestFinished(request: FetchRequest): void;
49
+ requestFinished(_request: FetchRequest): void;
45
50
  formSubmissionStarted({ formElement }: FormSubmission): void;
46
51
  formSubmissionSucceededWithResponse(formSubmission: FormSubmission, response: FetchResponse): void;
47
52
  formSubmissionFailedWithResponse(formSubmission: FormSubmission, fetchResponse: FetchResponse): void;
48
53
  formSubmissionErrored(formSubmission: FormSubmission, error: Error): void;
49
54
  formSubmissionFinished({ formElement }: FormSubmission): void;
50
- allowsImmediateRender(snapshot: Snapshot, resume: (value: any) => void): boolean;
51
- viewRenderedSnapshot(snapshot: Snapshot, isPreview: boolean): void;
55
+ allowsImmediateRender({ element: newFrame }: Snapshot<FrameElement>, options: ViewRenderOptions<FrameElement>): boolean;
56
+ viewRenderedSnapshot(_snapshot: Snapshot, _isPreview: boolean): void;
57
+ preloadOnLoadLinksForView(element: Element): void;
52
58
  viewInvalidated(): void;
59
+ frameExtracted(element: FrameElement): void;
60
+ visitCachedSnapshot: ({ element }: Snapshot) => void;
53
61
  private visit;
54
62
  private navigateFrame;
55
63
  private proposeVisitIfNavigatedWithAction;
@@ -60,11 +68,13 @@ export declare class FrameController implements AppearanceObserverDelegate, Fetc
60
68
  get id(): string;
61
69
  get enabled(): boolean;
62
70
  get sourceURL(): string | undefined;
63
- get reloadable(): boolean;
64
- set reloadable(value: boolean);
65
71
  set sourceURL(sourceURL: string | undefined);
66
72
  get loadingStyle(): FrameLoadingStyle;
67
73
  get isLoading(): boolean;
74
+ get complete(): boolean;
75
+ set complete(value: boolean);
68
76
  get isActive(): boolean;
69
77
  get rootLocation(): URL;
78
+ private isIgnoringChangesTo;
79
+ private ignoringChangesToAttribute;
70
80
  }
@@ -7,7 +7,7 @@ export declare class FrameRedirector implements LinkInterceptorDelegate, FormInt
7
7
  constructor(element: Element);
8
8
  start(): void;
9
9
  stop(): void;
10
- shouldInterceptLinkClick(element: Element, url: string): boolean;
10
+ shouldInterceptLinkClick(element: Element, _url: string): boolean;
11
11
  linkClickIntercepted(element: Element, url: string): void;
12
12
  shouldInterceptFormSubmission(element: HTMLFormElement, submitter?: HTMLElement): boolean;
13
13
  formSubmissionIntercepted(element: HTMLFormElement, submitter?: HTMLElement): void;
@@ -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
+ frameExtracted(element: 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>;
@@ -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
2
  import { 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, TurboFrameLoadEvent, TurboFrameRenderEvent, TurboLoadEvent, TurboRenderEvent, TurboVisitEvent, } from "./session";
16
+ export { TurboSubmitStartEvent, TurboSubmitEndEvent } from "./drive/form_submission";
17
+ export { TurboBeforeFetchRequestEvent, TurboBeforeFetchResponseEvent } from "../http/fetch_request";
18
+ export { TurboBeforeStreamRenderEvent } from "../elements/stream_element";
19
+ export { StreamActions } 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) => Promise<boolean>): void;
29
+ export declare function setFormMode(mode: string): 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
  }
@@ -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
20
  visitProposedToLocation(location: URL, options?: Partial<VisitOptions>): 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,30 @@
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
20
  createScriptElement(element: Element): Element;
15
21
  preservingPermanentElements(callback: () => void): void;
16
22
  focusFirstAutofocusableElement(): void;
23
+ enteringBardo(currentPermanentElement: Element): void;
24
+ leavingBardo(currentPermanentElement: Element): void;
17
25
  get connectedSnapshot(): S;
18
26
  get currentElement(): E;
19
27
  get newElement(): E;
20
- get permanentElementMap(): Record<string, [Element, Element]>;
21
- get cspNonce(): string | null | undefined;
28
+ get permanentElementMap(): import("./snapshot").PermanentElementMap;
29
+ get cspNonce(): string | null;
22
30
  }
@@ -1,9 +1,11 @@
1
1
  import { Adapter } from "./native/adapter";
2
+ import { ReloadReason } from "./native/browser_adapter";
2
3
  import { CacheObserver } from "../observers/cache_observer";
3
4
  import { FormSubmitObserver, FormSubmitObserverDelegate } from "../observers/form_submit_observer";
4
5
  import { FrameRedirector } from "./frames/frame_redirector";
5
6
  import { History, HistoryDelegate } from "./drive/history";
6
7
  import { LinkClickObserver, LinkClickObserverDelegate } from "../observers/link_click_observer";
8
+ import { FormLinkInterceptor, FormLinkInterceptorDelegate } from "../observers/form_link_interceptor";
7
9
  import { Locatable } from "./url";
8
10
  import { Navigator, NavigatorDelegate } from "./drive/navigator";
9
11
  import { PageObserver, PageObserverDelegate } from "../observers/page_observer";
@@ -11,15 +13,45 @@ import { ScrollObserver } from "../observers/scroll_observer";
11
13
  import { StreamMessage } from "./streams/stream_message";
12
14
  import { StreamObserver } from "../observers/stream_observer";
13
15
  import { Action, Position, StreamSource } from "./types";
14
- import { PageView, PageViewDelegate } from "./drive/page_view";
16
+ import { PageView, PageViewDelegate, PageViewRenderOptions } from "./drive/page_view";
15
17
  import { Visit, VisitOptions } from "./drive/visit";
16
18
  import { PageSnapshot } from "./drive/page_snapshot";
17
19
  import { FrameElement } from "../elements/frame_element";
20
+ import { FrameViewRenderOptions } from "./frames/frame_view";
18
21
  import { FetchResponse } from "../http/fetch_response";
19
- export declare type TimingData = {};
20
- export declare class Session implements FormSubmitObserverDelegate, HistoryDelegate, LinkClickObserverDelegate, NavigatorDelegate, PageObserverDelegate, PageViewDelegate {
22
+ import { Preloader, PreloaderDelegate } from "./drive/preloader";
23
+ export declare type TimingData = unknown;
24
+ export declare type TurboBeforeCacheEvent = CustomEvent;
25
+ export declare type TurboBeforeRenderEvent = CustomEvent<{
26
+ newBody: HTMLBodyElement;
27
+ } & PageViewRenderOptions>;
28
+ export declare type TurboBeforeVisitEvent = CustomEvent<{
29
+ url: string;
30
+ }>;
31
+ export declare type TurboClickEvent = CustomEvent<{
32
+ url: string;
33
+ originalEvent: MouseEvent;
34
+ }>;
35
+ export declare type TurboFrameLoadEvent = CustomEvent;
36
+ export declare type TurboBeforeFrameRenderEvent = CustomEvent<{
37
+ newFrame: FrameElement;
38
+ } & FrameViewRenderOptions>;
39
+ export declare type TurboFrameRenderEvent = CustomEvent<{
40
+ fetchResponse: FetchResponse;
41
+ }>;
42
+ export declare type TurboLoadEvent = CustomEvent<{
43
+ url: string;
44
+ timing: TimingData;
45
+ }>;
46
+ export declare type TurboRenderEvent = CustomEvent;
47
+ export declare type TurboVisitEvent = CustomEvent<{
48
+ url: string;
49
+ action: Action;
50
+ }>;
51
+ export declare class Session implements FormSubmitObserverDelegate, HistoryDelegate, FormLinkInterceptorDelegate, LinkClickObserverDelegate, NavigatorDelegate, PageObserverDelegate, PageViewDelegate, PreloaderDelegate {
21
52
  readonly navigator: Navigator;
22
53
  readonly history: History;
54
+ readonly preloader: Preloader;
23
55
  readonly view: PageView;
24
56
  adapter: Adapter;
25
57
  readonly pageObserver: PageObserver;
@@ -28,11 +60,13 @@ export declare class Session implements FormSubmitObserverDelegate, HistoryDeleg
28
60
  readonly formSubmitObserver: FormSubmitObserver;
29
61
  readonly scrollObserver: ScrollObserver;
30
62
  readonly streamObserver: StreamObserver;
63
+ readonly formLinkInterceptor: FormLinkInterceptor;
31
64
  readonly frameRedirector: FrameRedirector;
32
65
  drive: boolean;
33
66
  enabled: boolean;
34
67
  progressBarDelay: number;
35
68
  started: boolean;
69
+ formMode: string;
36
70
  start(): void;
37
71
  disable(): void;
38
72
  stop(): void;
@@ -43,13 +77,15 @@ export declare class Session implements FormSubmitObserverDelegate, HistoryDeleg
43
77
  renderStreamMessage(message: StreamMessage | string): void;
44
78
  clearCache(): void;
45
79
  setProgressBarDelay(delay: number): void;
80
+ setFormMode(mode: string): void;
46
81
  get location(): URL;
47
82
  get restorationIdentifier(): string;
48
83
  historyPoppedToLocationWithRestorationIdentifier(location: URL, restorationIdentifier: string): void;
49
84
  scrollPositionChanged(position: Position): void;
50
- willFollowLinkToLocation(link: Element, location: URL): boolean;
85
+ shouldInterceptFormLinkClick(_link: Element): boolean;
86
+ formLinkClickIntercepted(_link: Element, _form: HTMLFormElement): void;
87
+ willFollowLinkToLocation(link: Element, location: URL, event: MouseEvent): boolean;
51
88
  followedLinkToLocation(link: Element, location: URL): void;
52
- convertLinkWithMethodClickToFormSubmission(link: Element): false | CustomEvent<any>;
53
89
  allowsVisitingLocationWithAction(location: URL, action?: Action): boolean;
54
90
  visitProposedToLocation(location: URL, options: Partial<VisitOptions>): void;
55
91
  visitStarted(visit: Visit): void;
@@ -63,25 +99,41 @@ export declare class Session implements FormSubmitObserverDelegate, HistoryDeleg
63
99
  pageWillUnload(): void;
64
100
  receivedMessageFromStream(message: StreamMessage): void;
65
101
  viewWillCacheSnapshot(): void;
66
- allowsImmediateRender({ element }: PageSnapshot, resume: (value: any) => void): boolean;
67
- viewRenderedSnapshot(snapshot: PageSnapshot, isPreview: boolean): void;
68
- viewInvalidated(): void;
102
+ allowsImmediateRender({ element }: PageSnapshot, options: PageViewRenderOptions): boolean;
103
+ viewRenderedSnapshot(_snapshot: PageSnapshot, _isPreview: boolean): void;
104
+ preloadOnLoadLinksForView(element: Element): void;
105
+ viewInvalidated(reason: ReloadReason): void;
69
106
  frameLoaded(frame: FrameElement): void;
70
107
  frameRendered(fetchResponse: FetchResponse, frame: FrameElement): void;
71
- applicationAllowsFollowingLinkToLocation(link: Element, location: URL): boolean;
108
+ applicationAllowsFollowingLinkToLocation(link: Element, location: URL, ev: MouseEvent): boolean;
72
109
  applicationAllowsVisitingLocation(location: URL): boolean;
73
- notifyApplicationAfterClickingLinkToLocation(link: Element, location: URL): CustomEvent<any>;
74
- notifyApplicationBeforeVisitingLocation(location: URL): CustomEvent<any>;
75
- notifyApplicationAfterVisitingLocation(location: URL, action: Action): CustomEvent<any>;
110
+ notifyApplicationAfterClickingLinkToLocation(link: Element, location: URL, event: MouseEvent): CustomEvent<{
111
+ url: string;
112
+ originalEvent: MouseEvent;
113
+ }>;
114
+ notifyApplicationBeforeVisitingLocation(location: URL): CustomEvent<{
115
+ url: string;
116
+ }>;
117
+ notifyApplicationAfterVisitingLocation(location: URL, action: Action): CustomEvent<{
118
+ url: string;
119
+ action: Action;
120
+ }>;
76
121
  notifyApplicationBeforeCachingSnapshot(): CustomEvent<any>;
77
- notifyApplicationBeforeRender(newBody: HTMLBodyElement, resume: (value: any) => void): CustomEvent<any>;
122
+ notifyApplicationBeforeRender(newBody: HTMLBodyElement, options: PageViewRenderOptions): CustomEvent<{
123
+ newBody: HTMLBodyElement;
124
+ } & PageViewRenderOptions>;
78
125
  notifyApplicationAfterRender(): CustomEvent<any>;
79
- notifyApplicationAfterPageLoad(timing?: TimingData): CustomEvent<any>;
126
+ notifyApplicationAfterPageLoad(timing?: TimingData): CustomEvent<{
127
+ url: string;
128
+ timing: unknown;
129
+ }>;
80
130
  notifyApplicationAfterVisitingSamePageLocation(oldURL: URL, newURL: URL): void;
81
131
  notifyApplicationAfterFrameLoad(frame: FrameElement): CustomEvent<any>;
82
- notifyApplicationAfterFrameRender(fetchResponse: FetchResponse, frame: FrameElement): CustomEvent<any>;
132
+ notifyApplicationAfterFrameRender(fetchResponse: FetchResponse, frame: FrameElement): CustomEvent<{
133
+ fetchResponse: FetchResponse;
134
+ }>;
135
+ formElementDriveEnabled(element?: Element): boolean;
83
136
  elementDriveEnabled(element?: Element): boolean;
84
137
  getActionForLink(link: Element): Action;
85
- getTargetFrameForLink(link: Element): string | undefined;
86
138
  get snapshot(): PageSnapshot;
87
139
  }
@@ -1,6 +1,7 @@
1
1
  export declare class Snapshot<E extends Element = Element> {
2
2
  readonly element: E;
3
3
  constructor(element: E);
4
+ get activeElement(): Element | null;
4
5
  get children(): Element[];
5
6
  hasAnchor(anchor: string | undefined): boolean;
6
7
  getElementForAnchor(anchor: string | undefined): Element | null;
@@ -8,6 +9,6 @@ export declare class Snapshot<E extends Element = Element> {
8
9
  get firstAutofocusableElement(): Element | null;
9
10
  get permanentElements(): Element[];
10
11
  getPermanentElementById(id: string): Element | null;
11
- getPermanentElementMapForSnapshot(snapshot: Snapshot): Record<string, [Element, Element]>;
12
+ getPermanentElementMapForSnapshot(snapshot: Snapshot): PermanentElementMap;
12
13
  }
13
14
  export declare type PermanentElementMap = Record<string, [Element, Element]>;