reactish-state 2.0.0-alpha.0 → 2.0.1

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.
Files changed (36) hide show
  1. package/dist/cjs/_virtual/rolldown_runtime.cjs +31 -0
  2. package/dist/cjs/index.cjs +14 -16
  3. package/dist/cjs/middleware/applyMiddleware.cjs +7 -6
  4. package/dist/cjs/middleware/immer.cjs +6 -6
  5. package/dist/cjs/middleware/index.cjs +7 -9
  6. package/dist/cjs/middleware/persist.cjs +29 -37
  7. package/dist/cjs/middleware/reduxDevtools.cjs +23 -32
  8. package/dist/cjs/plugin/applyPlugin.cjs +5 -2
  9. package/dist/cjs/plugin/index.cjs +5 -7
  10. package/dist/cjs/plugin/reduxDevtools.cjs +19 -24
  11. package/dist/cjs/react/shim.cjs +14 -4
  12. package/dist/cjs/react/useSelector.cjs +26 -23
  13. package/dist/cjs/react/useSnapshot.cjs +9 -10
  14. package/dist/cjs/shim/index.cjs +3 -5
  15. package/dist/cjs/shim/reactShim.cjs +6 -4
  16. package/dist/cjs/utils.cjs +10 -9
  17. package/dist/cjs/vanilla/selector.cjs +27 -26
  18. package/dist/cjs/vanilla/state.cjs +35 -33
  19. package/dist/esm/index.mjs +7 -5
  20. package/dist/esm/middleware/applyMiddleware.mjs +6 -6
  21. package/dist/esm/middleware/immer.mjs +5 -5
  22. package/dist/esm/middleware/index.mjs +5 -3
  23. package/dist/esm/middleware/persist.mjs +28 -37
  24. package/dist/esm/middleware/reduxDevtools.mjs +22 -32
  25. package/dist/esm/plugin/applyPlugin.mjs +4 -2
  26. package/dist/esm/plugin/index.mjs +4 -2
  27. package/dist/esm/plugin/reduxDevtools.mjs +18 -24
  28. package/dist/esm/react/shim.mjs +5 -3
  29. package/dist/esm/react/useSelector.mjs +25 -23
  30. package/dist/esm/react/useSnapshot.mjs +9 -10
  31. package/dist/esm/shim/index.mjs +3 -1
  32. package/dist/esm/shim/reactShim.mjs +4 -2
  33. package/dist/esm/utils.mjs +9 -9
  34. package/dist/esm/vanilla/selector.mjs +26 -25
  35. package/dist/esm/vanilla/state.mjs +34 -33
  36. package/package.json +32 -36
