From 46d1e63e1e832529b2511ff04adc94ce0b78435e Mon Sep 17 00:00:00 2001 From: Christian van der Loo Date: Wed, 21 Aug 2024 22:36:22 -0400 Subject: [PATCH 1/3] build(dev-deps): changeover to bun test and remove jest types --- bun.lockb | Bin 115920 -> 104840 bytes package.json | 41 +++++++++++++++++++---------------------- 2 files changed, 19 insertions(+), 22 deletions(-) diff --git a/bun.lockb b/bun.lockb index 650db5c0e1975633b8a588589113f230c3e857a0..5717637d62a5f6e3bcb675927f11d28aa9c2ee42 100755 GIT binary patch delta 18968 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 diff --git a/package.json b/package.json index 7352518..b2dc9a3 100644 --- a/package.json +++ b/package.json @@ -1,33 +1,16 @@ { "name": "zustand-computed", "version": "1.4.1", - "description": "A Zustand middleware to create computed states.", "author": "chrisvander", - "license": "MIT", + "repository": "chrisvander/zustand-computed", "main": "dist/index.js", "module": "dist/index.mjs", - "exports": { - ".": { - "import": "./dist/index.js", - "require": "./dist/index.mjs" - } - }, - "repository": "chrisvander/zustand-computed", - "files": [ - "/dist" - ], - "scripts": { - "check": "biome check --write", - "format": "biome format --write", - "lint": "biome lint", - "build": "vite build" - }, "devDependencies": { "@biomejs/biome": "^1.8.3", "@commitlint/cli": "^19.4.0", "@commitlint/config-conventional": "^19.2.2", - "@tsconfig/recommended": "^1.0.7", - "@types/jest": "^29.5.12", + "@tsconfig/bun": "^1.0.7", + "@types/bun": "^1.1.6", "@types/node": "^22.5.0", "husky": "^9.1.5", "react": "^18.3.1", @@ -41,6 +24,16 @@ "react": "^18.2.0", "zustand": "^4.3.8" }, + "exports": { + ".": { + "import": "./dist/index.js", + "require": "./dist/index.mjs" + } + }, + "description": "A Zustand middleware to create computed states.", + "files": [ + "/dist" + ], "keywords": [ "zustand", "computed", @@ -52,7 +45,11 @@ "npm", "typescript" ], - "dependencies": { - "@tsconfig/bun": "^1.0.7" + "license": "MIT", + "scripts": { + "check": "biome check --write", + "format": "biome format --write", + "lint": "biome lint", + "build": "vite build" } } From 1d0d1497246c5e99fc6fbbf145e2d07b8e572ebd Mon Sep 17 00:00:00 2001 From: Christian van der Loo Date: Wed, 21 Aug 2024 22:36:30 -0400 Subject: [PATCH 2/3] test: import from bun:test --- src/computed.test.ts | 209 ++++++++++++++++++++++--------------------- 1 file changed, 105 insertions(+), 104 deletions(-) diff --git a/src/computed.test.ts b/src/computed.test.ts index 647b586..cf274fe 100644 --- a/src/computed.test.ts +++ b/src/computed.test.ts @@ -1,34 +1,35 @@ -import { type StateCreator, create } from "zustand" -import { type ComputedStateOpts, computed } from "./computed" +import { describe, expect, test, beforeEach, mock } from "bun:test"; +import { type StateCreator, create } from "zustand"; +import { type ComputedStateOpts, computed } from "./computed"; type Store = { - count: number - x: number - y: number - inc: () => void - dec: () => void -} + count: number; + x: number; + y: number; + inc: () => void; + dec: () => void; +}; type ComputedStore = { - countSq: number + countSq: number; nestedResult: { - stringified: string - } -} + stringified: string; + }; +}; function computeState(state: Store): ComputedStore { const nestedResult = { stringified: JSON.stringify(state.count), - } + }; return { countSq: state.count ** 2, nestedResult, - } + }; } describe("default config", () => { - const computeStateMock = jest.fn(computeState) + const computeStateMock = mock(computeState); const makeStore = () => create( computed( @@ -41,52 +42,52 @@ describe("default config", () => { }), computeStateMock, ), - ) + ); - let useStore: ReturnType + let useStore: ReturnType; beforeEach(() => { - jest.clearAllMocks() - useStore = makeStore() - }) + computeStateMock.mockClear(); + useStore = makeStore(); + }); test("computed works on simple counter example", () => { // note: this function should have been called once on store creation - expect(computeStateMock).toHaveBeenCalledTimes(1) - expect(useStore.getState().count).toEqual(1) - expect(useStore.getState().countSq).toEqual(1) - useStore.getState().inc() - expect(useStore.getState().count).toEqual(2) - expect(useStore.getState().countSq).toEqual(4) - useStore.getState().dec() - expect(useStore.getState().count).toEqual(1) - expect(useStore.getState().countSq).toEqual(1) - useStore.setState({ count: 4 }) - expect(useStore.getState().countSq).toEqual(16) - expect(computeStateMock).toHaveBeenCalledTimes(4) - }) + expect(computeStateMock).toHaveBeenCalledTimes(1); + expect(useStore.getState().count).toEqual(1); + expect(useStore.getState().countSq).toEqual(1); + useStore.getState().inc(); + expect(useStore.getState().count).toEqual(2); + expect(useStore.getState().countSq).toEqual(4); + useStore.getState().dec(); + expect(useStore.getState().count).toEqual(1); + expect(useStore.getState().countSq).toEqual(1); + useStore.setState({ count: 4 }); + expect(useStore.getState().countSq).toEqual(16); + expect(computeStateMock).toHaveBeenCalledTimes(4); + }); test("computed does not modify object ref even after change", () => { - useStore.setState({ count: 4 }) - expect(useStore.getState().count).toEqual(4) - const obj = useStore.getState().nestedResult - useStore.setState({ count: 4 }) - const toCompare = useStore.getState().nestedResult - expect(obj).toEqual(toCompare) - }) + useStore.setState({ count: 4 }); + expect(useStore.getState().count).toEqual(4); + const obj = useStore.getState().nestedResult; + useStore.setState({ count: 4 }); + const toCompare = useStore.getState().nestedResult; + expect(obj).toEqual(toCompare); + }); test("modifying variables x and y do not trigger compute function more than once, as they are not used in compute function", () => { - expect(computeStateMock).toHaveBeenCalledTimes(1) - useStore.setState({ x: 2 }) - expect(computeStateMock).toHaveBeenCalledTimes(2) - useStore.setState({ x: 3 }) - expect(computeStateMock).toHaveBeenCalledTimes(2) - useStore.setState({ y: 2 }) - expect(computeStateMock).toHaveBeenCalledTimes(2) - }) -}) + expect(computeStateMock).toHaveBeenCalledTimes(1); + useStore.setState({ x: 2 }); + expect(computeStateMock).toHaveBeenCalledTimes(2); + useStore.setState({ x: 3 }); + expect(computeStateMock).toHaveBeenCalledTimes(2); + useStore.setState({ y: 2 }); + expect(computeStateMock).toHaveBeenCalledTimes(2); + }); +}); describe("custom config", () => { - const computeStateMock = jest.fn(computeState) + const computeStateMock = mock(computeState); const makeStore = (opts?: ComputedStateOpts) => create( computed( @@ -100,54 +101,54 @@ describe("custom config", () => { computeStateMock, opts, ), - ) + ); beforeEach(() => { - computeStateMock.mockClear() - }) + computeStateMock.mockClear(); + }); test("computed does not update when a custom key selector is given", () => { - const useStore = makeStore({ keys: ["x", "y"] }) + const useStore = makeStore({ keys: ["x", "y"] }); // because we only care about x and y, the compute function should not be called when count changes - expect(computeStateMock).toHaveBeenCalledTimes(1) - expect(useStore.getState().count).toEqual(1) - expect(useStore.getState().countSq).toEqual(1) - useStore.getState().inc() - expect(useStore.getState().count).toEqual(2) - expect(useStore.getState().countSq).toEqual(1) - useStore.getState().dec() - expect(useStore.getState().count).toEqual(1) - expect(useStore.getState().countSq).toEqual(1) - expect(computeStateMock).toHaveBeenCalledTimes(1) - }) + expect(computeStateMock).toHaveBeenCalledTimes(1); + expect(useStore.getState().count).toEqual(1); + expect(useStore.getState().countSq).toEqual(1); + useStore.getState().inc(); + expect(useStore.getState().count).toEqual(2); + expect(useStore.getState().countSq).toEqual(1); + useStore.getState().dec(); + expect(useStore.getState().count).toEqual(1); + expect(useStore.getState().countSq).toEqual(1); + expect(computeStateMock).toHaveBeenCalledTimes(1); + }); test("disabling proxy causes compute to run every time", () => { - const useStore = makeStore({ disableProxy: true }) - expect(computeStateMock).toHaveBeenCalledTimes(1) - useStore.setState({ count: 4 }) - useStore.setState({ x: 2 }) - useStore.setState({ y: 3 }) - expect(useStore.getState().count).toEqual(4) - expect(useStore.getState().countSq).toEqual(16) - expect(computeStateMock).toHaveBeenCalledTimes(4) - }) -}) - -type CountSlice = Pick -type XYSlice = Pick + const useStore = makeStore({ disableProxy: true }); + expect(computeStateMock).toHaveBeenCalledTimes(1); + useStore.setState({ count: 4 }); + useStore.setState({ x: 2 }); + useStore.setState({ y: 3 }); + expect(useStore.getState().count).toEqual(4); + expect(useStore.getState().countSq).toEqual(16); + expect(computeStateMock).toHaveBeenCalledTimes(4); + }); +}); + +type CountSlice = Pick; +type XYSlice = Pick; function computeSlice(state: CountSlice): ComputedStore { const nestedResult = { stringified: JSON.stringify(state.count), - } + }; return { countSq: state.count ** 2, nestedResult, - } + }; } describe("slices pattern", () => { - const computeSliceMock = jest.fn(computeSlice) + const computeSliceMock = mock(computeSlice); const makeStore = () => { const createCountSlice: StateCreator< Store, @@ -160,40 +161,40 @@ describe("slices pattern", () => { dec: () => set((state) => ({ count: state.count - 1 })), }), computeSliceMock, - ) + ); const createXySlice: StateCreator = (set) => ({ x: 1, y: 1, // this should not trigger compute function inc: () => set((state) => ({ count: state.count + 2 })), - }) + }); return create()((...a) => ({ ...createCountSlice(...a), ...createXySlice(...a), - })) - } + })); + }; beforeEach(() => { - computeSliceMock.mockClear() - }) + computeSliceMock.mockClear(); + }); test("computed works on slices pattern example", () => { - const useStore = makeStore() - expect(computeSliceMock).toHaveBeenCalledTimes(1) - expect(useStore.getState().count).toEqual(1) - expect(useStore.getState().countSq).toEqual(1) - useStore.getState().inc() - expect(useStore.getState().count).toEqual(3) - expect(useStore.getState().countSq).toEqual(1) - expect(computeSliceMock).toHaveBeenCalledTimes(1) - useStore.getState().dec() - expect(useStore.getState().count).toEqual(2) - expect(useStore.getState().countSq).toEqual(4) - expect(computeSliceMock).toHaveBeenCalledTimes(2) - useStore.setState({ count: 4 }) - expect(useStore.getState().countSq).toEqual(16) - expect(computeSliceMock).toHaveBeenCalledTimes(3) - }) -}) + const useStore = makeStore(); + expect(computeSliceMock).toHaveBeenCalledTimes(1); + expect(useStore.getState().count).toEqual(1); + expect(useStore.getState().countSq).toEqual(1); + useStore.getState().inc(); + expect(useStore.getState().count).toEqual(3); + expect(useStore.getState().countSq).toEqual(1); + expect(computeSliceMock).toHaveBeenCalledTimes(1); + useStore.getState().dec(); + expect(useStore.getState().count).toEqual(2); + expect(useStore.getState().countSq).toEqual(4); + expect(computeSliceMock).toHaveBeenCalledTimes(2); + useStore.setState({ count: 4 }); + expect(useStore.getState().countSq).toEqual(16); + expect(computeSliceMock).toHaveBeenCalledTimes(3); + }); +}); From 38f9c3be920e01460702a2d49b02b56552d5ee5b Mon Sep 17 00:00:00 2001 From: Christian van der Loo Date: Wed, 21 Aug 2024 22:38:28 -0400 Subject: [PATCH 3/3] chore: reformat --- commitlint.config.mjs | 2 +- package.json | 16 +--- src/computed.test.ts | 210 +++++++++++++++++++++--------------------- 3 files changed, 108 insertions(+), 120 deletions(-) diff --git a/commitlint.config.mjs b/commitlint.config.mjs index fa584fb..fba73fb 100644 --- a/commitlint.config.mjs +++ b/commitlint.config.mjs @@ -1 +1 @@ -export default { extends: ["@commitlint/config-conventional"] }; +export default { extends: ["@commitlint/config-conventional"] } diff --git a/package.json b/package.json index b2dc9a3..e3d7563 100644 --- a/package.json +++ b/package.json @@ -31,20 +31,8 @@ } }, "description": "A Zustand middleware to create computed states.", - "files": [ - "/dist" - ], - "keywords": [ - "zustand", - "computed", - "calculated", - "state", - "react", - "plugin", - "middleware", - "npm", - "typescript" - ], + "files": ["/dist"], + "keywords": ["zustand", "computed", "calculated", "state", "react", "plugin", "middleware", "npm", "typescript"], "license": "MIT", "scripts": { "check": "biome check --write", diff --git a/src/computed.test.ts b/src/computed.test.ts index cf274fe..5980562 100644 --- a/src/computed.test.ts +++ b/src/computed.test.ts @@ -1,35 +1,35 @@ -import { describe, expect, test, beforeEach, mock } from "bun:test"; -import { type StateCreator, create } from "zustand"; -import { type ComputedStateOpts, computed } from "./computed"; +import { describe, expect, test, beforeEach, mock } from "bun:test" +import { type StateCreator, create } from "zustand" +import { type ComputedStateOpts, computed } from "./computed" type Store = { - count: number; - x: number; - y: number; - inc: () => void; - dec: () => void; -}; + count: number + x: number + y: number + inc: () => void + dec: () => void +} type ComputedStore = { - countSq: number; + countSq: number nestedResult: { - stringified: string; - }; -}; + stringified: string + } +} function computeState(state: Store): ComputedStore { const nestedResult = { stringified: JSON.stringify(state.count), - }; + } return { countSq: state.count ** 2, nestedResult, - }; + } } describe("default config", () => { - const computeStateMock = mock(computeState); + const computeStateMock = mock(computeState) const makeStore = () => create( computed( @@ -42,52 +42,52 @@ describe("default config", () => { }), computeStateMock, ), - ); + ) - let useStore: ReturnType; + let useStore: ReturnType beforeEach(() => { - computeStateMock.mockClear(); - useStore = makeStore(); - }); + computeStateMock.mockClear() + useStore = makeStore() + }) test("computed works on simple counter example", () => { // note: this function should have been called once on store creation - expect(computeStateMock).toHaveBeenCalledTimes(1); - expect(useStore.getState().count).toEqual(1); - expect(useStore.getState().countSq).toEqual(1); - useStore.getState().inc(); - expect(useStore.getState().count).toEqual(2); - expect(useStore.getState().countSq).toEqual(4); - useStore.getState().dec(); - expect(useStore.getState().count).toEqual(1); - expect(useStore.getState().countSq).toEqual(1); - useStore.setState({ count: 4 }); - expect(useStore.getState().countSq).toEqual(16); - expect(computeStateMock).toHaveBeenCalledTimes(4); - }); + expect(computeStateMock).toHaveBeenCalledTimes(1) + expect(useStore.getState().count).toEqual(1) + expect(useStore.getState().countSq).toEqual(1) + useStore.getState().inc() + expect(useStore.getState().count).toEqual(2) + expect(useStore.getState().countSq).toEqual(4) + useStore.getState().dec() + expect(useStore.getState().count).toEqual(1) + expect(useStore.getState().countSq).toEqual(1) + useStore.setState({ count: 4 }) + expect(useStore.getState().countSq).toEqual(16) + expect(computeStateMock).toHaveBeenCalledTimes(4) + }) test("computed does not modify object ref even after change", () => { - useStore.setState({ count: 4 }); - expect(useStore.getState().count).toEqual(4); - const obj = useStore.getState().nestedResult; - useStore.setState({ count: 4 }); - const toCompare = useStore.getState().nestedResult; - expect(obj).toEqual(toCompare); - }); + useStore.setState({ count: 4 }) + expect(useStore.getState().count).toEqual(4) + const obj = useStore.getState().nestedResult + useStore.setState({ count: 4 }) + const toCompare = useStore.getState().nestedResult + expect(obj).toEqual(toCompare) + }) test("modifying variables x and y do not trigger compute function more than once, as they are not used in compute function", () => { - expect(computeStateMock).toHaveBeenCalledTimes(1); - useStore.setState({ x: 2 }); - expect(computeStateMock).toHaveBeenCalledTimes(2); - useStore.setState({ x: 3 }); - expect(computeStateMock).toHaveBeenCalledTimes(2); - useStore.setState({ y: 2 }); - expect(computeStateMock).toHaveBeenCalledTimes(2); - }); -}); + expect(computeStateMock).toHaveBeenCalledTimes(1) + useStore.setState({ x: 2 }) + expect(computeStateMock).toHaveBeenCalledTimes(2) + useStore.setState({ x: 3 }) + expect(computeStateMock).toHaveBeenCalledTimes(2) + useStore.setState({ y: 2 }) + expect(computeStateMock).toHaveBeenCalledTimes(2) + }) +}) describe("custom config", () => { - const computeStateMock = mock(computeState); + const computeStateMock = mock(computeState) const makeStore = (opts?: ComputedStateOpts) => create( computed( @@ -101,54 +101,54 @@ describe("custom config", () => { computeStateMock, opts, ), - ); + ) beforeEach(() => { - computeStateMock.mockClear(); - }); + computeStateMock.mockClear() + }) test("computed does not update when a custom key selector is given", () => { - const useStore = makeStore({ keys: ["x", "y"] }); + const useStore = makeStore({ keys: ["x", "y"] }) // because we only care about x and y, the compute function should not be called when count changes - expect(computeStateMock).toHaveBeenCalledTimes(1); - expect(useStore.getState().count).toEqual(1); - expect(useStore.getState().countSq).toEqual(1); - useStore.getState().inc(); - expect(useStore.getState().count).toEqual(2); - expect(useStore.getState().countSq).toEqual(1); - useStore.getState().dec(); - expect(useStore.getState().count).toEqual(1); - expect(useStore.getState().countSq).toEqual(1); - expect(computeStateMock).toHaveBeenCalledTimes(1); - }); + expect(computeStateMock).toHaveBeenCalledTimes(1) + expect(useStore.getState().count).toEqual(1) + expect(useStore.getState().countSq).toEqual(1) + useStore.getState().inc() + expect(useStore.getState().count).toEqual(2) + expect(useStore.getState().countSq).toEqual(1) + useStore.getState().dec() + expect(useStore.getState().count).toEqual(1) + expect(useStore.getState().countSq).toEqual(1) + expect(computeStateMock).toHaveBeenCalledTimes(1) + }) test("disabling proxy causes compute to run every time", () => { - const useStore = makeStore({ disableProxy: true }); - expect(computeStateMock).toHaveBeenCalledTimes(1); - useStore.setState({ count: 4 }); - useStore.setState({ x: 2 }); - useStore.setState({ y: 3 }); - expect(useStore.getState().count).toEqual(4); - expect(useStore.getState().countSq).toEqual(16); - expect(computeStateMock).toHaveBeenCalledTimes(4); - }); -}); - -type CountSlice = Pick; -type XYSlice = Pick; + const useStore = makeStore({ disableProxy: true }) + expect(computeStateMock).toHaveBeenCalledTimes(1) + useStore.setState({ count: 4 }) + useStore.setState({ x: 2 }) + useStore.setState({ y: 3 }) + expect(useStore.getState().count).toEqual(4) + expect(useStore.getState().countSq).toEqual(16) + expect(computeStateMock).toHaveBeenCalledTimes(4) + }) +}) + +type CountSlice = Pick +type XYSlice = Pick function computeSlice(state: CountSlice): ComputedStore { const nestedResult = { stringified: JSON.stringify(state.count), - }; + } return { countSq: state.count ** 2, nestedResult, - }; + } } describe("slices pattern", () => { - const computeSliceMock = mock(computeSlice); + const computeSliceMock = mock(computeSlice) const makeStore = () => { const createCountSlice: StateCreator< Store, @@ -161,40 +161,40 @@ describe("slices pattern", () => { dec: () => set((state) => ({ count: state.count - 1 })), }), computeSliceMock, - ); + ) const createXySlice: StateCreator = (set) => ({ x: 1, y: 1, // this should not trigger compute function inc: () => set((state) => ({ count: state.count + 2 })), - }); + }) return create()((...a) => ({ ...createCountSlice(...a), ...createXySlice(...a), - })); - }; + })) + } beforeEach(() => { - computeSliceMock.mockClear(); - }); + computeSliceMock.mockClear() + }) test("computed works on slices pattern example", () => { - const useStore = makeStore(); - expect(computeSliceMock).toHaveBeenCalledTimes(1); - expect(useStore.getState().count).toEqual(1); - expect(useStore.getState().countSq).toEqual(1); - useStore.getState().inc(); - expect(useStore.getState().count).toEqual(3); - expect(useStore.getState().countSq).toEqual(1); - expect(computeSliceMock).toHaveBeenCalledTimes(1); - useStore.getState().dec(); - expect(useStore.getState().count).toEqual(2); - expect(useStore.getState().countSq).toEqual(4); - expect(computeSliceMock).toHaveBeenCalledTimes(2); - useStore.setState({ count: 4 }); - expect(useStore.getState().countSq).toEqual(16); - expect(computeSliceMock).toHaveBeenCalledTimes(3); - }); -}); + const useStore = makeStore() + expect(computeSliceMock).toHaveBeenCalledTimes(1) + expect(useStore.getState().count).toEqual(1) + expect(useStore.getState().countSq).toEqual(1) + useStore.getState().inc() + expect(useStore.getState().count).toEqual(3) + expect(useStore.getState().countSq).toEqual(1) + expect(computeSliceMock).toHaveBeenCalledTimes(1) + useStore.getState().dec() + expect(useStore.getState().count).toEqual(2) + expect(useStore.getState().countSq).toEqual(4) + expect(computeSliceMock).toHaveBeenCalledTimes(2) + useStore.setState({ count: 4 }) + expect(useStore.getState().countSq).toEqual(16) + expect(computeSliceMock).toHaveBeenCalledTimes(3) + }) +})