Skip to content

[v2] solid-form 2.0.0-alpha.1 cannot be imported under Solid 2, but its peer range permits it #2342

Description

@mathijsvdberg

Describe the bug

Summary

@tanstack/solid-form@2.0.0-alpha.1 declares peerDependencies: { "solid-js": ">=1.9.5" }.
That range has no upper bound, so it resolves happily against solid-js@2.0.0-rc.0
but the package cannot even be imported under Solid 2.

The sibling Solid packages have already landed Solid 2 builds and bound their ranges:

@tanstack/solid-router  2.0.0-rc.0     solid-js: >=2.0.0-0 <3.0.0
@tanstack/solid-start   2.0.0-rc.0     solid-js: >=2.0.0-0 <3.0.0
@tanstack/solid-query   6.0.0-rc.0     solid-js: >=2.0.0-rc.0 <3.0.0
@tanstack/solid-form    2.0.0-alpha.1  solid-js: >=1.9.5          <-- unbounded
@tanstack/solid-store   0.11.1         solid-js: ^1.6.0

solid-form is the last package blocking an otherwise complete Solid 2 upgrade
for us — router, start and query all work unmodified.

Reproduction

bun add solid-js@2.0.0-rc.0 @tanstack/solid-form@2.0.0-alpha.1
echo "import '@tanstack/solid-form'" > probe.ts
bun probe.ts

Result:

error: Cannot find module 'solid-js/web' from
  node_modules/@tanstack/solid-store/dist/createStoreContext.js

Solid 2 removed the solid-js/web subpath (the DOM runtime moved to
@solidjs/web), and @tanstack/solid-store@0.11.1 — pulled in as a direct
dependency of solid-form — still imports from it. So the failure is at module
resolution, before any component renders.

On the peer warnings

The install does emit four incorrect peer dependency "solid-js@2.0.0-rc.0"
warnings, but none of them come from solid-form itself, whose >=1.9.5 is
satisfied. They come from:

@tanstack/solid-store@0.11.1   peer: ^1.6.0
vite-plugin-solid@2.11.14      peer: ^1.7.2
babel-preset-solid@1.9.12      peer: ^1.9.12
solid-refresh@0.6.3            peer: ^1.3

So the warnings point at the toolchain rather than at the package that is
actually incompatible, which makes the cause harder to find than it needs to be.

Possibly unintended: vite-plugin-solid is a runtime dependency

"dependencies": {
  "@tanstack/solid-store": "^0.11.1",
  "vite-plugin-solid": "^2.11.10",
  "@tanstack/form-core": "2.0.0-alpha.1"
}

vite-plugin-solid is a build-time plugin, but it sits in dependencies, which
drags babel-preset-solid and solid-refresh into the runtime graph — three of
the four peer warnings above. Moving it to devDependencies (or peerDependencies
if consumers are meant to supply it) would remove that noise independently of
anything Solid 2 related.

Solid 2 port checklist

We have this working through a patches/ override. Every hunk maps to a
documented Solid 1 -> 2 change, so this doubles as a checklist:

@tanstack/solid-store (2 changes, both in createStoreContext):

  1. createComponent imports from solid-js, not solid-js/web
  2. Context objects are the provider: <Ctx.Provider> -> createComponent(Ctx, ...)

@tanstack/solid-form:
3. mergeProps renamed to merge
4. Same Ctx.Provider -> Ctx change in AppForm/Components
5. splitProps replaced by omit in FieldGroup/withFields
6. createRenderEffect is now two-arg (compute, apply); the single-arg form
throws MISSING_EFFECT_FN. Five call sites.
7. createMemo dropped its 3-arg form:
createMemo(fn, undefined, { equals: false }) -> createMemo(fn, { equals: false })
8. Writes from inside an owned scope need the opt-in — createFieldSelector
needs createSignal(initial, { equals, ownedWrite: true })
9. The JSX type moved from solid-js to @solidjs/web (type-only, 5 files)

Runtime files affected: SolidFormApi.lib.js, createField.lib.js,
AppForm/Components.lib.js, FieldGroup/withFields.lib.js.

Questions

  1. Is Solid 2 support planned for the solid-form v2 line, or is v2 scoped to
    the Form API changes (AppForm, FieldGroup, withFields), with Solid 2
    support to follow separately?
  2. Independently of that — would you consider bounding the solid-js peer range
    on the current alphas? Right now the incompatibility surfaces as a missing
    module deep in a transitive dependency rather than at install.
  3. Is @tanstack/solid-store in scope for a Solid 2 release too? It is the
    actual point of failure here, and solid-form depends on it directly.

Happy to open a PR for the Solid 2 changes if useful

Environment

solid-js                2.0.0-rc.0
@tanstack/solid-form    2.0.0-alpha.1
@tanstack/solid-store   0.11.1  (direct dependency of solid-form)
@tanstack/solid-router  2.0.0-rc.0    (works unmodified)
@tanstack/solid-query   6.0.0-rc.0    (works unmodified)
@tanstack/solid-start   2.0.0-rc.0    (works unmodified)
bun                     1.3.14

Your minimal, reproducible example

Steps to reproduce

Expected behavior

How often does this bug happen?

None

Screenshots or Videos

No response

Platform

TanStack Form adapter

None

TanStack Form version

2.0.0-alpha.1

TypeScript version

No response

Additional context

No response

Metadata

Metadata

Assignees

No one assigned

    Labels

    area: runtimeThis issue affects the runtime of the library.scope: solidThis issue specifically affects the solid adapter.type: enhancementThis requests an enhancement to existing behaviour.v2This issue affects v2 as well.

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions