Skip to content

fix(types): add StartHandler type that extends H3 - #2234

Merged
birkskyum merged 2 commits into
mainfrom
entry-server-fix
Jul 25, 2026
Merged

fix(types): add StartHandler type that extends H3#2234
birkskyum merged 2 commits into
mainfrom
entry-server-fix

Conversation

@birkskyum

@birkskyum birkskyum commented Jul 25, 2026

Copy link
Copy Markdown
Member

This is a types-only change. We have problems when using H3 types, which we do a few places as return types, and that happens in both hoisted and nested cases. If not familiar with hoisted/nested installs, see bottom of this PR.

createHandler returns h3's H3, which is declare const H3: { new(): H3$1 } plus type H3 = H3$1. The class H3$1 is exported only from h3's internal dist/h3.d.mts, never from h3 or h3/generic, so TypeScript cannot route the reference through the package and points at the internal file instead. When h3 also sits nested under node_modules/@solidjs/start/node_modules, that path is not portable and emit fails.

This PR

Implements so createHandler (both server and server/spa) returns StartHandler, an interface declared by @solidjs/start that extends h3's H3, so it tracks h3 automatically and stays structurally interchangeable with it. Emit becomes:

declare const _default: import("@solidjs/start/server").StartHandler;

Tried to fix this in H3 itself (two middle rows), but only manage to resolve the hoisted cases, so it seems most feasible to solve this on the Start side of things to have it work in both cases.

h3 .d.ts shape h3 hoisted h3 nested
current fails fails
real class H3 exported from entry ok fails
entry re-exports H3$1 ok fails
type declared by @solidjs/start ok ok

Hoisted/Nested

Hoisted means one copy of h3 at the top of the tree, reachable from the app:

node_modules/
  @solidjs/start/
  h3/            <- app can resolve "h3"

Nested means solid-start has its own private copy:

node_modules/
  @solidjs/start/
    node_modules/
      h3/        <- solid-start's copy
  h3/            <- a different version, or nothing here at all

@changeset-bot

changeset-bot Bot commented Jul 25, 2026

Copy link
Copy Markdown

🦋 Changeset detected

Latest commit: 2c99bcb

The changes in this PR will be included in the next version bump.

This PR includes changesets to release 1 package
Name Type
@solidjs/start Patch

Not sure what this means? Click here to learn what changesets are.

Click here if you're a maintainer who wants to add another changeset to this PR

@netlify

netlify Bot commented Jul 25, 2026

Copy link
Copy Markdown

Deploy Preview for solid-start-landing-page ready!

Name Link
🔨 Latest commit 2c99bcb
🔍 Latest deploy log https://app.netlify.com/projects/solid-start-landing-page/deploys/6a64fdebe510f10008fcba72
😎 Deploy Preview https://deploy-preview-2234--solid-start-landing-page.netlify.app
📱 Preview on mobile
Toggle QR Code...

QR Code

Use your smartphone camera to open QR code link.
🤖 Make changes Run an agent on this branch

To edit notification comments on pull requests, go to your Netlify project configuration.

@pkg-pr-new

pkg-pr-new Bot commented Jul 25, 2026

Copy link
Copy Markdown

Open in StackBlitz

npm i https://pkg.pr.new/@solidjs/start@2234

commit: 2c99bcb

@birkskyum
birkskyum requested review from brenelz and katywings July 25, 2026 10:20
@birkskyum
birkskyum merged commit e26cef0 into main Jul 25, 2026
10 checks passed
@birkskyum
birkskyum deleted the entry-server-fix branch July 25, 2026 18:20
brenelz added a commit that referenced this pull request Jul 29, 2026
Brings the v2 rc line (through 2.0.0-rc.6) into the Solid 2 branch.

Ported main features onto the Solid 2 architecture:
- Server-function error handler (#2262): wired through
  handleServerFunctionRequest's transformResult hook and the
  solid-start:server-fn-error-handler virtual module.
- Custom seroval plugins (#2250): serialization.plugins now feeds the
  @solidjs/web codec on both the client transport and the server handler.
- ~ alias fix for workspace packages (#2239): adopted appRootAlias in
  place of the global resolve.alias entry.
- Dev toolbar (#2049, replaces the dev overlay): ported to Solid 2
  (Errored/Loading, onSettled, two-arg createEffect, draft-mutation
  stores, terracotta 2 subpath imports, @solidjs/web Portal/Dynamic/JSX,
  createMemo(async) instead of createResource). Protocol-specific pieces
  (SerovalChunkReader, body-format markers) moved local to the toolbar.
- Deferred stream response via h3 iterable() (#2231), StartHandler type
  (#2234), routerLoad restore (#2228), nonce on streaming redirect
  script (#2252), ResizeObserver-loop filter (#2240) all kept.

Kept deleted (superseded by vite-plugin-solid / @solidjs/web /
@solidjs/router server-function integration): fs-routes tree-shake,
manifest.ts, directives, fns serialization/registration/shared and their
specs. Fixes main landed in those files (#2249, #2238, #2243, #2245,
#2241, #2261) live upstream now and are tracked for porting there.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[Bug?]: [v2] entry-server typescript issue

2 participants