@@ -1,8 +1,8 @@
1
- const applyMiddleware = (middlewares, {
2
- fromRight
3
- } = {}) => api => middlewares[fromRight ? 'reduceRight' : 'reduce']((set, middleware) => middleware ? middleware({
4
- ...api,
5
- set
1
+ //#region src/middleware/applyMiddleware.ts
2
+ const applyMiddleware = (middlewares, { fromRight } = {}) => (api) => middlewares[fromRight ? "reduceRight" : "reduce"]((set, middleware) => middleware ? middleware({
3
+ ...api,
4
+ set
6
5
  }) : set, api.set);
7
6
 
8
- export { applyMiddleware };
7
+ //#endregion
8
+ export { applyMiddleware };
@@ -1,7 +1,7 @@
1
- import { produce } from 'immer';
1
+ import { produce } from "immer";
2
2
 
3
- const immer = ({
4
- set
5
- }) => (value, context) => set(typeof value === 'function' ? produce(value) : value, context);
3
+ //#region src/middleware/immer.ts
4
+ const immer = ({ set }) => (value, context) => set(typeof value === "function" ? produce(value) : value, context);
6
5
 
7
- export { immer };
6
+ //#endregion
7
+ export { immer };
@@ -1,3 +1,5 @@
1
- export { applyMiddleware } from './applyMiddleware.mjs';
2
- export { persist } from './persist.mjs';
3
- export { reduxDevtools } from './reduxDevtools.mjs';
1
+ import { applyMiddleware } from "./applyMiddleware.mjs";
2
+ import { persist } from "./persist.mjs";
3
+ import { reduxDevtools } from "./reduxDevtools.mjs";
4
+
5
+ export { applyMiddleware, persist, reduxDevtools };
@@ -1,39 +1,30 @@
1
- const persist = ({
2
- prefix,
3
- getStorage = () => localStorage
4
- } = {}) => {
5
- const states = [];
6
- return {
7
- middleware: ({
8
- set,
9
- get,
10
- meta
11
- }) => {
12
- let key = meta()?.key;
13
- if (process.env.NODE_ENV !== 'production' && !key) throw new Error('[reactish-state] state should be provided with a string `key` in the config object when the `persist` middleware is used.');
14
- if (prefix) key = prefix + key;
15
- states.push([key, set]);
16
- return (...args) => {
17
- set(...args);
18
- try {
19
- getStorage().setItem(key, JSON.stringify(get()));
20
- } catch (_unused) {
21
- /* continue regardless of error */
22
- }
23
- };
24
- },
25
- hydrate: () => {
26
- states.forEach(([key, set]) => {
27
- try {
28
- const value = getStorage().getItem(key);
29
- value != null && set(value !== 'undefined' ? JSON.parse(value) : undefined, `HYDRATE_${key}`);
30
- } catch (_unused2) {
31
- /* continue regardless of error */
32
- }
33
- });
34
- states.length = 0;
35
- }
36
- };
1
+ //#region src/middleware/persist.ts
2
+ const persist = ({ prefix, getStorage = () => localStorage } = {}) => {
3
+ const states = [];
4
+ return {
5
+ middleware: ({ set, get, meta }) => {
6
+ let key = meta()?.key;
7
+ if (!key) throw new Error("[reactish-state] state should be provided with a string `key` in the config object when the `persist` middleware is used.");
8
+ if (prefix) key = prefix + key;
9
+ states.push([key, set]);
10
+ return (...args) => {
11
+ set(...args);
12
+ try {
13
+ getStorage().setItem(key, JSON.stringify(get()));
14
+ } catch {}
15
+ };
16
+ },
17
+ hydrate: () => {
18
+ states.forEach(([key, set]) => {
19
+ try {
20
+ const value = getStorage().getItem(key);
21
+ if (value != null) set(value !== "undefined" ? JSON.parse(value) : void 0, `HYDRATE_${key}`);
22
+ } catch {}
23
+ });
24
+ states.length = 0;
25
+ }
26
+ };
37
27
  };
38
28
 
39
- export { persist };
29
+ //#endregion
30
+ export { persist };
@@ -1,34 +1,24 @@
1
- const reduxDevtools = ({
2
- name
3
- } = {}) => {
4
- let devtoolsExt;
5
- if (process.env.NODE_ENV === 'production' || typeof window === 'undefined' || !(devtoolsExt = window.__REDUX_DEVTOOLS_EXTENSION__)) {
6
- return;
7
- }
8
- const devtools = devtoolsExt.connect({
9
- name
10
- });
11
- const mergedState = {};
12
- return ({
13
- set,
14
- get,
15
- meta
16
- }) => {
17
- const key = meta()?.key;
18
- if (process.env.NODE_ENV !== 'production' && !key) throw new Error('[reactish-state] state should be provided with a string `key` in the config object when the `reduxDevtools` middleware is used.');
19
- mergedState[key] = get();
20
- devtools.init(mergedState);
21
- return (value, action) => {
22
- set(value, action);
23
- mergedState[key] = get();
24
- devtools.send(typeof action === 'string' ? {
25
- type: action
26
- } : action || {
27
- type: `SET_${key}`,
28
- value
29
- }, mergedState);
30
- };
31
- };
1
+ //#region src/middleware/reduxDevtools.ts
2
+ const reduxDevtools = ({ name } = {}) => {
3
+ let devtoolsExt;
4
+ if (typeof window === "undefined" || !(devtoolsExt = window.__REDUX_DEVTOOLS_EXTENSION__)) return;
5
+ const devtools = devtoolsExt.connect({ name });
6
+ const mergedState = {};
7
+ return ({ set, get, meta }) => {
8
+ const key = meta()?.key;
9
+ if (!key) throw new Error("[reactish-state] state should be provided with a string `key` in the config object when the `reduxDevtools` middleware is used.");
10
+ mergedState[key] = get();
11
+ devtools.init(mergedState);
12
+ return (value, action) => {
13
+ set(value, action);
14
+ mergedState[key] = get();
15
+ devtools.send(typeof action === "string" ? { type: action } : action || {
16
+ type: `SET_${key}`,
17
+ value
18
+ }, mergedState);
19
+ };
20
+ };
32
21
  };
33
22
 
34
- export { reduxDevtools };
23
+ //#endregion
24
+ export { reduxDevtools };
@@ -1,3 +1,5 @@
1
- const applyPlugin = plugins => selector => plugins.forEach(plugin => plugin?.(selector));
1
+ //#region src/plugin/applyPlugin.ts
2
+ const applyPlugin = (plugins) => (selector) => plugins.forEach((plugin) => plugin?.(selector));
2
3
 
3
- export { applyPlugin };
4
+ //#endregion
5
+ export { applyPlugin };
@@ -1,2 +1,4 @@
1
- export { applyPlugin } from './applyPlugin.mjs';
2
- export { reduxDevtools } from './reduxDevtools.mjs';
1
+ import { applyPlugin } from "./applyPlugin.mjs";
2
+ import { reduxDevtools } from "./reduxDevtools.mjs";
3
+
4
+ export { applyPlugin, reduxDevtools };
@@ -1,26 +1,20 @@
1
- const reduxDevtools = ({
2
- name
3
- } = {}) => {
4
- let devtoolsExt;
5
- if (process.env.NODE_ENV === 'production' || typeof window === 'undefined' || !(devtoolsExt = window.__REDUX_DEVTOOLS_EXTENSION__)) return;
6
- const devtools = devtoolsExt.connect({
7
- name
8
- });
9
- const mergedState = {};
10
- return ({
11
- get,
12
- subscribe,
13
- meta
14
- }) => {
15
- const key = meta()?.key;
16
- if (process.env.NODE_ENV !== 'production' && !key) throw new Error('[reactish-state] selector should be provided with a string `key` in the config object when the `reduxDevtools` plugin is used.');
17
- const updateState = () => {
18
- mergedState[key] = get();
19
- devtools.init(mergedState);
20
- };
21
- updateState();
22
- subscribe(updateState);
23
- };
1
+ //#region src/plugin/reduxDevtools.ts
2
+ const reduxDevtools = ({ name } = {}) => {
3
+ let devtoolsExt;
4
+ if (typeof window === "undefined" || !(devtoolsExt = window.__REDUX_DEVTOOLS_EXTENSION__)) return;
5
+ const devtools = devtoolsExt.connect({ name });
6
+ const mergedState = {};
7
+ return ({ get, subscribe, meta }) => {
8
+ const key = meta()?.key;
9
+ if (!key) throw new Error("[reactish-state] selector should be provided with a string `key` in the config object when the `reduxDevtools` plugin is used.");
10
+ const updateState = () => {
11
+ mergedState[key] = get();
12
+ devtools.init(mergedState);
13
+ };
14
+ updateState();
15
+ subscribe(updateState);
16
+ };
24
17
  };
25
18
 
26
- export { reduxDevtools };
19
+ //#endregion
20
+ export { reduxDevtools };
@@ -1,8 +1,10 @@
1
- import React from 'react';
1
+ import React from "react";
2
2
 
3
+ //#region src/react/shim.ts
3
4
  let useSyncExternalStore = React.useSyncExternalStore;
4
5
  const setReactShim = ([shim]) => {
5
- useSyncExternalStore = shim;
6
+ useSyncExternalStore = shim;
6
7
  };
7
8
 
8
- export { setReactShim, useSyncExternalStore };
9
+ //#endregion
10
+ export { setReactShim, useSyncExternalStore };
@@ -1,27 +1,29 @@
1
- import { useState } from 'react';
2
- import { createSubscriber, getSelectorValues, isEqual } from '../utils.mjs';
3
- import { useSnapshot } from './useSnapshot.mjs';
1
+ 'use client';
4
2
 
3
+ import { createSubscriber, getSelectorValues, isEqual } from "../utils.mjs";
4
+ import { useSnapshot } from "./useSnapshot.mjs";
5
+ import { useState } from "react";
6
+
7
+ //#region src/react/useSelector.ts
5
8
  const useSelector = (selectorParamFactory, deps) => {
6
- const items = selectorParamFactory();
7
- const cutoff = items.length - 1;
8
- const selectorFunc = items[cutoff];
9
- items.length = cutoff;
10
- const [context] = useState(() =>
11
- // eslint-disable-next-line no-sparse-arrays
12
- [, createSubscriber(items)]);
13
- return useSnapshot({
14
- get: () => {
15
- const [cache] = context;
16
- const selectorValues = getSelectorValues(items);
17
- const args = selectorValues.concat(deps || selectorFunc);
18
- if (cache && isEqual(args, cache[0])) return cache[1];
19
- const value = selectorFunc(...selectorValues);
20
- context[0] = [args, value];
21
- return value;
22
- },
23
- subscribe: context[1]
24
- });
9
+ const items = selectorParamFactory();
10
+ const cutoff = items.length - 1;
11
+ const selectorFunc = items[cutoff];
12
+ items.length = cutoff;
13
+ const [context] = useState(() => [, createSubscriber(items)]);
14
+ return useSnapshot({
15
+ get: () => {
16
+ const [cache] = context;
17
+ const selectorValues = getSelectorValues(items);
18
+ const args = selectorValues.concat(deps || selectorFunc);
19
+ if (cache && isEqual(args, cache[0])) return cache[1];
20
+ const value = selectorFunc(...selectorValues);
21
+ context[0] = [args, value];
22
+ return value;
23
+ },
24
+ subscribe: context[1]
25
+ });
25
26
  };
26
27
 
27
- export { useSelector };
28
+ //#endregion
29
+ export { useSelector };
@@ -1,13 +1,12 @@
1
- import { useSyncExternalStore } from './shim.mjs';
1
+ 'use client';
2
2
 
3
- const useSnapshot = ({
4
- subscribe,
5
- get
6
- }) => {
7
- if (process.env.NODE_ENV !== 'production' && !useSyncExternalStore) {
8
- throw new Error('[reactish-state] Shim setup is required for React 16/17. See: https://github.com/szhsin/reactish-state/tree/master?tab=readme-ov-file#react-1617-setup');
9
- }
10
- return useSyncExternalStore(subscribe, get, get);
3
+ import { useSyncExternalStore } from "./shim.mjs";
4
+
5
+ //#region src/react/useSnapshot.ts
6
+ const useSnapshot = ({ subscribe, get }) => {
7
+ if (!useSyncExternalStore) throw new Error("[reactish-state] Shim setup is required for React 16/17. See: https://github.com/szhsin/reactish-state/tree/master?tab=readme-ov-file#react-1617-setup");
8
+ return useSyncExternalStore(subscribe, get, get);
11
9
  };
12
10
 
13
- export { useSnapshot };
11
+ //#endregion
12
+ export { useSnapshot };
@@ -1 +1,3 @@
1
- export { reactShim } from './reactShim.mjs';
1
+ import { reactShim } from "./reactShim.mjs";
2
+
3
+ export { reactShim };
@@ -1,5 +1,7 @@
1
- import { useSyncExternalStore } from 'use-sync-external-store/shim/index.js';
1
+ import { useSyncExternalStore } from "use-sync-external-store/shim/index.js";
2
2
 
3
+ //#region src/shim/reactShim.ts
3
4
  const reactShim = [useSyncExternalStore];
4
5
 
5
- export { reactShim };
6
+ //#endregion
7
+ export { reactShim };
@@ -1,13 +1,13 @@
1
+ //#region src/utils.ts
1
2
  const isEqual = (args1, args2) => {
2
- for (let i = 0; i < args1.length; i++) {
3
- if (!Object.is(args1[i], args2[i])) return false;
4
- }
5
- return true;
3
+ for (let i = 0; i < args1.length; i++) if (!Object.is(args1[i], args2[i])) return false;
4
+ return true;
6
5
  };
7
- const createSubscriber = items => listener => {
8
- const unsubscribers = items.map(item => item.subscribe(listener));
9
- return () => unsubscribers.forEach(unsubscribe => unsubscribe());
6
+ const createSubscriber = (items) => (listener) => {
7
+ const unsubscribers = items.map((item) => item.subscribe(listener));
8
+ return () => unsubscribers.forEach((unsubscribe) => unsubscribe());
10
9
  };
11
- const getSelectorValues = items => items.map(item => item.get());
10
+ const getSelectorValues = (items) => items.map((item) => item.get());
12
11
 
13
- export { createSubscriber, getSelectorValues, isEqual };
12
+ //#endregion
13
+ export { createSubscriber, getSelectorValues, isEqual };
@@ -1,27 +1,28 @@
1
- import { createSubscriber, getSelectorValues, isEqual } from '../utils.mjs';
1
+ import { createSubscriber, getSelectorValues, isEqual } from "../utils.mjs";
2
2
 
3
- const selectorBuilder = plugin => (...items) => {
4
- const length = items.length;
5
- const cutoff = typeof items[length - 1] === 'function' ? length - 1 : length - 2;
6
- const selectorFunc = items[cutoff];
7
- const metadata = items[cutoff + 1];
8
- items.length = cutoff;
9
- let cache;
10
- const selector = {
11
- get: () => {
12
- const args = getSelectorValues(items);
13
- if (cache && isEqual(args, cache[0])) return cache[1];
14
- const value = selectorFunc(...args);
15
- cache = [args, value];
16
- return value;
17
- },
18
- subscribe: createSubscriber(items),
19
- meta: () => metadata
20
- };
21
- plugin?.(selector);
22
- return selector;
23
- // Wrap TSelectorMeta in a tuple to prevent conditional type distribution;
24
- };
25
- const selector = /*#__PURE__*/selectorBuilder();
3
+ //#region src/vanilla/selector.ts
4
+ const selectorBuilder = (plugin) => ((...items) => {
5
+ const length = items.length;
6
+ const cutoff = typeof items[length - 1] === "function" ? length - 1 : length - 2;
7
+ const selectorFunc = items[cutoff];
8
+ const metadata = items[cutoff + 1];
9
+ items.length = cutoff;
10
+ let cache;
11
+ const selector$1 = {
12
+ get: () => {
13
+ const args = getSelectorValues(items);
14
+ if (cache && isEqual(args, cache[0])) return cache[1];
15
+ const value = selectorFunc(...args);
16
+ cache = [args, value];
17
+ return value;
18
+ },
19
+ subscribe: createSubscriber(items),
20
+ meta: () => metadata
21
+ };
22
+ plugin?.(selector$1);
23
+ return selector$1;
24
+ });
25
+ const selector = selectorBuilder();
26
26
 
27
- export { selector, selectorBuilder };
27
+ //#endregion
28
+ export { selector, selectorBuilder };
@@ -1,34 +1,35 @@
1
- const stateBuilder = middleware => (initialValue, actionBuilder, metadata) => {
2
- let value = initialValue;
3
- const listeners = new Set();
4
- const get = () => value;
5
- const readonlyState = {
6
- get,
7
- meta: () => metadata,
8
- subscribe: listener => {
9
- listeners.add(listener);
10
- return () => listeners.delete(listener);
11
- }
12
- };
13
- let set = newValue => {
14
- const nextValue = typeof newValue === 'function' ? newValue(value) : newValue;
15
- if (!Object.is(value, nextValue)) {
16
- const prevValue = value;
17
- value = nextValue;
18
- listeners.forEach(listener => listener(nextValue, prevValue));
19
- }
20
- };
21
- if (middleware) set = middleware({
22
- ...readonlyState,
23
- set
24
- });
25
- return {
26
- ...actionBuilder?.(set, get),
27
- ...readonlyState,
28
- set
29
- };
30
- // Wrap TStateMeta in a tuple to prevent conditional type distribution
31
- };
32
- const state = /*#__PURE__*/stateBuilder();
1
+ //#region src/vanilla/state.ts
2
+ const stateBuilder = (middleware) => ((initialValue, actionBuilder, metadata) => {
3
+ let value = initialValue;
4
+ const listeners = /* @__PURE__ */ new Set();
5
+ const get = () => value;
6
+ const readonlyState = {
7
+ get,
8
+ meta: () => metadata,
9
+ subscribe: (listener) => {
10
+ listeners.add(listener);
11
+ return () => listeners.delete(listener);
12
+ }
13
+ };
14
+ let set = (newValue) => {
15
+ const nextValue = typeof newValue === "function" ? newValue(value) : newValue;
16
+ if (!Object.is(value, nextValue)) {
17
+ const prevValue = value;
18
+ value = nextValue;
19
+ listeners.forEach((listener) => listener(nextValue, prevValue));
20
+ }
21
+ };
22
+ if (middleware) set = middleware({
23
+ ...readonlyState,
24
+ set
25
+ });
26
+ return {
27
+ ...actionBuilder?.(set, get),
28
+ ...readonlyState,
29
+ set
30
+ };
31
+ });
32
+ const state = stateBuilder();
33
33
 
34
- export { state, stateBuilder };
34
+ //#endregion
35
+ export { state, stateBuilder };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "reactish-state",
3
- "version": "2.0.0-alpha.0",
3
+ "version": "2.0.1",
4
4
  "description": "Simple, decentralized (atomic) state management for React.",
5
5
  "author": "Zheng Song",
6
6
  "license": "MIT",
@@ -27,19 +27,19 @@
27
27
  "redux"
28
28
  ],
29
29
  "scripts": {
30
- "start": "run-p watch \"types -- --watch\"",
31
- "bundle": "rollup -c",
32
- "watch": "rollup -c -w",
30
+ "start": "run-p watch \"tc -- --watch\"",
31
+ "bundle": "rolldown -c",
32
+ "watch": "rolldown -w -c",
33
33
  "clean": "rm -Rf dist types",
34
- "types": "tsc",
34
+ "tc": "tsc",
35
35
  "prepare": "rm -Rf types/__tests__",
36
- "lint": "eslint .",
37
- "lint:fix": "eslint --fix .",
36
+ "lint": "oxlint --type-aware .",
37
+ "lint:es": "eslint .",
38
38
  "pret": "prettier -c .",
39
39
  "pret:fix": "prettier -w .",
40
- "build": "run-s pret clean types lint bundle",
41
- "test": "jest",
42
- "test:watch": "jest --watch",
40
+ "build": "run-s pret clean tc lint lint:es bundle",
41
+ "test": "vitest run",
42
+ "test:watch": "vitest",
43
43
  "eg": "npm run dev --prefix examples"
44
44
  },
45
45
  "exports": {
@@ -80,40 +80,36 @@
80
80
  }
81
81
  },
82
82
  "dependencies": {
83
- "use-sync-external-store": "^1.5.0"
83
+ "use-sync-external-store": "^1.6.0"
84
84
  },
85
85
  "devDependencies": {
86
- "@babel/core": "^7.28.4",
87
- "@babel/preset-env": "^7.28.3",
88
- "@babel/preset-react": "^7.27.1",
89
- "@babel/preset-typescript": "^7.27.1",
90
86
  "@redux-devtools/extension": "^3.3.0",
91
- "@rollup/plugin-babel": "^6.0.4",
92
- "@rollup/plugin-node-resolve": "^16.0.1",
93
- "@rollup/plugin-replace": "^6.0.2",
94
- "@testing-library/jest-dom": "^6.8.0",
95
- "@testing-library/react": "^16.3.0",
96
- "@types/jest": "^30.0.0",
97
- "@types/react": "^19.1.12",
87
+ "@testing-library/jest-dom": "^6.9.1",
88
+ "@testing-library/react": "^16.3.1",
89
+ "@types/node": "^25.0.3",
90
+ "@types/react": "^19.2.7",
98
91
  "@types/use-sync-external-store": "^1.5.0",
99
- "babel-plugin-pure-annotations": "^0.1.2",
92
+ "@vitest/coverage-istanbul": "^4.0.16",
93
+ "@vitest/eslint-plugin": "^1.6.4",
100
94
  "deplift": "^1.0.1",
101
- "eslint": "^9.35.0",
95
+ "eslint": "^9.39.2",
102
96
  "eslint-config-prettier": "^10.1.8",
103
- "eslint-plugin-jest": "^29.0.1",
104
97
  "eslint-plugin-react": "^7.37.5",
105
- "eslint-plugin-react-hooks": "^5.2.0",
98
+ "eslint-plugin-react-hooks": "^7.0.1",
106
99
  "eslint-plugin-react-hooks-addons": "^0.5.0",
107
- "globals": "^16.3.0",
108
- "immer": "^10.1.3",
109
- "jest": "^30.1.3",
110
- "jest-environment-jsdom": "^30.1.2",
100
+ "globals": "^16.5.0",
101
+ "immer": "^11.1.0",
102
+ "jsdom": "^27.4.0",
111
103
  "npm-run-all": "^4.1.5",
112
- "prettier": "^3.6.2",
113
- "react": "^19.1.1",
114
- "react-dom": "^19.1.1",
115
- "rollup": "^4.50.1",
116
- "typescript": "^5.9.2",
117
- "typescript-eslint": "^8.42.0"
104
+ "oxlint": "^1.35.0",
105
+ "oxlint-tsgolint": "^0.10.0",
106
+ "prettier": "^3.7.4",
107
+ "react": "^19.2.3",
108
+ "react-dom": "^19.2.3",
109
+ "rolldown": "^1.0.0-beta.57",
110
+ "rollup-plugin-add-directive": "^1.0.0",
111
+ "typescript": "^5.9.3",
112
+ "typescript-eslint": "^8.50.1",
113
+ "vitest": "^4.0.16"
118
114
  }
119
115
  }