Skip to content

Conversation

@KyleAMathews
Copy link
Collaborator

Use the unfrozen internal copy as the Proxy target instead of the original frozen object. This fixes a TypeError that occurred when trying to modify properties on a proxy wrapping a frozen object (such as state from libraries that freeze their data).

Added comprehensive tests for frozen object handling including deeply frozen nested objects and array change tracking.

🎯 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).

Use the unfrozen internal copy as the Proxy target instead of the
original frozen object. This fixes a TypeError that occurred when
trying to modify properties on a proxy wrapping a frozen object
(such as state from libraries that freeze their data).

Added comprehensive tests for frozen object handling including
deeply frozen nested objects and array change tracking.
@changeset-bot
Copy link

changeset-bot bot commented Nov 28, 2025

🦋 Changeset detected

Latest commit: d39e733

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

This PR includes changesets to release 11 packages
Name Type
@tanstack/db Patch
@tanstack/angular-db Patch
@tanstack/db-collection-e2e Patch
@tanstack/electric-db-collection Patch
@tanstack/powersync-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

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

@pkg-pr-new
Copy link

pkg-pr-new bot commented Nov 28, 2025

More templates

@tanstack/angular-db

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

@tanstack/db

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

@tanstack/db-ivm

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

@tanstack/electric-db-collection

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

@tanstack/offline-transactions

npm i https://pkg.pr.new/@tanstack/offline-transactions@933

@tanstack/powersync-db-collection

npm i https://pkg.pr.new/@tanstack/powersync-db-collection@933

@tanstack/query-db-collection

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

@tanstack/react-db

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

@tanstack/rxdb-db-collection

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

@tanstack/solid-db

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

@tanstack/svelte-db

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

@tanstack/trailbase-db-collection

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

@tanstack/vue-db

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

commit: d39e733

@github-actions
Copy link
Contributor

github-actions bot commented Nov 28, 2025

Size Change: +57 B (+0.07%)

Total Size: 87.1 kB

