Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion types/bun/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
"https://bun.com"
],
"dependencies": {
"bun-types": "1.3.9"
"bun-types": "1.3.10"
},
"devDependencies": {
"@types/bun": "workspace:."
Expand Down
51 changes: 46 additions & 5 deletions types/hotwired__turbo/hotwired__turbo-tests.ts
Original file line number Diff line number Diff line change
@@ -1,16 +1,23 @@
import {
Adapter,
BrowserAdapter,
cache,
config,
connectStreamSource,
disconnectStreamSource,
navigator,
NavigatorDelegate,
ProgressBar,
registerAdapter,
renderStreamMessage,
session,
start,
StreamActions,
StreamMessage,
StreamSource,
Visit,
visit,
VisitOptions,
} from "@hotwired/turbo";

const turboFrame = document.querySelector("turbo-frame")!;
Expand Down Expand Up @@ -145,15 +152,29 @@ document.addEventListener("turbo:submit-end", function(event) {

// Test start() function
start();

const customAdapter: Adapter = {
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 {},
};
registerAdapter(customAdapter);
Turbo.registerAdapter(customAdapter);

Turbo.start();

// Test session.adapter
// $ExpectType BrowserAdapter
// $ExpectType Adapter
session.adapter;
session.adapter.formSubmissionStarted();
session.adapter.formSubmissionFinished();
Turbo.session.adapter.formSubmissionStarted();
Turbo.session.adapter.formSubmissionFinished();
// $ExpectType Adapter
Turbo.session.adapter;

// Test navigator.submitForm
const form = document.querySelector("form")!;
Expand All @@ -162,6 +183,26 @@ navigator.submitForm(form, document.querySelector("button")!);
Turbo.navigator.submitForm(form);
Turbo.navigator.submitForm(form, document.querySelector("button")!);

// Test navigator.delegate
// $ExpectType NavigatorDelegate
navigator.delegate;
// $ExpectType Adapter
navigator.delegate.adapter;

// Test ProgressBar via BrowserAdapter cast
const browserAdapter = navigator.delegate.adapter as BrowserAdapter;
// $ExpectType ProgressBar
browserAdapter.progressBar;
browserAdapter.progressBar.setValue(0);
browserAdapter.progressBar.show();
browserAdapter.progressBar.hide();
// $ExpectType number
browserAdapter.progressBar.value;
// $ExpectType boolean
browserAdapter.progressBar.visible;
// $ExpectType boolean
browserAdapter.progressBar.hiding;

// Test cache methods
cache.clear();
cache.resetCacheControl();
Expand Down
65 changes: 58 additions & 7 deletions types/hotwired__turbo/index.d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -109,20 +109,71 @@ export class FetchResponse {
succeeded: boolean;
}

export interface Visit {
readonly action: Action;
readonly location: URL;
hasCachedSnapshot(): boolean;
complete(): void;
cancel(): void;
}

export interface Adapter {
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;
}

export class BrowserAdapter implements 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;
}

export interface ProgressBar {
hiding: boolean;
value: number;
visible: boolean;
show(): void;
hide(): void;
setValue(value: number): void;
}

/**
* Interface for accessing the browser adapter.
* The adapter handles form submission lifecycle events.
* The delegate for the Turbo navigator — in practice, the active session.
* Provides access to the current adapter.
*/
export interface BrowserAdapter {
formSubmissionStarted(formSubmission?: FormSubmission): void;
formSubmissionFinished(formSubmission?: FormSubmission): void;
export interface NavigatorDelegate {
adapter: Adapter;
}

/**
* Interface for the Turbo navigator.
* Provides methods for programmatic navigation and form submission.
*/
export interface Navigator {
/** The delegate for this navigator (the active Turbo session). */
delegate: NavigatorDelegate;
/**
* Submits a form programmatically through Turbo Drive.
*
Expand Down Expand Up @@ -231,7 +282,7 @@ export interface TurboSession {
disconnectStreamSource(source: StreamSource): void;
renderStreamMessage(message: StreamMessage | string): void;
drive: boolean;
adapter: BrowserAdapter;
adapter: Adapter;
}

export const StreamActions: {
Expand All @@ -256,7 +307,7 @@ export function start(): void;
*
* @param adapter Adapter to register
*/
export function registerAdapter(adapter: unknown): void;
export function registerAdapter(adapter: Adapter): void;

/**
* Sets the form mode for Turbo Drive.
Expand Down