Skip to content

feat: Add in-memory fallback for localStorage collections in SSR environments - #696

Merged
KyleAMathews merged 5 commits into
mainfrom
claude/fallback-store-implementation-011CUK3giCpbGdRfgEUWSBwz
Oct 21, 2025
Merged

feat: Add in-memory fallback for localStorage collections in SSR environments#696
KyleAMathews merged 5 commits into
mainfrom
claude/fallback-store-implementation-011CUK3giCpbGdRfgEUWSBwz

Conversation

@KyleAMathews

Copy link
Copy Markdown
Collaborator

Prevents LocalStorageCollectionError when localStorage collections are imported on the server by automatically falling back to an in-memory store. This addresses issue #691 where importing client code with localStorage collections in server environments would throw errors during module initialization.

Changes:

  • Add createInMemoryStorage() to provide in-memory StorageApi fallback
  • Add createNoOpStorageEventApi() for server environments without window
  • Update localStorageCollectionOptions to use fallbacks instead of throwing errors
  • Remove unused NoStorageAvailableError and NoStorageEventApiError imports
  • Update tests to verify fallback behavior instead of expecting errors
  • Update JSDoc to document fallback behavior

This allows isomorphic JavaScript applications to safely import localStorage collection modules without errors, though data will not persist across reloads or sync across tabs when using the in-memory fallback.

Fixes#691

🤖 Generated with Claude Code

🎯 Changes

✅ Checklist

  • I have followed the steps in the Contributing guide.
  • I have tested this code locally with pnpm test:pr.

🚀 Release Impact

  • This change affects published code, and I have generated a changeset.
  • This change is docs/CI/dev-only (no release).

…ronments
Prevents LocalStorageCollectionError when localStorage collections are imported
on the server by automatically falling back to an in-memory store. This addresses
issue #691 where importing client code with localStorage collections in server
environments would throw errors during module initialization.
Changes:
- Add createInMemoryStorage() to provide in-memory StorageApi fallback
- Add createNoOpStorageEventApi() for server environments without window
- Update localStorageCollectionOptions to use fallbacks instead of throwing errors
- Remove unused NoStorageAvailableError and NoStorageEventApiError imports
- Update tests to verify fallback behavior instead of expecting errors
- Update JSDoc to document fallback behavior
This allows isomorphic JavaScript applications to safely import localStorage
collection modules without errors, though data will not persist across reloads
or sync across tabs when using the in-memory fallback.
Fixes#691
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
…or classes
These error classes are no longer used after implementing the in-memory fallback
for localStorage collections in SSR environments. Removes dead code to keep the
codebase clean.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
@changeset-bot

changeset-botBot commented Oct 20, 2025

Copy link
Copy Markdown

🦋 Changeset detected

Latest commit: acba6a9

The changes in this PR will be included in the next version bump.

This PR includes changesets to release 12 packages
NameType
@tanstack/dbPatch
@tanstack/angular-dbPatch
@tanstack/electric-db-collectionPatch
@tanstack/query-db-collectionPatch
@tanstack/react-dbPatch
@tanstack/rxdb-db-collectionPatch
@tanstack/solid-dbPatch
@tanstack/svelte-dbPatch
@tanstack/trailbase-db-collectionPatch
@tanstack/vue-dbPatch
todosPatch
@tanstack/db-example-react-todoPatch

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

🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
@pkg-pr-new

pkg-pr-newBot commented Oct 20, 2025

Copy link
Copy Markdown
More templates

@tanstack/angular-db

npm i https://pkg.pr.new/@tanstack/angular-db@696

@tanstack/db

npm i https://pkg.pr.new/@tanstack/db@696

@tanstack/db-ivm

npm i https://pkg.pr.new/@tanstack/db-ivm@696

@tanstack/electric-db-collection

npm i https://pkg.pr.new/@tanstack/electric-db-collection@696

@tanstack/query-db-collection

npm i https://pkg.pr.new/@tanstack/query-db-collection@696

@tanstack/react-db

npm i https://pkg.pr.new/@tanstack/react-db@696

@tanstack/rxdb-db-collection

npm i https://pkg.pr.new/@tanstack/rxdb-db-collection@696

@tanstack/solid-db

npm i https://pkg.pr.new/@tanstack/solid-db@696

@tanstack/svelte-db

npm i https://pkg.pr.new/@tanstack/svelte-db@696

@tanstack/trailbase-db-collection

npm i https://pkg.pr.new/@tanstack/trailbase-db-collection@696

@tanstack/vue-db

npm i https://pkg.pr.new/@tanstack/vue-db@696

commit: acba6a9

🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
@github-actions

Copy link
Copy Markdown
Contributor

Size Change: -47 B (-0.06%)

