Skip to content

Comments

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

Merged
KyleAMathews merged 5 commits intomainfrom
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 intomainfrom
claude/fallback-store-implementation-011CUK3giCpbGdRfgEUWSBwz

Conversation

@KyleAMathews
Copy link
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
Copy link

changeset-bot bot commented Oct 20, 2025

🦋 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
Name Type
@tanstack/db Patch
@tanstack/angular-db Patch
@tanstack/electric-db-collection Patch
@tanstack/query-db-collection Patch
@tanstack/react-db Patch
@tanstack/rxdb-db-collection Patch
@tanstack/solid-db Patch
@tanstack/svelte-db Patch
@tanstack/trailbase-db-collection Patch
@tanstack/vue-db Patch
todos Patch
@tanstack/db-example-react-todo Patch

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

pkg-pr-new bot commented Oct 20, 2025

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
Contributor

Size Change: -47 B (-0.06%)

Total Size: 83.6 kB

Filename Size Change
./packages/db/dist/esm/errors.js 3.48 kB -85 B (-2.38%)
./packages/db/dist/esm/index.js 1.62 kB -23 B (-1.4%)
./packages/db/dist/esm/local-storage.js 2.4 kB +61 B (+2.61%)
ℹ️ View Unchanged
Filename Size
./packages/db/dist/esm/collection/change-events.js 963 B
./packages/db/dist/esm/collection/changes.js 1.01 kB
./packages/db/dist/esm/collection/events.js 413 B
./packages/db/dist/esm/collection/index.js 3.23 kB
./packages/db/dist/esm/collection/indexes.js 1.16 kB
./packages/db/dist/esm/collection/lifecycle.js 1.8 kB
./packages/db/dist/esm/collection/mutations.js 2.52 kB
./packages/db/dist/esm/collection/state.js 3.79 kB
./packages/db/dist/esm/collection/subscription.js 2.2 kB
./packages/db/dist/esm/collection/sync.js 2.2 kB
./packages/db/dist/esm/deferred.js 230 B
./packages/db/dist/esm/event-emitter.js 798 B
./packages/db/dist/esm/indexes/auto-index.js 794 B
./packages/db/dist/esm/indexes/base-index.js 835 B
./packages/db/dist/esm/indexes/btree-index.js 2 kB
./packages/db/dist/esm/indexes/lazy-index.js 1.21 kB
./packages/db/dist/esm/indexes/reverse-index.js 577 B
./packages/db/dist/esm/local-only.js 967 B
./packages/db/dist/esm/optimistic-action.js 294 B
./packages/db/dist/esm/proxy.js 3.86 kB
./packages/db/dist/esm/query/builder/functions.js 615 B
./packages/db/dist/esm/query/builder/index.js 4.04 kB
./packages/db/dist/esm/query/builder/ref-proxy.js 938 B
./packages/db/dist/esm/query/compiler/evaluators.js 1.55 kB
./packages/db/dist/esm/query/compiler/expressions.js 760 B
./packages/db/dist/esm/query/compiler/group-by.js 2.04 kB
./packages/db/dist/esm/query/compiler/index.js 2.21 kB
./packages/db/dist/esm/query/compiler/joins.js 2.65 kB
./packages/db/dist/esm/query/compiler/order-by.js 1.43 kB
./packages/db/dist/esm/query/compiler/select.js 1.28 kB
./packages/db/dist/esm/query/ir.js 785 B
./packages/db/dist/esm/query/live-query-collection.js 404 B
./packages/db/dist/esm/query/live/collection-config-builder.js 5.54 kB
./packages/db/dist/esm/query/live/collection-registry.js 233 B
./packages/db/dist/esm/query/live/collection-subscriber.js 2.11 kB
./packages/db/dist/esm/query/optimizer.js 3.26 kB
./packages/db/dist/esm/scheduler.js 1.29 kB
./packages/db/dist/esm/SortedMap.js 1.24 kB
./packages/db/dist/esm/transactions.js 3.05 kB
./packages/db/dist/esm/utils.js 1.01 kB
./packages/db/dist/esm/utils/browser-polyfills.js 365 B
./packages/db/dist/esm/utils/btree.js 6.01 kB
./packages/db/dist/esm/utils/comparison.js 754 B
./packages/db/dist/esm/utils/index-optimization.js 1.73 kB

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

@github-actions
Copy link
Contributor

Size Change: 0 B

Total Size: 2.89 kB

ℹ️ View Unchanged
Filename Size
./packages/react-db/dist/esm/index.js 168 B
./packages/react-db/dist/esm/useLiveInfiniteQuery.js 1.41 kB
./packages/react-db/dist/esm/useLiveQuery.js 1.31 kB

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

Copy link
Collaborator

@samwillis samwillis left a comment

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
Copy link
Collaborator Author

KyleAMathews commented Oct 20, 2025

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 main Oct 21, 2025
6 checks passed
@KyleAMathews KyleAMathews deleted the claude/fallback-store-implementation-011CUK3giCpbGdRfgEUWSBwz branch October 21, 2025 14:55
@github-actions github-actions bot mentioned this pull request Oct 21, 2025
@github-actions
Copy link
Contributor

🎉 This PR has been released!

Thank you for your contribution!

Sign up for free to 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