Skip to content

feat: custom seroval plugins via serialization.plugins - #2250

Merged
birkskyum merged 2 commits into
mainfrom
seroval-custom-plugins
Jul 26, 2026
Merged

feat: custom seroval plugins via serialization.plugins#2250
birkskyum merged 2 commits into
mainfrom
seroval-custom-plugins

Conversation

@birkskyum

Copy link
Copy Markdown
Member

Values seroval has no built-in support for (Mongo ObjectId, Prisma Decimal, Temporal, custom classes) threw SerovalUnsupportedTypeError when crossing a server function boundary, with no way to register a plugin. Seroval has supported createPlugin since v1; SolidStart just hardcoded its plugin list.

// vite.config.ts
solidStart({
  serialization: { plugins: "src/seroval-plugins.ts" },
});

// src/seroval-plugins.ts
import { createPlugin } from "@solidjs/start/serialization";
export default [MyPlugin];

The path resolves through a new solid-start:seroval-plugins virtual module, wired like solid-start:middleware. One module feeds both fns/client.ts and fns/handler.ts, so client and server can't drift out of sync. Built-in plugins keep precedence (seroval takes the first passing test(), user plugins are appended).

Also adds a @solidjs/start/serialization entrypoint re-exporting createPlugin, OpaqueReference, and plugin types. Without it users need their own seroval dep, and a version mismatch wouldn't fail the build, it would emit plugin nodes the other end can't interpret.

Two limits, both documented on the option:

  • Only server function and action payloads. The SSR hydration payload is serialized by solid-js/web and is unaffected.
  • Under mode: "js" the payload is eval'd on the client, so a plugin's serialize may reference globals only, not the plugin module's imports. deserialize (mode: "json", the default) has no such limit.

Verified: 6 new unit tests, 1 new e2e round-tripping a custom class in both directions, and a manual browser check under both serialization modes. Full suites green (67 unit, 31 e2e, 31 bundled-dev).

@changeset-bot

changeset-bot Bot commented Jul 26, 2026

Copy link
Copy Markdown

🦋 Changeset detected

Latest commit: a6eb444

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 Minor

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 26, 2026

Copy link
Copy Markdown

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

Name Link
🔨 Latest commit a6eb444
🔍 Latest deploy log https://app.netlify.com/projects/solid-start-landing-page/deploys/6a664a11a3a89700085f0239
😎 Deploy Preview https://deploy-preview-2250--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 26, 2026

Copy link
Copy Markdown

Open in StackBlitz

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

commit: a6eb444

@birkskyum
birkskyum requested a review from lxsmnsyc July 26, 2026 14:54
@birkskyum birkskyum added the Start 2.x targeting SolidStart 2.x versions label Jul 26, 2026

@lxsmnsyc lxsmnsyc left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

lgtm

@birkskyum
birkskyum merged commit 4c803e5 into main Jul 26, 2026
11 checks passed
@birkskyum
birkskyum deleted the seroval-custom-plugins branch July 26, 2026 17:57
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

Start 2.x targeting SolidStart 2.x versions

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[Feature?]: Custom Seroval plugins

2 participants