Total Size: 83.6 kB

FilenameSizeChange
./packages/db/dist/esm/errors.js3.48 kB-85 B (-2.38%)
./packages/db/dist/esm/index.js1.62 kB-23 B (-1.4%)
./packages/db/dist/esm/local-storage.js2.4 kB+61 B (+2.61%)
ℹ️ View Unchanged
FilenameSize
./packages/db/dist/esm/collection/change-events.js963 B
./packages/db/dist/esm/collection/changes.js1.01 kB
./packages/db/dist/esm/collection/events.js413 B
./packages/db/dist/esm/collection/index.js3.23 kB
./packages/db/dist/esm/collection/indexes.js1.16 kB
./packages/db/dist/esm/collection/lifecycle.js1.8 kB
./packages/db/dist/esm/collection/mutations.js2.52 kB
./packages/db/dist/esm/collection/state.js3.79 kB
./packages/db/dist/esm/collection/subscription.js2.2 kB
./packages/db/dist/esm/collection/sync.js2.2 kB
./packages/db/dist/esm/deferred.js230 B
./packages/db/dist/esm/event-emitter.js798 B
./packages/db/dist/esm/indexes/auto-index.js794 B
./packages/db/dist/esm/indexes/base-index.js835 B
./packages/db/dist/esm/indexes/btree-index.js2 kB
./packages/db/dist/esm/indexes/lazy-index.js1.21 kB
./packages/db/dist/esm/indexes/reverse-index.js577 B
./packages/db/dist/esm/local-only.js967 B
./packages/db/dist/esm/optimistic-action.js294 B
./packages/db/dist/esm/proxy.js3.86 kB
./packages/db/dist/esm/query/builder/functions.js615 B
./packages/db/dist/esm/query/builder/index.js4.04 kB
./packages/db/dist/esm/query/builder/ref-proxy.js938 B
./packages/db/dist/esm/query/compiler/evaluators.js1.55 kB
./packages/db/dist/esm/query/compiler/expressions.js760 B
./packages/db/dist/esm/query/compiler/group-by.js2.04 kB
./packages/db/dist/esm/query/compiler/index.js2.21 kB
./packages/db/dist/esm/query/compiler/joins.js2.65 kB
./packages/db/dist/esm/query/compiler/order-by.js1.43 kB
./packages/db/dist/esm/query/compiler/select.js1.28 kB
./packages/db/dist/esm/query/ir.js785 B
./packages/db/dist/esm/query/live-query-collection.js404 B
./packages/db/dist/esm/query/live/collection-config-builder.js5.54 kB
./packages/db/dist/esm/query/live/collection-registry.js233 B
./packages/db/dist/esm/query/live/collection-subscriber.js2.11 kB
./packages/db/dist/esm/query/optimizer.js3.26 kB
./packages/db/dist/esm/scheduler.js1.29 kB
./packages/db/dist/esm/SortedMap.js1.24 kB
./packages/db/dist/esm/transactions.js3.05 kB
./packages/db/dist/esm/utils.js1.01 kB
./packages/db/dist/esm/utils/browser-polyfills.js365 B
./packages/db/dist/esm/utils/btree.js6.01 kB
./packages/db/dist/esm/utils/comparison.js754 B
./packages/db/dist/esm/utils/index-optimization.js1.73 kB

compressed-size-action::db-package-size

@github-actions

Copy link
Copy Markdown
Contributor

Size Change: 0 B

Total Size: 2.89 kB

ℹ️ View Unchanged
FilenameSize
./packages/react-db/dist/esm/index.js168 B
./packages/react-db/dist/esm/useLiveInfiniteQuery.js1.41 kB
./packages/react-db/dist/esm/useLiveQuery.js1.31 kB

compressed-size-action::react-db-package-size

@samwillissamwillis left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

This looks great! Perfect that's it's picked up that the api is designed to be plugable.

Should we have it emit a debug warning when this happens?

@KyleAMathews

KyleAMathews commented Oct 20, 2025

Copy link
Copy Markdown
CollaboratorAuthor

It should only happen in non-web environments in which case this is fine — so probably don't need any debug.

@KyleAMathews
KyleAMathews merged commit 8b29841 into mainOct 21, 2025
6 checks passed
@KyleAMathews
KyleAMathews deleted the claude/fallback-store-implementation-011CUK3giCpbGdRfgEUWSBwz branch October 21, 2025 14:55
@github-actionsgithub-actionsBot mentioned this pull request Oct 21, 2025
@github-actions

Copy link
Copy Markdown
Contributor

🎉 This PR has been released!

Thank you for your contribution!

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Prevent "LocalStorageCollectionError" when local-storage collections are imported on the server

3 participants

@KyleAMathews@samwillis@claude