@coinbase/cds-common 8.66.0 → 8.66.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -8,6 +8,20 @@ All notable changes to this project will be documented in this file.
8
8
 
9
9
  <!-- template-start -->
10
10
 
11
+ ## 8.66.2 (4/28/2026 PST)
12
+
13
+ #### 🐞 Fixes
14
+
15
+ - Fix: React 19 compatibility issue with useMergeRefs. [[#650](https://github.com/coinbase/cds/pull/650)]
16
+
17
+ ## 8.66.1 ((4/27/2026, 12:59 PM PST))
18
+
19
+ This is an artificial version bump with no new change.
20
+
21
+ #### 📘 Misc
22
+
23
+ - Fix incorrect sample data for docs. [[#502](https://github.com/coinbase/cds/pull/502)]
24
+
11
25
  ## 8.66.0 ((4/16/2026, 01:57 PM PST))
12
26
 
13
27
  This is an artificial version bump with no new change.
@@ -1,3 +1,16 @@
1
+ /**
2
+ * Merges multiple refs into a single ref callback. Supports both callback refs
3
+ * and object refs. `null`/`undefined` refs are ignored.
4
+ *
5
+ * The returned callback is referentially stable across renders as long as the
6
+ * underlying refs themselves are stable. This is critical under React 19,
7
+ * which schedules a detach (`oldRef(null)`) followed by an attach
8
+ * (`newRef(node)`) every time a ref-callback's identity changes. Without
9
+ * `useCallback` here, every render would create a new merged callback,
10
+ * triggering React 19's detach/attach lifecycle and — when one of the merged
11
+ * refs synchronously sets state during attach/detach — an infinite update
12
+ * loop ending in `Maximum update depth exceeded`.
13
+ */
1
14
  export declare const useMergeRefs: <T = any>(
2
15
  ...refs: (React.MutableRefObject<T> | React.LegacyRef<T> | undefined | null)[]
3
16
  ) => React.RefCallback<T>;
@@ -1 +1 @@
1
- {"version":3,"file":"useMergeRefs.d.ts","sourceRoot":"","sources":["../../src/hooks/useMergeRefs.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,YAAY,GAAI,CAAC,GAAG,GAAG,EAClC,GAAG,MAAM,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,SAAS,GAAG,IAAI,CAAC,EAAE,KAC7E,KAAK,CAAC,WAAW,CAAC,CAAC,CAUrB,CAAC"}
1
+ {"version":3,"file":"useMergeRefs.d.ts","sourceRoot":"","sources":["../../src/hooks/useMergeRefs.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;;GAYG;AACH,eAAO,MAAM,YAAY,GAAI,CAAC,GAAG,GAAG,EAClC,GAAG,MAAM,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,SAAS,GAAG,IAAI,CAAC,EAAE,KAC7E,KAAK,CAAC,WAAW,CAAC,CAAC,CAiBrB,CAAC"}
@@ -1,8 +1,23 @@
1
+ import { useCallback } from 'react';
2
+
3
+ /**
4
+ * Merges multiple refs into a single ref callback. Supports both callback refs
5
+ * and object refs. `null`/`undefined` refs are ignored.
6
+ *
7
+ * The returned callback is referentially stable across renders as long as the
8
+ * underlying refs themselves are stable. This is critical under React 19,
9
+ * which schedules a detach (`oldRef(null)`) followed by an attach
10
+ * (`newRef(node)`) every time a ref-callback's identity changes. Without
11
+ * `useCallback` here, every render would create a new merged callback,
12
+ * triggering React 19's detach/attach lifecycle and — when one of the merged
13
+ * refs synchronously sets state during attach/detach — an infinite update
14
+ * loop ending in `Maximum update depth exceeded`.
15
+ */
1
16
  export const useMergeRefs = function () {
2
17
  for (var _len = arguments.length, refs = new Array(_len), _key = 0; _key < _len; _key++) {
3
18
  refs[_key] = arguments[_key];
4
19
  }
5
- return value => {
20
+ return useCallback(value => {
6
21
  refs.forEach(ref => {
7
22
  if (typeof ref === 'function') {
8
23
  ref(value);
@@ -10,5 +25,10 @@ export const useMergeRefs = function () {
10
25
  ref.current = value;
11
26
  }
12
27
  });
13
- };
28
+ },
29
+ // The deps are the spread refs themselves. React's `useCallback` shallow-
30
+ // compares each element of the deps array, so the returned callback stays
31
+ // stable when each underlying ref keeps the same identity across renders.
32
+ // eslint-disable-next-line react-hooks/exhaustive-deps
33
+ refs);
14
34
  };
@@ -5899,7 +5899,7 @@ export const asset = {
5899
5899
  price: '1236.15',
5900
5900
  timestamp: '2017-04-21T00:00:00Z'
5901
5901
  }, {
5902
- price: '0.06',
5902
+ price: '1173.74',
5903
5903
  timestamp: '2017-04-15T00:00:00Z'
5904
5904
  }, {
5905
5905
  price: '1210',
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@coinbase/cds-common",
3
- "version": "8.66.0",
3
+ "version": "8.66.2",
4
4
  "description": "Coinbase Design System - Common",
5
5
  "repository": {
6
6
  "type": "git",
@@ -38,9 +38,9 @@
38
38
  "react-dom": "^18.3.1"
39
39
  },
40
40
  "dependencies": {
41
- "@coinbase/cds-icons": "^5.15.0",
41
+ "@coinbase/cds-icons": "^5.16.0",
42
42
  "@coinbase/cds-illustrations": "^4.38.0",
43
- "@coinbase/cds-mcp-server": "^8.66.0",
43
+ "@coinbase/cds-mcp-server": "^8.66.2",
44
44
  "@coinbase/cds-utils": "^2.3.5",
45
45
  "@modelcontextprotocol/sdk": "^1.13.1",
46
46
  "d3-array": "^3.2.4",