Repository navigation
chore: update solid-db/solid-query to latest (@fehmer) - #8521
Merged
Merged
Conversation
|
Review the following changes in direct dependencies. Learn more about Socket for GitHub.
|
fehmer
marked this pull request as ready for review
October 26, 2026 22:46
Miodec
approved these changes
Oct 27, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Updates the TanStack data + devtools packages in
frontendto their latest versions:@tanstack/solid-db@tanstack/query-db-collection@tanstack/solid-query@tanstack/solid-devtools@tanstack/solid-query-devtoolsBreaking changes found and how they were handled
1.
@tanstack/db0.15.0 —setWindowonfindOnequeries (no code change, verified unused)Breaking: a
findOnekeeps its compiled limit (1). An orderedfindOne'ssetWindowcan move the offset but now throwsSetWindowFindOneLimitErrorfor any other limit (before it silently made thefindOnereturn N rows); an unorderedfindOnewith a nonzero offset throwsSetWindowRequiresOrderByError.@tanstack/db0.15.0Our three
findOne()usages (results.tsaverages/daily-best) are aggregate projections and never callsetWindow/getWindow— verified unused, no fix needed.2.
@tanstack/db0.12.0 — removal ofbegin({ immediate })(no code change, verified unused)Breaking: the
immediateoption of the syncbegin()API was removed; writes made while a mutation persists now queue behind it instead of applying at once.@tanstack/db0.12.0The app never calls
begin({ immediate })— verified unused, no fix needed.3.
@tanstack/query-db-collection1.4.0 — collection writes now reject promises instead of throwing synchronously (code change)Breaking: validation errors from
writeInsert,writeUpdate,writeDelete,writeUpsertandwriteBatchnow reject the returned promise; before they threw synchronously. The changelog's migration guidance: "Await the promise and catch the error."@tanstack/query-db-collection1.4.0, PR #2044Until 1.3.2 these writes returned a sync receipt, so all 31 call sites in the 8 collections were bare expressions. Since writes now return
Promise<void>, they had to be handled or the repo'sno-floating-promiseslint rule (error severity) fails:mutationFns →await(e.g.collections/tags.ts,results.ts,presets.ts,connections.ts,ape-keys.ts,custom-themes.ts,result-filter-presets.ts). This preserves the old semantics exactly: a write validation failure rejects the mutation (previously the sync throw already did, inside the async function) instead of becoming an unhandled rejection.onMutate/writeBatchcallbacks →void(tagstoggleTagActive/setTagActive/clearActiveTags,inbox.tsbatch delete/read) — sync callbacks can't await; these are fire-and-forget, as before.4.
@tanstack/db0.15.x /query-db-collection1.3.5 — transaction settlement rework,isPersisteddeprecated (code change)The sync transaction API gained two moments (accepted vs. visible):
commit()receipts and subset loads resolve at visibility, while handler-facing writes resolve at acceptance. As part of this,Transaction.isPersistedis deprecated — "Usewhen('settled')instead. This alias will be removed in the 1.0 RC." (when('settled')has the same resolve/reject semantics: resolves with the transaction on success, rejects with the original error on failure.)when()@tanstack/db0.12.0 / 1.3.5 entryAll 26
await transaction.isPersisted.promiseoccurrences (public action wrappers in the 8 collections, e.g.addCustomTheme,insertApeKey,acceptConnection,updateResultTags) →await transaction.when("settled").5.
@tanstack/solid-db0.2.46 — live-query result types include the empty single-result representation (code change)Type-level breaking: conditional live-query result types were aligned with the disabled/empty reactive bindings, so a
findOne()insideuseLiveQuerynow types its empty state as[](empty array) in the union:{ ...; wpm: number; acc: number } | []. Property access on the union (last10()?.wpminAverageNotice.tsx) no longer type-checks (TS2339).@tanstack/solid-db0.2.46useUserAverage10LiveQuery(results.ts) now normalizes through acreateMemo:[](andundefined) →undefined, keeping the existing "no average" rendering path. This is the only consumer of a single-result live query.6.
@tanstack/query-core5.102.0 — imperativeQueryClientmethods deprecated (code change)Minor in 5.x (non-breaking: methods still work, removal is "next major version"), but the repo lints deprecations as errors, so these had to be migrated to the new API:
prefetchQuery→queryClient.query(options)— newquery()/infiniteQuery()methods added in #10658. UnlikeprefetchQuery(which never rejected),query()rejects on error, so fire-and-forget prefetches inrouter/routes.ts(9) andLeaderboardPage.tsx(1) now end in.catch(noop)to keep the old swallow-errors behavior.fetchQuery→queryClient.query(options)(1:1, both reject on error):ape/server-configuration.tssync,ProfileSearchPage.tsxusername validation.ensureQueryData→queryClient.query({ ...options, staleTime: "static" })— the mapping recommended in the deprecation tag;staleTime: "static"("never stale") is new in 5.102. Used in the friends route loader.QueryClient7.
@tanstack/solid-devtools0.8.5 → 0.8.13 / core@tanstack/devtools0.12.2 → 0.15.0 (no code change)The adapter is patch-only (0.8.x); the movement is in the core
@tanstack/devtoolspackage it wraps. Relevant entries, checked against our usage incomponents/dev/TanstackDevtools.tsx(<TsDevTools plugins={[inline query plugin, hotkeysDevtoolsPlugin(), SignalsDevtoolsPlugin()]} config={{ defaultOpen: false }} />):state.activePluginsin the devtoolslocalStoragestate is superseded bystate.layout— existing state is migrated automatically on first read (unusable entries repaired, unknown ids dropped), so no app-side action needed.destroyfires exactly once on close — a fix for plugin authors, no API change.use*→create*rename (#477): the only breaking tag in the range is@tanstack/devtools-ui's exporteduseTheme→createTheme(prevents React Compiler from transforming the Solid panel code). We don't import@tanstack/devtools-uidirectly — no impact.Our plugin objects (
{ id, name, render, defaultOpen }) satisfy the unchanged plugin interface — typecheck clean.@tanstack/solid-hotkeys-devtools@0.7.0(unchanged) peers only onsolid-js, so no coupling with the new core.8.
@tanstack/solid-query-devtools5.101.0 → 5.104.5 (no code change)Patch-only range — every release is a version alignment with
@tanstack/query-devtools/@tanstack/solid-query(5.x stable, no API changes).SolidQueryDevtoolsPanel'sclientprop is unchanged. Docs: TanStack Query devtools9.
applyIdWorkaroundworkaround removed (code change)collections/utils/misc.tscarriedapplyIdWorkaround— a temp workaround for TanStack/db#1524 (Solid rendering showed one item for all rows in agetKey: (it) => it._idcollection with ordered live queries, fixed by copying_idonto anidproperty of every fetched row). That issue is closed and its fixes — solid-db#1598 (reconcile key), solid-db#1604 (row cloning insyncDataFromCollection), solid-db#1825 (preserve live result identity for custom-key rows, shipped in@tanstack/solid-db0.2.46, see Solid live-query docs) — are all part of the updated 0.3.12.Removed the helper and all 7 usages (the
queryFnrow-mapping in thecustom-themes,connections,ape-keys,presets,results,result-filter-presetsandtagscollections). All consumers type rows via the zod schemas, which never declaredid, so no code could depend on the injected property — typecheck confirms.Entries checked and deliberately not actioned
query-db-collection1.2.0: QueryClient-defaultplaceholderDatano longer materializes as collection rows, QueryClient-defaultinitialDatano longer seeds on-demand subset observers. OurQueryClient(queries/index.ts) sets neither globally — no impact.query-db-collection1.3.0: mutation-handler auto-refetch deprecated (warnOncewhen a handler doesn't return{ refetch: false }). Our collections register noonInsert/onUpdate/onDeletehandlers (mutations run throughcreateOptimisticAction+ explicitwrite*), so the warning never fires. When handlers are ever added, the library wants an explicit{ refetch: false }or manualawait collection.utils.refetch().@tanstack/solid-db0.3.0 (minor): opt-in network-first initial rendering for persisted (SQLite) collections (initialRender: { strategy: "network-first" }, newpersistedStatus/isPersistedReadyflags). We use pure Query-backed collections with no persistence adapter — no impact.@tanstack/solid-query5.104.4: type-only re-exports switched toexport type *— our named imports (incl.UseQueryResult) unaffected, typecheck clean. (Sameexport type *change landed insolid-query-devtools'squery-devtoolsdep — devtools-only, no app code touched.)Evidence
Before: draft — signed-in browser smoke test still owed, no runtime evidence for the write/settlement rework.
After: smoke run on the dev server (3000/5005) as a signed-in test account:
useUserAverage10LiveQuery): with ≥10 results it shows the real average (84 wpm 87% acc); switching the test language so the settings filter matches zero results, the empty single-result state ([]) renders "no average" via the newcreateMemonormalization, and switches back when the language returns — the only consumer of a single-result live query._id-keyed list rendered each row with its own data. Renaming a custom theme re-sorted it to the top with both rows keeping their own name/colors — the one-item-for-all-rows regression behind the removedapplyIdWorkaround(solid-db rendering issues when not using key namedidTanStack/db#1524) is not present.writeBatchread/delete path went unexercised.queryClient.query(): profile search rejects an unknown username ("Unknown user", submit disabled) and accepts an existing one (submit enabled); the about page rendered all four prefetched sections; the leaderboard rendered its table.Observed while smoke-testing (filed as bugs, not blockers): rename modals (custom theme, ape key) apply the change but the modal takes several seconds to close —
when("settled")settles later thanisPersisteddid for query-backed collections; and a SimpleModal whose boolean input is never touched reports invalid until the checkbox is toggled once (form layer, untouched by this PR).Automated:
pnpm oxlint --type-aware --type-check— exit 0, 0 errorspnpm vitest run— 84 files, 1622/1622 tests passpnpm vite build— success (catches bundler-level issues from theexport type *change and the newdb-ivmdep)Merge Danger
Door: two-way
Dependency bump plus mechanical API migration; reverting the PR restores the prior versions and behavior. No schema, storage, or API contract changes — a rollback costs one revert.
Blast Radius: app-wide
Every signed-in data flow runs through the changed code: the 8 query-backed collections (tags, results, presets, connections, inbox, ape keys, custom themes, result-filter-presets) with their new write/settlement semantics, and every route's background data fetch on the new
queryClient.query()API. A divergence in write timing or live-query reconciliation would surface as slow-closing modals, rolled-back mutations, or duplicated list rows across the whole signed-in experience.