@hotwired/turbo 7.2.0-beta.1 → 7.2.0-beta.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (31) hide show
  1. package/dist/turbo.es2017-esm.js +388 -321
  2. package/dist/turbo.es2017-umd.js +388 -321
  3. package/dist/types/core/drive/error_renderer.d.ts +1 -1
  4. package/dist/types/core/drive/head_snapshot.d.ts +3 -3
  5. package/dist/types/core/drive/navigator.d.ts +3 -3
  6. package/dist/types/core/drive/page_renderer.d.ts +5 -5
  7. package/dist/types/core/drive/visit.d.ts +12 -1
  8. package/dist/types/core/frames/frame_controller.d.ts +26 -16
  9. package/dist/types/core/frames/frame_redirector.d.ts +12 -10
  10. package/dist/types/core/frames/frame_renderer.d.ts +1 -1
  11. package/dist/types/core/index.d.ts +5 -4
  12. package/dist/types/core/native/adapter.d.ts +1 -1
  13. package/dist/types/core/native/browser_adapter.d.ts +1 -1
  14. package/dist/types/core/renderer.d.ts +0 -2
  15. package/dist/types/core/session.d.ts +18 -11
  16. package/dist/types/core/streams/stream_message.d.ts +2 -6
  17. package/dist/types/core/types.d.ts +4 -0
  18. package/dist/types/core/view.d.ts +1 -1
  19. package/dist/types/elements/frame_element.d.ts +5 -5
  20. package/dist/types/elements/stream_element.d.ts +3 -1
  21. package/dist/types/http/fetch_request.d.ts +1 -0
  22. package/dist/types/observers/form_link_click_observer.d.ts +14 -0
  23. package/dist/types/observers/form_submit_observer.d.ts +2 -1
  24. package/dist/types/observers/link_click_observer.d.ts +3 -2
  25. package/dist/types/tests/functional/form_mode_tests.d.ts +1 -0
  26. package/dist/types/tests/unit/deprecated_adapter_support_test.d.ts +1 -1
  27. package/dist/types/util.d.ts +6 -0
  28. package/package.json +1 -1
  29. package/dist/types/core/frames/form_interceptor.d.ts +0 -12
  30. package/dist/types/core/frames/link_interceptor.d.ts +0 -16
  31. package/dist/types/observers/form_link_interceptor.d.ts +0 -14
@@ -6,5 +6,5 @@ export declare class ErrorRenderer extends Renderer<HTMLBodyElement, PageSnapsho
6
6
  replaceHeadAndBody(): void;
7
7
  activateScriptElements(): void;
8
8
  get newHead(): HTMLHeadElement;
9
- get scriptElements(): HTMLScriptElement[];
9
+ get scriptElements(): NodeListOf<HTMLScriptElement>;
10
10
  }
