From 16a5788aad75ebe898171b18f3670141d7cc6b5d Mon Sep 17 00:00:00 2001 From: Alexander Brandon Coles Date: Sat, 11 Jul 2026 21:01:23 +0100 Subject: [PATCH] =?UTF-8?q?=F0=9F=A4=96=20Merge=20PR=20#75215=20[hotwired?= =?UTF-8?q?=5F=5Fturbo]=20Demote=20phantom=20exports=20to=20types=20by=20@?= =?UTF-8?q?myabc?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../hotwired__turbo/hotwired__turbo-tests.ts | 15 ++++++---- types/hotwired__turbo/index.d.ts | 30 +++++++++---------- 2 files changed, 25 insertions(+), 20 deletions(-) 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;