Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 0 additions & 7 deletions .changeset/builtin-leaves.md

This file was deleted.

7 changes: 0 additions & 7 deletions .changeset/keep-observed-across-resubscribe.md

This file was deleted.

5 changes: 0 additions & 5 deletions .changeset/memo-untracked-cold-key.md

This file was deleted.

8 changes: 0 additions & 8 deletions .changeset/observe-covered-reactive-nodes.md

This file was deleted.

5 changes: 0 additions & 5 deletions .changeset/query-baseline-ignore.md

This file was deleted.

10 changes: 0 additions & 10 deletions .changeset/query-detach-shared-results.md

This file was deleted.

5 changes: 0 additions & 5 deletions .changeset/unsubscribe-after-clear-listeners.md

This file was deleted.

8 changes: 0 additions & 8 deletions .changeset/use-select-tree-version.md

This file was deleted.

46 changes: 23 additions & 23 deletions package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 2 additions & 0 deletions packages/retree-babel-plugin-compiler/CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
# @retreejs/babel-plugin-compiler

## 0.11.2

## 0.11.1

## 0.11.0
Expand Down
4 changes: 2 additions & 2 deletions packages/retree-babel-plugin-compiler/package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "@retreejs/babel-plugin-compiler",
"version": "0.11.1",
"version": "0.11.2",
"description": "Babel plugin that compiles ReactiveNode classes into proxy-free managed classes.",
"author": "Ryan Bliss",
"private": false,
Expand Down Expand Up @@ -28,7 +28,7 @@
},
"peerDependencies": {
"@babel/core": "^7.0.0",
"@retreejs/core": "0.11.1"
"@retreejs/core": "0.11.2"
},
"repository": {
"directory": "packages/retree-babel-plugin-compiler",
Expand Down
4 changes: 2 additions & 2 deletions packages/retree-benchmark-cli/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -19,8 +19,8 @@
},
"dependencies": {
"@inquirer/prompts": "^7.0.0",
"@retreejs/core": "0.11.1",
"@retreejs/react": "0.11.1",
"@retreejs/core": "0.11.2",
"@retreejs/react": "0.11.2",
"jsdom": "^26.1.0",
"react": "^19.2.5",
"react-dom": "^19.2.5"
Expand Down
10 changes: 10 additions & 0 deletions packages/retree-convex/CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,15 @@
# @retreejs/convex

## 0.11.2

### Patch Changes

- ec97249: Queries no longer adopt the objects a source emits, so two queries can share one cached result.

Two queries that received the same cached result threw "Retree cannot assign this node because it already has a structural parent". Rows added during reconciliation were also shared between queries, so editing one query changed the other. Query state now holds its own copies, including of `initialState`. Frozen objects and opaque built-ins are still shared, and reconciliation copies only the rows and fields it writes.

Custom reconcilers should not write objects from `next` into `current` directly. Use `reconcileArray`, or return a replacement value; it is copied, except for rows reused from `current`.

## 0.11.1

## 0.11.0
Expand Down
10 changes: 5 additions & 5 deletions packages/retree-convex/package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "@retreejs/convex",
"version": "0.11.1",
"version": "0.11.2",
"description": "Sync Convex queries into Retree reactive nodes.",
"author": "Ryan Bliss",
"private": false,
Expand All @@ -15,15 +15,15 @@
"publish:package": "dotenv -e .env -- npm publish --access public"
},
"devDependencies": {
"@retreejs/core": "0.11.1",
"@retreejs/query": "0.11.1",
"@retreejs/core": "0.11.2",
"@retreejs/query": "0.11.2",
"convex": "^1.39.1",
"dotenv-cli": "^11.0.0",
"typescript": "^6.0.2"
},
"peerDependencies": {
"@retreejs/core": "0.11.1",
"@retreejs/query": "0.11.1",
"@retreejs/core": "0.11.2",
"@retreejs/query": "0.11.2",
"convex": "^1.39.1"
},
"repository": {
Expand Down
18 changes: 18 additions & 0 deletions packages/retree-core/CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,23 @@
# @retreejs/core

## 0.11.2

### Patch Changes

- 8b59d34: Built-ins that keep their state in internal slots are now leaves, so reading them from a tree works.

A `DOMException` stored in a tree threw on `error.message` ("Illegal invocation" in browsers, `ERR_INVALID_THIS` in Node) because Retree proxied it and its accessors reject a proxy as `this`. The same broke `URL`, `Blob`, `RegExp`, typed arrays, `AbortController`, `Promise`, and other platform objects. Retree now stores these as-is, like frozen objects: reads return the object itself, and assigning a new one notifies. `Retree.root` rejects them because a root must be a node.

- 6eece3b: A `@memo` or `@fnMemo` read inside `Retree.untracked` no longer subscribes the surrounding selector or effect to its key's reads. Before, a memo whose key had to re-run (on its first read, or after a key input changed) leaked those reads, so whether a selector stayed asleep depended on what had warmed the memo.
- 347c69e: Selector-only `Retree.select(selector, callback)`, `Retree.effect`, and `useSelect` now observe every `ReactiveNode` they read, so `onObserved` and `onUnobserved` run for it.

Before, a node reached through a parent the selector also read was never observed, whether it existed before the run or was created during it. A query node created lazily inside a selector, such as `vm.snapshotsFor(id).state`, never subscribed and stayed loading forever. A selector also lost a dependency when `onObserved` wrote state while it subscribed, and `useSelect` re-ran a kept node's `onUnobserved` and `onObserved` when its other dependencies moved.

- 651f298: Calling a `Retree.on` unsubscribe after `Retree.clearListeners` already removed that listener no longer runs the node's `onUnobserved` a second time.
- 651f298: A selector that reads `Retree.treeVersion(node)` now re-runs on every write under `node`.

Before, a selector-only `useSelect` dropped writes to descendants the selector never read directly, unlike `Retree.select`. And `useSelect`, `Retree.select`, `Retree.effect` and `@select` getters all skipped a write to a descendant's field when the selector also read a different field of that descendant.

## 0.11.1

### Patch Changes
Expand Down
2 changes: 1 addition & 1 deletion packages/retree-core/package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "@retreejs/core",
"version": "0.11.1",
"version": "0.11.2",
"description": "React to changes in your object trees.",
"author": "Ryan Bliss",
"private": false,
Expand Down
2 changes: 2 additions & 0 deletions packages/retree-create/CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
# @retreejs/create

## 0.11.2

## 0.11.1

## 0.11.0
Expand Down
2 changes: 1 addition & 1 deletion packages/retree-create/package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "@retreejs/create",
"version": "0.11.1",
"version": "0.11.2",
"description": "Interactive installer that adds Retree packages to an existing project.",
"author": "Ryan Bliss",
"license": "MIT",
Expand Down
2 changes: 2 additions & 0 deletions packages/retree-devtools/CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
# @retreejs/devtools

## 0.11.2

## 0.11.1

## 0.11.0
Expand Down
6 changes: 3 additions & 3 deletions packages/retree-devtools/package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "@retreejs/devtools",
"version": "0.11.1",
"version": "0.11.2",
"description": "Redux DevTools bridge and structured change-log taps for Retree reactive state.",
"author": "Ryan Bliss",
"private": false,
Expand All @@ -16,12 +16,12 @@
"publish:package": "dotenv -e .env -- npm publish --access public"
},
"devDependencies": {
"@retreejs/core": "0.11.1",
"@retreejs/core": "0.11.2",
"dotenv-cli": "^11.0.0",
"typescript": "^6.0.2"
},
"peerDependencies": {
"@retreejs/core": "0.11.1"
"@retreejs/core": "0.11.2"
},
"repository": {
"directory": "packages/retree-devtools",
Expand Down
11 changes: 11 additions & 0 deletions packages/retree-query/CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,16 @@
# @retreejs/query

## 0.11.2

### Patch Changes

- 2b64407: Fixed an "already has a structural parent" error when a query reused a backend-cached result after an overlapping optimistic update rolled back.
- ec97249: Queries no longer adopt the objects a source emits, so two queries can share one cached result.

Two queries that received the same cached result threw "Retree cannot assign this node because it already has a structural parent". Rows added during reconciliation were also shared between queries, so editing one query changed the other. Query state now holds its own copies, including of `initialState`. Frozen objects and opaque built-ins are still shared, and reconciliation copies only the rows and fields it writes.

Custom reconcilers should not write objects from `next` into `current` directly. Use `reconcileArray`, or return a replacement value; it is copied, except for rows reused from `current`.

## 0.11.1

## 0.11.0
Expand Down
Loading
Loading