@@ -11,9 +11,9 @@ declare type ElementType = "script" | "stylesheet";
11
11
  export declare class HeadSnapshot extends Snapshot<HTMLHeadElement> {
12
12
  readonly detailsByOuterHTML: ElementDetailMap;
13
13
  get trackedElementSignature(): string;
14
- getScriptElementsNotInSnapshot(snapshot: HeadSnapshot): Element[];
15
- getStylesheetElementsNotInSnapshot(snapshot: HeadSnapshot): Element[];
16
- getElementsMatchingTypeNotInSnapshot(matchedType: ElementType, snapshot: HeadSnapshot): Element[];
14
+ getScriptElementsNotInSnapshot(snapshot: HeadSnapshot): HTMLScriptElement[];
15
+ getStylesheetElementsNotInSnapshot(snapshot: HeadSnapshot): HTMLLinkElement[];
16
+ getElementsMatchingTypeNotInSnapshot<T extends Element>(matchedType: ElementType, snapshot: HeadSnapshot): T[];
17
17
  get provisionalElements(): Element[];
18
18
  getMetaValue(name: string): string | null;
19
19
  findMetaElementByName(name: string): Element | undefined;
@@ -5,7 +5,7 @@ import { Locatable } from "../url";
5
5
  import { Visit, VisitDelegate, VisitOptions } from "./visit";
6
6
  export declare type NavigatorDelegate = VisitDelegate & {
7
7
  allowsVisitingLocationWithAction(location: URL, action?: Action): boolean;
8
- visitProposedToLocation(location: URL, options: Partial<VisitOptions>): void;
8
+ visitProposedToLocation(location: URL, options: Partial<VisitOptions>): Promise<void>;
9
9
  notifyApplicationAfterVisitingSamePageLocation(oldURL: URL, newURL: URL): void;
10
10
  };
11
11
  export declare class Navigator {
@@ -14,8 +14,8 @@ export declare class Navigator {
14
14
  currentVisit?: Visit;
15
15
  lastVisit?: Visit;
16
16
  constructor(delegate: NavigatorDelegate);
17
- proposeVisit(location: URL, options?: Partial<VisitOptions>): void;
18
- startVisit(locatable: Locatable, restorationIdentifier: string, options?: Partial<VisitOptions>): void;
17
+ proposeVisit(location: URL, options?: Partial<VisitOptions>): Promise<void>;
18
+ startVisit(locatable: Locatable, restorationIdentifier: string, options?: Partial<VisitOptions>): Promise<void>;
19
19
  submitForm(form: HTMLFormElement, submitter?: HTMLElement): void;
20
20
  stop(): void;
21
21
  get adapter(): import("../native/adapter").Adapter;
@@ -5,24 +5,24 @@ export declare class PageRenderer extends Renderer<HTMLBodyElement, PageSnapshot
5
5
  static renderElement(currentElement: HTMLBodyElement, newElement: HTMLBodyElement): void;
6
6
  get shouldRender(): boolean;
7
7
  get reloadReason(): ReloadReason;
8
- prepareToRender(): void;
8
+ prepareToRender(): Promise<void>;
9
9
  render(): Promise<void>;
10
10
  finishRendering(): void;
11
11
  get currentHeadSnapshot(): import("./head_snapshot").HeadSnapshot;
12
12
  get newHeadSnapshot(): import("./head_snapshot").HeadSnapshot;
13
13
  get newElement(): HTMLBodyElement;
14
- mergeHead(): void;
14
+ mergeHead(): Promise<void>;
15
15
  replaceBody(): void;
16
16
  get trackedElementsAreIdentical(): boolean;
17
- copyNewHeadStylesheetElements(): void;
17
+ copyNewHeadStylesheetElements(): Promise<void>;
18
18
  copyNewHeadScriptElements(): void;
19
19
  removeCurrentHeadProvisionalElements(): void;
20
20
  copyNewHeadProvisionalElements(): void;
21
21
  activateNewBody(): void;
22
22
  activateNewBodyScriptElements(): void;
23
23
  assignNewBody(): void;
24
- get newHeadStylesheetElements(): Element[];
25
- get newHeadScriptElements(): Element[];
24
+ get newHeadStylesheetElements(): HTMLLinkElement[];
25
+ get newHeadScriptElements(): HTMLScriptElement[];
26
26
  get currentHeadProvisionalElements(): Element[];
27
27
  get newHeadProvisionalElements(): Element[];
28
28
  get newBodyScriptElements(): NodeListOf<HTMLScriptElement>;
@@ -1,5 +1,5 @@
1
1
  import { Adapter } from "../native/adapter";
2
- import { FetchRequest, FetchRequestDelegate } from "../../http/fetch_request";
2
+ import { FetchRequest, FetchRequestDelegate, FetchRequestHeaders } from "../../http/fetch_request";
3
3
  import { FetchResponse } from "../../http/fetch_response";
4
4
  import { History } from "./history";
5
5
  import { Snapshot } from "../snapshot";
@@ -39,6 +39,11 @@ export declare type VisitOptions = {
39
39
  response?: VisitResponse;
40
40
  visitCachedSnapshot(snapshot: Snapshot): void;
41
41
  willRender: boolean;
42
+ updateHistory: boolean;
43
+ restorationIdentifier?: string;
44
+ shouldCacheSnapshot: boolean;
45
+ frame?: string;
46
+ acceptsStreamResponse: boolean;
42
47
  };
43
48
  export declare type VisitResponse = {
44
49
  statusCode: number;
@@ -59,6 +64,9 @@ export declare class Visit implements FetchRequestDelegate {
59
64
  readonly timingMetrics: TimingMetrics;
60
65
  readonly visitCachedSnapshot: (snapshot: Snapshot) => void;
61
66
  readonly willRender: boolean;
67
+ readonly updateHistory: boolean;
68
+ readonly promise: Promise<void>;
69
+ private resolvingFunctions;
62
70
  followedRedirect: boolean;
63
71
  frame?: number;
64
72
  historyChanged: boolean;
@@ -68,6 +76,8 @@ export declare class Visit implements FetchRequestDelegate {
68
76
  request?: FetchRequest;
69
77
  response?: VisitResponse;
70
78
  scrolled: boolean;
79
+ shouldCacheSnapshot: boolean;
80
+ acceptsStreamResponse: boolean;
71
81
  snapshotHTML?: string;
72
82
  snapshotCached: boolean;
73
83
  state: VisitState;
@@ -94,6 +104,7 @@ export declare class Visit implements FetchRequestDelegate {
94
104
  loadCachedSnapshot(): void;
95
105
  followRedirect(): void;
96
106
  goToSamePageAnchor(): void;
107
+ prepareHeadersForRequest(headers: FetchRequestHeaders, request: FetchRequest): void;
97
108
  requestStarted(): void;
98
109
  requestPreventedHandlingResponse(_request: FetchRequest, _response: FetchResponse): void;
99
110
  requestSucceededWithResponse(request: FetchRequest, response: FetchResponse): Promise<void>;
@@ -5,17 +5,20 @@ import { AppearanceObserver, AppearanceObserverDelegate } from "../../observers/
5
5
  import { FormSubmission, FormSubmissionDelegate } from "../drive/form_submission";
6
6
  import { Snapshot } from "../snapshot";
7
7
  import { ViewDelegate, ViewRenderOptions } from "../view";
8
- import { FormInterceptor, FormInterceptorDelegate } from "./form_interceptor";
8
+ import { FormSubmitObserver, FormSubmitObserverDelegate } from "../../observers/form_submit_observer";
9
9
  import { FrameView } from "./frame_view";
10
- import { LinkInterceptor, LinkInterceptorDelegate } from "./link_interceptor";
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>> {
10
+ import { LinkClickObserver, LinkClickObserverDelegate } from "../../observers/link_click_observer";
11
+ import { FormLinkClickObserver, FormLinkClickObserverDelegate } from "../../observers/form_link_click_observer";
12
+ export declare type TurboFrameMissingEvent = CustomEvent<{
13
+ fetchResponse: FetchResponse;
14
+ }>;
15
+ export declare class FrameController implements AppearanceObserverDelegate, FetchRequestDelegate, FormSubmitObserverDelegate, FormSubmissionDelegate, FrameElementDelegate, FormLinkClickObserverDelegate, LinkClickObserverDelegate, ViewDelegate<FrameElement, Snapshot<FrameElement>> {
13
16
  readonly element: FrameElement;
14
17
  readonly view: FrameView;
15
18
  readonly appearanceObserver: AppearanceObserver;
16
- readonly formLinkInterceptor: FormLinkInterceptor;
17
- readonly linkInterceptor: LinkInterceptor;
18
- readonly formInterceptor: FormInterceptor;
19
+ readonly formLinkClickObserver: FormLinkClickObserver;
20
+ readonly linkClickObserver: LinkClickObserver;
21
+ readonly formSubmitObserver: FormSubmitObserver;
19
22
  formSubmission?: FormSubmission;
20
23
  fetchResponseLoaded: (_fetchResponse: FetchResponse) => void;
21
24
  private currentFetchRequest;
@@ -23,7 +26,11 @@ export declare class FrameController implements AppearanceObserverDelegate, Fetc
23
26
  private connected;
24
27
  private hasBeenLoaded;
25
28
  private ignoredAttributes;
29
+ private action;
30
+ private frame?;
31
+ readonly restorationIdentifier: string;
26
32
  private previousFrameElement?;
33
+ private currentNavigationElement?;
27
34
  constructor(element: FrameElement);
28
35
  connect(): void;
29
36
  disconnect(): void;
@@ -34,13 +41,13 @@ export declare class FrameController implements AppearanceObserverDelegate, Fetc
34
41
  private loadSourceURL;
35
42
  loadResponse(fetchResponse: FetchResponse): Promise<void>;
36
43
  elementAppearedInViewport(_element: Element): void;
37
- shouldInterceptFormLinkClick(link: Element): boolean;
38
- formLinkClickIntercepted(link: Element, form: HTMLFormElement): void;
39
- shouldInterceptLinkClick(element: Element, _url: string): boolean;
40
- linkClickIntercepted(element: Element, url: string): void;
41
- shouldInterceptFormSubmission(element: HTMLFormElement, submitter?: HTMLElement): boolean;
42
- formSubmissionIntercepted(element: HTMLFormElement, submitter?: HTMLElement): void;
43
- prepareHeadersForRequest(headers: FetchRequestHeaders, _request: FetchRequest): void;
44
+ willSubmitFormLinkToLocation(link: Element): boolean;
45
+ submittedFormLinkToLocation(link: Element, _location: URL, form: HTMLFormElement): void;
46
+ willFollowLinkToLocation(element: Element): boolean;
47
+ followedLinkToLocation(element: Element, location: URL): void;
48
+ willSubmitForm(element: HTMLFormElement, submitter?: HTMLElement): boolean;
49
+ formSubmitted(element: HTMLFormElement, submitter?: HTMLElement): void;
50
+ prepareHeadersForRequest(headers: FetchRequestHeaders, request: FetchRequest): void;
44
51
  requestStarted(_request: FetchRequest): void;
45
52
  requestPreventedHandlingResponse(_request: FetchRequest, _response: FetchResponse): void;
46
53
  requestSucceededWithResponse(request: FetchRequest, response: FetchResponse): Promise<void>;
@@ -56,13 +63,15 @@ export declare class FrameController implements AppearanceObserverDelegate, Fetc
56
63
  viewRenderedSnapshot(_snapshot: Snapshot, _isPreview: boolean): void;
57
64
  preloadOnLoadLinksForView(element: Element): void;
58
65
  viewInvalidated(): void;
59
- frameExtracted(element: FrameElement): void;
66
+ willRenderFrame(currentElement: FrameElement, _newElement: FrameElement): void;
60
67
  visitCachedSnapshot: ({ element }: Snapshot) => void;
61
68
  private visit;
62
69
  private navigateFrame;
63
70
  private proposeVisitIfNavigatedWithAction;
71
+ changeHistory(): void;
72
+ private sessionWillHandleMissingFrame;
64
73
  private findFrameElement;
65
- extractForeignFrameElement(container: ParentNode): Promise<FrameElement>;
74
+ extractForeignFrameElement(container: ParentNode): Promise<FrameElement | null>;
66
75
  private formActionIsVisitable;
67
76
  private shouldInterceptNavigation;
68
77
  get id(): string;
@@ -77,4 +86,5 @@ export declare class FrameController implements AppearanceObserverDelegate, Fetc
77
86
  get rootLocation(): URL;
78
87
  private isIgnoringChangesTo;
79
88
  private ignoringChangesToAttribute;
89
+ private withCurrentNavigationElement;
80
90
  }
@@ -1,16 +1,18 @@
1
- import { FormInterceptor, FormInterceptorDelegate } from "./form_interceptor";
2
- import { LinkInterceptor, LinkInterceptorDelegate } from "./link_interceptor";
3
- export declare class FrameRedirector implements LinkInterceptorDelegate, FormInterceptorDelegate {
1
+ import { FormSubmitObserver, FormSubmitObserverDelegate } from "../../observers/form_submit_observer";
2
+ import { LinkClickObserver, LinkClickObserverDelegate } from "../../observers/link_click_observer";
3
+ import { Session } from "../session";
4
+ export declare class FrameRedirector implements LinkClickObserverDelegate, FormSubmitObserverDelegate {
5
+ readonly session: Session;
4
6
  readonly element: Element;
5
- readonly linkInterceptor: LinkInterceptor;
6
- readonly formInterceptor: FormInterceptor;
7
- constructor(element: Element);
7
+ readonly linkClickObserver: LinkClickObserver;
8
+ readonly formSubmitObserver: FormSubmitObserver;
9
+ constructor(session: Session, element: Element);
8
10
  start(): void;
9
11
  stop(): void;
10
- shouldInterceptLinkClick(element: Element, _url: string): boolean;
11
- linkClickIntercepted(element: Element, url: string): void;
12
- shouldInterceptFormSubmission(element: HTMLFormElement, submitter?: HTMLElement): boolean;
13
- formSubmissionIntercepted(element: HTMLFormElement, submitter?: HTMLElement): void;
12
+ willFollowLinkToLocation(element: Element): boolean;
13
+ followedLinkToLocation(element: Element, url: URL): void;
14
+ willSubmitForm(element: HTMLFormElement, submitter?: HTMLElement): boolean;
15
+ formSubmitted(element: HTMLFormElement, submitter?: HTMLElement): void;
14
16
  private shouldSubmit;
15
17
  private shouldRedirect;
16
18
  private findFrameElement;
@@ -2,7 +2,7 @@ import { FrameElement } from "../../elements/frame_element";
2
2
  import { Render, Renderer } from "../renderer";
3
3
  import { Snapshot } from "../snapshot";
4
4
  export interface FrameRendererDelegate {
5
- frameExtracted(element: FrameElement): void;
5
+ willRenderFrame(currentElement: FrameElement, newElement: FrameElement): void;
6
6
  }
7
7
  export declare class FrameRenderer extends Renderer<FrameElement> {
8
8
  private readonly delegate;
@@ -1,5 +1,5 @@
1
1
  import { Adapter } from "./native/adapter";
2
- import { Session } from "./session";
2
+ import { FormMode, Session } from "./session";
3
3
  import { Cache } from "./cache";
4
4
  import { Locatable } from "./url";
5
5
  import { StreamMessage } from "./streams/stream_message";
@@ -12,18 +12,19 @@ declare const session: Session;
12
12
  declare const cache: Cache;
13
13
  declare const navigator: import("./drive/navigator").Navigator;
14
14
  export { navigator, session, cache, PageRenderer, PageSnapshot, FrameRenderer };
15
- export { TurboBeforeCacheEvent, TurboBeforeRenderEvent, TurboBeforeVisitEvent, TurboClickEvent, TurboFrameLoadEvent, TurboFrameRenderEvent, TurboLoadEvent, TurboRenderEvent, TurboVisitEvent, } from "./session";
15
+ export { TurboBeforeCacheEvent, TurboBeforeRenderEvent, TurboBeforeVisitEvent, TurboClickEvent, TurboFetchRequestErrorEvent, TurboFrameLoadEvent, TurboFrameRenderEvent, TurboLoadEvent, TurboRenderEvent, TurboVisitEvent, } from "./session";
16
16
  export { TurboSubmitStartEvent, TurboSubmitEndEvent } from "./drive/form_submission";
17
+ export { TurboFrameMissingEvent } from "./frames/frame_controller";
17
18
  export { TurboBeforeFetchRequestEvent, TurboBeforeFetchResponseEvent } from "../http/fetch_request";
18
19
  export { TurboBeforeStreamRenderEvent } from "../elements/stream_element";
19
20
  export { StreamActions } from "./streams/stream_actions";
20
21
  export declare function start(): void;
21
22
  export declare function registerAdapter(adapter: Adapter): void;
22
- export declare function visit(location: Locatable, options?: Partial<VisitOptions>): void;
23
+ export declare function visit(location: Locatable, options?: Partial<VisitOptions>): Promise<void>;
23
24
  export declare function connectStreamSource(source: StreamSource): void;
24
25
  export declare function disconnectStreamSource(source: StreamSource): void;
25
26
  export declare function renderStreamMessage(message: StreamMessage | string): void;
26
27
  export declare function clearCache(): void;
27
28
  export declare function setProgressBarDelay(delay: number): void;
28
29
  export declare function setConfirmMethod(confirmMethod: (message: string, element: HTMLFormElement) => Promise<boolean>): void;
29
- export declare function setFormMode(mode: string): void;
30
+ export declare function setFormMode(mode: FormMode): void;
@@ -2,7 +2,7 @@ import { Visit, VisitOptions } from "../drive/visit";
2
2
  import { FormSubmission } from "../drive/form_submission";
3
3
  import { ReloadReason } from "./browser_adapter";
4
4
  export interface Adapter {
5
- visitProposedToLocation(location: URL, options?: Partial<VisitOptions>): void;
5
+ visitProposedToLocation(location: URL, options?: Partial<VisitOptions>): Promise<void>;
6
6
  visitStarted(visit: Visit): void;
7
7
  visitCompleted(visit: Visit): void;
8
8
  visitFailed(visit: Visit): void;
@@ -17,7 +17,7 @@ export declare class BrowserAdapter implements Adapter {
17
17
  formProgressBarTimeout?: number;
18
18
  location?: URL;
19
19
  constructor(session: Session);
20
- visitProposedToLocation(location: URL, options?: Partial<VisitOptions>): void;
20
+ visitProposedToLocation(location: URL, options?: Partial<VisitOptions>): Promise<void>;
21
21
  visitStarted(visit: Visit): void;
22
22
  visitRequestStarted(visit: Visit): void;
23
23
  visitRequestCompleted(visit: Visit): void;
@@ -17,7 +17,6 @@ export declare abstract class Renderer<E extends Element, S extends Snapshot<E>
17
17
  prepareToRender(): void;
18
18
  abstract render(): Promise<void>;
19
19
  finishRendering(): void;
20
- createScriptElement(element: Element): Element;
21
20
  preservingPermanentElements(callback: () => void): void;
22
21
  focusFirstAutofocusableElement(): void;
23
22
  enteringBardo(currentPermanentElement: Element): void;
@@ -26,5 +25,4 @@ export declare abstract class Renderer<E extends Element, S extends Snapshot<E>
26
25
  get currentElement(): E;
27
26
  get newElement(): E;
28
27
  get permanentElementMap(): import("./snapshot").PermanentElementMap;
29
- get cspNonce(): string | null;
30
28
  }
@@ -5,7 +5,7 @@ import { FormSubmitObserver, FormSubmitObserverDelegate } from "../observers/for
5
5
  import { FrameRedirector } from "./frames/frame_redirector";
6
6
  import { History, HistoryDelegate } from "./drive/history";
7
7
  import { LinkClickObserver, LinkClickObserverDelegate } from "../observers/link_click_observer";
8
- import { FormLinkInterceptor, FormLinkInterceptorDelegate } from "../observers/form_link_interceptor";
8
+ import { FormLinkClickObserver, FormLinkClickObserverDelegate } from "../observers/form_link_click_observer";
9
9
  import { Locatable } from "./url";
10
10
  import { Navigator, NavigatorDelegate } from "./drive/navigator";
11
11
  import { PageObserver, PageObserverDelegate } from "../observers/page_observer";
@@ -20,6 +20,8 @@ import { FrameElement } from "../elements/frame_element";
20
20
  import { FrameViewRenderOptions } from "./frames/frame_view";
21
21
  import { FetchResponse } from "../http/fetch_response";
22
22
  import { Preloader, PreloaderDelegate } from "./drive/preloader";
23
+ import { FetchRequest } from "../http/fetch_request";
24
+ export declare type FormMode = "on" | "off" | "optin";
23
25
  export declare type TimingData = unknown;
24
26
  export declare type TurboBeforeCacheEvent = CustomEvent;
25
27
  export declare type TurboBeforeRenderEvent = CustomEvent<{
@@ -36,6 +38,10 @@ export declare type TurboFrameLoadEvent = CustomEvent;
36
38
  export declare type TurboBeforeFrameRenderEvent = CustomEvent<{
37
39
  newFrame: FrameElement;
38
40
  } & FrameViewRenderOptions>;
41
+ export declare type TurboFetchRequestErrorEvent = CustomEvent<{
42
+ request: FetchRequest;
43
+ error: Error;
44
+ }>;
39
45
  export declare type TurboFrameRenderEvent = CustomEvent<{
40
46
  fetchResponse: FetchResponse;
41
47
  }>;
@@ -48,7 +54,7 @@ export declare type TurboVisitEvent = CustomEvent<{
48
54
  url: string;
49
55
  action: Action;
50
56
  }>;
51
- export declare class Session implements FormSubmitObserverDelegate, HistoryDelegate, FormLinkInterceptorDelegate, LinkClickObserverDelegate, NavigatorDelegate, PageObserverDelegate, PageViewDelegate, PreloaderDelegate {
57
+ export declare class Session implements FormSubmitObserverDelegate, HistoryDelegate, FormLinkClickObserverDelegate, LinkClickObserverDelegate, NavigatorDelegate, PageObserverDelegate, PageViewDelegate, PreloaderDelegate {
52
58
  readonly navigator: Navigator;
53
59
  readonly history: History;
54
60
  readonly preloader: Preloader;
@@ -60,34 +66,34 @@ export declare class Session implements FormSubmitObserverDelegate, HistoryDeleg
60
66
  readonly formSubmitObserver: FormSubmitObserver;
61
67
  readonly scrollObserver: ScrollObserver;
62
68
  readonly streamObserver: StreamObserver;
63
- readonly formLinkInterceptor: FormLinkInterceptor;
69
+ readonly formLinkClickObserver: FormLinkClickObserver;
64
70
  readonly frameRedirector: FrameRedirector;
65
71
  drive: boolean;
66
72
  enabled: boolean;
67
73
  progressBarDelay: number;
68
74
  started: boolean;
69
- formMode: string;
75
+ formMode: FormMode;
70
76
  start(): void;
71
77
  disable(): void;
72
78
  stop(): void;
73
79
  registerAdapter(adapter: Adapter): void;
74
- visit(location: Locatable, options?: Partial<VisitOptions>): void;
80
+ visit(location: Locatable, options?: Partial<VisitOptions>): Promise<void>;
75
81
  connectStreamSource(source: StreamSource): void;
76
82
  disconnectStreamSource(source: StreamSource): void;
77
83
  renderStreamMessage(message: StreamMessage | string): void;
78
84
  clearCache(): void;
79
85
  setProgressBarDelay(delay: number): void;
80
- setFormMode(mode: string): void;
86
+ setFormMode(mode: FormMode): void;
81
87
  get location(): URL;
82
88
  get restorationIdentifier(): string;
83
89
  historyPoppedToLocationWithRestorationIdentifier(location: URL, restorationIdentifier: string): void;
84
90
  scrollPositionChanged(position: Position): void;
85
- shouldInterceptFormLinkClick(_link: Element): boolean;
86
- formLinkClickIntercepted(_link: Element, _form: HTMLFormElement): void;
91
+ willSubmitFormLinkToLocation(link: Element, location: URL): boolean;
92
+ submittedFormLinkToLocation(): void;
87
93
  willFollowLinkToLocation(link: Element, location: URL, event: MouseEvent): boolean;
88
94
  followedLinkToLocation(link: Element, location: URL): void;
89
95
  allowsVisitingLocationWithAction(location: URL, action?: Action): boolean;
90
- visitProposedToLocation(location: URL, options: Partial<VisitOptions>): void;
96
+ visitProposedToLocation(location: URL, options: Partial<VisitOptions>): Promise<void>;
91
97
  visitStarted(visit: Visit): void;
92
98
  visitCompleted(visit: Visit): void;
93
99
  locationWithActionIsSamePage(location: URL, action?: Action): boolean;
@@ -105,6 +111,7 @@ export declare class Session implements FormSubmitObserverDelegate, HistoryDeleg
105
111
  viewInvalidated(reason: ReloadReason): void;
106
112
  frameLoaded(frame: FrameElement): void;
107
113
  frameRendered(fetchResponse: FetchResponse, frame: FrameElement): void;
114
+ frameMissing(frame: FrameElement, fetchResponse: FetchResponse): Promise<void>;
108
115
  applicationAllowsFollowingLinkToLocation(link: Element, location: URL, ev: MouseEvent): boolean;
109
116
  applicationAllowsVisitingLocation(location: URL): boolean;
110
117
  notifyApplicationAfterClickingLinkToLocation(link: Element, location: URL, event: MouseEvent): CustomEvent<{
@@ -132,8 +139,8 @@ export declare class Session implements FormSubmitObserverDelegate, HistoryDeleg
132
139
  notifyApplicationAfterFrameRender(fetchResponse: FetchResponse, frame: FrameElement): CustomEvent<{
133
140
  fetchResponse: FetchResponse;
134
141
  }>;
135
- formElementDriveEnabled(element?: Element): boolean;
136
- elementDriveEnabled(element?: Element): boolean;
142
+ submissionIsNavigatable(form: HTMLFormElement, submitter?: HTMLElement): boolean;
143
+ elementIsNavigatable(element: Element): boolean;
137
144
  getActionForLink(link: Element): Action;
138
145
  get snapshot(): PageSnapshot;
139
146
  }
@@ -1,10 +1,6 @@
1
- import { StreamElement } from "../../elements/stream_element";
2
1
  export declare class StreamMessage {
3
2
  static readonly contentType = "text/vnd.turbo-stream.html";
4
- readonly templateElement: HTMLTemplateElement;
3
+ readonly fragment: DocumentFragment;
5
4
  static wrap(message: StreamMessage | string): StreamMessage;
6
- constructor(html: string);
7
- get fragment(): DocumentFragment;
8
- get foreignElements(): StreamElement[];
9
- get templateChildren(): Element[];
5
+ constructor(fragment: DocumentFragment);
10
6
  }
@@ -8,3 +8,7 @@ export declare type StreamSource = {
8
8
  addEventListener(type: "message", listener: (event: MessageEvent) => void, options?: boolean | AddEventListenerOptions): void;
9
9
  removeEventListener(type: "message", listener: (event: MessageEvent) => void, options?: boolean | EventListenerOptions): void;
10
10
  };
11
+ export declare type ResolvingFunctions<T = unknown> = {
12
+ resolve(value: T | PromiseLike<T>): void;
13
+ reject(reason?: any): void;
14
+ };
@@ -32,7 +32,7 @@ export declare abstract class View<E extends Element, S extends Snapshot<E> = Sn
32
32
  };
33
33
  render(renderer: R): Promise<void>;
34
34
  invalidate(reason: ReloadReason): void;
35
- prepareToRenderSnapshot(renderer: R): void;
35
+ prepareToRenderSnapshot(renderer: R): Promise<void>;
36
36
  markAsPreview(isPreview: boolean): void;
37
37
  renderSnapshot(renderer: R): Promise<void>;
38
38
  finishRenderingSnapshot(renderer: R): void;
@@ -1,19 +1,19 @@
1
1
  import { FetchResponse } from "../http/fetch_response";
2
2
  import { Snapshot } from "../core/snapshot";
3
+ import { LinkClickObserverDelegate } from "../observers/link_click_observer";
4
+ import { FormSubmitObserverDelegate } from "../observers/form_submit_observer";
3
5
  export declare enum FrameLoadingStyle {
4
6
  eager = "eager",
5
7
  lazy = "lazy"
6
8
  }
7
9
  export declare type FrameElementObservedAttribute = keyof FrameElement & ("disabled" | "complete" | "loading" | "src");
8
- export interface FrameElementDelegate {
10
+ export interface FrameElementDelegate extends LinkClickObserverDelegate, FormSubmitObserverDelegate {
9
11
  connect(): void;
10
12
  disconnect(): void;
11
13
  completeChanged(): void;
12
14
  loadingStyleChanged(): void;
13
15
  sourceURLChanged(): void;
14
16
  disabledChanged(): void;
15
- formSubmissionIntercepted(element: HTMLFormElement, submitter?: HTMLElement): void;
16
- linkClickIntercepted(element: Element, url: string): void;
17
17
  loadResponse(response: FetchResponse): void;
18
18
  fetchResponseLoaded: (fetchResponse: FetchResponse) => void;
19
19
  visitCachedSnapshot: (snapshot: Snapshot) => void;
@@ -21,13 +21,13 @@ export interface FrameElementDelegate {
21
21
  }
22
22
  export declare class FrameElement extends HTMLElement {
23
23
  static delegateConstructor: new (element: FrameElement) => FrameElementDelegate;
24
- loaded: Promise<FetchResponse | void>;
24
+ loaded: Promise<void>;
25
25
  readonly delegate: FrameElementDelegate;
26
26
  static get observedAttributes(): FrameElementObservedAttribute[];
27
27
  constructor();
28
28
  connectedCallback(): void;
29
29
  disconnectedCallback(): void;
30
- reload(): void;
30
+ reload(): Promise<void>;
31
31
  attributeChangedCallback(name: string): void;
32
32
  get src(): string | null;
33
33
  set src(value: string | null);
@@ -1,4 +1,6 @@
1
- export declare type TurboBeforeStreamRenderEvent = CustomEvent;
1
+ export declare type TurboBeforeStreamRenderEvent = CustomEvent<{
2
+ newStream: StreamElement;
3
+ }>;
2
4
  export declare class StreamElement extends HTMLElement {
3
5
  connectedCallback(): Promise<void>;
4
6
  private renderPromise?;
@@ -57,5 +57,6 @@ export declare class FetchRequest {
57
57
  };
58
58
  get isIdempotent(): boolean;
59
59
  get abortSignal(): AbortSignal;
60
+ acceptResponseType(mimeType: string): void;
60
61
  private allowRequestToBeIntercepted;
61
62
  }
@@ -0,0 +1,14 @@
1
+ import { LinkClickObserver, LinkClickObserverDelegate } from "./link_click_observer";
2
+ export declare type FormLinkClickObserverDelegate = {
3
+ willSubmitFormLinkToLocation(link: Element, location: URL, event: MouseEvent): boolean;
4
+ submittedFormLinkToLocation(link: Element, location: URL, form: HTMLFormElement): void;
5
+ };
6
+ export declare class FormLinkClickObserver implements LinkClickObserverDelegate {
7
+ readonly linkClickObserver: LinkClickObserver;
8
+ readonly delegate: FormLinkClickObserverDelegate;
9
+ constructor(delegate: FormLinkClickObserverDelegate, element: HTMLElement);
10
+ start(): void;
11
+ stop(): void;
12
+ willFollowLinkToLocation(link: Element, location: URL, originalEvent: MouseEvent): boolean;
13
+ followedLinkToLocation(link: Element, location: URL): void;
14
+ }
@@ -4,8 +4,9 @@ export interface FormSubmitObserverDelegate {
4
4
  }
5
5
  export declare class FormSubmitObserver {
6
6
  readonly delegate: FormSubmitObserverDelegate;
7
+ readonly eventTarget: EventTarget;
7
8
  started: boolean;
8
- constructor(delegate: FormSubmitObserverDelegate);
9
+ constructor(delegate: FormSubmitObserverDelegate, eventTarget: EventTarget);
9
10
  start(): void;
10
11
  stop(): void;
11
12
  submitCaptured: () => void;
@@ -4,12 +4,13 @@ export interface LinkClickObserverDelegate {
4
4
  }
5
5
  export declare class LinkClickObserver {
6
6
  readonly delegate: LinkClickObserverDelegate;
7
+ readonly eventTarget: EventTarget;
7
8
  started: boolean;
8
- constructor(delegate: LinkClickObserverDelegate);
9
+ constructor(delegate: LinkClickObserverDelegate, eventTarget: EventTarget);
9
10
  start(): void;
10
11
  stop(): void;
11
12
  clickCaptured: () => void;
12
- clickBubbled: (event: MouseEvent) => void;
13
+ clickBubbled: (event: Event) => void;
13
14
  clickEventIsSignificant(event: MouseEvent): boolean;
14
15
  findLinkFromClickTarget(target: EventTarget | null): HTMLAnchorElement | null | undefined;
15
16
  getLocationForLink(link: Element): URL;
@@ -0,0 +1 @@
1
+ export {};
@@ -9,7 +9,7 @@ export declare class DeprecatedAdapterSupportTest extends DOMTestCase implements
9
9
  teardown(): Promise<void>;
10
10
  "test visit proposal location includes deprecated absoluteURL property"(): Promise<void>;
11
11
  "test visit start location includes deprecated absoluteURL property"(): Promise<void>;
12
- visitProposedToLocation(location: URL, _options?: Partial<VisitOptions>): void;
12
+ visitProposedToLocation(location: URL, _options?: Partial<VisitOptions>): Promise<void>;
13
13
  visitStarted(visit: Visit): void;
14
14
  visitCompleted(_visit: Visit): void;
15
15
  visitFailed(_visit: Visit): void;
@@ -1,8 +1,11 @@
1
+ import { Action } from "./core/types";
1
2
  export declare type DispatchOptions<T extends CustomEvent> = {
2
3
  target: EventTarget;
3
4
  cancelable: boolean;
4
5
  detail: T["detail"];
5
6
  };
7
+ export declare function activateScriptElement(element: HTMLScriptElement): HTMLScriptElement;
8
+ export declare function createDocumentFragment(html: string): DocumentFragment;
6
9
  export declare function dispatch<T extends CustomEvent>(eventName: string, { target, cancelable, detail }?: Partial<DispatchOptions<T>>): CustomEvent<T["detail"]>;
7
10
  export declare function nextAnimationFrame(): Promise<void>;
8
11
  export declare function nextEventLoopTick(): Promise<void>;
@@ -13,6 +16,9 @@ export declare function uuid(): string;
13
16
  export declare function getAttribute(attributeName: string, ...elements: (Element | undefined)[]): string | null;
14
17
  export declare function markAsBusy(...elements: Element[]): void;
15
18
  export declare function clearBusyState(...elements: Element[]): void;
19
+ export declare function waitForLoad(element: HTMLLinkElement, timeoutInMilliseconds?: number): Promise<void>;
20
+ export declare function getHistoryMethodForAction(action: Action): (data: any, unused: string, url?: string | URL | null | undefined) => void;
21
+ export declare function getVisitAction(...elements: (Element | undefined)[]): Action | null;
16
22
  export declare function getMetaElement(name: string): HTMLMetaElement | null;
17
23
  export declare function getMetaContent(name: string): string | null;
18
24
  export declare function setMetaContent(name: string, content: string): HTMLMetaElement;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@hotwired/turbo",
3
- "version": "7.2.0-beta.1",
3
+ "version": "7.2.0-beta.2",
4
4
  "description": "The speed of a single-page web application without having to write any JavaScript",
5
5
  "module": "dist/turbo.es2017-esm.js",
6
6
  "main": "dist/turbo.es2017-umd.js",
@@ -1,12 +0,0 @@
1
- export interface FormInterceptorDelegate {
2
- shouldInterceptFormSubmission(element: HTMLFormElement, submitter?: HTMLElement): boolean;
3
- formSubmissionIntercepted(element: HTMLFormElement, submitter?: HTMLElement): void;
4
- }
5
- export declare class FormInterceptor {
6
- readonly delegate: FormInterceptorDelegate;
7
- readonly element: Element;
8
- constructor(delegate: FormInterceptorDelegate, element: Element);
9
- start(): void;
10
- stop(): void;
11
- submitBubbled: EventListener;
12
- }
@@ -1,16 +0,0 @@
1
- export interface LinkInterceptorDelegate {
2
- shouldInterceptLinkClick(element: Element, url: string): boolean;
3
- linkClickIntercepted(element: Element, url: string): void;
4
- }
5
- export declare class LinkInterceptor {
6
- readonly delegate: LinkInterceptorDelegate;
7
- readonly element: Element;
8
- private clickEvent?;
9
- constructor(delegate: LinkInterceptorDelegate, element: Element);
10
- start(): void;
11
- stop(): void;
12
- clickBubbled: (event: Event) => void;
13
- linkClicked: EventListener;
14
- willVisit: EventListener;
15
- respondsToEventTarget(target: EventTarget | null): boolean | null;
16
- }