Prompt
Ensure API design follows consistent patterns for naming, typing, and composition to improve developer experience and maintainability.
Key principles:
-
Use fully qualified names in deprecation messages - Include the full path like
MetaArgs.loaderDatainstead of justloaderDatato provide clear migration guidance. -
Prefer type-only imports for types - Use
import type { ServerBuild }instead ofimport { ServerBuild }when importing only for type annotations. - Use consistent generic parameter naming - Prefer descriptive names like
Contextover abbreviated forms likeCfor better readability:export interface LoaderFunction<Context = any> { (args: LoaderFunctionArgs<Context>): Promise<DataFunctionValue> | DataFunctionValue; } - Choose appropriate type definitions - Use
export typefor simple function signatures instead of interfaces when no extension is needed:export type HeadersFunction = (args: HeadersArgs) => Headers | HeadersInit; - Build composable APIs - Design new functions to leverage existing ones rather than duplicating logic:
export const redirectWithReload: RedirectFunction = (url, init) => { let response = redirect(url, init); response.headers.set("X-Remix-Reload-Document", "true"); return response; }; - Preserve request context appropriately - When creating new request objects, copy relevant properties from the original rather than creating minimal requests:
let loaderRequest = new Request(request.url, { body: null, headers: request.headers, method: request.method, redirect: request.redirect, signal: request.signal, });
These patterns improve API discoverability, reduce confusion during migrations, and create more predictable interfaces for developers.