From f0e7b89e08cfbc2e78d32d965e967eaefd87defb Mon Sep 17 00:00:00 2001 From: Ryan Bliss Date: Tue, 8 Sep 2026 15:05:39 -0700 Subject: [PATCH] chore(release): prepare Retree 0.11.1 Consumes the pending changesets and versions the lockstep family to 0.11.1. --- .changeset/equals-gates-tracked-select.md | 8 ---- .../name-the-hook-that-got-a-non-node.md | 8 ---- package-lock.json | 46 +++++++++---------- .../retree-babel-plugin-compiler/CHANGELOG.md | 2 + .../retree-babel-plugin-compiler/package.json | 4 +- packages/retree-benchmark-cli/package.json | 4 +- packages/retree-convex/CHANGELOG.md | 2 + packages/retree-convex/package.json | 10 ++-- packages/retree-core/CHANGELOG.md | 12 +++++ packages/retree-core/package.json | 2 +- packages/retree-create/CHANGELOG.md | 2 + packages/retree-create/package.json | 2 +- packages/retree-devtools/CHANGELOG.md | 2 + packages/retree-devtools/package.json | 6 +-- packages/retree-query/CHANGELOG.md | 2 + packages/retree-query/package.json | 6 +-- packages/retree-react-convex/CHANGELOG.md | 2 + packages/retree-react-convex/package.json | 6 +-- packages/retree-react/CHANGELOG.md | 12 +++++ packages/retree-react/package.json | 6 +-- 20 files changed, 82 insertions(+), 62 deletions(-) delete mode 100644 .changeset/equals-gates-tracked-select.md delete mode 100644 .changeset/name-the-hook-that-got-a-non-node.md diff --git a/.changeset/equals-gates-tracked-select.md b/.changeset/equals-gates-tracked-select.md deleted file mode 100644 index a19aedc..0000000 --- a/.changeset/equals-gates-tracked-select.md +++ /dev/null @@ -1,8 +0,0 @@ ---- -"@retreejs/core": patch -"@retreejs/react": patch ---- - -An explicit `equals` now decides whether the tracked forms of `Retree.select` and `useSelect` notify. - -When a tracked selector re-ran because a dependency changed, both forms notified (and `useSelect` re-rendered) even when the `equals` option reported the previous and next selections equal. The dependency check existed so a selector returning a stable node reference still notifies when that node's content changes; it now applies only to the default comparison. With `equals` supplied, a re-run whose result compares equal keeps the previous reference and stays silent, which is what lets a component select a derived value such as a sorted order and re-render only when that order changes. diff --git a/.changeset/name-the-hook-that-got-a-non-node.md b/.changeset/name-the-hook-that-got-a-non-node.md deleted file mode 100644 index 9d4ab19..0000000 --- a/.changeset/name-the-hook-that-got-a-non-node.md +++ /dev/null @@ -1,8 +0,0 @@ ---- -"@retreejs/core": patch -"@retreejs/react": patch ---- - -`useNode`, `useTree`, `useRaw`, `useSelect`, and `Retree.select` now name themselves when they receive a value that is not a Retree node. - -Passing an unmanaged value to one of these APIs used to throw Retree's internal invariant, which reported an unproxied object and asked the caller to file a Retree issue — even though the value came straight from application code. The error now names the API that received it and what arrived instead, for example: `useRaw: expected a Retree-managed node but received an unmanaged array. Pass an object returned by Retree.root(...) or read a child from an existing Retree tree.` The internal invariant still covers values that reach the base-proxy lookup through an internal path. diff --git a/package-lock.json b/package-lock.json index 36196a4..56ea3ed 100644 --- a/package-lock.json +++ b/package-lock.json @@ -17531,7 +17531,7 @@ }, "packages/retree-babel-plugin-compiler": { "name": "@retreejs/babel-plugin-compiler", - "version": "0.11.0", + "version": "0.11.1", "license": "MIT", "dependencies": { "@babel/parser": "^7.27.0", @@ -17548,7 +17548,7 @@ }, "peerDependencies": { "@babel/core": "^7.0.0", - "@retreejs/core": "0.11.0" + "@retreejs/core": "0.11.1" } }, "packages/retree-babel-plugin-compiler/node_modules/@types/node": { @@ -17567,8 +17567,8 @@ "license": "MIT", "dependencies": { "@inquirer/prompts": "^7.0.0", - "@retreejs/core": "0.11.0", - "@retreejs/react": "0.11.0", + "@retreejs/core": "0.11.1", + "@retreejs/react": "0.11.1", "jsdom": "^26.1.0", "react": "^19.2.5", "react-dom": "^19.2.5" @@ -17585,24 +17585,24 @@ }, "packages/retree-convex": { "name": "@retreejs/convex", - "version": "0.11.0", + "version": "0.11.1", "license": "MIT", "devDependencies": { - "@retreejs/core": "0.11.0", - "@retreejs/query": "0.11.0", + "@retreejs/core": "0.11.1", + "@retreejs/query": "0.11.1", "convex": "^1.39.1", "dotenv-cli": "^11.0.0", "typescript": "^6.0.2" }, "peerDependencies": { - "@retreejs/core": "0.11.0", - "@retreejs/query": "0.11.0", + "@retreejs/core": "0.11.1", + "@retreejs/query": "0.11.1", "convex": "^1.39.1" } }, "packages/retree-core": { "name": "@retreejs/core", - "version": "0.11.0", + "version": "0.11.1", "license": "MIT", "devDependencies": { "@types/assert": "^1.5.6", @@ -17615,7 +17615,7 @@ }, "packages/retree-create": { "name": "@retreejs/create", - "version": "0.11.0", + "version": "0.11.1", "license": "MIT", "dependencies": { "@inquirer/prompts": "^7.0.0" @@ -17631,33 +17631,33 @@ }, "packages/retree-devtools": { "name": "@retreejs/devtools", - "version": "0.11.0", + "version": "0.11.1", "license": "MIT", "devDependencies": { - "@retreejs/core": "0.11.0", + "@retreejs/core": "0.11.1", "dotenv-cli": "^11.0.0", "typescript": "^6.0.2" }, "peerDependencies": { - "@retreejs/core": "0.11.0" + "@retreejs/core": "0.11.1" } }, "packages/retree-query": { "name": "@retreejs/query", - "version": "0.11.0", + "version": "0.11.1", "license": "MIT", "devDependencies": { - "@retreejs/core": "0.11.0", + "@retreejs/core": "0.11.1", "dotenv-cli": "^11.0.0", "typescript": "^6.0.2" }, "peerDependencies": { - "@retreejs/core": "0.11.0" + "@retreejs/core": "0.11.1" } }, "packages/retree-react": { "name": "@retreejs/react", - "version": "0.11.0", + "version": "0.11.1", "license": "MIT", "dependencies": { "use-sync-external-store": "^1.6.0" @@ -17666,7 +17666,7 @@ "@babel/core": "^7.29.0", "@babel/plugin-transform-modules-commonjs": "^7.28.0", "@babel/preset-react": "^7.27.0", - "@retreejs/core": "0.11.0", + "@retreejs/core": "0.11.1", "@types/react": "^19.2.3", "@types/react-dom": "^19.2.3", "@types/use-sync-external-store": "^1.5.0", @@ -17675,23 +17675,23 @@ "typescript": "^6.0.2" }, "peerDependencies": { - "@retreejs/core": "0.11.0", + "@retreejs/core": "0.11.1", "react": "^16.8.0 || ^17 || ^18 || ^19", "react-dom": "^16.8.0 || ^17 || ^18 || ^19" } }, "packages/retree-react-convex": { "name": "@retreejs/react-convex", - "version": "0.11.0", + "version": "0.11.1", "license": "MIT", "devDependencies": { - "@retreejs/convex": "0.11.0", + "@retreejs/convex": "0.11.1", "convex": "^1.39.1", "dotenv-cli": "^11.0.0", "typescript": "^6.0.2" }, "peerDependencies": { - "@retreejs/convex": "0.11.0", + "@retreejs/convex": "0.11.1", "convex": "^1.39.1" } }, diff --git a/packages/retree-babel-plugin-compiler/CHANGELOG.md b/packages/retree-babel-plugin-compiler/CHANGELOG.md index af1886d..d6021ee 100644 --- a/packages/retree-babel-plugin-compiler/CHANGELOG.md +++ b/packages/retree-babel-plugin-compiler/CHANGELOG.md @@ -1,5 +1,7 @@ # @retreejs/babel-plugin-compiler +## 0.11.1 + ## 0.11.0 ### Minor Changes diff --git a/packages/retree-babel-plugin-compiler/package.json b/packages/retree-babel-plugin-compiler/package.json index a109cb3..3ca66e0 100644 --- a/packages/retree-babel-plugin-compiler/package.json +++ b/packages/retree-babel-plugin-compiler/package.json @@ -1,6 +1,6 @@ { "name": "@retreejs/babel-plugin-compiler", - "version": "0.11.0", + "version": "0.11.1", "description": "Babel plugin that compiles ReactiveNode classes into proxy-free managed classes.", "author": "Ryan Bliss", "private": false, @@ -28,7 +28,7 @@ }, "peerDependencies": { "@babel/core": "^7.0.0", - "@retreejs/core": "0.11.0" + "@retreejs/core": "0.11.1" }, "repository": { "directory": "packages/retree-babel-plugin-compiler", diff --git a/packages/retree-benchmark-cli/package.json b/packages/retree-benchmark-cli/package.json index bc1a4a7..b252671 100644 --- a/packages/retree-benchmark-cli/package.json +++ b/packages/retree-benchmark-cli/package.json @@ -19,8 +19,8 @@ }, "dependencies": { "@inquirer/prompts": "^7.0.0", - "@retreejs/core": "0.11.0", - "@retreejs/react": "0.11.0", + "@retreejs/core": "0.11.1", + "@retreejs/react": "0.11.1", "jsdom": "^26.1.0", "react": "^19.2.5", "react-dom": "^19.2.5" diff --git a/packages/retree-convex/CHANGELOG.md b/packages/retree-convex/CHANGELOG.md index 27f8b18..a7a1bea 100644 --- a/packages/retree-convex/CHANGELOG.md +++ b/packages/retree-convex/CHANGELOG.md @@ -1,5 +1,7 @@ # @retreejs/convex +## 0.11.1 + ## 0.11.0 ## 0.10.4 diff --git a/packages/retree-convex/package.json b/packages/retree-convex/package.json index f37aa00..267da82 100644 --- a/packages/retree-convex/package.json +++ b/packages/retree-convex/package.json @@ -1,6 +1,6 @@ { "name": "@retreejs/convex", - "version": "0.11.0", + "version": "0.11.1", "description": "Sync Convex queries into Retree reactive nodes.", "author": "Ryan Bliss", "private": false, @@ -15,15 +15,15 @@ "publish:package": "dotenv -e .env -- npm publish --access public" }, "devDependencies": { - "@retreejs/core": "0.11.0", - "@retreejs/query": "0.11.0", + "@retreejs/core": "0.11.1", + "@retreejs/query": "0.11.1", "convex": "^1.39.1", "dotenv-cli": "^11.0.0", "typescript": "^6.0.2" }, "peerDependencies": { - "@retreejs/core": "0.11.0", - "@retreejs/query": "0.11.0", + "@retreejs/core": "0.11.1", + "@retreejs/query": "0.11.1", "convex": "^1.39.1" }, "repository": { diff --git a/packages/retree-core/CHANGELOG.md b/packages/retree-core/CHANGELOG.md index 3839b94..911b51f 100644 --- a/packages/retree-core/CHANGELOG.md +++ b/packages/retree-core/CHANGELOG.md @@ -1,5 +1,17 @@ # @retreejs/core +## 0.11.1 + +### Patch Changes + +- 36a2f1c: An explicit `equals` now decides whether the tracked forms of `Retree.select` and `useSelect` notify. + + When a tracked selector re-ran because a dependency changed, both forms notified (and `useSelect` re-rendered) even when the `equals` option reported the previous and next selections equal. The dependency check existed so a selector returning a stable node reference still notifies when that node's content changes; it now applies only to the default comparison. With `equals` supplied, a re-run whose result compares equal keeps the previous reference and stays silent, which is what lets a component select a derived value such as a sorted order and re-render only when that order changes. + +- b3d7872: `useNode`, `useTree`, `useRaw`, `useSelect`, and `Retree.select` now name themselves when they receive a value that is not a Retree node. + + Passing an unmanaged value to one of these APIs used to throw Retree's internal invariant, which reported an unproxied object and asked the caller to file a Retree issue — even though the value came straight from application code. The error now names the API that received it and what arrived instead, for example: `useRaw: expected a Retree-managed node but received an unmanaged array. Pass an object returned by Retree.root(...) or read a child from an existing Retree tree.` The internal invariant still covers values that reach the base-proxy lookup through an internal path. + ## 0.11.0 ### Minor Changes diff --git a/packages/retree-core/package.json b/packages/retree-core/package.json index 19b0630..20d9bd1 100644 --- a/packages/retree-core/package.json +++ b/packages/retree-core/package.json @@ -1,6 +1,6 @@ { "name": "@retreejs/core", - "version": "0.11.0", + "version": "0.11.1", "description": "React to changes in your object trees.", "author": "Ryan Bliss", "private": false, diff --git a/packages/retree-create/CHANGELOG.md b/packages/retree-create/CHANGELOG.md index 8c1bbdf..252c057 100644 --- a/packages/retree-create/CHANGELOG.md +++ b/packages/retree-create/CHANGELOG.md @@ -1,5 +1,7 @@ # @retreejs/create +## 0.11.1 + ## 0.11.0 ### Minor Changes diff --git a/packages/retree-create/package.json b/packages/retree-create/package.json index 92be72d..d5a55d9 100644 --- a/packages/retree-create/package.json +++ b/packages/retree-create/package.json @@ -1,6 +1,6 @@ { "name": "@retreejs/create", - "version": "0.11.0", + "version": "0.11.1", "description": "Interactive installer that adds Retree packages to an existing project.", "author": "Ryan Bliss", "license": "MIT", diff --git a/packages/retree-devtools/CHANGELOG.md b/packages/retree-devtools/CHANGELOG.md index fbd075a..a42fc1f 100644 --- a/packages/retree-devtools/CHANGELOG.md +++ b/packages/retree-devtools/CHANGELOG.md @@ -1,5 +1,7 @@ # @retreejs/devtools +## 0.11.1 + ## 0.11.0 ## 0.10.4 diff --git a/packages/retree-devtools/package.json b/packages/retree-devtools/package.json index 8ae8c4d..3fd445a 100644 --- a/packages/retree-devtools/package.json +++ b/packages/retree-devtools/package.json @@ -1,6 +1,6 @@ { "name": "@retreejs/devtools", - "version": "0.11.0", + "version": "0.11.1", "description": "Redux DevTools bridge and structured change-log taps for Retree reactive state.", "author": "Ryan Bliss", "private": false, @@ -16,12 +16,12 @@ "publish:package": "dotenv -e .env -- npm publish --access public" }, "devDependencies": { - "@retreejs/core": "0.11.0", + "@retreejs/core": "0.11.1", "dotenv-cli": "^11.0.0", "typescript": "^6.0.2" }, "peerDependencies": { - "@retreejs/core": "0.11.0" + "@retreejs/core": "0.11.1" }, "repository": { "directory": "packages/retree-devtools", diff --git a/packages/retree-query/CHANGELOG.md b/packages/retree-query/CHANGELOG.md index 0a5dac7..97d3f5a 100644 --- a/packages/retree-query/CHANGELOG.md +++ b/packages/retree-query/CHANGELOG.md @@ -1,5 +1,7 @@ # @retreejs/query +## 0.11.1 + ## 0.11.0 ## 0.10.4 diff --git a/packages/retree-query/package.json b/packages/retree-query/package.json index ff454c7..4938141 100644 --- a/packages/retree-query/package.json +++ b/packages/retree-query/package.json @@ -1,6 +1,6 @@ { "name": "@retreejs/query", - "version": "0.11.0", + "version": "0.11.1", "description": "Backend-agnostic async query nodes for Retree reactive state.", "author": "Ryan Bliss", "private": false, @@ -16,12 +16,12 @@ "publish:package": "dotenv -e .env -- npm publish --access public" }, "devDependencies": { - "@retreejs/core": "0.11.0", + "@retreejs/core": "0.11.1", "dotenv-cli": "^11.0.0", "typescript": "^6.0.2" }, "peerDependencies": { - "@retreejs/core": "0.11.0" + "@retreejs/core": "0.11.1" }, "repository": { "directory": "packages/retree-query", diff --git a/packages/retree-react-convex/CHANGELOG.md b/packages/retree-react-convex/CHANGELOG.md index 4c816f7..84cbd15 100644 --- a/packages/retree-react-convex/CHANGELOG.md +++ b/packages/retree-react-convex/CHANGELOG.md @@ -1,5 +1,7 @@ # @retreejs/react-convex +## 0.11.1 + ## 0.11.0 ## 0.10.4 diff --git a/packages/retree-react-convex/package.json b/packages/retree-react-convex/package.json index fdcea49..584fcbd 100644 --- a/packages/retree-react-convex/package.json +++ b/packages/retree-react-convex/package.json @@ -1,6 +1,6 @@ { "name": "@retreejs/react-convex", - "version": "0.11.0", + "version": "0.11.1", "description": "Use ConvexReactClient with Retree Convex nodes.", "author": "Ryan Bliss", "license": "MIT", @@ -16,13 +16,13 @@ "publish:package": "dotenv -e .env -- npm publish --access public" }, "devDependencies": { - "@retreejs/convex": "0.11.0", + "@retreejs/convex": "0.11.1", "convex": "^1.39.1", "dotenv-cli": "^11.0.0", "typescript": "^6.0.2" }, "peerDependencies": { - "@retreejs/convex": "0.11.0", + "@retreejs/convex": "0.11.1", "convex": "^1.39.1" }, "repository": { diff --git a/packages/retree-react/CHANGELOG.md b/packages/retree-react/CHANGELOG.md index 2a70067..674f6b8 100644 --- a/packages/retree-react/CHANGELOG.md +++ b/packages/retree-react/CHANGELOG.md @@ -1,5 +1,17 @@ # @retreejs/react +## 0.11.1 + +### Patch Changes + +- 36a2f1c: An explicit `equals` now decides whether the tracked forms of `Retree.select` and `useSelect` notify. + + When a tracked selector re-ran because a dependency changed, both forms notified (and `useSelect` re-rendered) even when the `equals` option reported the previous and next selections equal. The dependency check existed so a selector returning a stable node reference still notifies when that node's content changes; it now applies only to the default comparison. With `equals` supplied, a re-run whose result compares equal keeps the previous reference and stays silent, which is what lets a component select a derived value such as a sorted order and re-render only when that order changes. + +- b3d7872: `useNode`, `useTree`, `useRaw`, `useSelect`, and `Retree.select` now name themselves when they receive a value that is not a Retree node. + + Passing an unmanaged value to one of these APIs used to throw Retree's internal invariant, which reported an unproxied object and asked the caller to file a Retree issue — even though the value came straight from application code. The error now names the API that received it and what arrived instead, for example: `useRaw: expected a Retree-managed node but received an unmanaged array. Pass an object returned by Retree.root(...) or read a child from an existing Retree tree.` The internal invariant still covers values that reach the base-proxy lookup through an internal path. + ## 0.11.0 ## 0.10.4 diff --git a/packages/retree-react/package.json b/packages/retree-react/package.json index 322f00f..24a2fba 100644 --- a/packages/retree-react/package.json +++ b/packages/retree-react/package.json @@ -1,6 +1,6 @@ { "name": "@retreejs/react", - "version": "0.11.0", + "version": "0.11.1", "description": "Easily build stateful React applications using familiar JavaScript patterns.", "author": "Ryan Bliss", "license": "MIT", @@ -18,7 +18,7 @@ "@babel/core": "^7.29.0", "@babel/plugin-transform-modules-commonjs": "^7.28.0", "@babel/preset-react": "^7.27.0", - "@retreejs/core": "0.11.0", + "@retreejs/core": "0.11.1", "@types/react": "^19.2.3", "@types/react-dom": "^19.2.3", "@types/use-sync-external-store": "^1.5.0", @@ -27,7 +27,7 @@ "typescript": "^6.0.2" }, "peerDependencies": { - "@retreejs/core": "0.11.0", + "@retreejs/core": "0.11.1", "react": "^16.8.0 || ^17 || ^18 || ^19", "react-dom": "^16.8.0 || ^17 || ^18 || ^19" },