diff --git a/types/hotwired__turbo/hotwired__turbo-tests.ts b/types/hotwired__turbo/hotwired__turbo-tests.ts
index e034450042b191..8a8d1fcae3c844 100644
--- a/types/hotwired__turbo/hotwired__turbo-tests.ts
+++ b/types/hotwired__turbo/hotwired__turbo-tests.ts
@@ -226,7 +226,12 @@ navigator.delegate;
navigator.delegate.adapter;
// Test ProgressBar via BrowserAdapter cast
+// BrowserAdapter is not a runtime export of @hotwired/turbo, only a type
+// @ts-expect-error
+new BrowserAdapter();
const browserAdapter = navigator.delegate.adapter as BrowserAdapter;
+const browserAdapterAsAdapter: Adapter = browserAdapter;
+browserAdapterAsAdapter.visitStarted;
// $ExpectType ProgressBar
browserAdapter.progressBar;
browserAdapter.progressBar.setValue(0);
@@ -320,16 +325,16 @@ disconnectStreamSource(webSocket);
// @ts-expect-error
connectStreamSource({});
-const streamMessage = new StreamMessage(document.createDocumentFragment());
+const streamMessage: StreamMessage = { fragment: document.createDocumentFragment() };
renderStreamMessage("");
renderStreamMessage(streamMessage);
Turbo.renderStreamMessage("");
Turbo.renderStreamMessage(streamMessage);
-// $ExpectType "text/vnd.turbo-stream.html"
-StreamMessage.contentType;
-
-// $ExpectType StreamMessage
+// StreamMessage is not a runtime export of @hotwired/turbo, only a type
+// @ts-expect-error
+new StreamMessage(document.createDocumentFragment());
+// @ts-expect-error
StreamMessage.wrap("");
// Test TurboHistory via session.history
diff --git a/types/hotwired__turbo/index.d.ts b/types/hotwired__turbo/index.d.ts
index c3d2463e3c7e95..79c3188206615f 100644
--- a/types/hotwired__turbo/index.d.ts
+++ b/types/hotwired__turbo/index.d.ts
@@ -79,11 +79,15 @@ export interface StreamSource {
): void;
}
-export class StreamMessage {
- static readonly contentType: "text/vnd.turbo-stream.html";
+/**
+ * A stream message, as accepted by {@link renderStreamMessage}.
+ *
+ * Note that Turbo does not export the `StreamMessage` class at runtime, so
+ * this interface only describes instances (there is no constructor and no
+ * access to the static `wrap` method or `contentType` property).
+ */
+export interface StreamMessage {
readonly fragment: DocumentFragment;
- static wrap(message: StreamMessage | string): StreamMessage;
- constructor(fragment: DocumentFragment);
}
export interface FetchRequestHeaders {
@@ -141,18 +145,14 @@ export interface Adapter {
linkPrefetchingIsEnabledForLocation?(location: URL): boolean;
}
-export class BrowserAdapter implements Adapter {
+/**
+ * The default adapter installed on the session.
+ *
+ * Note that Turbo does not export the `BrowserAdapter` class at runtime —
+ * obtain the instance via `session.adapter` or `navigator.delegate.adapter`.
+ */
+export interface BrowserAdapter extends Adapter {
progressBar: ProgressBar;
- visitProposedToLocation(location: URL, options?: VisitOptions): void;
- visitStarted(visit: Visit): void;
- visitCompleted(visit: Visit): void;
- visitFailed(visit: Visit): void;
- visitRequestStarted(visit: Visit): void;
- visitRequestCompleted(visit: Visit): void;
- visitRequestFailedWithStatusCode(visit: Visit, statusCode: number): void;
- visitRequestFinished(visit: Visit): void;
- visitRendered(visit: Visit): void;
- pageInvalidated(reason: { reason: string }): void;
formSubmissionStarted(formSubmission: FormSubmission): void;
formSubmissionFinished(formSubmission: FormSubmission): void;
linkPrefetchingIsEnabledForLocation(location: URL): boolean;