@replicast/react 1.0.0-rc.6 → 1.0.0-rc.8

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.
@@ -1,8 +1,11 @@
1
1
  import type { App, StoreConstructors, StoreInstances, ConnectOptions } from '@replicast/core';
2
2
  import type { WsClient } from '@replicast/core';
3
3
  import type { ConnectionState } from './connection-store.js';
4
+ import type { UseEntities } from './use-entities.js';
4
5
  type ConnectReactRPC<TStores extends StoreConstructors> = {
5
6
  useConnection: () => ConnectionState;
7
+ /** Reactive view of the entities this client can currently see, e.g. `rpc.useEntities(Ship)`. */
8
+ useEntities: UseEntities;
6
9
  } & {
7
10
  [K in keyof TStores as `use${Capitalize<string & K>}`]: () => InstanceType<TStores[K]>;
8
11
  };
@@ -1 +1 @@
1
- {"version":3,"file":"connect-react.d.ts","sourceRoot":"","sources":["../src/connect-react.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,GAAG,EAAE,iBAAiB,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAA;AAC7F,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAA;AAE/C,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAA;AAE5D,KAAK,eAAe,CAAC,OAAO,SAAS,iBAAiB,IAAI;IACxD,aAAa,EAAE,MAAM,eAAe,CAAA;CACrC,GAAG;KACD,CAAC,IAAI,MAAM,OAAO,IAAI,MAAM,UAAU,CAAC,MAAM,GAAG,CAAC,CAAC,EAAE,GAAG,MAAM,YAAY,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;CACvF,CAAA;AAED,KAAK,kBAAkB,CAAC,OAAO,SAAS,iBAAiB,EAAE,QAAQ,SAAS,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,IAAI;IACpG,MAAM,EAAE,QAAQ,CAAA;IAChB,GAAG,EAAE,eAAe,CAAC,OAAO,CAAC,CAAA;IAC7B,MAAM,EAAE,cAAc,CAAC,OAAO,CAAC,CAAA;IAC/B,OAAO,EAAE,QAAQ,CAAA;CAClB,CAAA;AAED,wBAAgB,YAAY,CAC1B,OAAO,SAAS,iBAAiB,EACjC,QAAQ,SAAS,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAEvC,GAAG,EAAE,GAAG,CAAC,OAAO,EAAE,QAAQ,CAAC,EAC3B,OAAO,EAAE,cAAc,GACtB,kBAAkB,CAAC,OAAO,EAAE,QAAQ,CAAC,CAWvC"}
1
+ {"version":3,"file":"connect-react.d.ts","sourceRoot":"","sources":["../src/connect-react.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,GAAG,EAAE,iBAAiB,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAA;AAC7F,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAA;AAE/C,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAA;AAC5D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAA;AAEpD,KAAK,eAAe,CAAC,OAAO,SAAS,iBAAiB,IAAI;IACxD,aAAa,EAAE,MAAM,eAAe,CAAA;IACpC,iGAAiG;IACjG,WAAW,EAAE,WAAW,CAAA;CACzB,GAAG;KACD,CAAC,IAAI,MAAM,OAAO,IAAI,MAAM,UAAU,CAAC,MAAM,GAAG,CAAC,CAAC,EAAE,GAAG,MAAM,YAAY,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;CACvF,CAAA;AAED,KAAK,kBAAkB,CAAC,OAAO,SAAS,iBAAiB,EAAE,QAAQ,SAAS,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,IAAI;IACpG,MAAM,EAAE,QAAQ,CAAA;IAChB,GAAG,EAAE,eAAe,CAAC,OAAO,CAAC,CAAA;IAC7B,MAAM,EAAE,cAAc,CAAC,OAAO,CAAC,CAAA;IAC/B,OAAO,EAAE,QAAQ,CAAA;CAClB,CAAA;AAED,wBAAgB,YAAY,CAC1B,OAAO,SAAS,iBAAiB,EACjC,QAAQ,SAAS,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAEvC,GAAG,EAAE,GAAG,CAAC,OAAO,EAAE,QAAQ,CAAC,EAC3B,OAAO,EAAE,cAAc,GACtB,kBAAkB,CAAC,OAAO,EAAE,QAAQ,CAAC,CAWvC"}
@@ -1 +1 @@
1
- {"version":3,"file":"connect-react.js","sourceRoot":"","sources":["../src/connect-react.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAA;AAgBvC,MAAM,UAAU,YAAY,CAI1B,GAA2B,EAC3B,OAAuB;IAEvB,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC,CAAA;IACxD,MAAM,YAAY,GAAG,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,QAAQ,CAAC,EAAE,EAAE,CAAC,CAAC;QACrE,IAAI;QACJ,QAAQ,EAAE,QAAkB;KAC7B,CAAC,CAAC,CAAA;IACH,0FAA0F;IAC1F,wFAAwF;IACxF,6EAA6E;IAC7E,MAAM,GAAG,GAAG,OAAO,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,YAAY,EAAE,CAAwC,CAAA;IAC5F,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,CAAA;AACzC,CAAC"}
1
+ {"version":3,"file":"connect-react.js","sourceRoot":"","sources":["../src/connect-react.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAA;AAmBvC,MAAM,UAAU,YAAY,CAI1B,GAA2B,EAC3B,OAAuB;IAEvB,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC,CAAA;IACxD,MAAM,YAAY,GAAG,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,QAAQ,CAAC,EAAE,EAAE,CAAC,CAAC;QACrE,IAAI;QACJ,QAAQ,EAAE,QAAkB;KAC7B,CAAC,CAAC,CAAA;IACH,0FAA0F;IAC1F,wFAAwF;IACxF,6EAA6E;IAC7E,MAAM,GAAG,GAAG,OAAO,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,YAAY,EAAE,CAAwC,CAAA;IAC5F,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,CAAA;AACzC,CAAC"}
package/dist/index.d.ts CHANGED
@@ -1,4 +1,6 @@
1
1
  export { initRPC } from './init-rpc.js';
2
2
  export type { ConnectionState, ConnectionStatus, ConnectionQuality } from './connection-store.js';
3
3
  export { connectReact } from './connect-react.js';
4
+ export { createUseEntities } from './use-entities.js';
5
+ export type { EntityRegistryLike, UseEntities } from './use-entities.js';
4
6
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAA;AACvC,YAAY,EAAE,eAAe,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAA;AACjG,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAA;AACvC,YAAY,EAAE,eAAe,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAA;AACjG,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAA;AACjD,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAA;AACrD,YAAY,EAAE,kBAAkB,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAA"}
package/dist/index.js CHANGED
@@ -1,3 +1,4 @@
1
1
  export { initRPC } from './init-rpc.js';
2
2
  export { connectReact } from './connect-react.js';
3
+ export { createUseEntities } from './use-entities.js';
3
4
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAA;AAEvC,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAA"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAA;AAEvC,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAA;AACjD,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAA"}
@@ -1,3 +1,4 @@
1
+ import type { EntityRegistryLike, UseEntities } from './use-entities.js';
1
2
  interface StoreEntry {
2
3
  instance: object;
3
4
  name: string;
@@ -9,12 +10,15 @@ interface InitRPCOptions {
9
10
  quality: any;
10
11
  onStatusChange?: (status: any) => void;
11
12
  onLatencyChange?: (latency: number, quality: any) => void;
13
+ /** Present on every WsClient; absent on hand-rolled stubs. */
14
+ entities?: EntityRegistryLike;
12
15
  };
13
16
  stores: StoreEntry[];
14
17
  }
15
18
  type UseStoreHook<T extends object> = () => T;
16
19
  type RPCResult<Stores extends StoreEntry[]> = {
17
20
  useConnection: () => import('./connection-store.js').ConnectionState;
21
+ useEntities: UseEntities;
18
22
  } & {
19
23
  [K in Stores[number] as `use${K['name']}`]: UseStoreHook<K['instance'] & object>;
20
24
  };
@@ -1 +1 @@
1
- {"version":3,"file":"init-rpc.d.ts","sourceRoot":"","sources":["../src/init-rpc.ts"],"names":[],"mappings":"AAIA,UAAU,UAAU;IAClB,QAAQ,EAAE,MAAM,CAAA;IAChB,IAAI,EAAE,MAAM,CAAA;CACb;AAED,UAAU,cAAc;IACtB,MAAM,EAAE;QACN,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAA;QACvB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAA;QACtB,OAAO,EAAE,GAAG,CAAA;QACZ,cAAc,CAAC,EAAE,CAAC,MAAM,EAAE,GAAG,KAAK,IAAI,CAAA;QACtC,eAAe,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,KAAK,IAAI,CAAA;KAC1D,CAAA;IACD,MAAM,EAAE,UAAU,EAAE,CAAA;CACrB;AAED,KAAK,YAAY,CAAC,CAAC,SAAS,MAAM,IAAI,MAAM,CAAC,CAAA;AAE7C,KAAK,SAAS,CAAC,MAAM,SAAS,UAAU,EAAE,IAAI;IAC5C,aAAa,EAAE,MAAM,OAAO,uBAAuB,EAAE,eAAe,CAAA;CACrE,GAAG;KACD,CAAC,IAAI,MAAM,CAAC,MAAM,CAAC,IAAI,MAAM,CAAC,CAAC,MAAM,CAAC,EAAE,GAAG,YAAY,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,MAAM,CAAC;CACjF,CAAA;AAED,wBAAgB,OAAO,CAAC,KAAK,CAAC,MAAM,SAAS,UAAU,EAAE,EACvD,OAAO,EAAE;IAAE,MAAM,EAAE,cAAc,CAAC,QAAQ,CAAC,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GAC5D,SAAS,CAAC,MAAM,CAAC,CAuDnB"}
1
+ {"version":3,"file":"init-rpc.d.ts","sourceRoot":"","sources":["../src/init-rpc.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,kBAAkB,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAA;AAExE,UAAU,UAAU;IAClB,QAAQ,EAAE,MAAM,CAAA;IAChB,IAAI,EAAE,MAAM,CAAA;CACb;AAED,UAAU,cAAc;IACtB,MAAM,EAAE;QACN,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAA;QACvB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAA;QACtB,OAAO,EAAE,GAAG,CAAA;QACZ,cAAc,CAAC,EAAE,CAAC,MAAM,EAAE,GAAG,KAAK,IAAI,CAAA;QACtC,eAAe,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,KAAK,IAAI,CAAA;QACzD,8DAA8D;QAC9D,QAAQ,CAAC,EAAE,kBAAkB,CAAA;KAC9B,CAAA;IACD,MAAM,EAAE,UAAU,EAAE,CAAA;CACrB;AAED,KAAK,YAAY,CAAC,CAAC,SAAS,MAAM,IAAI,MAAM,CAAC,CAAA;AAE7C,KAAK,SAAS,CAAC,MAAM,SAAS,UAAU,EAAE,IAAI;IAC5C,aAAa,EAAE,MAAM,OAAO,uBAAuB,EAAE,eAAe,CAAA;IACpE,WAAW,EAAE,WAAW,CAAA;CACzB,GAAG;KACD,CAAC,IAAI,MAAM,CAAC,MAAM,CAAC,IAAI,MAAM,CAAC,CAAC,MAAM,CAAC,EAAE,GAAG,YAAY,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,MAAM,CAAC;CACjF,CAAA;AAED,wBAAgB,OAAO,CAAC,KAAK,CAAC,MAAM,SAAS,UAAU,EAAE,EACvD,OAAO,EAAE;IAAE,MAAM,EAAE,cAAc,CAAC,QAAQ,CAAC,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GAC5D,SAAS,CAAC,MAAM,CAAC,CA0DnB"}
package/dist/init-rpc.js CHANGED
@@ -1,6 +1,7 @@
1
1
  import { create } from 'zustand';
2
2
  import { createConnectionStore } from './connection-store.js';
3
3
  import { createUseConnection } from './use-connection.js';
4
+ import { createUseEntities } from './use-entities.js';
4
5
  export function initRPC(options) {
5
6
  const { client, stores } = options;
6
7
  // Set up connection Zustand store
@@ -22,9 +23,9 @@ export function initRPC(options) {
22
23
  : Object.fromEntries(Object.entries(instance)
23
24
  .filter(([k, v]) => !k.startsWith('_') && v !== undefined));
24
25
  const zustandStore = create(() => ({ ...initialState }));
25
- // Wire up _onReplication to update the Zustand store if instance is a BaseStore.
26
- // Always overwrite to ensure re-wiring on a second initRPC call is consistent.
27
- maybeStore._onReplication = (batch) => {
26
+ // Subscribe to replication batches (multi-listener) so the game loop can subscribe too;
27
+ // falls back to the legacy single slot for stores without subscribe().
28
+ const onBatch = (batch) => {
28
29
  const update = {};
29
30
  if (batch.global && Object.keys(batch.global).length > 0) {
30
31
  Object.assign(update, batch.global);
@@ -39,10 +40,15 @@ export function initRPC(options) {
39
40
  zustandStore.setState(update);
40
41
  }
41
42
  };
43
+ if (typeof maybeStore.subscribe === 'function')
44
+ maybeStore.subscribe(onBatch);
45
+ else
46
+ maybeStore._onReplication = onBatch;
42
47
  storeHooks[`use${name[0].toUpperCase() + name.slice(1)}`] = () => zustandStore();
43
48
  }
44
49
  return {
45
50
  useConnection: createUseConnection(connectionStore),
51
+ useEntities: createUseEntities(client.entities),
46
52
  ...storeHooks,
47
53
  };
48
54
  }
@@ -1 +1 @@
1
- {"version":3,"file":"init-rpc.js","sourceRoot":"","sources":["../src/init-rpc.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"init-rpc.js","sourceRoot":"","sources":["../src/init-rpc.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ /** The slice of `client.entities` this hook needs. Structural so it is easy to stub in tests. */
2
+ export interface EntityRegistryLike {
3
+ subscribe(listener: () => void): () => void;
4
+ byType<T extends object>(Type: new () => T): T[];
5
+ }
6
+ export type UseEntities = <T extends object>(Type: new () => T) => T[];
7
+ /**
8
+ * Builds the `useEntities(Ship)` hook for one client's entity registry. The registry returns a
9
+ * referentially stable array per type until something changes, so React re-renders only on real
10
+ * enter / update / leave transitions.
11
+ */
12
+ export declare function createUseEntities(registry?: EntityRegistryLike): UseEntities;
13
+ //# sourceMappingURL=use-entities.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-entities.d.ts","sourceRoot":"","sources":["../src/use-entities.ts"],"names":[],"mappings":"AAEA,iGAAiG;AACjG,MAAM,WAAW,kBAAkB;IACjC,SAAS,CAAC,QAAQ,EAAE,MAAM,IAAI,GAAG,MAAM,IAAI,CAAA;IAC3C,MAAM,CAAC,CAAC,SAAS,MAAM,EAAE,IAAI,EAAE,UAAU,CAAC,GAAG,CAAC,EAAE,CAAA;CACjD;AAED,MAAM,MAAM,WAAW,GAAG,CAAC,CAAC,SAAS,MAAM,EAAE,IAAI,EAAE,UAAU,CAAC,KAAK,CAAC,EAAE,CAAA;AAYtE;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,QAAQ,GAAE,kBAAkC,GAAG,WAAW,CAM3F"}
@@ -0,0 +1,23 @@
1
+ import { useCallback, useSyncExternalStore } from 'react';
2
+ /**
3
+ * An empty stand-in for clients created without any entity types. The snapshot must be the same
4
+ * array every call, or useSyncExternalStore re-renders forever.
5
+ */
6
+ const noEntities = [];
7
+ const emptyRegistry = {
8
+ subscribe: () => () => { },
9
+ byType: () => noEntities,
10
+ };
11
+ /**
12
+ * Builds the `useEntities(Ship)` hook for one client's entity registry. The registry returns a
13
+ * referentially stable array per type until something changes, so React re-renders only on real
14
+ * enter / update / leave transitions.
15
+ */
16
+ export function createUseEntities(registry = emptyRegistry) {
17
+ return function useEntities(Type) {
18
+ const subscribe = useCallback((onChange) => registry.subscribe(onChange), []);
19
+ const getSnapshot = useCallback(() => registry.byType(Type), [Type]);
20
+ return useSyncExternalStore(subscribe, getSnapshot, getSnapshot);
21
+ };
22
+ }
23
+ //# sourceMappingURL=use-entities.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-entities.js","sourceRoot":"","sources":["../src/use-entities.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,oBAAoB,EAAE,MAAM,OAAO,CAAA;AAUzD;;;GAGG;AACH,MAAM,UAAU,GAAY,EAAE,CAAA;AAC9B,MAAM,aAAa,GAAuB;IACxC,SAAS,EAAE,GAAG,EAAE,CAAC,GAAG,EAAE,GAAE,CAAC;IACzB,MAAM,EAAE,GAAG,EAAE,CAAC,UAAU;CACzB,CAAA;AAED;;;;GAIG;AACH,MAAM,UAAU,iBAAiB,CAAC,WAA+B,aAAa;IAC5E,OAAO,SAAS,WAAW,CAAmB,IAAiB;QAC7D,MAAM,SAAS,GAAG,WAAW,CAAC,CAAC,QAAoB,EAAE,EAAE,CAAC,QAAQ,CAAC,SAAS,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC,CAAA;QACzF,MAAM,WAAW,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,CAAA;QACpE,OAAO,oBAAoB,CAAC,SAAS,EAAE,WAAW,EAAE,WAAW,CAAC,CAAA;IAClE,CAAC,CAAA;AACH,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@replicast/react",
3
- "version": "1.0.0-rc.6",
3
+ "version": "1.0.0-rc.8",
4
4
  "description": "React hooks for replicast — initRPC, useConnection, and reactive per-store hooks",
5
5
  "license": "MIT",
6
6
  "type": "module",
@@ -18,17 +18,18 @@
18
18
  },
19
19
  "dependencies": {
20
20
  "@replicast/core": "*",
21
- "zustand": "^4.5.0"
21
+ "zustand": "^5.0.0"
22
22
  },
23
23
  "peerDependencies": {
24
- "react": "^18.0.0"
24
+ "react": "^18.0.0 || ^19.0.0"
25
25
  },
26
26
  "devDependencies": {
27
27
  "@testing-library/react": "^16.3.2",
28
- "@types/react": "^18.0.0",
28
+ "@types/react": "^19.0.0",
29
29
  "jsdom": "^29.1.1",
30
30
  "react": "^19.2.7",
31
31
  "react-dom": "^19.2.7",
32
- "vitest": "^1.6.0"
32
+ "vitest": "^1.6.0",
33
+ "@types/react-dom": "^19.0.0"
33
34
  }
34
35
  }