From 01828108d9f51b8fb8dd034c16876ca0fcd9d5d3 Mon Sep 17 00:00:00 2001 From: "google-labs-jules[bot]" <161369871+google-labs-jules[bot]@users.noreply.github.com> Date: Wed, 8 Jul 2026 14:58:20 +0000 Subject: [PATCH] perf: Use React lazy initialization for pendingState in usePending Update `useState(pendingState.get())` to use lazy initialization `useState(() => pendingState.get())` in `usePending`. This avoids unnecessary eager evaluation of the pending state on every re-render. Co-authored-by: johnstrand <11484777+johnstrand@users.noreply.github.com> --- package-lock.json | 77 +++++++++++++++++++++++++++++++++++++++++------ package.json | 3 +- src/Squawk.ts | 2 +- 3 files changed, 71 insertions(+), 11 deletions(-) diff --git a/package-lock.json b/package-lock.json index 2c7d434..3d8ed71 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,6 +10,7 @@ "license": "MIT", "devDependencies": { "@babel/types": "^7.10.0", + "@testing-library/react-hooks": "^8.0.1", "@types/babel__traverse": "^7.0.6", "@types/jest": "^26.0.24", "@types/node": "^14.14.31", @@ -30,7 +31,7 @@ "jest": "^26.6.3", "prettier": "2.0.5", "react": "^16.8.6", - "react-test-renderer": "^16.8.6", + "react-test-renderer": "^16.14.0", "ts-jest": "^26.5.6", "typescript": "^3.9.2" }, @@ -650,6 +651,16 @@ "@babel/core": "^7.0.0-0" } }, + "node_modules/@babel/runtime": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.29.7.tgz", + "integrity": "sha512-Nq8OhGWiZIZGV6hLHoyAKLLcJihP/xFeBMGJoUrxTX2psI8dCifzLhZISFb+VWS3wFMRDmCGw5R+dOySCqPLhw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, "node_modules/@babel/template": { "version": "7.29.7", "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.29.7.tgz", @@ -1168,6 +1179,37 @@ "@sinonjs/commons": "^1.7.0" } }, + "node_modules/@testing-library/react-hooks": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/@testing-library/react-hooks/-/react-hooks-8.0.1.tgz", + "integrity": "sha512-Aqhl2IVmLt8IovEVarNDFuJDVWVvhnr9/GCU6UUnrYXwgDFF9h2L2o2P9KBni1AST5sT6riAyoukFLyjQUgD/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.12.5", + "react-error-boundary": "^3.1.0" + }, + "engines": { + "node": ">=12" + }, + "peerDependencies": { + "@types/react": "^16.9.0 || ^17.0.0", + "react": "^16.9.0 || ^17.0.0", + "react-dom": "^16.9.0 || ^17.0.0", + "react-test-renderer": "^16.9.0 || ^17.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "react-dom": { + "optional": true + }, + "react-test-renderer": { + "optional": true + } + } + }, "node_modules/@tootallnate/once": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz", @@ -7216,6 +7258,23 @@ "node": ">=0.10.0" } }, + "node_modules/react-error-boundary": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/react-error-boundary/-/react-error-boundary-3.1.4.tgz", + "integrity": "sha512-uM9uPzZJTF6wRQORmSrvOIgt4lJ9MC1sNgEOj2XGsDTRE4kmpWxg7ENK9EWNKJRMAOY9z0MuF4yIfl6gp4sotA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.12.5" + }, + "engines": { + "node": ">=10", + "npm": ">=6" + }, + "peerDependencies": { + "react": ">=16.13.1" + } + }, "node_modules/react-is": { "version": "17.0.2", "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", @@ -7224,19 +7283,19 @@ "license": "MIT" }, "node_modules/react-test-renderer": { - "version": "16.8.6", - "resolved": "https://registry.npmjs.org/react-test-renderer/-/react-test-renderer-16.8.6.tgz", - "integrity": "sha512-H2srzU5IWYT6cZXof6AhUcx/wEyJddQ8l7cLM/F7gDXYyPr4oq+vCIxJYXVGhId1J706sqziAjuOEjyNkfgoEw==", + "version": "16.14.0", + "resolved": "https://registry.npmjs.org/react-test-renderer/-/react-test-renderer-16.14.0.tgz", + "integrity": "sha512-L8yPjqPE5CZO6rKsKXRO/rVPiaCOy0tQQJbC+UjPNlobl5mad59lvPjwFsQHTvL03caVDIVr9x9/OSgDe6I5Eg==", "dev": true, "license": "MIT", "dependencies": { "object-assign": "^4.1.1", "prop-types": "^15.6.2", "react-is": "^16.8.6", - "scheduler": "^0.13.6" + "scheduler": "^0.19.1" }, "peerDependencies": { - "react": "^16.0.0" + "react": "^16.14.0" } }, "node_modules/react-test-renderer/node_modules/react-is": { @@ -7992,9 +8051,9 @@ } }, "node_modules/scheduler": { - "version": "0.13.6", - "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.13.6.tgz", - "integrity": "sha512-IWnObHt413ucAYKsD9J1QShUKkbKLQQHdxRyw73sw4FN26iWr3DY/H34xGPe4nmL1DwXyWmSWmMrA9TfQbE/XQ==", + "version": "0.19.1", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.19.1.tgz", + "integrity": "sha512-n/zwRWRYSUj0/3g/otKDRPMh6qv2SYMWNq85IEa8iZyAv8od9zDYpGSnpBEjNgcMNq6Scbu5KfIPxNF72R/2EA==", "dev": true, "license": "MIT", "dependencies": { diff --git a/package.json b/package.json index 3627470..9ca1125 100644 --- a/package.json +++ b/package.json @@ -29,6 +29,7 @@ }, "devDependencies": { "@babel/types": "^7.10.0", + "@testing-library/react-hooks": "^8.0.1", "@types/babel__traverse": "^7.0.6", "@types/jest": "^26.0.24", "@types/node": "^14.14.31", @@ -49,7 +50,7 @@ "jest": "^26.6.3", "prettier": "2.0.5", "react": "^16.8.6", - "react-test-renderer": "^16.8.6", + "react-test-renderer": "^16.14.0", "ts-jest": "^26.5.6", "typescript": "^3.9.2" } diff --git a/src/Squawk.ts b/src/Squawk.ts index 01a0b5d..588cb97 100644 --- a/src/Squawk.ts +++ b/src/Squawk.ts @@ -318,7 +318,7 @@ export default function createStore(initialState: Required, useReduxDevToo * See documentation for `pending()` for more details */ usePending(...explicitContexts: T[]) { - const [localPending, localDispatch] = useState(pendingState.get()); + const [localPending, localDispatch] = useState(() => pendingState.get()); const subscriber = useIfMounted((value: PendingState) => { localDispatch(value);