diff --git a/.changeset/olive-apes-clap.md b/.changeset/olive-apes-clap.md new file mode 100644 index 000000000..27315cfb1 --- /dev/null +++ b/.changeset/olive-apes-clap.md @@ -0,0 +1,5 @@ +--- +"@solidjs/start": patch +--- + +Fix TS2883/TS2742 when emitting declarations for `entry-server.tsx`. `createHandler` now returns `StartHandler`, a type owned by `@solidjs/start`, instead of h3's `H3`, so the inferred type of `export default createHandler(...)` no longer has to be named through a nested `node_modules/@solidjs/start/node_modules/h3` path. diff --git a/packages/start/src/server/handler.ts b/packages/start/src/server/handler.ts index c1fea4b4c..aee2d41b4 100644 --- a/packages/start/src/server/handler.ts +++ b/packages/start/src/server/handler.ts @@ -10,7 +10,7 @@ import { decorateHandler, decorateMiddleware } from "./fetchEvent.ts"; import { getSsrManifest } from "./manifest/ssr-manifest.ts"; import { matchAPIRoute } from "./routes.ts"; import { handleServerFunction } from "../fns/handler.ts"; -import type { APIEvent, FetchEvent, HandlerOptions, PageEvent } from "./types.ts"; +import type { APIEvent, FetchEvent, HandlerOptions, PageEvent, StartHandler } from "./types.ts"; import { getExpectedRedirectStatus } from "./util.ts"; import { toWebReadableStream } from "./web-stream.ts"; import { stripPathBase } from "./strip-path-base.ts"; @@ -22,7 +22,7 @@ export function createBaseHandler( fn: (context: PageEvent) => JSX.Element, options: HandlerOptions | ((context: PageEvent) => HandlerOptions | Promise) = {}, routerLoad?: (event: FetchEvent) => Promise, -): H3 { +): StartHandler { const handler = defineHandler({ middleware: middleware.length ? middleware.map(decorateMiddleware) : undefined, handler: decorateHandler(async (e: H3Event) => { @@ -138,7 +138,7 @@ export function createHandler( fn: (context: PageEvent) => JSX.Element, options: HandlerOptions | ((context: PageEvent) => HandlerOptions | Promise) = {}, routerLoad?: (event: FetchEvent) => Promise, -): H3 { +): StartHandler { return createBaseHandler(createPageEvent, fn, options, routerLoad); } diff --git a/packages/start/src/server/index.tsx b/packages/start/src/server/index.tsx index 8b2abc3ad..f7b1be5e3 100644 --- a/packages/start/src/server/index.tsx +++ b/packages/start/src/server/index.tsx @@ -15,6 +15,7 @@ export type { PageEvent, ResponseStub, ServerFunctionMeta, + StartHandler, } from "./types.ts"; /** diff --git a/packages/start/src/server/spa/handler.ts b/packages/start/src/server/spa/handler.ts index 855f02c5f..6cc10f172 100644 --- a/packages/start/src/server/spa/handler.ts +++ b/packages/start/src/server/spa/handler.ts @@ -1,9 +1,8 @@ -import type { H3 } from "h3/generic"; import type { JSX } from "solid-js"; import { createBaseHandler } from "../handler.ts"; import { getSsrManifest } from "../manifest/ssr-manifest.ts"; -import type { FetchEvent, HandlerOptions, PageEvent } from "../types.ts"; +import type { FetchEvent, HandlerOptions, PageEvent, StartHandler } from "../types.ts"; /** * @@ -13,7 +12,7 @@ export function createHandler( fn: (context: PageEvent) => JSX.Element, options?: HandlerOptions | ((context: PageEvent) => HandlerOptions), routerLoad?: (event: FetchEvent) => Promise, -): H3 { +): StartHandler { return createBaseHandler(createPageEvent, fn, options, routerLoad); } diff --git a/packages/start/src/server/types.ts b/packages/start/src/server/types.ts index 1d57a38ac..967125d43 100644 --- a/packages/start/src/server/types.ts +++ b/packages/start/src/server/types.ts @@ -1,9 +1,20 @@ -import type { H3Event } from "h3"; +import type { H3, H3Event } from "h3"; import type { JSX } from "solid-js"; import type { RequestEvent } from "solid-js/web"; // export const FETCH_EVENT = "$FETCH"; +/** + * The h3 app instance returned by `createHandler`. + * + * Structurally identical to h3's `H3`, but declared here so that `export default + * createHandler(...)` in `entry-server.tsx` can be named through `@solidjs/start`. + * Referring to `H3` directly makes TypeScript emit a reference to h3's internal + * `H3$1` class, which is not portable when h3 is nested inside + * `node_modules/@solidjs/start/node_modules` (TS2742 / TS2883). + */ +export interface StartHandler extends H3 {} + export type DocumentComponentProps = { assets?: JSX.Element; scripts: JSX.Element;