@hotwired/turbo 7.0.0-beta.3 → 7.0.0-beta.4

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 (48) hide show
  1. package/dist/turbo.es2017-esm.js +647 -574
  2. package/dist/turbo.es2017-esm.js.map +1 -1
  3. package/dist/turbo.es2017-umd.js +647 -574
  4. package/dist/turbo.es2017-umd.js.map +1 -1
  5. package/dist/turbo.es5-umd.js +1153 -843
  6. package/dist/turbo.es5-umd.js.map +1 -1
  7. package/dist/types/core/drive/error_renderer.d.ts +7 -11
  8. package/dist/types/core/drive/form_submission.d.ts +11 -3
  9. package/dist/types/core/drive/head_snapshot.d.ts +21 -0
  10. package/dist/types/core/drive/history.d.ts +5 -6
  11. package/dist/types/core/drive/navigator.d.ts +7 -7
  12. package/dist/types/core/drive/page_renderer.d.ts +26 -0
  13. package/dist/types/core/drive/page_snapshot.d.ts +17 -0
  14. package/dist/types/core/drive/page_view.d.ts +21 -0
  15. package/dist/types/core/drive/snapshot_cache.d.ts +8 -9
  16. package/dist/types/core/drive/visit.d.ts +13 -15
  17. package/dist/types/core/frames/frame_controller.d.ts +11 -10
  18. package/dist/types/core/frames/frame_renderer.d.ts +8 -0
  19. package/dist/types/core/frames/frame_view.d.ts +7 -0
  20. package/dist/types/core/index.d.ts +1 -1
  21. package/dist/types/core/native/adapter.d.ts +1 -2
  22. package/dist/types/core/native/browser_adapter.d.ts +1 -2
  23. package/dist/types/core/renderer.d.ts +26 -0
  24. package/dist/types/core/session.d.ts +23 -21
  25. package/dist/types/core/snapshot.d.ts +11 -0
  26. package/dist/types/core/streams/stream_message.d.ts +1 -0
  27. package/dist/types/core/url.d.ts +7 -0
  28. package/dist/types/core/view.d.ts +27 -0
  29. package/dist/types/http/fetch_request.d.ts +8 -11
  30. package/dist/types/http/fetch_response.d.ts +1 -2
  31. package/dist/types/observers/link_click_observer.d.ts +3 -4
  32. package/dist/types/observers/stream_observer.d.ts +0 -1
  33. package/dist/types/tests/functional/form_submission_tests.d.ts +11 -3
  34. package/dist/types/tests/functional/frame_tests.d.ts +4 -0
  35. package/dist/types/tests/functional/navigation_tests.d.ts +1 -0
  36. package/dist/types/tests/functional/rendering_tests.d.ts +2 -0
  37. package/dist/types/tests/functional/stream_tests.d.ts +0 -2
  38. package/dist/types/tests/helpers/functional_test_case.d.ts +3 -0
  39. package/dist/types/tests/unit/deprecated_adapter_support_test.d.ts +21 -0
  40. package/dist/types/tests/unit/index.d.ts +1 -0
  41. package/dist/types/util.d.ts +2 -0
  42. package/package.json +1 -1
  43. package/dist/types/core/drive/head_details.d.ts +0 -22
  44. package/dist/types/core/drive/renderer.d.ts +0 -13
  45. package/dist/types/core/drive/snapshot.d.ts +0 -24
  46. package/dist/types/core/drive/snapshot_renderer.d.ts +0 -43
  47. package/dist/types/core/drive/view.d.ts +0 -34
  48. package/dist/types/core/location.d.ts +0 -22
