TanStack / TanStack/form

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

Open
#2,342 1 comment 0 reactions 0 assignees View on GitHub

Nobody has claimed this yet.

area: runtime scope: solid type: enhancement v2
Dominant language
TypeScript
Stars
6.7k
Forks
682
Avg merge
5d 18h
Merged PRs (30d)
7

Description

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

Contributor guide

Open the contributing guide

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. Open a pull request that references the issue number.

Research direction

Start with the Bun reproduction and inspect the SolidFormApi.lib.js, createField.lib.js, AppForm/Components.lib.js, and FieldGroup/withFields.lib.js runtime files, plus the package dependency metadata. Compare the listed Solid 2 port checklist against the corresponding solid-store createStoreContext changes. Done means solid-form can be imported under Solid 2 without the missing subpath failure and its peer range no longer advertises unsupported versions.

Written by the indexing model from the issue text.

Assessment

Tech stack
typescript
Domain
frontend
Issue type
Bug
Difficulty
4/5
Estimated time
3-5 days
Activity status
Quiet
Clarity
Mostly clear
Newbie friendliness
48/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.