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
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