Filename Size Change
./packages/db/dist/esm/proxy.js 3.75 kB +57 B (+1.55%)
ℹ️ View Unchanged
Filename Size
./packages/db/dist/esm/collection/change-events.js 1.38 kB
./packages/db/dist/esm/collection/changes.js 977 B
./packages/db/dist/esm/collection/events.js 388 B
./packages/db/dist/esm/collection/index.js 3.24 kB
./packages/db/dist/esm/collection/indexes.js 1.1 kB
./packages/db/dist/esm/collection/lifecycle.js 1.67 kB
./packages/db/dist/esm/collection/mutations.js 2.31 kB
./packages/db/dist/esm/collection/state.js 3.43 kB
./packages/db/dist/esm/collection/subscription.js 2.55 kB
./packages/db/dist/esm/collection/sync.js 2.37 kB
./packages/db/dist/esm/deferred.js 207 B
./packages/db/dist/esm/errors.js 4.19 kB
./packages/db/dist/esm/event-emitter.js 748 B
./packages/db/dist/esm/index.js 2.64 kB
./packages/db/dist/esm/indexes/auto-index.js 742 B
./packages/db/dist/esm/indexes/base-index.js 766 B
./packages/db/dist/esm/indexes/btree-index.js 1.87 kB
./packages/db/dist/esm/indexes/lazy-index.js 1.1 kB
./packages/db/dist/esm/indexes/reverse-index.js 513 B
./packages/db/dist/esm/local-only.js 837 B
./packages/db/dist/esm/local-storage.js 2.1 kB
./packages/db/dist/esm/optimistic-action.js 359 B
./packages/db/dist/esm/paced-mutations.js 496 B
./packages/db/dist/esm/query/builder/functions.js 733 B
./packages/db/dist/esm/query/builder/index.js 3.96 kB
./packages/db/dist/esm/query/builder/ref-proxy.js 917 B
./packages/db/dist/esm/query/compiler/evaluators.js 1.35 kB
./packages/db/dist/esm/query/compiler/expressions.js 430 B
./packages/db/dist/esm/query/compiler/group-by.js 1.8 kB
./packages/db/dist/esm/query/compiler/index.js 1.96 kB
./packages/db/dist/esm/query/compiler/joins.js 2 kB
./packages/db/dist/esm/query/compiler/order-by.js 1.25 kB
./packages/db/dist/esm/query/compiler/select.js 1.07 kB
./packages/db/dist/esm/query/expression-helpers.js 1.43 kB
./packages/db/dist/esm/query/ir.js 673 B
./packages/db/dist/esm/query/live-query-collection.js 360 B
./packages/db/dist/esm/query/live/collection-config-builder.js 5.33 kB
./packages/db/dist/esm/query/live/collection-registry.js 264 B
./packages/db/dist/esm/query/live/collection-subscriber.js 1.74 kB
./packages/db/dist/esm/query/live/internal.js 130 B
./packages/db/dist/esm/query/optimizer.js 2.56 kB
./packages/db/dist/esm/query/predicate-utils.js 2.91 kB
./packages/db/dist/esm/query/subset-dedupe.js 921 B
./packages/db/dist/esm/scheduler.js 1.3 kB
./packages/db/dist/esm/SortedMap.js 1.18 kB
./packages/db/dist/esm/strategies/debounceStrategy.js 247 B
./packages/db/dist/esm/strategies/queueStrategy.js 428 B
./packages/db/dist/esm/strategies/throttleStrategy.js 246 B
./packages/db/dist/esm/transactions.js 2.9 kB
./packages/db/dist/esm/utils.js 881 B
./packages/db/dist/esm/utils/browser-polyfills.js 304 B
./packages/db/dist/esm/utils/btree.js 5.61 kB
./packages/db/dist/esm/utils/comparison.js 852 B
./packages/db/dist/esm/utils/index-optimization.js 1.51 kB
./packages/db/dist/esm/utils/type-guards.js 157 B

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

@github-actions
Copy link
Contributor

github-actions bot commented Nov 28, 2025

Size Change: 0 B

Total Size: 3.34 kB

ℹ️ View Unchanged
Filename Size
./packages/react-db/dist/esm/index.js 225 B
./packages/react-db/dist/esm/useLiveInfiniteQuery.js 1.17 kB
./packages/react-db/dist/esm/useLiveQuery.js 1.11 kB
./packages/react-db/dist/esm/useLiveSuspenseQuery.js 431 B
./packages/react-db/dist/esm/usePacedMutations.js 401 B

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.

I think this looks good.

If I understand correctly, we make a deep copy of the target, and now use that as the proxy target rather than the original source object.

Note that the old tests that where commented out also tested Object.seal, but the new tests do not, they only test Object.freeze

- Add proper Proxy traps for defineProperty, getOwnPropertyDescriptor,
  preventExtensions, and isExtensible that forward to the target
- Update deleteProperty trap to use Reflect.deleteProperty
- Add comprehensive tests for seal and preventExtensions behavior
- Update changeset to document the new functionality
@KyleAMathews
Copy link
Collaborator Author

Yeah exactly. We were already making a clone and should have been using it.

And yeah good call, also added support for .seal/.preventExtensions.

This is a good test of the improved models — it went in circles on this ~6 months ago when I first tried implementing this but Claude 4.5 fixed it immediately this go around.

@KyleAMathews KyleAMathews merged commit b3e4e80 into main Dec 1, 2025
7 checks passed
@KyleAMathews KyleAMathews deleted the claude/proxy-frozen-values-01YAoYN2PcqkcnjvS7oA5Wzx branch December 1, 2025 15:28
@github-actions github-actions bot mentioned this pull request Dec 1, 2025
@github-actions
Copy link
Contributor

github-actions bot commented Dec 2, 2025

🎉 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.

4 participants