@@ -1,13 +1,9 @@
1
- import { RenderCallback, RenderDelegate, Renderer } from "./renderer";
2
- export declare class ErrorRenderer extends Renderer {
3
- readonly delegate: RenderDelegate;
4
- readonly htmlElement: HTMLHtmlElement;
5
- readonly newHead: HTMLHeadElement;
6
- readonly newBody: HTMLBodyElement;
7
- static render(delegate: RenderDelegate, callback: RenderCallback, html: string): void;
8
- constructor(delegate: RenderDelegate, html: string);
9
- render(callback: RenderCallback): void;
1
+ import { PageSnapshot } from "./page_snapshot";
2
+ import { Renderer } from "../renderer";
3
+ export declare class ErrorRenderer extends Renderer<HTMLBodyElement, PageSnapshot> {
4
+ render(): Promise<void>;
10
5
  replaceHeadAndBody(): void;
11
- activateBodyScriptElements(): void;
12
- getScriptElements(): HTMLScriptElement[];
6
+ activateScriptElements(): void;
7
+ get newHead(): HTMLHeadElement;
8
+ get scriptElements(): HTMLScriptElement[];
13
9
  }
@@ -1,6 +1,5 @@
1
1
  import { FetchRequest, FetchMethod, FetchRequestHeaders } from "../../http/fetch_request";
2
2
  import { FetchResponse } from "../../http/fetch_response";
3
- import { Location } from "../location";
4
3
  export interface FormSubmissionDelegate {
5
4
  formSubmissionStarted(formSubmission: FormSubmission): void;
6
5
  formSubmissionSucceededWithResponse(formSubmission: FormSubmission, fetchResponse: FetchResponse): void;
@@ -23,6 +22,11 @@ export declare enum FormSubmissionState {
23
22
  stopping = 4,
24
23
  stopped = 5
25
24
  }
25
+ declare enum FormEnctype {
26
+ urlEncoded = "application/x-www-form-urlencoded",
27
+ multipart = "multipart/form-data",
28
+ plain = "text/plain"
29
+ }
26
30
  export declare class FormSubmission {
27
31
  readonly delegate: FormSubmissionDelegate;
28
32
  readonly formElement: HTMLFormElement;
@@ -35,10 +39,13 @@ export declare class FormSubmission {
35
39
  constructor(delegate: FormSubmissionDelegate, formElement: HTMLFormElement, submitter?: HTMLElement, mustRedirect?: boolean);
36
40
  get method(): FetchMethod;
37
41
  get action(): string;
38
- get location(): Location;
42
+ get location(): URL;
43
+ get body(): FormData;
44
+ get enctype(): FormEnctype;
45
+ get stringFormData(): [string, string][];
39
46
  start(): Promise<FetchResponse | undefined>;
40
47
  stop(): true | undefined;
41
- additionalHeadersForRequest(request: FetchRequest): FetchRequestHeaders;
48
+ prepareHeadersForRequest(headers: FetchRequestHeaders, request: FetchRequest): void;
42
49
  requestStarted(request: FetchRequest): void;
43
50
  requestPreventedHandlingResponse(request: FetchRequest, response: FetchResponse): void;
44
51
  requestSucceededWithResponse(request: FetchRequest, response: FetchResponse): void;
@@ -47,3 +54,4 @@ export declare class FormSubmission {
47
54
  requestFinished(request: FetchRequest): void;
48
55
  requestMustRedirect(request: FetchRequest): boolean;
49
56
  }
57
+ export {};
@@ -0,0 +1,21 @@
1
+ import { Snapshot } from "../snapshot";
2
+ declare type ElementDetailMap = {
3
+ [outerHTML: string]: ElementDetails;
4
+ };
5
+ declare type ElementDetails = {
6
+ type?: ElementType;
7
+ tracked: boolean;
8
+ elements: Element[];
9
+ };
10
+ declare type ElementType = "script" | "stylesheet";
11
+ export declare class HeadSnapshot extends Snapshot<HTMLHeadElement> {
12
+ readonly detailsByOuterHTML: ElementDetailMap;
13
+ get trackedElementSignature(): string;
14
+ getScriptElementsNotInSnapshot(snapshot: HeadSnapshot): Element[];
15
+ getStylesheetElementsNotInSnapshot(snapshot: HeadSnapshot): Element[];
16
+ getElementsMatchingTypeNotInSnapshot(matchedType: ElementType, snapshot: HeadSnapshot): Element[];
17
+ get provisionalElements(): Element[];
18
+ getMetaValue(name: string): string | null;
19
+ findMetaElementByName(name: string): Element | undefined;
20
+ }
21
+ export {};
@@ -1,7 +1,6 @@
1
- import { Location } from "../location";
2
1
  import { Position } from "../types";
3
2
  export interface HistoryDelegate {
4
- historyPoppedToLocationWithRestorationIdentifier(location: Location, restorationIdentifier: string): void;
3
+ historyPoppedToLocationWithRestorationIdentifier(location: URL, restorationIdentifier: string): void;
5
4
  }
6
5
  declare type HistoryMethod = (this: typeof history, state: any, title: string, url?: string | null | undefined) => void;
7
6
  export declare type RestorationData = {
@@ -12,7 +11,7 @@ export declare type RestorationDataMap = {
12
11
  };
13
12
  export declare class History {
14
13
  readonly delegate: HistoryDelegate;
15
- location: Location;
14
+ location: URL;
16
15
  restorationIdentifier: string;
17
16
  restorationData: RestorationDataMap;
18
17
  started: boolean;
@@ -21,9 +20,9 @@ export declare class History {
21
20
  constructor(delegate: HistoryDelegate);
22
21
  start(): void;
23
22
  stop(): void;
24
- push(location: Location, restorationIdentifier?: string): void;
25
- replace(location: Location, restorationIdentifier?: string): void;
26
- update(method: HistoryMethod, location: Location, restorationIdentifier?: string): void;
23
+ push(location: URL, restorationIdentifier?: string): void;
24
+ replace(location: URL, restorationIdentifier?: string): void;
25
+ update(method: HistoryMethod, location: URL, restorationIdentifier?: string): void;
27
26
  getRestorationDataForIdentifier(restorationIdentifier: string): RestorationData;
28
27
  updateRestorationData(additionalData: Partial<RestorationData>): void;
29
28
  assumeControlOfScrollRestoration(): void;
@@ -1,22 +1,22 @@
1
1
  import { FetchResponse } from "../../http/fetch_response";
2
2
  import { FormSubmission } from "./form_submission";
3
- import { Locatable, Location } from "../location";
3
+ import { Locatable } from "../url";
4
4
  import { Visit, VisitDelegate, VisitOptions } from "./visit";
5
5
  export declare type NavigatorDelegate = VisitDelegate & {
6
- allowsVisitingLocation(location: Location): boolean;
7
- visitProposedToLocation(location: Location, options: Partial<VisitOptions>): void;
6
+ allowsVisitingLocation(location: URL): boolean;
7
+ visitProposedToLocation(location: URL, options: Partial<VisitOptions>): void;
8
8
  };
9
9
  export declare class Navigator {
10
10
  readonly delegate: NavigatorDelegate;
11
11
  formSubmission?: FormSubmission;
12
12
  currentVisit?: Visit;
13
13
  constructor(delegate: NavigatorDelegate);
14
- proposeVisit(location: Location, options?: Partial<VisitOptions>): void;
15
- startVisit(location: Locatable, restorationIdentifier: string, options?: Partial<VisitOptions>): void;
14
+ proposeVisit(location: URL, options?: Partial<VisitOptions>): void;
15
+ startVisit(locatable: Locatable, restorationIdentifier: string, options?: Partial<VisitOptions>): void;
16
16
  submitForm(form: HTMLFormElement, submitter?: HTMLElement): void;
17
17
  stop(): void;
18
18
  get adapter(): import("../native/adapter").Adapter;
19
- get view(): import("./view").View;
19
+ get view(): import("./page_view").PageView;
20
20
  get history(): import("./history").History;
21
21
  formSubmissionStarted(formSubmission: FormSubmission): void;
22
22
  formSubmissionSucceededWithResponse(formSubmission: FormSubmission, fetchResponse: FetchResponse): Promise<void>;
@@ -25,6 +25,6 @@ export declare class Navigator {
25
25
  formSubmissionFinished(formSubmission: FormSubmission): void;
26
26
  visitStarted(visit: Visit): void;
27
27
  visitCompleted(visit: Visit): void;
28
- get location(): Location;
28
+ get location(): URL;
29
29
  get restorationIdentifier(): string;
30
30
  }
@@ -0,0 +1,26 @@
1
+ import { Renderer } from "../renderer";
2
+ import { PageSnapshot } from "./page_snapshot";
3
+ export declare class PageRenderer extends Renderer<HTMLBodyElement, PageSnapshot> {
4
+ get shouldRender(): boolean;
5
+ prepareToRender(): void;
6
+ render(): Promise<void>;
7
+ finishRendering(): void;
8
+ get currentHeadSnapshot(): import("./head_snapshot").HeadSnapshot;
9
+ get newHeadSnapshot(): import("./head_snapshot").HeadSnapshot;
10
+ get newElement(): HTMLBodyElement;
11
+ mergeHead(): void;
12
+ replaceBody(): void;
13
+ get trackedElementsAreIdentical(): boolean;
14
+ copyNewHeadStylesheetElements(): void;
15
+ copyNewHeadScriptElements(): void;
16
+ removeCurrentHeadProvisionalElements(): void;
17
+ copyNewHeadProvisionalElements(): void;
18
+ activateNewBody(): void;
19
+ activateNewBodyScriptElements(): void;
20
+ assignNewBody(): void;
21
+ get newHeadStylesheetElements(): Element[];
22
+ get newHeadScriptElements(): Element[];
23
+ get currentHeadProvisionalElements(): Element[];
24
+ get newHeadProvisionalElements(): Element[];
25
+ get newBodyScriptElements(): HTMLScriptElement[];
26
+ }
@@ -0,0 +1,17 @@
1
+ import { Snapshot } from "../snapshot";
2
+ import { HeadSnapshot } from "./head_snapshot";
3
+ export declare class PageSnapshot extends Snapshot<HTMLBodyElement> {
4
+ static fromHTMLString(html?: string): PageSnapshot;
5
+ static fromElement(element: Element): PageSnapshot;
6
+ static fromDocument({ head, body }: Document): PageSnapshot;
7
+ readonly headSnapshot: HeadSnapshot;
8
+ constructor(element: HTMLBodyElement, headSnapshot: HeadSnapshot);
9
+ clone(): PageSnapshot;
10
+ get headElement(): HTMLHeadElement;
11
+ get rootLocation(): URL;
12
+ get cacheControlValue(): string | null;
13
+ get isPreviewable(): boolean;
14
+ get isCacheable(): boolean;
15
+ get isVisitable(): boolean;
16
+ getSetting(name: string): string | null;
17
+ }
@@ -0,0 +1,21 @@
1
+ import { View, ViewDelegate } from "../view";
2
+ import { ErrorRenderer } from "./error_renderer";
3
+ import { PageRenderer } from "./page_renderer";
4
+ import { PageSnapshot } from "./page_snapshot";
5
+ import { SnapshotCache } from "./snapshot_cache";
6
+ export interface PageViewDelegate extends ViewDelegate<PageSnapshot> {
7
+ viewWillCacheSnapshot(): void;
8
+ }
9
+ declare type PageViewRenderer = PageRenderer | ErrorRenderer;
10
+ export declare class PageView extends View<Element, PageSnapshot, PageViewRenderer, PageViewDelegate> {
11
+ readonly snapshotCache: SnapshotCache;
12
+ lastRenderedLocation: URL;
13
+ renderPage(snapshot: PageSnapshot, isPreview?: boolean): Promise<void>;
14
+ renderError(snapshot: PageSnapshot): void;
15
+ clearSnapshotCache(): void;
16
+ cacheSnapshot(): Promise<void>;
17
+ getCachedSnapshotForLocation(location: URL): PageSnapshot | undefined;
18
+ get snapshot(): PageSnapshot;
19
+ get shouldCacheSnapshot(): boolean;
20
+ }
21
+ export {};
@@ -1,18 +1,17 @@
1
- import { Location } from "../location";
2
- import { Snapshot } from "./snapshot";
1
+ import { PageSnapshot } from "./page_snapshot";
3
2
  export declare class SnapshotCache {
4
3
  readonly keys: string[];
5
4
  readonly size: number;
6
5
  snapshots: {
7
- [url: string]: Snapshot;
6
+ [url: string]: PageSnapshot;
8
7
  };
9
8
  constructor(size: number);
10
- has(location: Location): boolean;
11
- get(location: Location): Snapshot | undefined;
12
- put(location: Location, snapshot: Snapshot): Snapshot;
9
+ has(location: URL): boolean;
10
+ get(location: URL): PageSnapshot | undefined;
11
+ put(location: URL, snapshot: PageSnapshot): PageSnapshot;
13
12
  clear(): void;
14
- read(location: Location): Snapshot;
15
- write(location: Location, snapshot: Snapshot): void;
16
- touch(location: Location): void;
13
+ read(location: URL): PageSnapshot;
14
+ write(location: URL, snapshot: PageSnapshot): void;
15
+ touch(location: URL): void;
17
16
  trim(): void;
18
17
  }
@@ -2,15 +2,13 @@ import { Adapter } from "../native/adapter";
2
2
  import { FetchRequest, FetchRequestDelegate } from "../../http/fetch_request";
3
3
  import { FetchResponse } from "../../http/fetch_response";
4
4
  import { History } from "./history";
5
- import { Location } from "../location";
6
- import { RenderCallback } from "./renderer";
7
- import { Snapshot } from "./snapshot";
5
+ import { PageSnapshot } from "./page_snapshot";
8
6
  import { Action } from "../types";
9
- import { View } from "./view";
7
+ import { PageView } from "./page_view";
10
8
  export interface VisitDelegate {
11
9
  readonly adapter: Adapter;
12
- readonly view: View;
13
10
  readonly history: History;
11
+ readonly view: PageView;
14
12
  visitStarted(visit: Visit): void;
15
13
  visitCompleted(visit: Visit): void;
16
14
  }
@@ -33,7 +31,7 @@ export declare enum VisitState {
33
31
  export declare type VisitOptions = {
34
32
  action: Action;
35
33
  historyChanged: boolean;
36
- referrer?: Location;
34
+ referrer?: URL;
37
35
  snapshotHTML?: string;
38
36
  response?: VisitResponse;
39
37
  };
@@ -51,22 +49,22 @@ export declare class Visit implements FetchRequestDelegate {
51
49
  readonly identifier: string;
52
50
  readonly restorationIdentifier: string;
53
51
  readonly action: Action;
54
- readonly referrer?: Location;
52
+ readonly referrer?: URL;
55
53
  readonly timingMetrics: TimingMetrics;
56
54
  followedRedirect: boolean;
57
55
  frame?: number;
58
56
  historyChanged: boolean;
59
- location: Location;
60
- redirectedToLocation?: Location;
57
+ location: URL;
58
+ redirectedToLocation?: URL;
61
59
  request?: FetchRequest;
62
60
  response?: VisitResponse;
63
61
  scrolled: boolean;
64
62
  snapshotHTML?: string;
65
63
  snapshotCached: boolean;
66
64
  state: VisitState;
67
- constructor(delegate: VisitDelegate, location: Location, restorationIdentifier: string | undefined, options?: Partial<VisitOptions>);
65
+ constructor(delegate: VisitDelegate, location: URL, restorationIdentifier: string | undefined, options?: Partial<VisitOptions>);
68
66
  get adapter(): Adapter;
69
- get view(): View;
67
+ get view(): PageView;
70
68
  get history(): History;
71
69
  get restorationData(): import("./history").RestorationData;
72
70
  start(): void;
@@ -80,8 +78,8 @@ export declare class Visit implements FetchRequestDelegate {
80
78
  recordResponse(response?: VisitResponse | undefined): void;
81
79
  finishRequest(): void;
82
80
  loadResponse(): void;
83
- getCachedSnapshot(): Snapshot | undefined;
84
- getPreloadedSnapshot(): Snapshot | undefined;
81
+ getCachedSnapshot(): PageSnapshot | undefined;
82
+ getPreloadedSnapshot(): PageSnapshot | undefined;
85
83
  hasCachedSnapshot(): boolean;
86
84
  loadCachedSnapshot(): void;
87
85
  followRedirect(): void;
@@ -91,7 +89,7 @@ export declare class Visit implements FetchRequestDelegate {
91
89
  requestFailedWithResponse(request: FetchRequest, response: FetchResponse): Promise<void>;
92
90
  requestErrored(request: FetchRequest, error: Error): void;
93
91
  requestFinished(): void;
94
- performScroll: () => void;
92
+ performScroll(): void;
95
93
  scrollToRestoredPosition(): true | undefined;
96
94
  scrollToAnchor(): true | undefined;
97
95
  scrollToTop(): void;
@@ -101,6 +99,6 @@ export declare class Visit implements FetchRequestDelegate {
101
99
  hasPreloadedResponse(): boolean;
102
100
  shouldIssueRequest(): boolean;
103
101
  cacheSnapshot(): void;
104
- render(callback: RenderCallback): void;
102
+ render(callback: () => Promise<void>): Promise<void>;
105
103
  cancelRender(): void;
106
104
  }
@@ -1,12 +1,16 @@
1
1
  import { FrameElement, FrameElementDelegate, FrameLoadingStyle } from "../../elements/frame_element";
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 { AppearanceObserver, AppearanceObserverDelegate } from "../../observers/appearance_observer";
5
5
  import { FormSubmission, FormSubmissionDelegate } from "../drive/form_submission";
6
+ import { Snapshot } from "../snapshot";
7
+ import { ViewDelegate } from "../view";
6
8
  import { FormInterceptor, FormInterceptorDelegate } from "./form_interceptor";
9
+ import { FrameView } from "./frame_view";
7
10
  import { LinkInterceptor, LinkInterceptorDelegate } from "./link_interceptor";
8
- export declare class FrameController implements AppearanceObserverDelegate, FetchRequestDelegate, FormInterceptorDelegate, FormSubmissionDelegate, FrameElementDelegate, LinkInterceptorDelegate {
11
+ export declare class FrameController implements AppearanceObserverDelegate, FetchRequestDelegate, FormInterceptorDelegate, FormSubmissionDelegate, FrameElementDelegate, LinkInterceptorDelegate, ViewDelegate<Snapshot<FrameElement>> {
9
12
  readonly element: FrameElement;
13
+ readonly view: FrameView;
10
14
  readonly appearanceObserver: AppearanceObserver;
11
15
  readonly linkInterceptor: LinkInterceptor;
12
16
  readonly formInterceptor: FormInterceptor;
@@ -25,9 +29,7 @@ export declare class FrameController implements AppearanceObserverDelegate, Fetc
25
29
  linkClickIntercepted(element: Element, url: string): void;
26
30
  shouldInterceptFormSubmission(element: HTMLFormElement): boolean;
27
31
  formSubmissionIntercepted(element: HTMLFormElement, submitter?: HTMLElement): void;
28
- additionalHeadersForRequest(request: FetchRequest): {
29
- "Turbo-Frame": string;
30
- };
32
+ prepareHeadersForRequest(headers: FetchRequestHeaders, request: FetchRequest): void;
31
33
  requestStarted(request: FetchRequest): void;
32
34
  requestPreventedHandlingResponse(request: FetchRequest, response: FetchResponse): void;
33
35
  requestSucceededWithResponse(request: FetchRequest, response: FetchResponse): Promise<void>;
@@ -39,15 +41,14 @@ export declare class FrameController implements AppearanceObserverDelegate, Fetc
39
41
  formSubmissionFailedWithResponse(formSubmission: FormSubmission, fetchResponse: FetchResponse): void;
40
42
  formSubmissionErrored(formSubmission: FormSubmission, error: Error): void;
41
43
  formSubmissionFinished(formSubmission: FormSubmission): void;
44
+ viewWillRenderSnapshot(snapshot: Snapshot, isPreview: boolean): void;
45
+ viewRenderedSnapshot(snapshot: Snapshot, isPreview: boolean): void;
46
+ viewInvalidated(): void;
42
47
  private visit;
43
48
  private navigateFrame;
44
49
  private findFrameElement;
45
- private extractForeignFrameElement;
46
- private loadFrameElement;
47
- private focusFirstAutofocusableElement;
48
- private scrollFrameIntoView;
50
+ extractForeignFrameElement(container: ParentNode): Promise<FrameElement>;
49
51
  private shouldInterceptNavigation;
50
- get firstAutofocusableElement(): HTMLElement | null;
51
52
  get id(): string;
52
53
  get enabled(): boolean;
53
54
  get sourceURL(): string | null;
@@ -0,0 +1,8 @@
1
+ import { FrameElement } from "../../elements/frame_element";
2
+ import { Renderer } from "../renderer";
3
+ export declare class FrameRenderer extends Renderer<FrameElement> {
4
+ get shouldRender(): boolean;
5
+ render(): Promise<void>;
6
+ loadFrameElement(): void;
7
+ scrollFrameIntoView(): boolean;
8
+ }
@@ -0,0 +1,7 @@
1
+ import { FrameElement } from "../../elements";
2
+ import { Snapshot } from "../snapshot";
3
+ import { View } from "../view";
4
+ export declare class FrameView extends View<FrameElement> {
5
+ invalidate(): void;
6
+ get snapshot(): Snapshot<FrameElement>;
7
+ }
@@ -1,5 +1,5 @@
1
1
  import { Adapter } from "./native/adapter";
2
- import { Locatable } from "./location";
2
+ import { Locatable } from "./url";
3
3
  import { StreamMessage } from "./streams/stream_message";
4
4
  import { StreamSource } from "./types";
5
5
  import { VisitOptions } from "./drive/visit";
@@ -1,7 +1,6 @@
1
- import { Locatable } from "../location";
2
1
  import { Visit, VisitOptions } from "../drive/visit";
3
2
  export interface Adapter {
4
- visitProposedToLocation(location: Locatable, options?: Partial<VisitOptions>): void;
3
+ visitProposedToLocation(location: URL, options?: Partial<VisitOptions>): void;
5
4
  visitStarted(visit: Visit): void;
6
5
  visitCompleted(visit: Visit): void;
7
6
  visitFailed(visit: Visit): void;
@@ -1,5 +1,4 @@
1
1
  import { Adapter } from "./adapter";
2
- import { Locatable } from "../location";
3
2
  import { ProgressBar } from "../drive/progress_bar";
4
3
  import { Visit, VisitOptions } from "../drive/visit";
5
4
  import { Session } from "../session";
@@ -8,7 +7,7 @@ export declare class BrowserAdapter implements Adapter {
8
7
  readonly progressBar: ProgressBar;
9
8
  progressBarTimeout?: number;
10
9
  constructor(session: Session);
11
- visitProposedToLocation(location: Locatable, options?: Partial<VisitOptions>): void;
10
+ visitProposedToLocation(location: URL, options?: Partial<VisitOptions>): void;
12
11
  visitStarted(visit: Visit): void;
13
12
  visitRequestStarted(visit: Visit): void;
14
13
  visitRequestCompleted(visit: Visit): void;
@@ -0,0 +1,26 @@
1
+ import { Snapshot } from "./snapshot";
2
+ export declare type PermanentElement = Element & {
3
+ id: string;
4
+ };
5
+ export declare type Placeholder = {
6
+ element: Element;
7
+ permanentElement: PermanentElement;
8
+ };
9
+ export declare abstract class Renderer<E extends Element, S extends Snapshot<E> = Snapshot<E>> {
10
+ readonly currentSnapshot: S;
11
+ readonly newSnapshot: S;
12
+ readonly isPreview: boolean;
13
+ readonly promise: Promise<void>;
14
+ private resolvingFunctions?;
15
+ constructor(currentSnapshot: S, newSnapshot: S, isPreview: boolean);
16
+ get shouldRender(): boolean;
17
+ prepareToRender(): void;
18
+ abstract render(): Promise<void>;
19
+ finishRendering(): void;
20
+ createScriptElement(element: Element): Element;
21
+ preservingPermanentElements(callback: () => void): void;
22
+ focusFirstAutofocusableElement(): void;
23
+ get currentElement(): E;
24
+ get newElement(): E;
25
+ }
26
+ export declare function replaceElementWithElement(fromElement: Element, toElement: Element): Element | undefined;
@@ -1,22 +1,23 @@
1
1
  import { Adapter } from "./native/adapter";
2
2
  import { FormSubmitObserver } from "../observers/form_submit_observer";
3
3
  import { FrameRedirector } from "./frames/frame_redirector";
4
- import { History } from "./drive/history";
5
- import { LinkClickObserver } from "../observers/link_click_observer";
6
- import { Location, Locatable } from "./location";
4
+ import { History, HistoryDelegate } from "./drive/history";
5
+ import { LinkClickObserver, LinkClickObserverDelegate } from "../observers/link_click_observer";
6
+ import { Locatable } from "./url";
7
7
  import { Navigator, NavigatorDelegate } from "./drive/navigator";
8
8
  import { PageObserver, PageObserverDelegate } from "../observers/page_observer";
9
9
  import { ScrollObserver } from "../observers/scroll_observer";
10
10
  import { StreamMessage } from "./streams/stream_message";
11
11
  import { StreamObserver } from "../observers/stream_observer";
12
12
  import { Action, Position, StreamSource } from "./types";
13
- import { View } from "./drive/view";
13
+ import { PageView, PageViewDelegate } from "./drive/page_view";
14
14
  import { Visit, VisitOptions } from "./drive/visit";
15
+ import { PageSnapshot } from "./drive/page_snapshot";
15
16
  export declare type TimingData = {};
16
- export declare class Session implements NavigatorDelegate, PageObserverDelegate {
17
+ export declare class Session implements HistoryDelegate, LinkClickObserverDelegate, NavigatorDelegate, PageObserverDelegate, PageViewDelegate {
17
18
  readonly navigator: Navigator;
18
19
  readonly history: History;
19
- readonly view: View;
20
+ readonly view: PageView;
20
21
  adapter: Adapter;
21
22
  readonly pageObserver: PageObserver;
22
23
  readonly linkClickObserver: LinkClickObserver;
@@ -37,14 +38,14 @@ export declare class Session implements NavigatorDelegate, PageObserverDelegate
37
38
  renderStreamMessage(message: StreamMessage | string): void;
38
39
  clearCache(): void;
39
40
  setProgressBarDelay(delay: number): void;
40
- get location(): Location;
41
+ get location(): URL;
41
42
  get restorationIdentifier(): string;
42
- historyPoppedToLocationWithRestorationIdentifier(location: Location): void;
43
+ historyPoppedToLocationWithRestorationIdentifier(location: URL): void;
43
44
  scrollPositionChanged(position: Position): void;
44
- willFollowLinkToLocation(link: Element, location: Location): boolean;
45
- followedLinkToLocation(link: Element, location: Location): void;
46
- allowsVisitingLocation(location: Location): boolean;
47
- visitProposedToLocation(location: Location, options: Partial<VisitOptions>): void;
45
+ willFollowLinkToLocation(link: Element, location: URL): boolean;
46
+ followedLinkToLocation(link: Element, location: URL): void;
47
+ allowsVisitingLocation(location: URL): boolean;
48
+ visitProposedToLocation(location: URL, options: Partial<VisitOptions>): void;
48
49
  visitStarted(visit: Visit): void;
49
50
  visitCompleted(visit: Visit): void;
50
51
  willSubmitForm(form: HTMLFormElement, submitter?: HTMLElement): boolean;
@@ -53,20 +54,21 @@ export declare class Session implements NavigatorDelegate, PageObserverDelegate
53
54
  pageLoaded(): void;
54
55
  pageWillUnload(): void;
55
56
  receivedMessageFromStream(message: StreamMessage): void;
56
- viewWillRender(newBody: HTMLBodyElement): void;
57
- viewRendered(): void;
58
- viewInvalidated(): void;
59
57
  viewWillCacheSnapshot(): void;
60
- applicationAllowsFollowingLinkToLocation(link: Element, location: Location): boolean;
61
- applicationAllowsVisitingLocation(location: Location): boolean;
62
- notifyApplicationAfterClickingLinkToLocation(link: Element, location: Location): CustomEvent<any>;
63
- notifyApplicationBeforeVisitingLocation(location: Location): CustomEvent<any>;
64
- notifyApplicationAfterVisitingLocation(location: Location): CustomEvent<any>;
58
+ viewWillRenderSnapshot({ element }: PageSnapshot, isPreview: boolean): void;
59
+ viewRenderedSnapshot(snapshot: PageSnapshot, isPreview: boolean): void;
60
+ viewInvalidated(): void;
61
+ applicationAllowsFollowingLinkToLocation(link: Element, location: URL): boolean;
62
+ applicationAllowsVisitingLocation(location: URL): boolean;
63
+ notifyApplicationAfterClickingLinkToLocation(link: Element, location: URL): CustomEvent<any>;
64
+ notifyApplicationBeforeVisitingLocation(location: URL): CustomEvent<any>;
65
+ notifyApplicationAfterVisitingLocation(location: URL): CustomEvent<any>;
65
66
  notifyApplicationBeforeCachingSnapshot(): CustomEvent<any>;
66
67
  notifyApplicationBeforeRender(newBody: HTMLBodyElement): CustomEvent<any>;
67
68
  notifyApplicationAfterRender(): CustomEvent<any>;
68
69
  notifyApplicationAfterPageLoad(timing?: TimingData): CustomEvent<any>;
69
70
  getActionForLink(link: Element): Action;
70
71
  elementIsNavigable(element?: Element): boolean;
71
- locationIsVisitable(location: Location): boolean;
72
+ locationIsVisitable(location: URL): boolean;
73
+ get snapshot(): PageSnapshot;
72
74
  }
@@ -0,0 +1,11 @@
1
+ export declare class Snapshot<E extends Element = Element> {
2
+ readonly element: E;
3
+ constructor(element: E);
4
+ get children(): Element[];
5
+ hasAnchor(anchor: string): boolean;
6
+ getElementForAnchor(anchor: string): Element | null;
7
+ get firstAutofocusableElement(): Element | null;
8
+ get permanentElements(): Element[];
9
+ getPermanentElementById(id: string): Element | null;
10
+ getPermanentElementsPresentInSnapshot(snapshot: Snapshot): Element[];
11
+ }
@@ -1,5 +1,6 @@
1
1
  import { StreamElement } from "../../elements/stream_element";
2
2
  export declare class StreamMessage {
3
+ static readonly contentType = "text/vnd.turbo-stream.html";
3
4
  readonly templateElement: HTMLTemplateElement;
4
5
  static wrap(message: StreamMessage | string): StreamMessage;
5
6
  constructor(html: string);
@@ -0,0 +1,7 @@
1
+ export declare type Locatable = URL | string;
2
+ export declare function expandURL(locatable: Locatable): URL;
3
+ export declare function getAnchor(url: URL): string;
4
+ export declare function getExtension(url: URL): string;
5
+ export declare function isHTML(url: URL): boolean;
6
+ export declare function isPrefixedBy(baseURL: URL, url: URL): boolean;
7
+ export declare function toCacheKey(url: URL): string;
@@ -0,0 +1,27 @@
1
+ import { Renderer } from "./renderer";
2
+ import { Snapshot } from "./snapshot";
3
+ import { Position } from "./types";
4
+ export interface ViewDelegate<S extends Snapshot> {
5
+ viewWillRenderSnapshot(snapshot: S, isPreview: boolean): void;
6
+ viewRenderedSnapshot(snapshot: S, isPreview: boolean): void;
7
+ viewInvalidated(): void;
8
+ }
9
+ export declare abstract class View<E extends Element, S extends Snapshot<E> = Snapshot<E>, R extends Renderer<E, S> = Renderer<E, S>, D extends ViewDelegate<S> = ViewDelegate<S>> {
10
+ readonly delegate: D;
11
+ readonly element: E;
12
+ renderer?: R;
13
+ abstract readonly snapshot: S;
14
+ constructor(delegate: D, element: E);
15
+ scrollToAnchor(anchor: string): void;
16
+ scrollToElement(element: Element): void;
17
+ scrollToPosition({ x, y }: Position): void;
18
+ get scrollRoot(): {
19
+ scrollTo(x: number, y: number): void;
20
+ };
21
+ render(renderer: R): Promise<void>;
22
+ invalidate(): void;
23
+ prepareToRenderSnapshot(renderer: R): void;
24
+ markAsPreview(isPreview: boolean): void;
25
+ renderSnapshot(renderer: R): Promise<void>;
26
+ finishRenderingSnapshot(renderer: R): void;
27
+ }