{"_id":"reactive-react-redux","_rev":"40-603bfe75f9e9a0704baa8e30ef7c44e0","name":"reactive-react-redux","dist-tags":{"latest":"4.9.0","next":"5.0.0-alpha.7"},"versions":{"1.7.0":{"name":"reactive-react-redux","description":"React Redux binding with React Hooks and Proxy","version":"1.7.0","author":{"name":"Daishi Kato"},"repository":{"type":"git","url":"git+https://github.com/dai-shi/reactive-react-redux.git"},"main":"./dist/index.js","module":"./src/index.js","types":"./src/index.d.ts","scripts":{"compile":"babel src -d dist","test":"npm run eslint && npm run tsc-test && npm run jest","eslint":"eslint --ext .js,.ts,.tsx --ignore-pattern dist .","jest":"jest","tsc-test":"tsc --project . --noEmit","examples:minimal":"DIR=01_minimal EXT=js webpack-dev-server","examples:typescript":"DIR=02_typescript webpack-dev-server","examples:deep":"DIR=03_deep webpack-dev-server","examples:immer":"DIR=04_immer webpack-dev-server","examples:localstate":"DIR=05_localstate webpack-dev-server","examples:memoization":"DIR=06_memoization webpack-dev-server","examples:multistore":"DIR=07_multistore webpack-dev-server","examples:dynamic":"DIR=08_dynamic webpack-dev-server","examples:thunk":"DIR=09_thunk webpack-dev-server"},"keywords":["react","redux","state","hooks","stateless","thisless","pure"],"license":"MIT","dependencies":{"proxyequal":"^2.0.3","shallowequal":"^1.1.0"},"devDependencies":{"@babel/cli":"^7.2.3","@babel/core":"^7.4.0","@babel/preset-env":"^7.4.2","@babel/preset-react":"^7.0.0","@types/react":"^16.8.8","@types/react-dom":"^16.8.3","@types/redux-logger":"^3.0.7","@typescript-eslint/eslint-plugin":"^1.5.0","babel-core":"^7.0.0-bridge.0","babel-eslint":"^10.0.1","babel-loader":"^8.0.5","eslint":"^5.15.3","eslint-config-airbnb":"^17.1.0","eslint-plugin-import":"^2.16.0","eslint-plugin-jsx-a11y":"^6.2.1","eslint-plugin-react":"^7.12.4","eslint-plugin-react-hooks":"^1.6.0","html-webpack-plugin":"^3.2.0","immer":"^2.1.4","jest":"^24.5.0","react":"^16.8.5","react-dom":"^16.8.5","react-testing-library":"^6.0.2","redux":"^4.0.1","redux-thunk":"^2.3.0","ts-loader":"^5.3.3","typescript":"^3.3.4000","webpack":"^4.29.6","webpack-cli":"^3.3.0","webpack-dev-server":"^3.2.1"},"peerDependencies":{"react":">=16.8.0","redux":">=4.0.0"},"babel":{"presets":["@babel/preset-env","@babel/preset-react"]},"gitHead":"f649f1d8dcfe239d326e9f3dc09447f73bf4adae","bugs":{"url":"https://github.com/dai-shi/reactive-react-redux/issues"},"homepage":"https://github.com/dai-shi/reactive-react-redux#readme","_id":"reactive-react-redux@1.7.0","_nodeVersion":"8.14.0","_npmVersion":"6.8.0","dist":{"integrity":"sha512-ORlOMjH0p435GTLUQOpMyx8PbPNCpRvUL1xBNdRzYZx93oHhtyfS4eJS9sfSus5phA6WuCXSF76iYqeD9uZovg==","shasum":"84c0d644cb04a3f167e3a0eee6ee58174d44cec1","tarball":"https://registry.npmjs.org/reactive-react-redux/-/reactive-react-redux-1.7.0.tgz","fileCount":12,"unpackedSize":23433,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJcoN9/CRA9TVsSAnZWagAAVtcP/0nNX734xEff16L998eH\nSmengnK4DW41HVoHfgeGP/mryZrM/owkSAQxjZyR5sJWJ17xlFoyFy11OQw2\nRXyMvWoO/JBpZcVVBnVfMdCH+95sLbchHDVRcPWEXpp/qkOMkhFVRd7F3OdM\nLek+AebsyAHUqgJ8Y7QPRDzBitkaTaqkd3KxbZ8qdPNWaSQK9YxrjryQtKi9\nEee6GpsJyMDbdaI3d/jkfwCRWjeKt+KV/DVUKMBbA15GVY8175+Q0Ghx8j5B\nQ1gbmmExMj8NJF1PsR1cyiw1vcwHGBiE7kESbqXLvq2wnxFO6Me5HwmDv3uB\npimsfvr5p6ghzD1lRJ8q2LIyLUIZQ2+jvngR5KkUkItjDOmNdHNkNYJEP5If\nnlmhTBFSpV6EYC3uwEXjzAxWbRwgtKjkHNaQ4+E3T4Ko32NBlDGdxZlWanek\nEcfqauR1qrNUhjD7cDHCg1p177TErf64XLYTDLiYI+fGxQsJG7SB9GobU8xK\nWPp5dr0UEM8JJOFXJ8I3AQqWTlck7q8F9aEUjLVrzLQR8hawodVkKbEHU1Nm\nScDcwVUhY+gSUEunDu9kemZ1wgq2WII7R23ohoQfrXGGJGl81SZwZpeVmv+3\nzeZq0TF8QFtfyMkzVhaioGFAS3jLDD7ymPaFIQcq6DLX1g7mnFW43O8VreJI\n4P90\r\n=6Nky\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIDpWEWBskp0WzSCQLjI5CG6dX9WR0gfXccr3bqv3oTLrAiEAkC294fJ6uT3hKfUJb36wo27w4YDph4usoCqCWpJObNo="}]},"maintainers":[{"name":"daishi","email":"daishi@axlight.com"}],"_npmUser":{"name":"daishi","email":"daishi@axlight.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/reactive-react-redux_1.7.0_1554046847064_0.6873773596125496"},"_hasShrinkwrap":false},"1.8.0":{"name":"reactive-react-redux","description":"React Redux binding with React Hooks and Proxy","version":"1.8.0","author":{"name":"Daishi Kato"},"repository":{"type":"git","url":"git+https://github.com/dai-shi/reactive-react-redux.git"},"main":"./dist/index.js","module":"./src/index.js","types":"./src/index.d.ts","scripts":{"compile":"babel src -d dist","test":"npm run eslint && npm run tsc-test && npm run jest","eslint":"eslint --ext .js,.ts,.tsx --ignore-pattern dist .","jest":"jest","tsc-test":"tsc --project . --noEmit","examples:minimal":"DIR=01_minimal EXT=js webpack-dev-server","examples:typescript":"DIR=02_typescript webpack-dev-server","examples:deep":"DIR=03_deep webpack-dev-server","examples:immer":"DIR=04_immer webpack-dev-server","examples:localstate":"DIR=05_localstate webpack-dev-server","examples:memoization":"DIR=06_memoization webpack-dev-server","examples:multistore":"DIR=07_multistore webpack-dev-server","examples:dynamic":"DIR=08_dynamic webpack-dev-server","examples:thunk":"DIR=09_thunk webpack-dev-server"},"keywords":["react","redux","state","hooks","stateless","thisless","pure"],"license":"MIT","dependencies":{"proxyequal":"^2.0.3"},"devDependencies":{"@babel/cli":"^7.2.3","@babel/core":"^7.4.0","@babel/preset-env":"^7.4.2","@babel/preset-react":"^7.0.0","@types/react":"^16.8.8","@types/react-dom":"^16.8.3","@types/redux-logger":"^3.0.7","@typescript-eslint/eslint-plugin":"^1.5.0","babel-core":"^7.0.0-bridge.0","babel-eslint":"^10.0.1","babel-loader":"^8.0.5","eslint":"^5.15.3","eslint-config-airbnb":"^17.1.0","eslint-plugin-import":"^2.16.0","eslint-plugin-jsx-a11y":"^6.2.1","eslint-plugin-react":"^7.12.4","eslint-plugin-react-hooks":"^1.6.0","html-webpack-plugin":"^3.2.0","immer":"^2.1.4","jest":"^24.5.0","react":"^16.8.5","react-dom":"^16.8.5","react-testing-library":"^6.0.2","redux":"^4.0.1","redux-thunk":"^2.3.0","ts-loader":"^5.3.3","typescript":"^3.3.4000","webpack":"^4.29.6","webpack-cli":"^3.3.0","webpack-dev-server":"^3.2.1"},"peerDependencies":{"react":">=16.8.0","redux":">=4.0.0"},"babel":{"presets":["@babel/preset-env","@babel/preset-react"]},"gitHead":"a94e3cf39ea850ef0256b280f987f540ef53f7ad","bugs":{"url":"https://github.com/dai-shi/reactive-react-redux/issues"},"homepage":"https://github.com/dai-shi/reactive-react-redux#readme","_id":"reactive-react-redux@1.8.0","_nodeVersion":"8.14.0","_npmVersion":"6.8.0","dist":{"integrity":"sha512-baFKVPmVItX9F+xhayBFo2EaWTmlVWhQUgUJXO2W237rRe3WsRTJMjfo4hLHaVdifh1k+nKrlyCqQfLiCIShMA==","shasum":"1760938f4ebb71e785454dbad6169a457ccbdad0","tarball":"https://registry.npmjs.org/reactive-react-redux/-/reactive-react-redux-1.8.0.tgz","fileCount":11,"unpackedSize":25298,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJco4ZXCRA9TVsSAnZWagAAvbMP/2t7BpFg5LrYfAw+jdIZ\ncDJgWeg/Bc+ouYN31caJ1CLGFEqcczpo2JBt+rAzzj1iHzIpW/wROacW1NOl\nKNDCQPFvjQ9ZnLdkdZZtNfzTsO9reP9udHTmZwYtwhJJKj3UGxfrFkZdOAQW\n3988cgYL4tS8czV49kS59Uf/LM54srl5vPZmYny3tsxbZ3CqCKE4nIW74m4z\n/rw3/isV6L/XYO0LwG5zXNC0TFOw6vEJD9MCOQhpA9SL3Gm9kZs4SPKxzTUR\n74i/WCMcGRMPJRMzWm/iLDEvPkDro7cDrnQE6a6cAsekHJ5JpbkIRkcoZiYy\nDZ/P4VYYO3dHTEpfV24DbMyYqq/rQJdQ+5cfsbbnkQffvmKfszQYo0sz55Ig\nggLgnFUfRSnTIETEdlvX/Omyo16eqvr7SZfYqE4Rixv97LVYNziXpK+TBgsB\ngmPSSlrWqDLwWXDJobIbDR8g87TP9vAGuu/466P2C8ZNWol55Lx6wavzQNzs\nRBVIeOAiEPOXqZ1htemB5q1OEVHWNxQbRxfMvtctb8wNKtK7qzRD23jZNsC5\ntIEz2Z8dAFrjOHSKsf1Job4mYQX4/wF353f7cDiBHLudKV9x43wFcGKiyDHe\nwhhne1NCYzKXOV7fyISX/LU0/UpqzxUOk6UsYYt2LNJqyEPYcVV1+36Lb8MI\n6ZyX\r\n=BeSK\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIGatRJ5W5KH3deWabQznO0H7kg24LStR8nE3Eicp/5TuAiEArUS/fJfrEGoa0aTlcYniAp+eH3SWP1uc6XLwyz7mWOU="}]},"maintainers":[{"name":"daishi","email":"daishi@axlight.com"}],"_npmUser":{"name":"daishi","email":"daishi@axlight.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/reactive-react-redux_1.8.0_1554220631062_0.48043933097265046"},"_hasShrinkwrap":false},"2.0.0":{"name":"reactive-react-redux","description":"React Redux binding with React Hooks and Proxy","version":"2.0.0","author":{"name":"Daishi Kato"},"repository":{"type":"git","url":"git+https://github.com/dai-shi/reactive-react-redux.git"},"main":"./dist/index.js","module":"./src/index.js","types":"./src/index.d.ts","scripts":{"compile":"babel src -d dist","test":"npm run eslint && npm run tsc-test && npm run jest","eslint":"eslint --ext .js,.ts,.tsx --ignore-pattern dist .","jest":"jest","tsc-test":"tsc --project . --noEmit","examples:minimal":"DIR=01_minimal EXT=js webpack-dev-server","examples:typescript":"DIR=02_typescript webpack-dev-server","examples:deep":"DIR=03_deep webpack-dev-server","examples:immer":"DIR=04_immer webpack-dev-server","examples:localstate":"DIR=05_localstate webpack-dev-server","examples:memoization":"DIR=06_memoization webpack-dev-server","examples:multistore":"DIR=07_multistore webpack-dev-server","examples:dynamic":"DIR=08_dynamic webpack-dev-server","examples:thunk":"DIR=09_thunk webpack-dev-server","examples:selectors":"DIR=10_selectors webpack-dev-server"},"keywords":["react","redux","state","hooks","stateless","thisless","pure"],"license":"MIT","dependencies":{"memoize-state":"^2.0.7","proxyequal":"^2.0.6","with-known-usage":"^1.0.0"},"devDependencies":{"@babel/cli":"^7.4.3","@babel/core":"^7.4.3","@babel/preset-env":"^7.4.3","@babel/preset-react":"^7.0.0","@types/react":"^16.8.13","@types/react-dom":"^16.8.4","@types/redux-logger":"^3.0.7","@typescript-eslint/eslint-plugin":"^1.6.0","babel-core":"^7.0.0-bridge.0","babel-eslint":"^10.0.1","babel-loader":"^8.0.5","eslint":"^5.16.0","eslint-config-airbnb":"^17.1.0","eslint-plugin-import":"^2.17.0","eslint-plugin-jsx-a11y":"^6.2.1","eslint-plugin-react":"^7.12.4","eslint-plugin-react-hooks":"^1.6.0","html-webpack-plugin":"^3.2.0","immer":"^2.1.5","jest":"^24.7.1","react":"^16.8.5","react-dom":"^16.8.6","react-testing-library":"^6.1.2","redux":"^4.0.1","redux-thunk":"^2.3.0","ts-loader":"^5.3.3","typescript":"^3.4.3","webpack":"^4.30.0","webpack-cli":"^3.3.0","webpack-dev-server":"^3.3.1"},"peerDependencies":{"react":">=16.8.0","redux":">=4.0.0"},"babel":{"presets":["@babel/preset-env","@babel/preset-react"]},"gitHead":"da991ef813bd1eae29dd6ae3da42c6524a71f592","bugs":{"url":"https://github.com/dai-shi/reactive-react-redux/issues"},"homepage":"https://github.com/dai-shi/reactive-react-redux#readme","_id":"reactive-react-redux@2.0.0","_nodeVersion":"8.14.0","_npmVersion":"6.8.0","dist":{"integrity":"sha512-oFutsu4DyWSpAqN0AFsDoAIY51eeU4TUZFKSESbgODtOWK7LBf9kC9ypyYWwqqS6WRkp9pP1E6gJ6QmTIQhvLQ==","shasum":"820dc8e1738e2d938a056146a7f51ee11f5eeeff","tarball":"https://registry.npmjs.org/reactive-react-redux/-/reactive-react-redux-2.0.0.tgz","fileCount":21,"unpackedSize":30659,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJcsecfCRA9TVsSAnZWagAAHAcP/Ar9levw0/7BkZtjqGQt\n2FLXEUcRBE5BgreeYwm4vBvADpf31eI9QAOMWeWaSh4cE3PkcKi4g1nA53AR\nDBsfzTlFrOWrrmbu4LJ/ziycFv+YlA1X2/B1cgF4sJjJL4w+69k9Y0I51PXW\nySYqjOFVgR/Mwt8MHBCbVxAK1c3+lI7aq+7BFGGXEO4M0CnnHRnEH55ZsCLY\nrCxxDlyVvo3TZ1icOIOcGHsuqvDr4EN+6mibhVf8D2CU95v8qUBHa86zPnYw\niC2YwVZt8avNabmuEneDyMbys0sE/0FkSBLRyT4dNqBkYyaPHHgqMAfYamav\nFz1Ukiw6A78PPd6KnkhNmULwmUvKCRFjtBHRjFe4DEiARSnunyi5H0ZQ4dFA\nfjl3LHD4RoatLOkdyLVF31q5ujai252eii+AL9q5MGKQr/u1Zti1LnlEyzfO\nWB1ryR41K2iBYAFrrG0ZB6XmqwLIfJHCBhuc2/lsCLMym2pqDnBzrmVonlKl\nyVLHVlxdUjRlRvJm2keJkcOS49O/58GB5IJISODpGPoqrMlkLOTGs4rNzZSh\nYuT+3Wu8DPBHYxJtbNFiHavU6+pMlwAxLMelCi8T5FdF3vt8ey5mfEykDtZi\n3wXwvmfD8qQ24WN/w5lAAKgyfb054NBS7j+s+wxj8uN1b3TmPLZ6VLBxIc7e\nRiHA\r\n=Ihh3\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIB538zTT/zklNZAYN2AzOI7svbubC04HokyCDLpRSxWAAiBSUTIwkUcsii2uO4TdNMe1A7Xp6EmaBCJOk6l1ioM/Sw=="}]},"maintainers":[{"name":"daishi","email":"daishi@axlight.com"}],"_npmUser":{"name":"daishi","email":"daishi@axlight.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/reactive-react-redux_2.0.0_1555162910261_0.6991768627216768"},"_hasShrinkwrap":false},"2.0.1":{"name":"reactive-react-redux","description":"React Redux binding with React Hooks and Proxy","version":"2.0.1","author":{"name":"Daishi Kato"},"repository":{"type":"git","url":"git+https://github.com/dai-shi/reactive-react-redux.git"},"main":"./dist/index.js","module":"./src/index.js","types":"./src/index.d.ts","scripts":{"compile":"babel src -d dist","test":"npm run eslint && npm run tsc-test && npm run jest","eslint":"eslint --ext .js,.ts,.tsx --ignore-pattern dist .","jest":"jest","tsc-test":"tsc --project . --noEmit","examples:minimal":"DIR=01_minimal EXT=js webpack-dev-server","examples:typescript":"DIR=02_typescript webpack-dev-server","examples:deep":"DIR=03_deep webpack-dev-server","examples:immer":"DIR=04_immer webpack-dev-server","examples:localstate":"DIR=05_localstate webpack-dev-server","examples:memoization":"DIR=06_memoization webpack-dev-server","examples:multistore":"DIR=07_multistore webpack-dev-server","examples:dynamic":"DIR=08_dynamic webpack-dev-server","examples:thunk":"DIR=09_thunk webpack-dev-server","examples:selectors":"DIR=10_selectors webpack-dev-server"},"keywords":["react","redux","state","hooks","stateless","thisless","pure"],"license":"MIT","dependencies":{"memoize-state":"^2.0.7","proxyequal":"^2.0.6","with-known-usage":"^1.0.0"},"devDependencies":{"@babel/cli":"^7.4.3","@babel/core":"^7.4.3","@babel/preset-env":"^7.4.3","@babel/preset-react":"^7.0.0","@types/react":"^16.8.13","@types/react-dom":"^16.8.4","@types/redux-logger":"^3.0.7","@typescript-eslint/eslint-plugin":"^1.6.0","babel-core":"^7.0.0-bridge.0","babel-eslint":"^10.0.1","babel-loader":"^8.0.5","eslint":"^5.16.0","eslint-config-airbnb":"^17.1.0","eslint-plugin-import":"^2.17.0","eslint-plugin-jsx-a11y":"^6.2.1","eslint-plugin-react":"^7.12.4","eslint-plugin-react-hooks":"^1.6.0","html-webpack-plugin":"^3.2.0","immer":"^2.1.5","jest":"^24.7.1","react":"^16.8.5","react-dom":"^16.8.6","react-testing-library":"^6.1.2","redux":"^4.0.1","redux-thunk":"^2.3.0","ts-loader":"^5.3.3","typescript":"^3.4.3","webpack":"^4.30.0","webpack-cli":"^3.3.0","webpack-dev-server":"^3.3.1"},"peerDependencies":{"react":">=16.8.0","redux":">=4.0.0"},"babel":{"presets":["@babel/preset-env","@babel/preset-react"]},"gitHead":"449e34ad59e49b146e10c13e8e8626693abce12a","bugs":{"url":"https://github.com/dai-shi/reactive-react-redux/issues"},"homepage":"https://github.com/dai-shi/reactive-react-redux#readme","_id":"reactive-react-redux@2.0.1","_nodeVersion":"8.14.0","_npmVersion":"6.8.0","dist":{"integrity":"sha512-U2Q9nlOMuesOZsmmIUj8zf7gFptquiQ1fc5v3hrNWDxzGleVYJlYO/iSCn3W51bQtqQFzu1Gx+5zuzfdf3LLHg==","shasum":"f8fdf12cd9c2fdbea535a1df133d3c391fbd76ee","tarball":"https://registry.npmjs.org/reactive-react-redux/-/reactive-react-redux-2.0.1.tgz","fileCount":21,"unpackedSize":30730,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJcs7qTCRA9TVsSAnZWagAAijQP/jl1ffxAEneD3OJeiXlO\nJ/EUMyH/27vpvYEaEZofDRIDcFppEQz5tRegZNiw99bX4Q/iDGV4fFRTgEOR\nM/qF+XIRvEnhnxBacXSsxco5/df4VhYqTAgL+4qs3ZvqyFknXS6Yzpe58HCq\nCrVuRi9ioTmeq6Do7nigecJdufTa8N/bf9Ddgl9q+o/UDZd26kTtoKppqq72\nH246MbGKOy0qW1rKJb+g6c6vaqwVuV7/QHrEY7Mvfm+bMGQn23+pMYC06Vaj\nURh9FG9MUV76Rw4xNyCwraRCQyMZP/rLZ/I1NUMuM3gHTtBiGyxReJsCpDfH\nAivKmmLqLJMcFCEsdH6Vq3wksrQGRqpaaSl1Tt9JsqUfaiwFojSwMWGxooca\n9k/sJ464/WFaAfYUV/LYGrHFL7i3YBvE1EbKc+FT8xC8XUQmtFCRN3okMXAY\nZCyuCu3H2IR4mEmhTW9Btjod18rHUp5cSYXe7cC0VHx6MYE3yILHrJX6HTDe\nzLHY8WnPunWgTvKVTfkAkQgikHF44/QmWa9s03oyaN7QefMkAlj9rcnkWkHB\npJrxATopehX+8XGINvImyZB+z45CbT2h9s0s8fLRal35CloBo5gt8Ivyl6C4\n2Uf/xDK+fJCig0d3JKpaoB90xE+/bMT8w09mMrxrdywuyZ29savJvnXrcq+z\nIpQb\r\n=QnNV\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIFQ0t9av4Pt3c2iIQUEvULncCsmmgdln8zj1rf9Xuo23AiB6CVRPiLskc5PwQzUJa5khSpSi/IzKJVxEQfap3i//rQ=="}]},"maintainers":[{"name":"daishi","email":"daishi@axlight.com"}],"_npmUser":{"name":"daishi","email":"daishi@axlight.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/reactive-react-redux_2.0.1_1555282578251_0.27708340587831426"},"_hasShrinkwrap":false},"3.0.0-alpha.0":{"name":"reactive-react-redux","description":"React Redux binding with React Hooks and Proxy","version":"3.0.0-alpha.0","author":{"name":"Daishi Kato"},"repository":{"type":"git","url":"git+https://github.com/dai-shi/reactive-react-redux.git"},"main":"./dist/index.js","module":"./src/index.js","types":"./src/index.d.ts","scripts":{"compile":"babel src -d dist","test":"npm run eslint && npm run tsc-test && npm run jest","eslint":"eslint --ext .js,.ts,.tsx --ignore-pattern dist .","jest":"jest","tsc-test":"tsc --project . --noEmit","examples:minimal":"DIR=01_minimal EXT=js webpack-dev-server","examples:typescript":"DIR=02_typescript webpack-dev-server","examples:deep":"DIR=03_deep webpack-dev-server","examples:immer":"DIR=04_immer webpack-dev-server","examples:localstate":"DIR=05_localstate webpack-dev-server","examples:memoization":"DIR=06_memoization webpack-dev-server","examples:multistore":"DIR=07_multistore webpack-dev-server","examples:dynamic":"DIR=08_dynamic webpack-dev-server","examples:thunk":"DIR=09_thunk webpack-dev-server","examples:selectors":"DIR=10_selectors webpack-dev-server"},"keywords":["react","redux","state","hooks","stateless","thisless","pure"],"license":"MIT","dependencies":{"memoize-state":"^2.0.7","proxyequal":"^2.0.6","with-known-usage":"^1.0.0"},"devDependencies":{"@babel/cli":"^7.4.3","@babel/core":"^7.4.3","@babel/preset-env":"^7.4.3","@babel/preset-react":"^7.0.0","@types/react":"^16.8.13","@types/react-dom":"^16.8.4","@types/redux-logger":"^3.0.7","@typescript-eslint/eslint-plugin":"^1.6.0","babel-core":"^7.0.0-bridge.0","babel-eslint":"^10.0.1","babel-loader":"^8.0.5","eslint":"^5.16.0","eslint-config-airbnb":"^17.1.0","eslint-plugin-import":"^2.17.0","eslint-plugin-jsx-a11y":"^6.2.1","eslint-plugin-react":"^7.12.4","eslint-plugin-react-hooks":"^1.6.0","html-webpack-plugin":"^3.2.0","immer":"^2.1.5","jest":"^24.7.1","react":"^16.8.5","react-dom":"^16.8.6","react-testing-library":"^6.1.2","redux":"^4.0.1","redux-thunk":"^2.3.0","ts-loader":"^5.3.3","typescript":"^3.4.3","webpack":"^4.30.0","webpack-cli":"^3.3.0","webpack-dev-server":"^3.3.1"},"peerDependencies":{"react":">=16.8.0","redux":">=4.0.0"},"babel":{"presets":["@babel/preset-env","@babel/preset-react"]},"readme":"# reactive-react-redux\n\n[![Build Status](https://travis-ci.com/dai-shi/reactive-react-redux.svg?branch=master)](https://travis-ci.com/dai-shi/reactive-react-redux)\n[![npm version](https://badge.fury.io/js/reactive-react-redux.svg)](https://badge.fury.io/js/reactive-react-redux)\n[![bundle size](https://badgen.net/bundlephobia/minzip/reactive-react-redux)](https://bundlephobia.com/result?p=reactive-react-redux)\n\nReact Redux binding with React Hooks and Proxy\n\n## Introduction\n\nThis is a React bindings library for Redux with Hooks API.\nThere are many such libraries, but this one is specialized for\nauto-detecting state usage with Proxy.\n\nThe official React bindings for Redux is `react-redux`.\nWhile its `connect` is fine tuned for performance,\nwriting a proper `mapStateToProps` function is sometimes difficult,\nand improper `mapStateToProps` can easily lead performance issues.\nThis library eliminates writing `mapStateToProps` at all.\n\n## How it works\n\nA hook `useReduxState` returns the entire Redux state object,\nbut it keeps track of which properties of the object are used\nin rendering. When the state is updated, this hook checks\nwhether used properties are changed.\nOnly if it detects changes in the state, it triggers re-rendering.\n\n## Install\n\n```bash\nnpm install reactive-react-redux\n```\n\n## Usage\n\n```javascript\nimport React from 'react';\nimport { createStore } from 'redux';\nimport {\n  ReduxProvider,\n  useReduxDispatch,\n  useReduxState,\n} from 'reactive-react-redux';\n\nconst initialState = {\n  counter: 0,\n  text: 'hello',\n};\n\nconst reducer = (state = initialState, action) => {\n  switch (action.type) {\n    case 'increment': return { ...state, counter: state.counter + 1 };\n    case 'decrement': return { ...state, counter: state.counter - 1 };\n    case 'setText': return { ...state, text: action.text };\n    default: return state;\n  }\n};\n\nconst store = createStore(reducer);\n\nconst Counter = () => {\n  const state = useReduxState();\n  const dispatch = useReduxDispatch();\n  return (\n    <div>\n      {Math.random()}\n      <div>\n        <span>Count:{state.counter}</span>\n        <button type=\"button\" onClick={() => dispatch({ type: 'increment' })}>+1</button>\n        <button type=\"button\" onClick={() => dispatch({ type: 'decrement' })}>-1</button>\n      </div>\n    </div>\n  );\n};\n\nconst TextBox = () => {\n  const state = useReduxState();\n  const dispatch = useReduxDispatch();\n  return (\n    <div>\n      {Math.random()}\n      <div>\n        <span>Text:{state.text}</span>\n        <input value={state.text} onChange={event => dispatch({ type: 'setText', text: event.target.value })} />\n      </div>\n    </div>\n  );\n};\n\nconst App = () => (\n  <ReduxProvider store={store}>\n    <h1>Counter</h1>\n    <Counter />\n    <Counter />\n    <h1>TextBox</h1>\n    <TextBox />\n    <TextBox />\n  </ReduxProvider>\n);\n```\n\n## Advanced Usage\n\n<details>\n<summary>Experimental useReduxSelectors</summary>\n\n```javascript\nimport React, { useCallback } from 'react';\nimport { useReduxSelectors } from 'reactive-react-redux';\n\nconst globalSelectors = {\n  firstName: state => state.person.first,\n  lastName: state => state.person.last,\n};\n\nconst Person = () => {\n  const { firstName } = useReduxSelectors(globalSelectors);\n  return <div>{firstName}</div>;\n  // this component will only render when `state.person.first` is changed.\n};\n\nconst Person2 = ({ threshold }) => {\n  const { firstName, isYoung } = useReduxSelectors({\n    ...globalSelectors,\n    isYoung: useCallback(state => (state.person.age < threshold), [threshold]),\n  });\n  return <div>{firstName}{isYoung && '(young)'}</div>;\n};\n```\n\n</details>\n\n## Examples\n\nThe [examples](examples) folder contains working examples.\nYou can run one of them with\n\n```bash\nPORT=8080 npm run examples:minimal\n```\n\nand open <http://localhost:8080> in your web browser.\n\nYou can also try them in codesandbox.io:\n[01](https://codesandbox.io/s/github/dai-shi/reactive-react-redux/tree/master/examples/01_minimal)\n[02](https://codesandbox.io/s/github/dai-shi/reactive-react-redux/tree/master/examples/02_typescript)\n[03](https://codesandbox.io/s/github/dai-shi/reactive-react-redux/tree/master/examples/03_deep)\n[04](https://codesandbox.io/s/github/dai-shi/reactive-react-redux/tree/master/examples/04_immer)\n[05](https://codesandbox.io/s/github/dai-shi/reactive-react-redux/tree/master/examples/05_localstate)\n[06](https://codesandbox.io/s/github/dai-shi/reactive-react-redux/tree/master/examples/06_memoization)\n[07](https://codesandbox.io/s/github/dai-shi/reactive-react-redux/tree/master/examples/07_multistore)\n[08](https://codesandbox.io/s/github/dai-shi/reactive-react-redux/tree/master/examples/08_dynamic)\n[09](https://codesandbox.io/s/github/dai-shi/reactive-react-redux/tree/master/examples/09_thunk)\n[10](https://codesandbox.io/s/github/dai-shi/reactive-react-redux/tree/master/examples/10_selectors)\n\n## Blogs\n\n- [A deadly simple React bindings library for Redux with Hooks API](https://medium.com/@dai_shi/a-deadly-simple-react-bindings-library-for-redux-with-hooks-api-822295857282)\n- [Developing React custom hooks for Redux without react-redux](https://medium.com/@dai_shi/developing-react-custom-hooks-for-redux-without-react-redux-483a90de0c71)\n- [Integrating React and Redux, with Hooks and Proxies](https://frontarm.com/daishi-kato/redux-custom-hooks/)\n- [New React Redux coding style with hooks without selectors](https://medium.com/@dai_shi/new-react-redux-coding-style-with-hooks-without-selectors-5055d59ab753)\n- [Benchmark alpha-released hooks API in React Redux with alternatives](https://medium.com/@dai_shi/benchmark-alpha-released-hooks-api-in-react-redux-with-alternatives-25bef8b840ae)\n","readmeFilename":"README.md","gitHead":"d26de70550e2b81e3ff060f396f83ad84d8f9339","bugs":{"url":"https://github.com/dai-shi/reactive-react-redux/issues"},"homepage":"https://github.com/dai-shi/reactive-react-redux#readme","_id":"reactive-react-redux@3.0.0-alpha.0","_nodeVersion":"8.14.0","_npmVersion":"6.8.0","dist":{"integrity":"sha512-4XvKDnRpNx8PIerHHqeU2yXPdoVeHv/pEWo/UISjGS0kelslg5owJLxpOTn1rmyK9z6MCFoCkxtndcGM2thawg==","shasum":"5133b540003166d0296a63826cfab6ccadd8a644","tarball":"https://registry.npmjs.org/reactive-react-redux/-/reactive-react-redux-3.0.0-alpha.0.tgz","fileCount":26,"unpackedSize":54866,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJc1445CRA9TVsSAnZWagAAJfMP/1J1FXWUPYN+uaqNg95n\nydJxUoEGG/7Ri284ONsaxfG1stJCtcF++ljfP55TxaakNWp7QyvBMR7UcrR7\nq69vZZJxAG5cVrpXtH+vtwgBuck8+S36nVnLLBjhlZ7FSSOA+7z4f3B9ro7e\nM00rO3k86JsK1hsoMjwndXaKpScZGtkhfz1qOT6PWbvnmsyfhH7LtCupdYYg\ntc9diu5ilWEdI3u2AwT4CkaeOUdZ40w/M+0/tFy8lFMuSnzGtv/FdUeZgwZK\nA1LH9Mtkl4ljwo/EhLzHE1zYPL+Vl91Qg7rTRp8GJLi0AwgyHIYrffuQdaOJ\nqbldMra3hRfx2i0yTv/K1sTUuR3PJh/R37AaRZ6yCt3iD9fXEC3FM0rnDgJI\nFbl+pe8k9YhaZiu+0MeFjo8Bdv8vJGKF1TSiEKa5UoP+CpEJFDbeNrRSWFx3\nXUcJ4jc0ptBq0CdOx0spXU1MwGY0Ja2W3ATyQCAws4RiA1C9O8MGxrp8I3vg\nCCX9KIcNXaYQ3ED11YKl6CKyio+ycv9CwRc+eCoyglpP/G8aiq5vMgriEY1G\nGa08h+L8POeFdli0Hf/i73rHgJ8CxJWcuHzJJTTKGlfGzcNLjFyttLrWgGiE\nMJUUDe7W4c8C4PE6oxjMav17dilfK1oQ2hCxv1Z2K3tFdobue+A/p4vHw0hI\nZ+4I\r\n=o9/O\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDcBxKPnTRVVW7j/YJ+fiwI5fgqL/AHR/ifqvn7uprUVAIgV1LdZCgaqHQYMcP5d764kNmzvebzwGCgUNI3+C3qIsc="}]},"maintainers":[{"name":"daishi","email":"daishi@axlight.com"}],"_npmUser":{"name":"daishi","email":"daishi@axlight.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/reactive-react-redux_3.0.0-alpha.0_1557630520496_0.06647341470829549"},"_hasShrinkwrap":false},"3.0.0-alpha.1":{"name":"reactive-react-redux","description":"React Redux binding with React Hooks and Proxy","version":"3.0.0-alpha.1","author":{"name":"Daishi Kato"},"repository":{"type":"git","url":"git+https://github.com/dai-shi/reactive-react-redux.git"},"main":"./dist/index.js","module":"./src/index.js","types":"./src/index.d.ts","scripts":{"compile":"babel src -d dist","test":"npm run eslint && npm run tsc-test && npm run jest","eslint":"eslint --ext .js,.ts,.tsx --ignore-pattern dist .","jest":"jest","tsc-test":"tsc --project . --noEmit","examples:minimal":"DIR=01_minimal EXT=js webpack-dev-server","examples:typescript":"DIR=02_typescript webpack-dev-server","examples:deep":"DIR=03_deep webpack-dev-server","examples:immer":"DIR=04_immer webpack-dev-server","examples:localstate":"DIR=05_localstate webpack-dev-server","examples:memoization":"DIR=06_memoization webpack-dev-server","examples:multistore":"DIR=07_multistore webpack-dev-server","examples:dynamic":"DIR=08_dynamic webpack-dev-server","examples:thunk":"DIR=09_thunk webpack-dev-server","examples:selectors":"DIR=10_selectors webpack-dev-server"},"keywords":["react","redux","state","hooks","stateless","thisless","pure"],"license":"MIT","dependencies":{"memoize-state":"^2.0.7","proxyequal":"^2.0.6","with-known-usage":"^1.0.0"},"devDependencies":{"@babel/cli":"^7.4.3","@babel/core":"^7.4.3","@babel/preset-env":"^7.4.3","@babel/preset-react":"^7.0.0","@types/react":"^16.8.13","@types/react-dom":"^16.8.4","@types/redux-logger":"^3.0.7","@typescript-eslint/eslint-plugin":"^1.6.0","babel-core":"^7.0.0-bridge.0","babel-eslint":"^10.0.1","babel-loader":"^8.0.5","eslint":"^5.16.0","eslint-config-airbnb":"^17.1.0","eslint-plugin-import":"^2.17.0","eslint-plugin-jsx-a11y":"^6.2.1","eslint-plugin-react":"^7.12.4","eslint-plugin-react-hooks":"^1.6.0","html-webpack-plugin":"^3.2.0","immer":"^2.1.5","jest":"^24.7.1","react":"^16.8.5","react-dom":"^16.8.6","react-testing-library":"^6.1.2","redux":"^4.0.1","redux-thunk":"^2.3.0","ts-loader":"^5.3.3","typescript":"^3.4.3","webpack":"^4.30.0","webpack-cli":"^3.3.0","webpack-dev-server":"^3.3.1"},"peerDependencies":{"react":">=16.8.0","redux":">=4.0.0"},"babel":{"presets":["@babel/preset-env","@babel/preset-react"]},"readme":"# reactive-react-redux\n\n[![Build Status](https://travis-ci.com/dai-shi/reactive-react-redux.svg?branch=master)](https://travis-ci.com/dai-shi/reactive-react-redux)\n[![npm version](https://badge.fury.io/js/reactive-react-redux.svg)](https://badge.fury.io/js/reactive-react-redux)\n[![bundle size](https://badgen.net/bundlephobia/minzip/reactive-react-redux)](https://bundlephobia.com/result?p=reactive-react-redux)\n\nReact Redux binding with React Hooks and Proxy\n\n## Introduction\n\nThis is a React bindings library for Redux with Hooks API.\nThere are many such libraries, but this one is specialized for\nauto-detecting state usage with Proxy.\n\nThe official React bindings for Redux is `react-redux`.\nWhile its `connect` is fine tuned for performance,\nwriting a proper `mapStateToProps` function is sometimes difficult,\nand improper `mapStateToProps` can easily lead performance issues.\nThis library eliminates writing `mapStateToProps` at all.\n\n## How it works\n\nA hook `useReduxState` returns the entire Redux state object,\nbut it keeps track of which properties of the object are used\nin rendering. When the state is updated, this hook checks\nwhether used properties are changed.\nOnly if it detects changes in the state, it triggers re-rendering.\n\n## Install\n\n```bash\nnpm install reactive-react-redux\n```\n\n## Usage\n\n```javascript\nimport React from 'react';\nimport { createStore } from 'redux';\nimport {\n  ReduxProvider,\n  useReduxDispatch,\n  useReduxState,\n} from 'reactive-react-redux';\n\nconst initialState = {\n  counter: 0,\n  text: 'hello',\n};\n\nconst reducer = (state = initialState, action) => {\n  switch (action.type) {\n    case 'increment': return { ...state, counter: state.counter + 1 };\n    case 'decrement': return { ...state, counter: state.counter - 1 };\n    case 'setText': return { ...state, text: action.text };\n    default: return state;\n  }\n};\n\nconst store = createStore(reducer);\n\nconst Counter = () => {\n  const state = useReduxState();\n  const dispatch = useReduxDispatch();\n  return (\n    <div>\n      {Math.random()}\n      <div>\n        <span>Count:{state.counter}</span>\n        <button type=\"button\" onClick={() => dispatch({ type: 'increment' })}>+1</button>\n        <button type=\"button\" onClick={() => dispatch({ type: 'decrement' })}>-1</button>\n      </div>\n    </div>\n  );\n};\n\nconst TextBox = () => {\n  const state = useReduxState();\n  const dispatch = useReduxDispatch();\n  return (\n    <div>\n      {Math.random()}\n      <div>\n        <span>Text:{state.text}</span>\n        <input value={state.text} onChange={event => dispatch({ type: 'setText', text: event.target.value })} />\n      </div>\n    </div>\n  );\n};\n\nconst App = () => (\n  <ReduxProvider store={store}>\n    <h1>Counter</h1>\n    <Counter />\n    <Counter />\n    <h1>TextBox</h1>\n    <TextBox />\n    <TextBox />\n  </ReduxProvider>\n);\n```\n\n## Advanced Usage\n\n<details>\n<summary>Experimental useReduxSelectors</summary>\n\n```javascript\nimport React, { useCallback } from 'react';\nimport { useReduxSelectors } from 'reactive-react-redux';\n\nconst globalSelectors = {\n  firstName: state => state.person.first,\n  lastName: state => state.person.last,\n};\n\nconst Person = () => {\n  const { firstName } = useReduxSelectors(globalSelectors);\n  return <div>{firstName}</div>;\n  // this component will only render when `state.person.first` is changed.\n};\n\nconst Person2 = ({ threshold }) => {\n  const { firstName, isYoung } = useReduxSelectors({\n    ...globalSelectors,\n    isYoung: useCallback(state => (state.person.age < threshold), [threshold]),\n  });\n  return <div>{firstName}{isYoung && '(young)'}</div>;\n};\n```\n\n</details>\n\n## Examples\n\nThe [examples](examples) folder contains working examples.\nYou can run one of them with\n\n```bash\nPORT=8080 npm run examples:minimal\n```\n\nand open <http://localhost:8080> in your web browser.\n\nYou can also try them in codesandbox.io:\n[01](https://codesandbox.io/s/github/dai-shi/reactive-react-redux/tree/master/examples/01_minimal)\n[02](https://codesandbox.io/s/github/dai-shi/reactive-react-redux/tree/master/examples/02_typescript)\n[03](https://codesandbox.io/s/github/dai-shi/reactive-react-redux/tree/master/examples/03_deep)\n[04](https://codesandbox.io/s/github/dai-shi/reactive-react-redux/tree/master/examples/04_immer)\n[05](https://codesandbox.io/s/github/dai-shi/reactive-react-redux/tree/master/examples/05_localstate)\n[06](https://codesandbox.io/s/github/dai-shi/reactive-react-redux/tree/master/examples/06_memoization)\n[07](https://codesandbox.io/s/github/dai-shi/reactive-react-redux/tree/master/examples/07_multistore)\n[08](https://codesandbox.io/s/github/dai-shi/reactive-react-redux/tree/master/examples/08_dynamic)\n[09](https://codesandbox.io/s/github/dai-shi/reactive-react-redux/tree/master/examples/09_thunk)\n[10](https://codesandbox.io/s/github/dai-shi/reactive-react-redux/tree/master/examples/10_selectors)\n\n## Blogs\n\n- [A deadly simple React bindings library for Redux with Hooks API](https://medium.com/@dai_shi/a-deadly-simple-react-bindings-library-for-redux-with-hooks-api-822295857282)\n- [Developing React custom hooks for Redux without react-redux](https://medium.com/@dai_shi/developing-react-custom-hooks-for-redux-without-react-redux-483a90de0c71)\n- [Integrating React and Redux, with Hooks and Proxies](https://frontarm.com/daishi-kato/redux-custom-hooks/)\n- [New React Redux coding style with hooks without selectors](https://medium.com/@dai_shi/new-react-redux-coding-style-with-hooks-without-selectors-5055d59ab753)\n- [Benchmark alpha-released hooks API in React Redux with alternatives](https://medium.com/@dai_shi/benchmark-alpha-released-hooks-api-in-react-redux-with-alternatives-25bef8b840ae)\n","readmeFilename":"README.md","gitHead":"6a5879bffcbd0e2d655093a1c326ee4759af1577","bugs":{"url":"https://github.com/dai-shi/reactive-react-redux/issues"},"homepage":"https://github.com/dai-shi/reactive-react-redux#readme","_id":"reactive-react-redux@3.0.0-alpha.1","_nodeVersion":"8.14.0","_npmVersion":"6.8.0","dist":{"integrity":"sha512-wgUPLukR750rEJk6S7+cXbC3UQAQyPGMVwaETt/hM1Mc+AWMY0EymV1u21Jpt3CnuEa8GO/Fyo72YntIFbE2Gg==","shasum":"a94163170ffd90227e8b4065e12700f488c2e15f","tarball":"https://registry.npmjs.org/reactive-react-redux/-/reactive-react-redux-3.0.0-alpha.1.tgz","fileCount":21,"unpackedSize":42236,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJc2DRSCRA9TVsSAnZWagAAmOIP/jbEIxPSW0VcLqKfiwif\nqP0f0rcdlDSn+yRIR7D4cbz/CmD6ILeHfteGfAGYGxwxK3/z1qAY7BP7BKKr\n7plXsBNmAkEakEnynvKpGAwhusQSryazDgtPHLvVQM1MzBge9d7ie2iKrbzW\nE49BOrEGTdyufY72XpCrG3BPZKVKQ5gmJ+4QK1baeCEHbLBViJ/GbvszbgEa\nfJsIVCH/TiZ8mw3j/F0tCK1BuppyXz+yJ5lxXhSmMkqYb/+fUKMhIbRitggA\n7hLzRHQZcUdNw4V5n8wBAOuJE1xSrPT23OUjdR3qibOxIMJ9qx8qiSMAtxjM\n9M1hSh/zjKP9DySm+f2Z7lDZMJr8qkdE6UZg0lpbI7Jx2dNDJxBvTVu0xJaD\nep4MVUdydbAK+GMQgT91fU2CT6dQdF5QxTAdOtcfzSqhYV5YDJkZYEMX7DK3\nqkn0Xj8rx316VHmaUfCgrCJxjAaV1QROqUwWDB2WMf78xyOjS5HTIo3URxzF\nTPirik9soKuuVVSaekihvYNMDt18zFXiDthv2Qxrn4sglONlw05+PFi1sZQh\nhh2uasS5j6ik0ce8D+VR6iY9VBFQh8HY4pIVuLzficFsZA6UNnnq7xMNbIeG\nuOcSoJR8HrNmGZnilC40905RRb03HTbRMcxUtnYYpGoUrxtQZWhzhEDpTsvV\nHCyD\r\n=A042\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIFxnQxgwf5HKe078SLfiUQHZ5aA/9Uipb1Dsznw6upQ6AiEA+43qzIkfFlflZUvSbZiw7XV6GzM2PBuenU9jLpe+P3s="}]},"maintainers":[{"name":"daishi","email":"daishi@axlight.com"}],"_npmUser":{"name":"daishi","email":"daishi@axlight.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/reactive-react-redux_3.0.0-alpha.1_1557673041431_0.4247936461039754"},"_hasShrinkwrap":false},"3.0.0":{"name":"reactive-react-redux","description":"React Redux binding with React Hooks and Proxy","version":"3.0.0","author":{"name":"Daishi Kato"},"repository":{"type":"git","url":"git+https://github.com/dai-shi/reactive-react-redux.git"},"main":"./dist/index.js","module":"./src/index.js","types":"./src/index.d.ts","scripts":{"compile":"babel src -d dist","test":"npm run eslint && npm run tsc-test && npm run jest","eslint":"eslint --ext .js,.ts,.tsx --ignore-pattern dist .","jest":"jest","tsc-test":"tsc --project . --noEmit","examples:minimal":"DIR=01_minimal EXT=js webpack-dev-server","examples:typescript":"DIR=02_typescript webpack-dev-server","examples:deep":"DIR=03_deep webpack-dev-server","examples:immer":"DIR=04_immer webpack-dev-server","examples:localstate":"DIR=05_localstate webpack-dev-server","examples:memoization":"DIR=06_memoization webpack-dev-server","examples:multistore":"DIR=07_multistore webpack-dev-server","examples:dynamic":"DIR=08_dynamic webpack-dev-server","examples:thunk":"DIR=09_thunk webpack-dev-server","examples:selectors":"DIR=10_selectors webpack-dev-server"},"keywords":["react","redux","state","hooks","stateless","thisless","pure"],"license":"MIT","dependencies":{"memoize-state":"^2.0.7","proxyequal":"^2.0.6","with-known-usage":"^1.0.0"},"devDependencies":{"@babel/cli":"^7.4.4","@babel/core":"^7.4.4","@babel/preset-env":"^7.4.4","@babel/preset-react":"^7.0.0","@types/react":"^16.8.17","@types/react-dom":"^16.8.4","@types/redux-logger":"^3.0.7","@typescript-eslint/eslint-plugin":"^1.9.0","babel-core":"^7.0.0-bridge.0","babel-eslint":"^10.0.1","babel-loader":"^8.0.6","eslint":"^5.16.0","eslint-config-airbnb":"^17.1.0","eslint-plugin-import":"^2.17.2","eslint-plugin-jsx-a11y":"^6.2.1","eslint-plugin-react":"^7.13.0","eslint-plugin-react-hooks":"^1.6.0","html-webpack-plugin":"^3.2.0","immer":"^3.1.1","jest":"^24.8.0","react":"^16.8.6","react-dom":"^16.8.6","react-testing-library":"^7.0.0","redux":"^4.0.1","redux-thunk":"^2.3.0","ts-loader":"^6.0.0","typescript":"^3.4.5","webpack":"^4.31.0","webpack-cli":"^3.3.2","webpack-dev-server":"^3.3.1"},"peerDependencies":{"react":">=16.8.0","redux":">=4.0.0"},"babel":{"presets":["@babel/preset-env","@babel/preset-react"]},"gitHead":"6f7c7b8577c10092b81e70d8f50adadc67661374","bugs":{"url":"https://github.com/dai-shi/reactive-react-redux/issues"},"homepage":"https://github.com/dai-shi/reactive-react-redux#readme","_id":"reactive-react-redux@3.0.0","_nodeVersion":"8.14.0","_npmVersion":"6.8.0","dist":{"integrity":"sha512-r/VsJUhC00eQ16k35I97IDBN99rTRVaIVYteUqj+AfD3wNLjOZPkjjwuvnJKieLCyYzUr6FA7yyYd1S+Uvp/Fw==","shasum":"c6e451815a20681bdf7933f5e8b35da6cd3cc6e4","tarball":"https://registry.npmjs.org/reactive-react-redux/-/reactive-react-redux-3.0.0.tgz","fileCount":21,"unpackedSize":44674,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJc30vXCRA9TVsSAnZWagAAzfcP/ji/fmAILOVv7Wyau9cE\nG28wNbCbQfbcIzoHpFwWTdAoLOU372rgh0BOzGzh7oRBp7Cp7rFyO+bx3BAV\n4qWW59rKT3WSlBITG6QsJ8a72OT7lgdT8yy2J8Qx8+rQniI/JtzKHDjnzy8y\nX3VzuD8k4hbIPzf4ifL+DCIU2mZah6z86mX+hMCjv51d2i6yp8A7RDPBJVzD\nZLN+/cAhdq4q1l6AWN48taHBWRbaMKppQBwXMQTJLipbr2TTKb3UnhP2Fjbn\n/AWQwchN+OjnkF8B8pnvU3TpEFCBcU/vk6Q9E+OT7uui0pufjmAKD1kNr6My\nhl7OrN4TzUnp1jvpoFKG0egJ/mEsv3CwD4zTiUNVWtBgFNw7YZpzYmSlPC9h\nOnVGzXdaNTJlNM9YtZOX+GBLghsJGNSktLpSMcX92p+JUxxOY8nkhUyF47Xg\nh3BQIueJfZ1lOAJVmfWDRaHn5s8riC0pVGGfBj1fLM1WV0DhXFcZe9e3dB+d\nYC4G9elyUYNI1gaUsHIhGVQMsPEP9gopOlIrJS2OHpKYfhjCxPtrsbt1OPo+\nwj0ZvWPPGOt65zTcQu7stMSmqm71uUgCCMkuFMPCdDhOBOSWmuT7v36sBE4x\n5E+lf1fJxDXeosKWuN8N7JwzYDdgwWOFXBStxADd/23/cBEr3n1FjdxERNku\nLzRD\r\n=ymts\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCSoGcmufe8KKRNTnZlZkzUwqt3TUM8F5QLQSsWsxRJ/QIgJFDUGVBqjhQbeSCTQ/mQ4/pMwZCTTupmfFbXP0cmvFE="}]},"maintainers":[{"name":"daishi","email":"daishi@axlight.com"}],"_npmUser":{"name":"daishi","email":"daishi@axlight.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/reactive-react-redux_3.0.0_1558137814638_0.017887873735908277"},"_hasShrinkwrap":false},"4.0.0-alpha.0":{"name":"reactive-react-redux","description":"React Redux binding with React Hooks and Proxy","version":"4.0.0-alpha.0","author":{"name":"Daishi Kato"},"repository":{"type":"git","url":"git+https://github.com/dai-shi/reactive-react-redux.git"},"main":"./dist/index.js","module":"./src/index.js","types":"./src/index.d.ts","scripts":{"compile":"babel src -d dist","test":"npm run eslint && npm run tsc-test && npm run jest","eslint":"eslint --ext .js,.ts,.tsx --ignore-pattern dist .","jest":"jest","tsc-test":"tsc --project . --noEmit","examples:minimal":"DIR=01_minimal EXT=js webpack-dev-server","examples:typescript":"DIR=02_typescript webpack-dev-server","examples:deep":"DIR=03_deep webpack-dev-server","examples:immer":"DIR=04_immer webpack-dev-server","examples:localstate":"DIR=05_localstate webpack-dev-server","examples:memoization":"DIR=06_memoization webpack-dev-server","examples:multistore":"DIR=07_multistore webpack-dev-server","examples:dynamic":"DIR=08_dynamic webpack-dev-server","examples:thunk":"DIR=09_thunk webpack-dev-server","examples:selectors":"DIR=10_selectors webpack-dev-server","examples:todolist":"DIR=11_todolist EXT=tsx webpack-dev-server"},"keywords":["react","redux","state","hooks","stateless","thisless","pure"],"license":"MIT","dependencies":{"memoize-state":"^2.0.7","proxyequal":"^2.0.7","with-known-usage":"^1.0.0"},"devDependencies":{"@babel/cli":"^7.4.4","@babel/core":"^7.4.5","@babel/preset-env":"^7.4.5","@babel/preset-react":"^7.0.0","@testing-library/react":"^8.0.1","@types/react":"^16.8.19","@types/react-dom":"^16.8.4","@types/redux-logger":"^3.0.7","@typescript-eslint/eslint-plugin":"^1.10.2","@typescript-eslint/parser":"^1.10.2","babel-core":"^7.0.0-bridge.0","babel-eslint":"^10.0.1","babel-loader":"^8.0.6","eslint":"^5.16.0","eslint-config-airbnb":"^17.1.0","eslint-plugin-import":"^2.17.3","eslint-plugin-jsx-a11y":"^6.2.1","eslint-plugin-react":"^7.13.0","eslint-plugin-react-hooks":"^1.6.0","html-webpack-plugin":"^3.2.0","immer":"^3.1.3","jest":"^24.8.0","react":"^16.8.6","react-dom":"^16.8.6","redux":"^4.0.1","redux-thunk":"^2.3.0","ts-loader":"^6.0.2","typescript":"^3.5.1","webpack":"^4.33.0","webpack-cli":"^3.3.4","webpack-dev-server":"^3.7.1"},"peerDependencies":{"react":">=16.8.6","redux":">=4.0.1"},"babel":{"presets":["@babel/preset-env","@babel/preset-react"]},"gitHead":"7514bf1a825dc26da9f74e6cfd3bc404e9b11fd8","bugs":{"url":"https://github.com/dai-shi/reactive-react-redux/issues"},"homepage":"https://github.com/dai-shi/reactive-react-redux#readme","_id":"reactive-react-redux@4.0.0-alpha.0","_nodeVersion":"8.16.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-GaMXTkfTTinuU0sy4r4TX7MQXvo/F5vghutUG8S0MlVidQEeXu8YvThn60GKrpMqLZE/3GE+PTfTlM1roMFzJw==","shasum":"ad530db3fa5a56d23623b94fdb84db6a1124853f","tarball":"https://registry.npmjs.org/reactive-react-redux/-/reactive-react-redux-4.0.0-alpha.0.tgz","fileCount":27,"unpackedSize":46521,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdAZZcCRA9TVsSAnZWagAANXwP/0lM0VckWmzAy9R0GAMD\n60HI+c6FbhjLbhZFtXG9NmKdgzUTFE616aDz2Qr/zsECiDErOCS7/q7gxq43\nwtWTZMv9virwB5ZoRq4PvJW3NM7h/MzcJuo4GERb1NUZ5f3hEJjHZRuSW8yz\nqJzLSjWJEqOg+cht5XWMWXWZ0rYVqhPjrBFbVyNh87XqYyL6KrcexHTGc22e\ngw4tHF0UZj+uOrSlTqM05RozxEBm10oLhX8coA1fcSkKbv7jQtOjf1x1+HdZ\nerIz0NLwUfV8+iM9/GW22Fa/XVpcugvds5ay8bYOfCo2PLjTZwdK6Q/e8NVl\nZppybIK6HE+iagD/Gj88nKKL/GBdTIdZZ9NYuKmEWchpGPX+TFjON0rKterc\nXNgY/6znPsI0ll+qnChl3/qJeoCR7/eLXAorw+7tTyIBigKWPI365Epvx3hb\nIRybgVdAWFUpt+P6gpssKqz36ijLgg3rHPBlBlqZ4ovj4aXIz1wHIqwiICHG\nh2JRnSNNDv/YbVa+rY7UTxckYRpFwQCmCfnKQa3eAT2G/oAMx0yqjALQGczE\nucBcBd4gTi+Lyf3ZgYhSdJ8VpcYC/oGjEl227V1Lokjc125a/+h4tfuGBjCW\ncyuG213roFOW0/rIqfRVsj5wTz61qYwqFan3FwbMP/NUKwYcxcILxbbTFYfk\nozyW\r\n=YAzY\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIHLcXFeFLSMwASDwgcJgmCnnggFpQY6tSOW0siGizf7LAiEAz6CXvA10b16XC5VWQKmTQQeITMwGdZ/rSoEQs4a5O/w="}]},"maintainers":[{"name":"daishi","email":"daishi@axlight.com"}],"_npmUser":{"name":"daishi","email":"daishi@axlight.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/reactive-react-redux_4.0.0-alpha.0_1560385115135_0.7209936424638652"},"_hasShrinkwrap":false},"4.0.0-alpha.2":{"name":"reactive-react-redux","description":"React Redux binding with React Hooks and Proxy","version":"4.0.0-alpha.2","author":{"name":"Daishi Kato"},"repository":{"type":"git","url":"git+https://github.com/dai-shi/reactive-react-redux.git"},"main":"./dist/index.js","module":"./src/index.js","types":"./src/index.d.ts","scripts":{"compile":"babel src -d dist","test":"npm run eslint && npm run tsc-test && npm run jest","eslint":"eslint --ext .js,.ts,.tsx --ignore-pattern dist .","jest":"jest","tsc-test":"tsc --project . --noEmit","examples:minimal":"DIR=01_minimal EXT=js webpack-dev-server","examples:typescript":"DIR=02_typescript webpack-dev-server","examples:deep":"DIR=03_deep webpack-dev-server","examples:immer":"DIR=04_immer webpack-dev-server","examples:localstate":"DIR=05_localstate webpack-dev-server","examples:memoization":"DIR=06_memoization webpack-dev-server","examples:multistore":"DIR=07_multistore webpack-dev-server","examples:dynamic":"DIR=08_dynamic webpack-dev-server","examples:thunk":"DIR=09_thunk webpack-dev-server","examples:selectors":"DIR=10_selectors webpack-dev-server","examples:todolist":"DIR=11_todolist EXT=tsx webpack-dev-server"},"keywords":["react","redux","state","hooks","stateless","thisless","pure"],"license":"MIT","dependencies":{"memoize-state":"^2.0.7","proxyequal":"^2.0.7","with-known-usage":"^1.0.0"},"devDependencies":{"@babel/cli":"^7.4.4","@babel/core":"^7.4.5","@babel/preset-env":"^7.4.5","@babel/preset-react":"^7.0.0","@testing-library/react":"^8.0.1","@types/react":"^16.8.19","@types/react-dom":"^16.8.4","@types/redux-logger":"^3.0.7","@typescript-eslint/eslint-plugin":"^1.10.2","@typescript-eslint/parser":"^1.10.2","babel-core":"^7.0.0-bridge.0","babel-eslint":"^10.0.1","babel-loader":"^8.0.6","eslint":"^5.16.0","eslint-config-airbnb":"^17.1.0","eslint-plugin-import":"^2.17.3","eslint-plugin-jsx-a11y":"^6.2.1","eslint-plugin-react":"^7.13.0","eslint-plugin-react-hooks":"^1.6.0","html-webpack-plugin":"^3.2.0","immer":"^3.1.3","jest":"^24.8.0","react":"^16.8.6","react-dom":"^16.8.6","redux":"^4.0.1","redux-thunk":"^2.3.0","ts-loader":"^6.0.2","typescript":"^3.5.1","webpack":"^4.33.0","webpack-cli":"^3.3.4","webpack-dev-server":"^3.7.1"},"peerDependencies":{"react":">=16.8.0","redux":">=4.0.0"},"babel":{"presets":["@babel/preset-env","@babel/preset-react"]},"readme":"# reactive-react-redux\n\n[![Build Status](https://travis-ci.com/dai-shi/reactive-react-redux.svg?branch=master)](https://travis-ci.com/dai-shi/reactive-react-redux)\n[![npm version](https://badge.fury.io/js/reactive-react-redux.svg)](https://badge.fury.io/js/reactive-react-redux)\n[![bundle size](https://badgen.net/bundlephobia/minzip/reactive-react-redux)](https://bundlephobia.com/result?p=reactive-react-redux)\n\nReact Redux binding with React Hooks and Proxy\n\n## Introduction\n\nThis is a library to bind React and Redux with Hooks API.\nThis is an alternative to the official `react-redux`,\nwith a capability of auto-detecting state usage.\n\nThe hook in the official `redux-redux` is\n[`useSelector`](https://react-redux.js.org/api/hooks#useselector)\nwhich is already simple, but the hook `useReduxState` in this library\nis simpler than that without a selector.\nTechnically, `useReduxState` has no [stale props](https://react-redux.js.org/api/hooks#stale-props-and-zombie-children) issue.\n\nSee [comparison](#comparison-with-useselector) for details.\n\n## How it works\n\nA hook `useReduxState` returns the entire Redux state object,\nbut it keeps track of which properties of the object are used\nin render. When the state is updated, this hook checks\nwhether used properties are changed.\nOnly if it detects changes in the state, it triggers re-render.\n\n## Install\n\n```bash\nnpm install reactive-react-redux\n```\n\n## Usage\n\n```javascript\nimport React from 'react';\nimport { createStore } from 'redux';\nimport {\n  ReduxProvider,\n  useReduxDispatch,\n  useReduxState,\n} from 'reactive-react-redux';\n\nconst initialState = {\n  counter: 0,\n  text: 'hello',\n};\n\nconst reducer = (state = initialState, action) => {\n  switch (action.type) {\n    case 'increment': return { ...state, counter: state.counter + 1 };\n    case 'decrement': return { ...state, counter: state.counter - 1 };\n    case 'setText': return { ...state, text: action.text };\n    default: return state;\n  }\n};\n\nconst store = createStore(reducer);\n\nconst Counter = () => {\n  const state = useReduxState();\n  const dispatch = useReduxDispatch();\n  return (\n    <div>\n      {Math.random()}\n      <div>\n        <span>Count:{state.counter}</span>\n        <button type=\"button\" onClick={() => dispatch({ type: 'increment' })}>+1</button>\n        <button type=\"button\" onClick={() => dispatch({ type: 'decrement' })}>-1</button>\n      </div>\n    </div>\n  );\n};\n\nconst TextBox = () => {\n  const state = useReduxState();\n  const dispatch = useReduxDispatch();\n  return (\n    <div>\n      {Math.random()}\n      <div>\n        <span>Text:{state.text}</span>\n        <input value={state.text} onChange={event => dispatch({ type: 'setText', text: event.target.value })} />\n      </div>\n    </div>\n  );\n};\n\nconst App = () => (\n  <ReduxProvider store={store}>\n    <h1>Counter</h1>\n    <Counter />\n    <Counter />\n    <h1>TextBox</h1>\n    <TextBox />\n    <TextBox />\n  </ReduxProvider>\n);\n```\n\n## Advanced Usage\n\n<details>\n<summary>Experimental useReduxSelectors</summary>\n\n```javascript\nimport React, { useCallback } from 'react';\nimport { useReduxSelectors } from 'reactive-react-redux';\n\nconst globalSelectors = {\n  firstName: state => state.person.first,\n  lastName: state => state.person.last,\n};\n\nconst Person = () => {\n  const { firstName } = useReduxSelectors(globalSelectors);\n  return <div>{firstName}</div>;\n  // this component will only render when `state.person.first` is changed.\n};\n\nconst Person2 = ({ threshold }) => {\n  const { firstName, isYoung } = useReduxSelectors({\n    ...globalSelectors,\n    isYoung: useCallback(state => (state.person.age < threshold), [threshold]),\n  });\n  return <div>{firstName}{isYoung && '(young)'}</div>;\n};\n```\n\n</details>\n\n## Examples\n\nThe [examples](examples) folder contains working examples.\nYou can run one of them with\n\n```bash\nPORT=8080 npm run examples:minimal\n```\n\nand open <http://localhost:8080> in your web browser.\n\nYou can also try them in codesandbox.io:\n[01](https://codesandbox.io/s/github/dai-shi/reactive-react-redux/tree/master/examples/01_minimal)\n[02](https://codesandbox.io/s/github/dai-shi/reactive-react-redux/tree/master/examples/02_typescript)\n[03](https://codesandbox.io/s/github/dai-shi/reactive-react-redux/tree/master/examples/03_deep)\n[04](https://codesandbox.io/s/github/dai-shi/reactive-react-redux/tree/master/examples/04_immer)\n[05](https://codesandbox.io/s/github/dai-shi/reactive-react-redux/tree/master/examples/05_localstate)\n[06](https://codesandbox.io/s/github/dai-shi/reactive-react-redux/tree/master/examples/06_memoization)\n[07](https://codesandbox.io/s/github/dai-shi/reactive-react-redux/tree/master/examples/07_multistore)\n[08](https://codesandbox.io/s/github/dai-shi/reactive-react-redux/tree/master/examples/08_dynamic)\n[09](https://codesandbox.io/s/github/dai-shi/reactive-react-redux/tree/master/examples/09_thunk)\n[10](https://codesandbox.io/s/github/dai-shi/reactive-react-redux/tree/master/examples/10_selectors)\n[11](https://codesandbox.io/s/github/dai-shi/reactive-react-redux/tree/master/examples/11_todolist)\n\n## Benchmarks\n\n![benchmark result](https://user-images.githubusercontent.com/490574/58372012-3bde9700-7f52-11e9-9a54-0e3f78bce38a.png)\n\nSee [#3](https://github.com/dai-shi/reactive-react-redux/issues/3#issuecomment-495929564) for details.\n\n## Comparison with useSelector\n\nHere is a example to compare `useSelector` in react-redux\nand `useReduxState` in reactive-react-redux.\n\n### useSelector\n\n```javascript\nimport React from 'react';\nimport { createStore } from 'redux';\nimport {\n  Provider,\n  useSelector,\n} from 'react-redux';\n\nconst store = createStore(...);\n\nconst UserName = ({ id }) => {\n  const firstName = useSelector(state => state.users[id].firstName);\n  const lastName = useSelector(state => state.users[id].lastName);\n  return (\n    <div>\n      User Name: {firstName} {lastName}\n    </div>\n  );\n};\n\nconst App = () => (\n  <Provider store={store}>\n    <UserName id={1} />\n  </Provider>\n);\n```\n\n### useReduxState\n\n```javascript\nimport React from 'react';\nimport { createStore } from 'redux';\nimport {\n  ReduxProvider as Provider,\n  useReduxState,\n} from 'reactive-react-redux';\n\nconst store = createStore(...);\n\nconst UserName = ({ id }) => {\n  const state = useReduxState();\n  const { firstName, lastName } = state.users[id];\n  return (\n    <div>\n      User Name: {firstName} {lastName}\n    </div>\n  );\n};\n\nconst App = () => (\n  <Provider store={store}>\n    <UserName id={1} />\n  </Provider>\n);\n```\n\n## Limitations\n\nBy relying on Proxy,\nthere are some false negatives (failure to trigger re-renders)\nand some false positives (extra re-renders) in edge cases.\n\n### Proxied states are referentially equal only in per-hook basis\n\n```javascript\nconst state1 = useReduxState();\nconst state2 = useReduxState();\n// state1 and state2 is not referentially equal\n// even if the underlying redux state is referentially equal.\n```\n\n### An object referential change doesn't trigger re-render if an property of the object is accessed in previous render\n\n```javascript\nconst state = useReduxState();\nconst foo = useMemo(() => state.foo, [state]);\nconst bar = state.bar;\n// if state.foo is not evaluated in render,\n// it won't trigger re-render if only state.foo is changed.\n```\n\n### Proxied state shouldn't be used outside of render\n\n```javascript\nconst state = useReduxState();\nconst dispatch = useReduxDispatch();\ndispatch({ type: 'FOO', value: state.foo }); // This may lead unexpected behaviour if state.foo is an object\ndispatch({ type: 'FOO', value: state.fooStr }); // This is OK if state.fooStr is a string\n```\n\n## Blogs\n\n- [A deadly simple React bindings library for Redux with Hooks API](https://blog.axlight.com/posts/a-deadly-simple-react-bindings-library-for-redux-with-hooks-api/)\n- [Developing React custom hooks for Redux without react-redux](https://blog.axlight.com/posts/developing-react-custom-hooks-for-redux-without-react-redux/)\n- [Integrating React and Redux, with Hooks and Proxies](https://frontarm.com/daishi-kato/redux-custom-hooks/)\n- [New React Redux coding style with hooks without selectors](https://blog.axlight.com/posts/new-react-redux-coding-style-with-hooks-without-selectors/)\n- [Benchmark alpha-released hooks API in React Redux with alternatives](https://blog.axlight.com/posts/benchmark-alpha-released-hooks-api-in-react-redux-with-alternatives/)\n- [Four patterns for global state with React hooks: Context or Redux](https://blog.axlight.com/posts/four-patterns-for-global-state-with-react-hooks-context-or-redux/)\n- [Redux meets hooks for non-redux users: a small concrete example with reactive-react-redux](https://blog.axlight.com/posts/redux-meets-hooks-for-non-redux-users-a-small-concrete-example-with-reactive-react-redux/)\n","readmeFilename":"README.md","gitHead":"91cc226b556f82b5ca6b5c6941ca498443186b87","bugs":{"url":"https://github.com/dai-shi/reactive-react-redux/issues"},"homepage":"https://github.com/dai-shi/reactive-react-redux#readme","_id":"reactive-react-redux@4.0.0-alpha.2","_nodeVersion":"8.16.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-Pfc/tUYpkIk0tMTpbko0EUQwDDNfNcjcL8hmi/YID709Td9YmxHCwSLfCFpZYpHSlVsPHqHGA9re0rtTIYQYKg==","shasum":"ea56d6785ab39560b7341bce756bf7dd07845e9b","tarball":"https://registry.npmjs.org/reactive-react-redux/-/reactive-react-redux-4.0.0-alpha.2.tgz","fileCount":27,"unpackedSize":49685,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdAj7zCRA9TVsSAnZWagAAfBcP/2GRqGYQ9HqVNzO+8WbI\n59JUPOiU0ba4RrhcYPrPP6VpbKs3Ub9Up7xmdhjUvQzR9kW0pes2giQ80vhK\ndlAhLmAfQNizve8z1A2BFAeOG4s2i9hoDNY4cA11Cof20nxOSFYJzBZ7vFJ2\nhpY5r5373UEimZP/P+hmwhyJlohZHQe3917VbuZhGXt8chceIqNcLHRimU4f\ny7axZz80HwQWNKwyRUoFIX4BDPBxS9JUZdP6ffsQtX9xm/lTBbpZQE0i4NyU\n2hORx2gJeiaPj5Y6sQErAmxTZv/pXJNC1X/kMpP0OVDh2c4z2pf6y/8Yokaw\n1cAhDktBIuvyxiYBKEpR+pPXZLIRE9lX/x9lWQr7xNyBs8u/Q0LzcDAzCZBp\nS0/xSqM8c7+K6rpZUN29fNKruXCars5ooV9Nhg89J/eofaj50YCe7uOooQ1N\nQKHpSWcscSWH1uu6ttnQ2AGXanU3tNtFClHMR7Qg2a/ouPPN8eapz+RpThoG\n9b2Cn5HKKnVyU2O5hh3UUpWPKrFI/7RdY9N5APCzUpcHNkFRCHMGOuFA93/3\nO4P4sk9+I6P+SG8KNqV+sJsTgj7TPS3GrJQjHs1PftM5qrA88gqIwVI44fq6\n1orREpOHjzTNpEQ2PFIq8fjjzcIVvh/j66nMPbksCtO7AOypgGS0Kzt5tO6j\nNJAN\r\n=0iRT\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCICePMmg8z2mJ9selXzsOH+AyDUQL9KWRArMJJ9HbyWPIAiEAq9ZWc6yWmhANPPdpEU5bcw6a3vosKn9yPZJfNVga5rk="}]},"maintainers":[{"name":"daishi","email":"daishi@axlight.com"}],"_npmUser":{"name":"daishi","email":"daishi@axlight.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/reactive-react-redux_4.0.0-alpha.2_1560428274321_0.8946251719060407"},"_hasShrinkwrap":false},"4.0.0-beta.0":{"name":"reactive-react-redux","description":"React Redux binding with React Hooks and Proxy","version":"4.0.0-beta.0","author":{"name":"Daishi Kato"},"repository":{"type":"git","url":"git+https://github.com/dai-shi/reactive-react-redux.git"},"main":"./dist/index.js","module":"./src/index.js","types":"./src/index.d.ts","scripts":{"compile":"babel src -d dist","test":"npm run eslint && npm run tsc-test && npm run jest","eslint":"eslint --ext .js,.ts,.tsx --ignore-pattern dist .","jest":"jest","tsc-test":"tsc --project . --noEmit","examples:minimal":"DIR=01_minimal EXT=js webpack-dev-server","examples:typescript":"DIR=02_typescript webpack-dev-server","examples:deep":"DIR=03_deep webpack-dev-server","examples:immer":"DIR=04_immer webpack-dev-server","examples:localstate":"DIR=05_localstate webpack-dev-server","examples:memoization":"DIR=06_memoization webpack-dev-server","examples:multistore":"DIR=07_multistore webpack-dev-server","examples:dynamic":"DIR=08_dynamic webpack-dev-server","examples:thunk":"DIR=09_thunk webpack-dev-server","examples:selectors":"DIR=10_selectors webpack-dev-server","examples:todolist":"DIR=11_todolist EXT=tsx webpack-dev-server"},"keywords":["react","redux","state","hooks","stateless","thisless","pure"],"license":"MIT","dependencies":{"memoize-state":"^2.0.7","with-known-usage":"^1.0.0"},"devDependencies":{"@babel/cli":"^7.4.4","@babel/core":"^7.4.5","@babel/preset-env":"^7.4.5","@babel/preset-react":"^7.0.0","@testing-library/react":"^8.0.1","@types/react":"^16.8.20","@types/react-dom":"^16.8.4","@types/redux-logger":"^3.0.7","@typescript-eslint/eslint-plugin":"^1.10.2","@typescript-eslint/parser":"^1.10.2","babel-core":"^7.0.0-bridge.0","babel-eslint":"^10.0.1","babel-loader":"^8.0.6","eslint":"^5.16.0","eslint-config-airbnb":"^17.1.0","eslint-plugin-import":"^2.17.3","eslint-plugin-jsx-a11y":"^6.2.1","eslint-plugin-react":"^7.13.0","eslint-plugin-react-hooks":"^1.6.0","html-webpack-plugin":"^3.2.0","immer":"^3.1.3","jest":"^24.8.0","react":"^16.8.6","react-dom":"^16.8.6","redux":"^4.0.1","redux-thunk":"^2.3.0","ts-loader":"^6.0.2","typescript":"^3.5.2","webpack":"^4.34.0","webpack-cli":"^3.3.4","webpack-dev-server":"^3.7.1"},"peerDependencies":{"react":">=16.8.0","redux":">=4.0.0"},"babel":{"presets":["@babel/preset-env","@babel/preset-react"]},"readme":"# reactive-react-redux\n\n[![Build Status](https://travis-ci.com/dai-shi/reactive-react-redux.svg?branch=master)](https://travis-ci.com/dai-shi/reactive-react-redux)\n[![npm version](https://badge.fury.io/js/reactive-react-redux.svg)](https://badge.fury.io/js/reactive-react-redux)\n[![bundle size](https://badgen.net/bundlephobia/minzip/reactive-react-redux)](https://bundlephobia.com/result?p=reactive-react-redux)\n\nReact Redux binding with React Hooks and Proxy\n\n## Introduction\n\nThis is a library to bind React and Redux with Hooks API.\nThis is an alternative to the official `react-redux`,\nwith a capability of auto-detecting state usage.\n\nThe hook in the official `redux-redux` is\n[`useSelector`](https://react-redux.js.org/api/hooks#useselector)\nwhich is already simple, but the hook `useTrackedState` in this library\nis simpler than that without a selector.\nTechnically, `useTrackedState` has no [stale props](https://react-redux.js.org/api/hooks#stale-props-and-zombie-children) issue.\n\nSee [comparison](#comparison-with-useselector) for details.\n\n## How it works\n\nA hook `useTrackedState` returns the entire Redux state object,\nbut it keeps track of which properties of the object are used\nin render. When the state is updated, this hook checks\nwhether used properties are changed.\nOnly if it detects changes in the state, it triggers re-render.\n\n## Install\n\n```bash\nnpm install reactive-react-redux\n```\n\n## Usage\n\n```javascript\nimport React from 'react';\nimport { createStore } from 'redux';\nimport {\n  Provider,\n  useDispatch,\n  useTrackedState,\n} from 'reactive-react-redux';\n\nconst initialState = {\n  counter: 0,\n  text: 'hello',\n};\n\nconst reducer = (state = initialState, action) => {\n  switch (action.type) {\n    case 'increment': return { ...state, counter: state.counter + 1 };\n    case 'decrement': return { ...state, counter: state.counter - 1 };\n    case 'setText': return { ...state, text: action.text };\n    default: return state;\n  }\n};\n\nconst store = createStore(reducer);\n\nconst Counter = () => {\n  const state = useTrackedState();\n  const dispatch = useDispatch();\n  return (\n    <div>\n      {Math.random()}\n      <div>\n        <span>Count:{state.counter}</span>\n        <button type=\"button\" onClick={() => dispatch({ type: 'increment' })}>+1</button>\n        <button type=\"button\" onClick={() => dispatch({ type: 'decrement' })}>-1</button>\n      </div>\n    </div>\n  );\n};\n\nconst TextBox = () => {\n  const state = useTrackedState();\n  const dispatch = useDispatch();\n  return (\n    <div>\n      {Math.random()}\n      <div>\n        <span>Text:{state.text}</span>\n        <input value={state.text} onChange={event => dispatch({ type: 'setText', text: event.target.value })} />\n      </div>\n    </div>\n  );\n};\n\nconst App = () => (\n  <Provider store={store}>\n    <h1>Counter</h1>\n    <Counter />\n    <Counter />\n    <h1>TextBox</h1>\n    <TextBox />\n    <TextBox />\n  </Provider>\n);\n```\n\n## Advanced Usage\n\n<details>\n<summary>Experimental useTrackedSelectors</summary>\n\n```javascript\nimport React, { useCallback } from 'react';\nimport { useTrackedSelectors } from 'reactive-react-redux';\n\nconst globalSelectors = {\n  firstName: state => state.person.first,\n  lastName: state => state.person.last,\n};\n\nconst Person = () => {\n  const { firstName } = useTrackedSelectors(globalSelectors);\n  return <div>{firstName}</div>;\n  // this component will only render when `state.person.first` is changed.\n};\n\nconst Person2 = ({ threshold }) => {\n  const { firstName, isYoung } = useTrackedSelectors({\n    ...globalSelectors,\n    isYoung: useCallback(state => (state.person.age < threshold), [threshold]),\n  });\n  return <div>{firstName}{isYoung && '(young)'}</div>;\n};\n```\n\n</details>\n\n## Examples\n\nThe [examples](examples) folder contains working examples.\nYou can run one of them with\n\n```bash\nPORT=8080 npm run examples:minimal\n```\n\nand open <http://localhost:8080> in your web browser.\n\nYou can also try them in codesandbox.io:\n[01](https://codesandbox.io/s/github/dai-shi/reactive-react-redux/tree/master/examples/01_minimal)\n[02](https://codesandbox.io/s/github/dai-shi/reactive-react-redux/tree/master/examples/02_typescript)\n[03](https://codesandbox.io/s/github/dai-shi/reactive-react-redux/tree/master/examples/03_deep)\n[04](https://codesandbox.io/s/github/dai-shi/reactive-react-redux/tree/master/examples/04_immer)\n[05](https://codesandbox.io/s/github/dai-shi/reactive-react-redux/tree/master/examples/05_localstate)\n[06](https://codesandbox.io/s/github/dai-shi/reactive-react-redux/tree/master/examples/06_memoization)\n[07](https://codesandbox.io/s/github/dai-shi/reactive-react-redux/tree/master/examples/07_multistore)\n[08](https://codesandbox.io/s/github/dai-shi/reactive-react-redux/tree/master/examples/08_dynamic)\n[09](https://codesandbox.io/s/github/dai-shi/reactive-react-redux/tree/master/examples/09_thunk)\n[10](https://codesandbox.io/s/github/dai-shi/reactive-react-redux/tree/master/examples/10_selectors)\n[11](https://codesandbox.io/s/github/dai-shi/reactive-react-redux/tree/master/examples/11_todolist)\n\n## Benchmarks\n\n![benchmark result](https://user-images.githubusercontent.com/490574/58372012-3bde9700-7f52-11e9-9a54-0e3f78bce38a.png)\n\nSee [#3](https://github.com/dai-shi/reactive-react-redux/issues/3#issuecomment-495929564) for details.\n\n## Comparison with useSelector\n\nHere is a example to compare `useSelector` in react-redux\nand `useTrackedState` in reactive-react-redux.\n\n### useSelector\n\n```javascript\nimport React from 'react';\nimport { createStore } from 'redux';\nimport {\n  Provider,\n  useSelector,\n} from 'react-redux';\n\nconst store = createStore(...);\n\nconst UserName = ({ id }) => {\n  const firstName = useSelector(state => state.users[id].firstName);\n  const lastName = useSelector(state => state.users[id].lastName);\n  return (\n    <div>\n      User Name: {firstName} {lastName}\n    </div>\n  );\n};\n\nconst App = () => (\n  <Provider store={store}>\n    <UserName id={1} />\n  </Provider>\n);\n```\n\n### useTrackedState\n\n```javascript\nimport React from 'react';\nimport { createStore } from 'redux';\nimport {\n  Provider,\n  useTrackedState,\n} from 'reactive-react-redux';\n\nconst store = createStore(...);\n\nconst UserName = ({ id }) => {\n  const state = useTrackedState();\n  const { firstName, lastName } = state.users[id];\n  return (\n    <div>\n      User Name: {firstName} {lastName}\n    </div>\n  );\n};\n\nconst App = () => (\n  <Provider store={store}>\n    <UserName id={1} />\n  </Provider>\n);\n```\n\n## Limitations\n\nBy relying on Proxy,\nthere are some false negatives (failure to trigger re-renders)\nand some false positives (extra re-renders) in edge cases.\n\n### Proxied states are referentially equal only in per-hook basis\n\n```javascript\nconst state1 = useTrackedState();\nconst state2 = useTrackedState();\n// state1 and state2 is not referentially equal\n// even if the underlying redux state is referentially equal.\n```\n\n### An object referential change doesn't trigger re-render if an property of the object is accessed in previous render\n\n```javascript\nconst state = useTrackedState();\nconst foo = useMemo(() => state.foo, [state]);\nconst bar = state.bar;\n// if state.foo is not evaluated in render,\n// it won't trigger re-render if only state.foo is changed.\n```\n\n### Proxied state shouldn't be used outside of render\n\n```javascript\nconst state = useTrackedState();\nconst dispatch = useDispatch();\ndispatch({ type: 'FOO', value: state.foo }); // This may lead unexpected behaviour if state.foo is an object\ndispatch({ type: 'FOO', value: state.fooStr }); // This is OK if state.fooStr is a string\n```\n\n## Blogs\n\n- [A deadly simple React bindings library for Redux with Hooks API](https://blog.axlight.com/posts/a-deadly-simple-react-bindings-library-for-redux-with-hooks-api/)\n- [Developing React custom hooks for Redux without react-redux](https://blog.axlight.com/posts/developing-react-custom-hooks-for-redux-without-react-redux/)\n- [Integrating React and Redux, with Hooks and Proxies](https://frontarm.com/daishi-kato/redux-custom-hooks/)\n- [New React Redux coding style with hooks without selectors](https://blog.axlight.com/posts/new-react-redux-coding-style-with-hooks-without-selectors/)\n- [Benchmark alpha-released hooks API in React Redux with alternatives](https://blog.axlight.com/posts/benchmark-alpha-released-hooks-api-in-react-redux-with-alternatives/)\n- [Four patterns for global state with React hooks: Context or Redux](https://blog.axlight.com/posts/four-patterns-for-global-state-with-react-hooks-context-or-redux/)\n- [Redux meets hooks for non-redux users: a small concrete example with reactive-react-redux](https://blog.axlight.com/posts/redux-meets-hooks-for-non-redux-users-a-small-concrete-example-with-reactive-react-redux/)\n","readmeFilename":"README.md","gitHead":"89526ca0e3b08b385cbf8ada9bdf7d21b8d23f50","bugs":{"url":"https://github.com/dai-shi/reactive-react-redux/issues"},"homepage":"https://github.com/dai-shi/reactive-react-redux#readme","_id":"reactive-react-redux@4.0.0-beta.0","_nodeVersion":"8.16.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-Bl3zlK/EXtshEUnBY5LdXC9SHDo/3QjN+TVJx0rGnKJSeH1VdpstacmT3Gz0Stns1tJbyLjr+p6tkPUrORK5qw==","shasum":"dab5a356924a24c6e7c9636dd9e65aaf7d994e9a","tarball":"https://registry.npmjs.org/reactive-react-redux/-/reactive-react-redux-4.0.0-beta.0.tgz","fileCount":21,"unpackedSize":44746,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdAtcDCRA9TVsSAnZWagAARAQQAITAo3HKw0exzAwuyUZ7\netDwctvZzFTRaOQlFCeb1G8T58LSxfp1vMQMa6nb6neE8S9ytr5AyEKBwYhw\nBB+tsVaMxrJnB5s5fc5matNSH3wnJe4OvbIJSRBs/zzTG3cd8RNUwIIuidpv\nu9Wpwkxwgw4abQzhGzYgycqM2TpDIpQ8j/OSMpcly77/y6AFwBxwZBf0wDTU\njCWicTFhSvdYU3fen2MomHkKpuaJ21e/wKN3mL17FQ8u8keRYtY4P5527lDD\nsRgIUXMyXkgDAQwPHen1fxTnImgvQ/w84ygAj9QuMoyTKu5e5Hl/K9GeJBQs\nDAZLGehGtpITQxEmda3TrCQbQYsPY9F3Tf8Xpky2HAv0hRPSd5kJyu3lmI2l\n5to5odGS1bHJPm7CTbTkZ0w2GIj8riHfwgxW/J2Sb3LDEe3t5AIeauEpQEcb\nV3XP35yUMinnitUlfgJit+a8eMwQT4E6K+NJzu5LpTUoOQZMbjrDw53NnVv6\nklgla6MbzOrYTO7jkD+eSWPj8AszBG3I6H8m0PyBZ/s6YqtXZQNda6dmarx9\neeDviLYsqmdoKsD5nk8k8pOQUkbTdwXfVHpxW5kDSniaCuKk9sQx7rW3TCS2\n1eGpNtVBxed82dpAKHML3ZFjlEfzqTA6fioKuwlG9pDyesQG9I/dMQf3HooR\nwRa6\r\n=msLO\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCISuAa4Uoj6HzPFgMet7+VdE2HAk8ElHtOAbjR7rq/PwIhAOdkQtoIZMEO0Iz8z8ieEFbVo4uTmaBTU29Hx7B5edqr"}]},"maintainers":[{"name":"daishi","email":"daishi@axlight.com"}],"_npmUser":{"name":"daishi","email":"daishi@axlight.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/reactive-react-redux_4.0.0-beta.0_1560467202465_0.44455539104491404"},"_hasShrinkwrap":false},"4.0.0":{"name":"reactive-react-redux","description":"React Redux binding with React Hooks and Proxy","version":"4.0.0","author":{"name":"Daishi Kato"},"repository":{"type":"git","url":"git+https://github.com/dai-shi/reactive-react-redux.git"},"main":"./dist/index.js","module":"./src/index.js","types":"./src/index.d.ts","scripts":{"compile":"babel src -d dist","test":"npm run eslint && npm run tsc-test && npm run jest","eslint":"eslint --ext .js,.ts,.tsx --ignore-pattern dist .","jest":"jest","tsc-test":"tsc --project . --noEmit","examples:minimal":"DIR=01_minimal EXT=js webpack-dev-server","examples:typescript":"DIR=02_typescript webpack-dev-server","examples:deep":"DIR=03_deep webpack-dev-server","examples:immer":"DIR=04_immer webpack-dev-server","examples:localstate":"DIR=05_localstate webpack-dev-server","examples:memoization":"DIR=06_memoization webpack-dev-server","examples:multistore":"DIR=07_multistore webpack-dev-server","examples:dynamic":"DIR=08_dynamic webpack-dev-server","examples:thunk":"DIR=09_thunk webpack-dev-server","examples:selectors":"DIR=10_selectors webpack-dev-server","examples:todolist":"DIR=11_todolist EXT=tsx webpack-dev-server"},"keywords":["react","redux","state","hooks","stateless","thisless","pure"],"license":"MIT","dependencies":{"memoize-state":"^2.0.7","with-known-usage":"^1.0.0"},"devDependencies":{"@babel/cli":"^7.4.4","@babel/core":"^7.4.5","@babel/preset-env":"^7.4.5","@babel/preset-react":"^7.0.0","@testing-library/react":"^8.0.1","@types/react":"^16.8.20","@types/react-dom":"^16.8.4","@types/redux-logger":"^3.0.7","@typescript-eslint/eslint-plugin":"^1.10.2","@typescript-eslint/parser":"^1.10.2","babel-core":"^7.0.0-bridge.0","babel-eslint":"^10.0.1","babel-loader":"^8.0.6","eslint":"^5.16.0","eslint-config-airbnb":"^17.1.0","eslint-plugin-import":"^2.17.3","eslint-plugin-jsx-a11y":"^6.2.1","eslint-plugin-react":"^7.13.0","eslint-plugin-react-hooks":"^1.6.0","html-webpack-plugin":"^3.2.0","immer":"^3.1.3","jest":"^24.8.0","react":"^16.8.6","react-dom":"^16.8.6","redux":"^4.0.1","redux-thunk":"^2.3.0","ts-loader":"^6.0.2","typescript":"^3.5.2","webpack":"^4.34.0","webpack-cli":"^3.3.4","webpack-dev-server":"^3.7.1"},"peerDependencies":{"react":">=16.8.0","redux":">=4.0.0"},"babel":{"presets":["@babel/preset-env","@babel/preset-react"]},"gitHead":"cde66a5b147aff767d8d3da341e36b63e6dd9588","bugs":{"url":"https://github.com/dai-shi/reactive-react-redux/issues"},"homepage":"https://github.com/dai-shi/reactive-react-redux#readme","_id":"reactive-react-redux@4.0.0","_nodeVersion":"8.16.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-gQXTcT8+Ymk8kTm+qDV7PwdbCRhwFKo/udNyj6QTBeWvzDUpLoEJXQo6d4pwSigAlw5uXPFUDCss71CS2nQGLQ==","shasum":"dd40c07b7453539b81c64e08f783c3fa68a248ab","tarball":"https://registry.npmjs.org/reactive-react-redux/-/reactive-react-redux-4.0.0.tgz","fileCount":21,"unpackedSize":45081,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdDd2rCRA9TVsSAnZWagAAzEYQAKDRc4fsd3hc+PRiiU0t\nFW8QPBXv9tP7DiEgnUn1EumF3bvoqwPvGrCFD4eLMfwm8PEJFbyP4b6Q7ynI\nopwO9bcbTbVgM/eCdvryvSK9HMPGKKcidBdVeQJiMLfjg7T/IhbwsguSUN1h\nC2NPEosgslJBh6MKlDRWp2Y5dSPLaHL7QSgnaeHpiNHdzbuwHaknsyio4vM9\nx5S9pSv2n2j38XNLvwNsl5X4Lqm0usACR/Q6oeDizxbCYVicsdIODcXo57to\nSjeev1aF77oqP+/VGKiGez6cjWwc9PaTFzVzlGxVz6cuboGLmpv6J1DacKMt\nD/y+Fc6TbFbsT7+EfabB2gGZ8RFQJ+ZyOzDJ03vnkp47vIjkrvEw71QP6Wks\n/ieWOGTjgyCrzQ/SUbDPnxw1AcTJI7u1za26FIDcaYjgVOd5gayVRhk3fRkr\nZnDTs8TfGjcejDn2cahQyctadzfmI3hj2QaH0HEVeigJuJOxaMIsnaqaFjE4\n/afmpL8GWIhuaEe9WQNUDm0/H3/Y7tgZU77Pp37bCtTnYlUwgKTjkM+ftofh\n6Ot3T3EQEqRKwRKx5a5uts6RIYna+avBORo5QLUFxM609EeoEPkOQC3vGVGp\nBEFMF5jwnNtyc7PDBjKvQEYb/aZaS6oOsWKB2iBy266Pr7j503grHQEcDlV9\nUOZD\r\n=pyyy\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDkCNe8g8bKl6Yzpdt2F2Wcc8zJNRRPfiO+YiHqWEqxIgIgTPrruCxGMglTLtcSMSyVxUaWlqF6JDxN+m8res7C/Jc="}]},"maintainers":[{"name":"daishi","email":"daishi@axlight.com"}],"_npmUser":{"name":"daishi","email":"daishi@axlight.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/reactive-react-redux_4.0.0_1561189802391_0.6260527937289957"},"_hasShrinkwrap":false},"4.1.0":{"name":"reactive-react-redux","description":"React Redux binding with React Hooks and Proxy","version":"4.1.0","author":{"name":"Daishi Kato"},"repository":{"type":"git","url":"git+https://github.com/dai-shi/reactive-react-redux.git"},"main":"./dist/index.js","module":"./src/index.js","types":"./src/index.d.ts","scripts":{"compile":"babel src -d dist","test":"npm run eslint && npm run tsc-test && npm run jest","eslint":"eslint --ext .js,.ts,.tsx --ignore-pattern dist .","jest":"jest","tsc-test":"tsc --project . --noEmit","examples:minimal":"DIR=01_minimal EXT=js webpack-dev-server","examples:typescript":"DIR=02_typescript webpack-dev-server","examples:deep":"DIR=03_deep webpack-dev-server","examples:immer":"DIR=04_immer webpack-dev-server","examples:localstate":"DIR=05_localstate webpack-dev-server","examples:memoization":"DIR=06_memoization webpack-dev-server","examples:multistore":"DIR=07_multistore webpack-dev-server","examples:dynamic":"DIR=08_dynamic webpack-dev-server","examples:thunk":"DIR=09_thunk webpack-dev-server","examples:selectors":"DIR=10_selectors webpack-dev-server","examples:todolist":"DIR=11_todolist EXT=tsx webpack-dev-server"},"keywords":["react","redux","state","hooks","stateless","thisless","pure"],"license":"MIT","dependencies":{"memoize-state":"^2.0.7","with-known-usage":"^1.0.0"},"devDependencies":{"@babel/cli":"^7.5.5","@babel/core":"^7.5.5","@babel/preset-env":"^7.5.5","@babel/preset-react":"^7.0.0","@testing-library/react":"^8.0.5","@types/react":"^16.8.23","@types/react-dom":"^16.8.4","@types/redux-logger":"^3.0.7","@typescript-eslint/eslint-plugin":"^1.12.0","@typescript-eslint/parser":"^1.12.0","babel-core":"^7.0.0-bridge.0","babel-eslint":"^10.0.2","babel-loader":"^8.0.6","eslint":"^6.0.1","eslint-config-airbnb":"^17.1.1","eslint-plugin-import":"^2.18.2","eslint-plugin-jsx-a11y":"^6.2.3","eslint-plugin-react":"^7.14.2","eslint-plugin-react-hooks":"^1.6.1","html-webpack-plugin":"^3.2.0","immer":"^3.1.3","jest":"^24.8.0","react":"^16.8.6","react-dom":"^16.8.6","redux":"^4.0.1","redux-thunk":"^2.3.0","ts-loader":"^6.0.4","typescript":"^3.5.3","webpack":"^4.36.1","webpack-cli":"^3.3.6","webpack-dev-server":"^3.7.2"},"peerDependencies":{"react":">=16.8.0","redux":">=4.0.0"},"babel":{"presets":["@babel/preset-env","@babel/preset-react"]},"gitHead":"56a64342b9a8fed6499b39e99abd3fa9215d9a76","bugs":{"url":"https://github.com/dai-shi/reactive-react-redux/issues"},"homepage":"https://github.com/dai-shi/reactive-react-redux#readme","_id":"reactive-react-redux@4.1.0","_nodeVersion":"8.16.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-EzTVWb6QEbPv9t4ynzuq31+BLiWfZGWV5soyCt9nN2/1QDR86iaaTLhxW6VutSdz63R8RJyg35X6X3CjqDuInw==","shasum":"e002090bda1dd66448bf70a68bbbb78600027c45","tarball":"https://registry.npmjs.org/reactive-react-redux/-/reactive-react-redux-4.1.0.tgz","fileCount":21,"unpackedSize":45637,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdMrdhCRA9TVsSAnZWagAAPecP/1f/kmzyh0lvIrXlwE01\nfTs0OUKhvcYoBbK/W7KkqSE+GI6GwWSkckMKkHeNcIqsXvclJUH0eX2pFxQ0\nYhavE1ic3JazK9KRvkhDIG+NK1+7Wt05xAVqKccre9q25mO/6jnfzBK/1A0k\nrfyAq9YQS1unyDvNG17Z3BCnwEydP/d6qdHv48UZEecoprrgFexZ7zVfijtB\nh0832xnOYUZCQgEt6v7Rh6ifQvX4IQyP+SC6aoXdFUcVqjG1UbSGYce9fjOM\nINldLB12U/0/+hrIJ4Z6ZoAVvFAy5GaMSRBOIIOAWahJqznTAlkGQpgQ5Fs3\nrbuqejGc6NNRonT7+wR2dEwu4Hyj7j8+pQxiQ42W5NOHkAV9LttRjpeZ9Vgq\nTZxE+iKwEJXW2kx8LX5On8iZul+V9NC2Lp3Ie75c5FNtXb7AcdudXhrrvIha\nBttPzNMA955UtRMc7zc9tevVj3j/7u3FrOHcQXXNzyATMFedgx8AloF/DlTR\nfC9euqRInXHpIe6nEDRxwjHQdwR/1NxMj70dGSlT/eiR18YXFGWF5RcqCvCE\n9ktDy1UiE5faVFfCyVGJY3CzyABKwjvUA/wMbRDpB6r+jXuGczUr0bIn8VLy\nRkwm4HWtcDdMqT7ilorY15+SaJOgAJRla15WluMTFLKvRodeRSA75JKlNj1Y\n8ah5\r\n=fopd\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIEpr9d9z5P9gwCfHufewAngR8R3kRzuXSUdpL8jQ9Rs5AiAs3wXbMTsWnfEsr3ksD+BINMtKcexmEVzhKjxW/yOVsQ=="}]},"maintainers":[{"name":"daishi","email":"daishi@axlight.com"}],"_npmUser":{"name":"daishi","email":"daishi@axlight.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/reactive-react-redux_4.1.0_1563604832634_0.7214020614205705"},"_hasShrinkwrap":false},"4.2.0-alpha.0":{"name":"reactive-react-redux","description":"React Redux binding with React Hooks and Proxy","version":"4.2.0-alpha.0","author":{"name":"Daishi Kato"},"repository":{"type":"git","url":"git+https://github.com/dai-shi/reactive-react-redux.git"},"main":"./dist/index.js","module":"./src/index.js","types":"./src/index.d.ts","scripts":{"compile":"babel src -d dist","test":"npm run eslint && npm run tsc-test && npm run jest","eslint":"eslint --ext .js,.ts,.tsx --ignore-pattern dist .","jest":"jest","tsc-test":"tsc --project . --noEmit","examples:minimal":"DIR=01_minimal EXT=js webpack-dev-server","examples:typescript":"DIR=02_typescript webpack-dev-server","examples:deep":"DIR=03_deep webpack-dev-server","examples:immer":"DIR=04_immer webpack-dev-server","examples:localstate":"DIR=05_localstate webpack-dev-server","examples:memoization":"DIR=06_memoization webpack-dev-server","examples:multistore":"DIR=07_multistore webpack-dev-server","examples:dynamic":"DIR=08_dynamic webpack-dev-server","examples:thunk":"DIR=09_thunk webpack-dev-server","examples:todolist":"DIR=11_todolist EXT=tsx webpack-dev-server"},"keywords":["react","redux","state","hooks","stateless","thisless","pure"],"license":"MIT","dependencies":{},"devDependencies":{"@babel/cli":"^7.5.5","@babel/core":"^7.5.5","@babel/preset-env":"^7.5.5","@babel/preset-react":"^7.0.0","@testing-library/react":"^8.0.5","@types/react":"^16.8.23","@types/react-dom":"^16.8.4","@types/redux-logger":"^3.0.7","@typescript-eslint/eslint-plugin":"^1.12.0","@typescript-eslint/parser":"^1.12.0","babel-core":"^7.0.0-bridge.0","babel-eslint":"^10.0.2","babel-loader":"^8.0.6","eslint":"^6.0.1","eslint-config-airbnb":"^17.1.1","eslint-plugin-import":"^2.18.2","eslint-plugin-jsx-a11y":"^6.2.3","eslint-plugin-react":"^7.14.2","eslint-plugin-react-hooks":"^1.6.1","html-webpack-plugin":"^3.2.0","immer":"^3.1.3","jest":"^24.8.0","react":"^16.8.6","react-dom":"^16.8.6","redux":"^4.0.1","redux-thunk":"^2.3.0","ts-loader":"^6.0.4","typescript":"^3.5.3","webpack":"^4.36.1","webpack-cli":"^3.3.6","webpack-dev-server":"^3.7.2"},"peerDependencies":{"react":">=16.8.0","redux":">=4.0.0"},"babel":{"presets":["@babel/preset-env","@babel/preset-react"]},"gitHead":"655e2c22baf7430b04bfc26aff24257b0ab5caea","bugs":{"url":"https://github.com/dai-shi/reactive-react-redux/issues"},"homepage":"https://github.com/dai-shi/reactive-react-redux#readme","_id":"reactive-react-redux@4.2.0-alpha.0","_nodeVersion":"8.16.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-NW1bnw1R0pbn9Y8i5wExtsJTaNxykW6f++sIDq3V92vx3fGkoAJnfF0BfCrIR82greoRNQKa/W0185qSOZ6pCg==","shasum":"a911de2351e49ea16c4307cba9a37e4f51e36024","tarball":"https://registry.npmjs.org/reactive-react-redux/-/reactive-react-redux-4.2.0-alpha.0.tgz","fileCount":12,"unpackedSize":25143,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdOIPlCRA9TVsSAnZWagAAi+8P/iAd3EJhk99X+3dTM91s\nWBNjjDoP8yDZdK8ZLu4nAF7ggx2fs8zINGkWfm0x6SLVj/SMWJveZIorE/ev\nhXjZXOlOn0hWyMFwZ4X203cwrm64FmoyaeEMpBizuQgKIFsWvG4w1DOmNRLF\n/tXJGvN0buWohteQb3UwDN1NBFZTTGvzyDiAwRTm8f2v4pzwbCvgVSfEuqKp\nXYd2ZBRoGS9iVbiMsfGyCVE2r+tfJbGamA96s6cJngPsTCYmk0YvhtV7uNjR\ny3V1XXd/Tk4XfOqlnydNw5PccvWtsVbxN7X4nsriTVjVjoz4roYqU6UsdjIO\n3UnX8RxcXmrEqsKAdEKjdD6guW0LOKArI9kwDZLddgckkR6cOdjrQsOcet3+\nEKk8Iu4497AUp8rqPMpiNdtFBVkL2w2D0oG4Ep9WBY4wbC37BJJ2gD124LwO\n+oqoLP8mZooujhX/9GwVFqyfinnOu52tjuQFvSfxwrrS+9h9ZcnGSzYHzeH3\ndR55FaXB6cTaiEUJR7vlgkmjYvnmzvbzsMsncpnuyD4IGtBfk/nvoIqp+leu\nUeRlClRYBD2qw0VlPsC8VArvCT50A7Vflgg4ZCTgqr3ez6k1Y7o4x/8KDmac\nZ62OpvFjssFdOvs472ZhFLt/nvhCQl580pAFdQqWwFUJIpKQduJMbwpTVqvg\nZKDu\r\n=2xzL\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIEgAAN8zO5CTSZB3gfTTXMSHRbYhkX4QhaC38yRMwkdQAiEAwpnacwjhDJzWFF602Kr9iJynD07c6xDfuaQr95LN28w="}]},"maintainers":[{"name":"daishi","email":"daishi@axlight.com"}],"_npmUser":{"name":"daishi","email":"daishi@axlight.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/reactive-react-redux_4.2.0-alpha.0_1563984868976_0.8847136877905655"},"_hasShrinkwrap":false},"4.2.0":{"name":"reactive-react-redux","description":"React Redux binding with React Hooks and Proxy","version":"4.2.0","author":{"name":"Daishi Kato"},"repository":{"type":"git","url":"git+https://github.com/dai-shi/reactive-react-redux.git"},"main":"./dist/index.js","module":"./src/index.js","types":"./src/index.d.ts","scripts":{"compile":"babel src -d dist","test":"npm run eslint && npm run tsc-test && npm run jest","eslint":"eslint --ext .js,.ts,.tsx --ignore-pattern dist .","jest":"jest","tsc-test":"tsc --project . --noEmit","examples:minimal":"DIR=01_minimal EXT=js webpack-dev-server","examples:typescript":"DIR=02_typescript webpack-dev-server","examples:deep":"DIR=03_deep webpack-dev-server","examples:immer":"DIR=04_immer webpack-dev-server","examples:localstate":"DIR=05_localstate webpack-dev-server","examples:memoization":"DIR=06_memoization webpack-dev-server","examples:multistore":"DIR=07_multistore webpack-dev-server","examples:dynamic":"DIR=08_dynamic webpack-dev-server","examples:thunk":"DIR=09_thunk webpack-dev-server","examples:todolist":"DIR=11_todolist EXT=tsx webpack-dev-server"},"keywords":["react","redux","state","hooks","stateless","thisless","pure"],"license":"MIT","dependencies":{},"devDependencies":{"@babel/cli":"^7.5.5","@babel/core":"^7.5.5","@babel/preset-env":"^7.5.5","@babel/preset-react":"^7.0.0","@testing-library/react":"^8.0.7","@types/react":"^16.8.23","@types/react-dom":"^16.8.5","@types/redux-logger":"^3.0.7","@typescript-eslint/eslint-plugin":"^1.13.0","@typescript-eslint/parser":"^1.13.0","babel-core":"^7.0.0-bridge.0","babel-eslint":"^10.0.2","babel-loader":"^8.0.6","eslint":"^6.1.0","eslint-config-airbnb":"^17.1.1","eslint-plugin-import":"^2.18.2","eslint-plugin-jsx-a11y":"^6.2.3","eslint-plugin-react":"^7.14.3","eslint-plugin-react-hooks":"^1.6.1","html-webpack-plugin":"^3.2.0","immer":"^3.1.3","jest":"^24.8.0","react":"^16.8.6","react-dom":"^16.8.6","redux":"^4.0.1","redux-thunk":"^2.3.0","ts-loader":"^6.0.4","typescript":"^3.5.3","webpack":"^4.38.0","webpack-cli":"^3.3.6","webpack-dev-server":"^3.7.2"},"peerDependencies":{"react":">=16.8.0","redux":">=4.0.0"},"babel":{"presets":["@babel/preset-env","@babel/preset-react"]},"gitHead":"9ffd876bc5c5a7e7ec3718166e25465526c54511","bugs":{"url":"https://github.com/dai-shi/reactive-react-redux/issues"},"homepage":"https://github.com/dai-shi/reactive-react-redux#readme","_id":"reactive-react-redux@4.2.0","_nodeVersion":"8.16.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-iAVbf9NbwIU/dxqEj36gdgeYzsh6qVk88l0nzhuFGQ+hcylXJB4980HfS3t24Y0qcFHWHpb3AtgetM217hGXCA==","shasum":"127ce40189d1aaa73df800e350a2eccf23964f0a","tarball":"https://registry.npmjs.org/reactive-react-redux/-/reactive-react-redux-4.2.0.tgz","fileCount":19,"unpackedSize":38581,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdPBNZCRA9TVsSAnZWagAA1rUP/R7ubMID6Ze6sylBdAyU\n3wVaI8hdZWPbU6YLix7X91kHYfnzL0cqzxrMmFgBj4S6tlMS5GYw+D0HhrMq\n1l99TZ5GssDPQcVveX/KUVV/OLtjI81aTi6J11pAdACdW3G85CQG/RlcuTKO\nj8RBhJ1bvEQNyi8klwFDbi1nR9+uOgvwlEP/Ia2Re2HZU68u2psv6CS0cSb3\nIPqtUCiEEU2oOopNw+ohKFBnQBMJgaUVfdEJfMt+85FlyAh29RAx0Ds2rTPJ\nV2CSSTsTY3rYKg9gJ7tK2P6YVo69u1s4xgnGw9Wc232L6mPZzUeDj94vHRJ4\nH0R8raWkQAUy3tuTwnJoPNYUdu7STAFnI880spAfb1qFgcmRax8ZuzkscqZ0\nbNWBwXJLXqJAnDApo3v0vt+9OMhpFKGJLZ3pOKPI4KjM5E/3QRTAOw9hxQgA\n53hV2a5o+zhlg0c+lgx8Df1igZ6WeTUrrfDk6t3F/nXyh2z10NeD0rfewz+2\nfjngNvQ7Fqbz+VL25p6wLp9tjxS9HgaXwGdeIVYF84vXYzNJ9YlbCQfMQcN0\naPRNnk4m1Uj8jhNqrh2rGWT38Q8EQVu2goXoxpxNKkFlyHSHgy848f2WZntl\nU1+J8i0BwMwWbu1abAWebp7rPY2TLyxRHvuBq1UwmZj1KedE5Yt32bGGKp2i\nqFvn\r\n=6s3o\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCaPelfPyKWZhygfE2wxP+iXkt516Se+u65yPBKRJ63XQIgCpKK4gr6L21pffqyKxj+CKxZWpt4UneRyCEOMXzZIzQ="}]},"maintainers":[{"name":"daishi","email":"daishi@axlight.com"}],"_npmUser":{"name":"daishi","email":"daishi@axlight.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/reactive-react-redux_4.2.0_1564218200287_0.8879953675855998"},"_hasShrinkwrap":false},"4.2.1":{"name":"reactive-react-redux","description":"React Redux binding with React Hooks and Proxy","version":"4.2.1","author":{"name":"Daishi Kato"},"repository":{"type":"git","url":"git+https://github.com/dai-shi/reactive-react-redux.git"},"main":"./dist/index.js","module":"./src/index.js","types":"./src/index.d.ts","scripts":{"compile":"babel src -d dist","test":"npm run eslint && npm run tsc-test && npm run jest","eslint":"eslint --ext .js,.ts,.tsx --ignore-pattern dist .","jest":"jest","tsc-test":"tsc --project . --noEmit","examples:minimal":"DIR=01_minimal EXT=js webpack-dev-server","examples:typescript":"DIR=02_typescript webpack-dev-server","examples:deep":"DIR=03_deep webpack-dev-server","examples:immer":"DIR=04_immer webpack-dev-server","examples:localstate":"DIR=05_localstate webpack-dev-server","examples:memoization":"DIR=06_memoization webpack-dev-server","examples:multistore":"DIR=07_multistore webpack-dev-server","examples:dynamic":"DIR=08_dynamic webpack-dev-server","examples:thunk":"DIR=09_thunk webpack-dev-server","examples:todolist":"DIR=11_todolist EXT=tsx webpack-dev-server","examples:async":"DIR=12_async EXT=tsx webpack-dev-server"},"keywords":["react","redux","state","hooks","stateless","thisless","pure"],"license":"MIT","dependencies":{},"devDependencies":{"@babel/cli":"^7.6.2","@babel/core":"^7.6.2","@babel/preset-env":"^7.6.2","@babel/preset-react":"^7.0.0","@testing-library/react":"^9.2.0","@types/react":"^16.9.4","@types/react-dom":"^16.9.1","@types/redux-logger":"^3.0.7","@typescript-eslint/eslint-plugin":"^2.3.2","@typescript-eslint/parser":"^2.3.2","babel-core":"^7.0.0-bridge.0","babel-loader":"^8.0.6","eslint":"^6.5.1","eslint-config-airbnb":"^18.0.1","eslint-plugin-import":"^2.18.2","eslint-plugin-jsx-a11y":"^6.2.3","eslint-plugin-react":"^7.15.1","eslint-plugin-react-hooks":"^2.1.1","html-webpack-plugin":"^3.2.0","immer":"^4.0.0","jest":"^24.9.0","react":"^16.9.0","react-dom":"^16.10.1","redux":"^4.0.4","redux-thunk":"^2.3.0","ts-loader":"^6.2.0","typescript":"^3.6.3","webpack":"^4.41.0","webpack-cli":"^3.3.9","webpack-dev-server":"^3.8.2"},"peerDependencies":{"react":">=16.8.0","redux":">=4.0.0"},"babel":{"presets":["@babel/preset-env","@babel/preset-react"]},"gitHead":"397a5c81b6c9829b30b5c3a91e945d797002c0b2","bugs":{"url":"https://github.com/dai-shi/reactive-react-redux/issues"},"homepage":"https://github.com/dai-shi/reactive-react-redux#readme","_id":"reactive-react-redux@4.2.1","_nodeVersion":"10.16.2","_npmVersion":"6.11.3","dist":{"integrity":"sha512-eWV9jUCYJ/KbXe454tojdolp03iehoxMoV+kjWmbSnPKdXyIH58fzEiGmnXBIEDqKURj/W37694HKUZzMPjOGw==","shasum":"34e74ec37d48f504d08d65fbe4144f49911b31c9","tarball":"https://registry.npmjs.org/reactive-react-redux/-/reactive-react-redux-4.2.1.tgz","fileCount":19,"unpackedSize":42896,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdmCdHCRA9TVsSAnZWagAA5+EP/A4H6Q/nL31ocNV4MQhr\nUe9nGZgnBRZyPmmFe/oaDJQuGcChngUUgLWWPfpYos6Pi6gZ0Wv7thGMBmri\n07W2WJZYRsVV5iVq8tC4OYorXvmxHLd/dWlfDlrjI53wKrIcHBkTqNr1t0rP\nPtGW9sUbk9TPunOb/CDpgBCAw750o3IusioNb7Ds5h3GKVRfVBQa60JzclIU\nzndCqYpGt6QbvcNuKnl8VcUscs/9Qn87lHJOoKPMYNS6uAs/LqX0vZGTeF0X\nTpD1Rl2SzKvG89XA84ZJwnYx4dVQwpDHE1l/emlOoHLhSMJMAbI7Vy8709qC\n/THFmPth4YYgOSKX81d494KM6HBma2bBa+VfxZ7Hua0SGPO4ivOzSpfrmmqi\nCaKd/raJ+b522Og7MZTunvdnNfxp+7NFirdKHG/4Wt54nnFPMeampbVnasVv\nRj/Vm0rNCm3VQmCuIz1YzPikfCvs8FMXUTA28KIxNEktLVPShwgcncQawayV\nMzkeO+FpDvEHBz2wbAnURRlmdNlNIELhf+MwV0fq4qaPb4nxYWc7qTtfZtcB\nUCps5uPybbzmVCEXbHrJJlGb7Mr3uSR7ahYWCh+8+DUcBAwSRtQmJ4cmse1n\nYVNcffWmiAxrbR7HP65S9n8sCc9v0XP/emjrX7QHhGKOfYFb/Xv+1mfFAL//\nPlVS\r\n=SuyR\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIGyNvTDS78MLu1O2DrWKjcXSl/twcFHjbo4W84ur+mkfAiEAqWDv5NNFOTQYd0mERiF8TZ6hnDLfYTdlhoIUPoAA6aU="}]},"maintainers":[{"name":"daishi","email":"daishi@axlight.com"}],"_npmUser":{"name":"daishi","email":"daishi@axlight.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/reactive-react-redux_4.2.1_1570252615120_0.5754889664654184"},"_hasShrinkwrap":false},"4.3.0":{"name":"reactive-react-redux","description":"React Redux binding with React Hooks and Proxy","version":"4.3.0","author":{"name":"Daishi Kato"},"repository":{"type":"git","url":"git+https://github.com/dai-shi/reactive-react-redux.git"},"main":"./dist/index.js","module":"./src/index.js","types":"./src/index.d.ts","scripts":{"compile":"babel src -d dist","test":"npm run eslint && npm run tsc-test && npm run jest","eslint":"eslint --ext .js,.ts,.tsx --ignore-pattern dist .","jest":"jest","tsc-test":"tsc --project . --noEmit","examples:minimal":"DIR=01_minimal EXT=js webpack-dev-server","examples:typescript":"DIR=02_typescript webpack-dev-server","examples:deep":"DIR=03_deep webpack-dev-server","examples:immer":"DIR=04_immer webpack-dev-server","examples:localstate":"DIR=05_localstate webpack-dev-server","examples:memoization":"DIR=06_memoization webpack-dev-server","examples:multistore":"DIR=07_multistore webpack-dev-server","examples:dynamic":"DIR=08_dynamic webpack-dev-server","examples:thunk":"DIR=09_thunk webpack-dev-server","examples:todolist":"DIR=11_todolist EXT=tsx webpack-dev-server","examples:async":"DIR=12_async EXT=tsx webpack-dev-server"},"keywords":["react","redux","state","hooks","stateless","thisless","pure"],"license":"MIT","dependencies":{},"devDependencies":{"@babel/cli":"^7.6.3","@babel/core":"^7.6.3","@babel/preset-env":"^7.6.3","@babel/preset-react":"^7.6.3","@testing-library/react":"^9.3.0","@types/react":"^16.9.5","@types/react-dom":"^16.9.1","@types/redux-logger":"^3.0.7","@typescript-eslint/eslint-plugin":"^2.3.3","@typescript-eslint/parser":"^2.3.3","babel-core":"^7.0.0-bridge.0","babel-loader":"^8.0.6","eslint":"^6.5.1","eslint-config-airbnb":"^18.0.1","eslint-plugin-import":"^2.18.2","eslint-plugin-jsx-a11y":"^6.2.3","eslint-plugin-react":"^7.16.0","eslint-plugin-react-hooks":"^2.1.2","html-webpack-plugin":"^3.2.0","immer":"^4.0.1","jest":"^24.9.0","react":"^16.10.2","react-dom":"^16.10.2","redux":"^4.0.4","redux-thunk":"^2.3.0","ts-loader":"^6.2.0","typescript":"^3.6.3","webpack":"^4.41.0","webpack-cli":"^3.3.9","webpack-dev-server":"^3.8.2"},"peerDependencies":{"react":">=16.8.0","redux":">=4.0.0"},"babel":{"presets":["@babel/preset-env","@babel/preset-react"]},"gitHead":"bdd8e92619870012a4d98a8058b114dda6e91ad5","bugs":{"url":"https://github.com/dai-shi/reactive-react-redux/issues"},"homepage":"https://github.com/dai-shi/reactive-react-redux#readme","_id":"reactive-react-redux@4.3.0","_nodeVersion":"10.16.3","_npmVersion":"6.11.3","dist":{"integrity":"sha512-0X2/o9eCMC1PPm6YlBIixfhe6nS/StZx4wZxdipsReKV3h+Lpp2Iy55QDL2YH0NnDUki7amkgQZ/ZbHbm5Ec5g==","shasum":"71449842266eee3998f603bdf101770b5a628b35","tarball":"https://registry.npmjs.org/reactive-react-redux/-/reactive-react-redux-4.3.0.tgz","fileCount":19,"unpackedSize":45102,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdnR6HCRA9TVsSAnZWagAA2+QP/1BHaCNpQbOqXEX/9Gcg\nWdKylOGtOQDpKS5mCqbZlD5v0sm2tjpqz0mzzbJPWFEVwQd0TSvs03PjGCZs\nGvm8N9ycqB38WSF4fFe59bPBIIST9rKbOgwPJNLlNTVRJOpyMYewJJShKqlK\nHs+LCcQ8NsDpE0jcFAs+SFmPaXtBJN+vgNqzyLh0rwd/4NmYsNjjHA9SDm92\n6ZpQALdZFAS45AHrnLMS8LT0WxxuW0vSK/8IrfWcrAJmq2uXOM+EfIDVJnfN\n6c8qyp7o8/qk/kPkAnBKNqVFzCojwjt42LUnhLsGVtbnTC25VjQ8qasAZBPG\nN6SO2Uur4f3bqw1TzUVX4kaPaXvapgRFm+Ox2lZU+pyYuBAYmVfAVFliV1be\nU6OqgV6V7TzyIhGJuOCNGSULy6YPTtSTzbxJOLhQAC2u3ridveWzMoi3S0Zr\n1K3S06QSA8CR1hMtGl3a1dBisoF10tyg3g/e/22og/MnPtoG31w0WgQwODDi\nDtCBYGegCqCeAxQdH/ubV0SxHbUk7xYeLA7njqk/dmA5WxloP+jrKb9+FLiS\nTixD3TdMlBaGGZn915eNhzB0thkzBpMqzLoDwuip1DaSBoTU96q99Su2ywYh\nHkN/v2yB8BWGI5xFmUPFqSzfbBqux7mmkcjsKBy16DWHl9E6JraasKj0shx5\nhAyG\r\n=5Ftt\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIDC/Zxog/1WEmqKhoPnqoYPodd7O9MQLvERQkU+6sYKLAiEAvEshSk2RpdUSJBiEJjE1GSIKfIa0OsMKdXxwgGBh7ac="}]},"maintainers":[{"name":"daishi","email":"daishi@axlight.com"}],"_npmUser":{"name":"daishi","email":"daishi@axlight.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/reactive-react-redux_4.3.0_1570578054926_0.6224713171619614"},"_hasShrinkwrap":false},"4.4.0":{"name":"reactive-react-redux","description":"React Redux binding with React Hooks and Proxy","version":"4.4.0","author":{"name":"Daishi Kato"},"repository":{"type":"git","url":"git+https://github.com/dai-shi/reactive-react-redux.git"},"main":"./dist/index.js","module":"./src/index.js","types":"./src/index.d.ts","scripts":{"compile":"babel src -d dist","test":"npm run eslint && npm run tsc-test && npm run jest","eslint":"eslint --ext .js,.ts,.tsx --ignore-pattern dist .","jest":"jest","tsc-test":"tsc --project . --noEmit","examples:minimal":"DIR=01_minimal EXT=js webpack-dev-server","examples:typescript":"DIR=02_typescript webpack-dev-server","examples:deep":"DIR=03_deep webpack-dev-server","examples:immer":"DIR=04_immer webpack-dev-server","examples:localstate":"DIR=05_localstate webpack-dev-server","examples:memoization":"DIR=06_memoization webpack-dev-server","examples:multistore":"DIR=07_multistore webpack-dev-server","examples:dynamic":"DIR=08_dynamic webpack-dev-server","examples:thunk":"DIR=09_thunk webpack-dev-server","examples:todolist":"DIR=11_todolist EXT=tsx webpack-dev-server","examples:async":"DIR=12_async EXT=tsx webpack-dev-server"},"keywords":["react","redux","state","hooks","stateless","thisless","pure"],"license":"MIT","dependencies":{},"devDependencies":{"@babel/cli":"^7.6.4","@babel/core":"^7.6.4","@babel/preset-env":"^7.6.3","@babel/preset-react":"^7.6.3","@testing-library/react":"^9.3.0","@types/react":"^16.9.9","@types/react-dom":"^16.9.2","@types/redux-logger":"^3.0.7","@typescript-eslint/eslint-plugin":"^2.4.0","@typescript-eslint/parser":"^2.4.0","babel-core":"^7.0.0-bridge.0","babel-loader":"^8.0.6","eslint":"^6.5.1","eslint-config-airbnb":"^18.0.1","eslint-plugin-import":"^2.18.2","eslint-plugin-jsx-a11y":"^6.2.3","eslint-plugin-react":"^7.16.0","eslint-plugin-react-hooks":"^2.1.2","html-webpack-plugin":"^3.2.0","immer":"^4.0.1","jest":"^24.9.0","react":"^16.10.2","react-dom":"^16.10.2","redux":"^4.0.4","redux-thunk":"^2.3.0","ts-loader":"^6.2.0","typescript":"^3.6.4","webpack":"^4.41.2","webpack-cli":"^3.3.9","webpack-dev-server":"^3.8.2"},"peerDependencies":{"react":">=16.8.0","redux":">=4.0.0"},"babel":{"presets":["@babel/preset-env","@babel/preset-react"]},"gitHead":"e0de05480bf0aa66fbf530e973b960915d1d718b","bugs":{"url":"https://github.com/dai-shi/reactive-react-redux/issues"},"homepage":"https://github.com/dai-shi/reactive-react-redux#readme","_id":"reactive-react-redux@4.4.0","_nodeVersion":"10.16.3","_npmVersion":"6.12.0","dist":{"integrity":"sha512-ySuhFnjCuEkyeQqXeCAEBfz8pJDCJ12V9mvSIxqZg2pfoh3C6LXcebYWMGZFmpLmXqqy+8I8bcPxOxtePwJxeg==","shasum":"74d4742fabc9ec3d31c1c9bd8bfe836afcb7fcf6","tarball":"https://registry.npmjs.org/reactive-react-redux/-/reactive-react-redux-4.4.0.tgz","fileCount":19,"unpackedSize":47210,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdqEcBCRA9TVsSAnZWagAAfSoP/jI6i4rRkZFd3pdtpGwH\nnNaoqzXkeWne0L4Nq83Q2N1qLMTRP6B9/CHjlwrONWg6A/kpLt9kYkT2hhSV\n93zoER5D8crMpGwOosfNn5J+Kug/DuaLsoKR1o6aEiv+6zDQnhvxrUgui4yo\n1Mm5tXAD6GSHDuCm4VFP8Zg9iwTkdxq6InnaaVW/wDJOJV0q78xid7kQBDdr\n2jwKQ4GS/vd/51jyGCWj/WlM43amvBF/n9C1hqncMwlM00JFG7PTxe/cAfAL\nBpGPoRhtTRiQsdrmfTjC9WAkGJbyNrkIWhpl+AxZ3Ju6p/NNZLFWRmEG5H9J\nlq+Nil1ZOjsHSTWy55Jjm6aplSfnztEalsV4VuXtixIDAx5jLUeh00N10iZt\nndjVMWrfpM7xA2d6TEkAZHxdmmg2IYKBTL0aEaAH8dhpa4oesh2KbMvUPjGV\ncLxZPj6RlaPy13Hp/Bsl2JqKHR38sV17mMTiP6zuzMBGL7kK3NChfc9fryz7\nPtdojk8IKMaw3lZrXYG950KhlMqne/dHi0XPFLveQjUs10z5zpeJkHraqYEc\ng4RQ5ipxDbTfiIlv31rrEQ4eC5bWtv/ySOMWCEQvQXMMFI26//bLsnRMsJJI\n/F8Jpiwry0cL9TnGrQ3tQLnBp87rpH3pUv3N6FkHmyjSqUVk8tq/u56MAvzw\nnpE0\r\n=rB6O\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDK1tb+d7nnWbEKVsmwdkK73iZVZ1yytFkihNe1AYMATgIgYAC2oVZS8w7rdvW4lZ5oEmt55x9iZ8LCfJq7SxWfhlk="}]},"maintainers":[{"name":"daishi","email":"daishi@axlight.com"}],"_npmUser":{"name":"daishi","email":"daishi@axlight.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/reactive-react-redux_4.4.0_1571309312613_0.8118407010168733"},"_hasShrinkwrap":false},"4.4.1":{"name":"reactive-react-redux","description":"React Redux binding with React Hooks and Proxy","version":"4.4.1","author":{"name":"Daishi Kato"},"repository":{"type":"git","url":"git+https://github.com/dai-shi/reactive-react-redux.git"},"main":"./dist/index.js","module":"./src/index.js","types":"./src/index.d.ts","sideEffects":false,"scripts":{"compile":"babel src -d dist","test":"npm run eslint && npm run tsc-test && npm run jest","eslint":"eslint --ext .js,.ts,.tsx --ignore-pattern dist .","jest":"jest","tsc-test":"tsc --project . --noEmit","examples:01_minimal":"DIR=01_minimal EXT=js webpack-dev-server","examples:02_typescript":"DIR=02_typescript webpack-dev-server","examples:03_deep":"DIR=03_deep webpack-dev-server","examples:04_immer":"DIR=04_immer webpack-dev-server","examples:05_localstate":"DIR=05_localstate webpack-dev-server","examples:06_memoization":"DIR=06_memoization webpack-dev-server","examples:07_multistore":"DIR=07_multistore webpack-dev-server","examples:08_dynamic":"DIR=08_dynamic webpack-dev-server","examples:09_thunk":"DIR=09_thunk webpack-dev-server","examples:11_todolist":"DIR=11_todolist EXT=tsx webpack-dev-server","examples:12_async":"DIR=12_async EXT=tsx webpack-dev-server"},"keywords":["react","redux","state","hooks","stateless","thisless","pure"],"license":"MIT","dependencies":{},"devDependencies":{"@babel/cli":"^7.8.3","@babel/core":"^7.8.3","@babel/preset-env":"^7.8.3","@babel/preset-react":"^7.8.3","@testing-library/react":"^9.4.0","@types/react":"^16.9.19","@types/react-dom":"^16.9.5","@types/redux-logger":"^3.0.7","@typescript-eslint/eslint-plugin":"^2.17.0","@typescript-eslint/parser":"^2.17.0","babel-loader":"^8.0.6","eslint":"^6.8.0","eslint-config-airbnb":"^18.0.1","eslint-plugin-import":"^2.20.0","eslint-plugin-jsx-a11y":"^6.2.3","eslint-plugin-react":"^7.18.0","eslint-plugin-react-hooks":"^2.3.0","html-webpack-plugin":"^3.2.0","immer":"^5.3.2","jest":"^25.1.0","react":"experimental","react-dom":"experimental","redux":"^4.0.5","redux-thunk":"^2.3.0","ts-loader":"^6.2.1","typescript":"^3.7.5","webpack":"^4.41.5","webpack-cli":"^3.3.10","webpack-dev-server":"^3.10.1"},"peerDependencies":{"react":">=16.8.0","redux":">=4.0.0"},"babel":{"presets":["@babel/preset-env","@babel/preset-react"]},"gitHead":"7c2e705930e6cca2eab33b60864d840c4e10c532","bugs":{"url":"https://github.com/dai-shi/reactive-react-redux/issues"},"homepage":"https://github.com/dai-shi/reactive-react-redux#readme","_id":"reactive-react-redux@4.4.1","_nodeVersion":"10.16.3","_npmVersion":"6.13.6","dist":{"integrity":"sha512-j9AnNbbrdG3wfDaLEqLTtKFl6JWhWDMeiNADdjVMqip2bKQEMyOz0v2PK8WMXHthQArWcJQkqofgafwtbE8cBg==","shasum":"c6683547fb5c40d54a918f85ca395aeada9b46b3","tarball":"https://registry.npmjs.org/reactive-react-redux/-/reactive-react-redux-4.4.1.tgz","fileCount":19,"unpackedSize":47399,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJeKcF/CRA9TVsSAnZWagAA+fIP/2yH1TmLeN1FhqSj5Mio\nBI8pKYVNti1zugNPrDNl02QKljKa0pOFz0TxYhBRROjChAIsES/pCFHDXDKy\nTYMbZ5gEhz19c2+4g4LjmLsWGPBRaL/zojBCY8mj777gca5paJ8kkFe5eSAB\n3f5C7w7nsR9NDVX+jKI0DZ3IyiR7vpjqB1z0FIKeG96Ak+dy42A7M6gY55gd\n2T6IOZwrUBGe2KFNsZn4gbAk+FavEImTAMXrz4C6HdaIS+5xzHSbVazFZs4D\nsFdl6Pb7Rn6FxAY4V0TLHH3c7Yb2p6f/+OKKbtRBgaUagP8Lx7wo9XFavJpQ\nX/se4Zz5l0GeRxNDeMptipVbRJB7xZw0diQpCnKOt9S3uSt891FO5fnqM3sW\nrQ6/Tvn42TVddWt78lQGobUqEl/5+h8rfEilw0cj8tKkjh6yQa/cOi/mSJLI\nZ53AQA6C9nvGyOKh6gWu2IhdBTAzBS6FiZ0WpaIW+H50gRw581W4UKfogAy/\nsFuk25uGmrbSxd8kPN8vPvXXuGwCWDwwdW3v3NgZWCjmofo9iXHTeNRuMWAc\nP3wPXowDsrAi7+mWeNAfGOLPu/zXhVY+dc5jXj+Okg52JOwvv1iOeGRZ5SiQ\nHL77COG55jJY4TJ/GXueaG29nB1wK2vUwMlnBAhYj28Jn8mM/taVGHzCTJoH\nYt7+\r\n=Wah7\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCVDeXHHq9+k+CAKv0AsHuVbT7N2Y7iiuaWw9uUOmB5mAIgL6/keED87Fno1p16EeQCYLGhpPKo6jSPTkPIjrTUQcA="}]},"maintainers":[{"name":"daishi","email":"daishi@axlight.com"}],"_npmUser":{"name":"daishi","email":"daishi@axlight.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/reactive-react-redux_4.4.1_1579794815406_0.23617563973265598"},"_hasShrinkwrap":false},"4.5.0":{"name":"reactive-react-redux","description":"React Redux binding with React Hooks and Proxy","version":"4.5.0","author":{"name":"Daishi Kato"},"repository":{"type":"git","url":"git+https://github.com/dai-shi/reactive-react-redux.git"},"main":"./dist/index.js","module":"./src/index.js","types":"./src/index.d.ts","sideEffects":false,"scripts":{"compile":"babel src -d dist","test":"npm run eslint && npm run tsc-test && npm run jest","eslint":"eslint --ext .js,.ts,.tsx --ignore-pattern dist .","jest":"jest","tsc-test":"tsc --project . --noEmit","examples:01_minimal":"DIR=01_minimal EXT=js webpack-dev-server","examples:02_typescript":"DIR=02_typescript webpack-dev-server","examples:03_deep":"DIR=03_deep webpack-dev-server","examples:04_immer":"DIR=04_immer webpack-dev-server","examples:05_localstate":"DIR=05_localstate webpack-dev-server","examples:06_memoization":"DIR=06_memoization webpack-dev-server","examples:07_multistore":"DIR=07_multistore webpack-dev-server","examples:08_dynamic":"DIR=08_dynamic webpack-dev-server","examples:09_thunk":"DIR=09_thunk webpack-dev-server","examples:11_todolist":"DIR=11_todolist EXT=tsx webpack-dev-server","examples:12_async":"DIR=12_async EXT=tsx webpack-dev-server"},"keywords":["react","redux","state","hooks","stateless","thisless","pure"],"license":"MIT","dependencies":{},"devDependencies":{"@babel/cli":"^7.8.4","@babel/core":"^7.8.4","@babel/preset-env":"^7.8.4","@babel/preset-react":"^7.8.3","@testing-library/react":"^9.4.0","@types/react":"^16.9.19","@types/react-dom":"^16.9.5","@types/redux-logger":"^3.0.7","@typescript-eslint/eslint-plugin":"^2.18.0","@typescript-eslint/parser":"^2.18.0","babel-loader":"^8.0.6","eslint":"^6.8.0","eslint-config-airbnb":"^18.0.1","eslint-plugin-import":"^2.20.1","eslint-plugin-jsx-a11y":"^6.2.3","eslint-plugin-react":"^7.18.3","eslint-plugin-react-hooks":"^2.3.0","html-webpack-plugin":"^3.2.0","immer":"^5.3.2","jest":"^25.1.0","react":"experimental","react-dom":"experimental","redux":"^4.0.5","redux-thunk":"^2.3.0","ts-loader":"^6.2.1","typescript":"^3.7.5","webpack":"^4.41.5","webpack-cli":"^3.3.10","webpack-dev-server":"^3.10.2"},"peerDependencies":{"react":">=16.8.0","redux":">=4.0.0"},"babel":{"presets":["@babel/preset-env","@babel/preset-react"]},"gitHead":"7e6bbce3b0a1fed0b04636681176a626ada51535","bugs":{"url":"https://github.com/dai-shi/reactive-react-redux/issues"},"homepage":"https://github.com/dai-shi/reactive-react-redux#readme","_id":"reactive-react-redux@4.5.0","_nodeVersion":"10.16.3","_npmVersion":"6.13.7","dist":{"integrity":"sha512-XjJv6BIBc2K0U4WtpKEyMH7f7I7REpKdA5qKO4u8oeDzo5yevGq8veIFEfY5E4yyXvh/QMNVE4bYpVMIwoGTOg==","shasum":"1787962e116497b5785500328f1a1b0d9e35fbd4","tarball":"https://registry.npmjs.org/reactive-react-redux/-/reactive-react-redux-4.5.0.tgz","fileCount":19,"unpackedSize":47591,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJeOBmDCRA9TVsSAnZWagAA6/oP/0SaNvnULyJmRdeoWmom\n8yVu9JJkPWT0yQw36Bx7vYw9GGLgbB6V3TjMgGsx4ADjk64t9Hb33+/UbP2w\nwNlEdI8q0dL2cNjqbxFFot3aT9p4HWVJ4E4t4KlcAvPSh7fA8vNqgTcoP1ji\nWuC/dYvgWRmgpqhA3cs6vLH84mN4Ak7ysSjYqLbN3z8Gda1AWRukLcw9Apri\nIHRAMftfpTVfCm5QKd9uR/PxWQAgBCv+B7XlFfHz7ltFveMINyZ6SN7B6Fyy\necl1CpSyxxQsRDpWplK8cCyEupJsQdbZtYd7LUqgUIO+pw9NaHsqveLCwJjs\nsO44saqRgRbcvRIdcsGd18xdbO9mht+dE/b7fuDZhqn55wTIi6J4+DKK/+x0\nQ7V0CvgaYk/gdXhl9vUvv+V2uYFzEa+Q9MCTvQI+goa3enJ+5JJiaTh+taaw\nDVgiW+aTaGxGKYHnAX62FiOOhgwoBsGEHjYJ1Ky6xkmc3JV40aV/w1es26Sz\nqEHYZQd+O1rzqY/SggFEOZ40PUNLpnCQIWilmkgDM8xkzoj/n+Gj0fDqW/To\nDMzPy7sGUWBpJd6By++oBrZH5If0Ug8wQqvLBNvX4eLLFN6CGQxIq0wupC+c\npbSkxXoQmDLvNdCzrLVKrML6OEvzaire+Mu3ZV2TbsE/yQ0u3jNjKCjOZaJf\n4wl6\r\n=kfZg\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDW9rrlJ19N297Faa+BEfOl0oXZDpCmo4KgWePxT1HavgIgLPcYeVknhNP7rSjieDT57zge9OnpvZHPUpBNC3ETKks="}]},"maintainers":[{"name":"daishi","email":"daishi@axlight.com"}],"_npmUser":{"name":"daishi","email":"daishi@axlight.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/reactive-react-redux_4.5.0_1580734849920_0.27119479680961356"},"_hasShrinkwrap":false},"4.6.0":{"name":"reactive-react-redux","description":"React Redux binding with React Hooks and Proxy","version":"4.6.0","author":{"name":"Daishi Kato"},"repository":{"type":"git","url":"git+https://github.com/dai-shi/reactive-react-redux.git"},"main":"./dist/index.js","module":"./src/index.js","types":"./src/index.d.ts","sideEffects":false,"scripts":{"compile":"babel src -d dist","test":"run-s eslint tsc-test jest","eslint":"eslint --ext .js,.ts,.tsx --ignore-pattern dist .","jest":"jest","tsc-test":"tsc --project . --noEmit","examples:01_minimal":"DIR=01_minimal EXT=js webpack-dev-server","examples:02_typescript":"DIR=02_typescript webpack-dev-server","examples:03_deep":"DIR=03_deep webpack-dev-server","examples:04_immer":"DIR=04_immer webpack-dev-server","examples:05_localstate":"DIR=05_localstate webpack-dev-server","examples:06_memoization":"DIR=06_memoization webpack-dev-server","examples:07_multistore":"DIR=07_multistore webpack-dev-server","examples:08_dynamic":"DIR=08_dynamic webpack-dev-server","examples:09_thunk":"DIR=09_thunk webpack-dev-server","examples:11_todolist":"DIR=11_todolist EXT=tsx webpack-dev-server","examples:12_async":"DIR=12_async EXT=tsx webpack-dev-server"},"keywords":["react","redux","state","hooks","stateless","thisless","pure"],"license":"MIT","dependencies":{},"devDependencies":{"@babel/cli":"^7.8.4","@babel/core":"^7.8.4","@babel/preset-env":"^7.8.4","@babel/preset-react":"^7.8.3","@testing-library/react":"^9.4.1","@types/react":"^16.9.22","@types/react-dom":"^16.9.5","@types/redux-logger":"^3.0.7","@typescript-eslint/eslint-plugin":"^2.20.0","@typescript-eslint/parser":"^2.20.0","babel-loader":"^8.0.6","eslint":"^6.8.0","eslint-config-airbnb":"^18.0.1","eslint-plugin-import":"^2.20.1","eslint-plugin-jsx-a11y":"^6.2.3","eslint-plugin-react":"^7.18.3","eslint-plugin-react-hooks":"^2.4.0","html-webpack-plugin":"^3.2.0","immer":"^5.3.6","jest":"^25.1.0","npm-run-all":"^4.1.5","react":"experimental","react-dom":"experimental","redux":"^4.0.5","redux-thunk":"^2.3.0","ts-loader":"^6.2.1","typescript":"^3.8.2","webpack":"^4.41.6","webpack-cli":"^3.3.11","webpack-dev-server":"^3.10.3"},"peerDependencies":{"react":">=16.8.0","redux":">=4.0.0"},"babel":{"presets":["@babel/preset-env","@babel/preset-react"]},"gitHead":"a463d82742ea413830c51600c5b51a2c05a40403","bugs":{"url":"https://github.com/dai-shi/reactive-react-redux/issues"},"homepage":"https://github.com/dai-shi/reactive-react-redux#readme","_id":"reactive-react-redux@4.6.0","_nodeVersion":"10.19.0","_npmVersion":"6.13.7","dist":{"integrity":"sha512-aB+KAVOCs/0NMUiMAF2q3M1QBEea2flOmR6Bem3gRnwDPOZ69mtb23iuEeheBuU7PN3KKkXJkuWfPMeAIEGQ2Q==","shasum":"51d53d6a61a3bbfa0ed5e5395913270d0ca8bceb","tarball":"https://registry.npmjs.org/reactive-react-redux/-/reactive-react-redux-4.6.0.tgz","fileCount":19,"unpackedSize":48750,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJeUy6hCRA9TVsSAnZWagAASmgP/jCNgqnmLgUBjjrJmaSF\nqU0IlnjAYoXopaI75qD2u2R8rB1wM4ZwDQgVLw2tz4EaoBmL13+L7H3W4Ojo\nOdmlYXvj0v5ls9MKO8SXz+/2k/5pOzDEZ4J5a2hG3ERsKbY07+0mohwaauvK\nzHjAfzdzYipbP8EZcqs3x47JhQuQv5sQ7V9MmkmlwdCuPSk1J6iQqiLmrmDI\nQcDqiORz7/10G288Hf4d60+RF+Qs8Cil6XJSoFax5floPQKoju4ObsT88BLA\n4kBzqSlzA5wc74UdMwvaMBx1T6kRqEvSgxMw+uChj4hGf7UJ37ESml5lq/0F\nxiRTZOX/7EusgtHEZdCrMbBoVCJ7ENcDUpcXeKnWP4NoeYpSAhDSP4x8mihc\nHHtBLtjYAUVlOs7la+VSLVODcVeOWX0cQzUcw8TTw+pRCuhfs0lRzWPh4OqO\n5n3zOWqtY+EDE19pRU4Eb4utpFAfAmxDphTR+1aE702LuCSc6cg+qgiyahJt\nOcK+md/I/mCgxuqvqaDIb3CVJvvvJS3hms02ujUaI/sFRK4cyof9Pnfl416a\n3MmRLEfwrtymMm6skiV9vFZEjxNX7GtglTsFORpDmrSMc5lrIRl9421AsylC\nKISqsrhM4ZcATzFOvo0HdEFGVgOYEpxEeNQ/+XFhOpsHLRjudJZLxXNKTiG/\n34Cf\r\n=FCwq\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQC+82FjGlvBAzcKSQoDxYmEwgWZ9R3S2+Uj9clHXeng7wIgY3sYcrokrnz1n+5cSz98E9k1wEfJBAdKPQUVJS7owWg="}]},"maintainers":[{"name":"daishi","email":"daishi@axlight.com"}],"_npmUser":{"name":"daishi","email":"daishi@axlight.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/reactive-react-redux_4.6.0_1582509729164_0.8116203924255314"},"_hasShrinkwrap":false},"4.6.1":{"name":"reactive-react-redux","description":"React Redux binding with React Hooks and Proxy","version":"4.6.1","author":{"name":"Daishi Kato"},"repository":{"type":"git","url":"git+https://github.com/dai-shi/reactive-react-redux.git"},"main":"./dist/index.js","module":"./src/index.js","types":"./src/index.d.ts","sideEffects":false,"scripts":{"compile":"babel src -d dist","test":"run-s eslint tsc-test jest","eslint":"eslint --ext .js,.ts,.tsx --ignore-pattern dist .","jest":"jest","tsc-test":"tsc --project . --noEmit","examples:01_minimal":"DIR=01_minimal EXT=js webpack-dev-server","examples:02_typescript":"DIR=02_typescript webpack-dev-server","examples:03_deep":"DIR=03_deep webpack-dev-server","examples:04_immer":"DIR=04_immer webpack-dev-server","examples:05_localstate":"DIR=05_localstate webpack-dev-server","examples:06_memoization":"DIR=06_memoization webpack-dev-server","examples:07_multistore":"DIR=07_multistore webpack-dev-server","examples:08_dynamic":"DIR=08_dynamic webpack-dev-server","examples:09_thunk":"DIR=09_thunk webpack-dev-server","examples:11_todolist":"DIR=11_todolist EXT=tsx webpack-dev-server","examples:12_async":"DIR=12_async EXT=tsx webpack-dev-server"},"keywords":["react","redux","state","hooks","stateless","thisless","pure"],"license":"MIT","dependencies":{},"devDependencies":{"@babel/cli":"^7.8.4","@babel/core":"^7.8.4","@babel/preset-env":"^7.8.4","@babel/preset-react":"^7.8.3","@testing-library/react":"^9.4.1","@types/react":"^16.9.22","@types/react-dom":"^16.9.5","@types/redux-logger":"^3.0.7","@typescript-eslint/eslint-plugin":"^2.20.0","@typescript-eslint/parser":"^2.20.0","babel-loader":"^8.0.6","eslint":"^6.8.0","eslint-config-airbnb":"^18.0.1","eslint-plugin-import":"^2.20.1","eslint-plugin-jsx-a11y":"^6.2.3","eslint-plugin-react":"^7.18.3","eslint-plugin-react-hooks":"^2.4.0","html-webpack-plugin":"^3.2.0","immer":"^5.3.6","jest":"^25.1.0","npm-run-all":"^4.1.5","react":"experimental","react-dom":"experimental","redux":"^4.0.5","redux-thunk":"^2.3.0","ts-loader":"^6.2.1","typescript":"^3.8.2","webpack":"^4.41.6","webpack-cli":"^3.3.11","webpack-dev-server":"^3.10.3"},"peerDependencies":{"react":">=16.8.0","redux":">=4.0.0"},"babel":{"presets":["@babel/preset-env","@babel/preset-react"]},"gitHead":"9cea9003298721d4486c307fb52126541c3af819","bugs":{"url":"https://github.com/dai-shi/reactive-react-redux/issues"},"homepage":"https://github.com/dai-shi/reactive-react-redux#readme","_id":"reactive-react-redux@4.6.1","_nodeVersion":"10.19.0","_npmVersion":"6.13.7","dist":{"integrity":"sha512-+lhxAwSNQant3RihwKWtDFKdOYNAdiDl5xvYiIFFAoIeq1fIsqfwcYet7EHUNA+7nNcyWF8KWu/Jv5qdvbUbJw==","shasum":"3a15ebf38a25d62bbf0715a1548b4be4ee209fe4","tarball":"https://registry.npmjs.org/reactive-react-redux/-/reactive-react-redux-4.6.1.tgz","fileCount":19,"unpackedSize":49312,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJeVd0PCRA9TVsSAnZWagAAzesP/jFfvPT0n2HH++50vi0k\nUCenqB1d4c8C1c+wWv4nb98SvDWQWk60iBrH7X4sK4uz4oBytbKkx5Z4obQX\nEjN0PC2VlmlCj1tU1EUYKdnnv7/ndwIcnAZqWtWJ1UpYbuqCjBqRWgqiHBO2\nC8qGLMOpIbAV4wFTu92zW7oMVNzbdD7yOpDf+GoqqZGRHxL+pCicYxpUPoFM\nbc81lBtg7qrIU8xnf61yyFIoswpEOcEbtnOccAmHGCRVIeI96JUEg5YbHBQ2\nG9llp3tU1LCEzCq6GVKnSONRikcEHAfhJPyARuCljQ4dR2QFYgTNh7HPEh3y\nSNb5ZuRxQrts23hmP2r8eoCJcGh8FtvnR0l/l110lJENPZtGIyPJ8owH0dhX\nCScCR2SWdv3R6/UQKidRIb7jbANu6tPTP/wM+IXMB0U4IGfhXvJ1P91A+zfv\niO5Gvkm5e3BDt0Sph1atX0JEVhzmDdaGXOmeZZaMwUgCFnZIlVlYUyU0+wEP\n+pPkLyaeD2rqwBZ551BQeD9H1yB3ZNxT90vrf5NayWlxYsajNe5qsb9i/5YP\naa5RCquA8snr06qrpxFp0MwGyvV/2EXEJgh3eKXFuT3X7o5DRGhoXTf+h6EW\nj0QHBw8qP5KIuBviPePlD5UUbKi6b5h5iBwhCaCpvr5p5n+vpSfgDev6uApb\nZhhy\r\n=laWP\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIDUaBkcQbXYtJHweYu8//AoM7EOnnDPym1Ji4w27KPp1AiEAp1ZYYGoXDCnB0Dux8MR5QJ3xlKXMLwMbGoxTXRrtYdM="}]},"maintainers":[{"name":"daishi","email":"daishi@axlight.com"}],"_npmUser":{"name":"daishi","email":"daishi@axlight.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/reactive-react-redux_4.6.1_1582685454760_0.559448294955057"},"_hasShrinkwrap":false},"4.7.0":{"name":"reactive-react-redux","description":"React Redux binding with React Hooks and Proxy","version":"4.7.0","author":{"name":"Daishi Kato"},"repository":{"type":"git","url":"git+https://github.com/dai-shi/reactive-react-redux.git"},"main":"./dist/index.js","module":"./src/index.js","types":"./src/index.d.ts","sideEffects":false,"scripts":{"compile":"babel src -d dist","test":"run-s eslint tsc-test jest","eslint":"eslint --ext .js,.ts,.tsx --ignore-pattern dist .","jest":"jest","tsc-test":"tsc --project . --noEmit","examples:01_minimal":"DIR=01_minimal EXT=js webpack-dev-server","examples:02_typescript":"DIR=02_typescript webpack-dev-server","examples:03_deep":"DIR=03_deep webpack-dev-server","examples:04_immer":"DIR=04_immer webpack-dev-server","examples:05_localstate":"DIR=05_localstate webpack-dev-server","examples:06_memoization":"DIR=06_memoization webpack-dev-server","examples:07_multistore":"DIR=07_multistore webpack-dev-server","examples:08_dynamic":"DIR=08_dynamic webpack-dev-server","examples:09_thunk":"DIR=09_thunk webpack-dev-server","examples:11_todolist":"DIR=11_todolist EXT=tsx webpack-dev-server","examples:12_async":"DIR=12_async EXT=tsx webpack-dev-server"},"keywords":["react","redux","state","hooks","stateless","thisless","pure"],"license":"MIT","dependencies":{},"devDependencies":{"@babel/cli":"^7.8.4","@babel/core":"^7.8.6","@babel/preset-env":"^7.8.6","@babel/preset-react":"^7.8.3","@testing-library/react":"^9.4.1","@types/react":"^16.9.23","@types/react-dom":"^16.9.5","@types/redux-logger":"^3.0.7","@typescript-eslint/eslint-plugin":"^2.21.0","@typescript-eslint/parser":"^2.21.0","babel-loader":"^8.0.6","eslint":"^6.8.0","eslint-config-airbnb":"^18.0.1","eslint-plugin-import":"^2.20.1","eslint-plugin-jsx-a11y":"^6.2.3","eslint-plugin-react":"^7.18.3","eslint-plugin-react-hooks":"^2.5.0","html-webpack-plugin":"^3.2.0","immer":"^5.3.6","jest":"^25.1.0","npm-run-all":"^4.1.5","react":"experimental","react-dom":"experimental","redux":"^4.0.5","redux-thunk":"^2.3.0","ts-loader":"^6.2.1","typescript":"^3.8.3","webpack":"^4.41.6","webpack-cli":"^3.3.11","webpack-dev-server":"^3.10.3"},"peerDependencies":{"react":">=16.8.0","redux":">=4.0.0"},"babel":{"presets":["@babel/preset-env","@babel/preset-react"]},"gitHead":"7f112246d83c59687043f0fa6aee8c30cd8e5cf7","bugs":{"url":"https://github.com/dai-shi/reactive-react-redux/issues"},"homepage":"https://github.com/dai-shi/reactive-react-redux#readme","_id":"reactive-react-redux@4.7.0","_nodeVersion":"10.19.0","_npmVersion":"6.13.7","dist":{"integrity":"sha512-V1t3+HTGJEEenead/QBdSCZnHP6cyZG8gP41fWSjBJ7wuhhJCimzt8Vw58QIiwWi3MuwUT1E6EWdOFNX6sQAzw==","shasum":"cd4fdcb29ff401ff9c772963321d06e89e39865d","tarball":"https://registry.npmjs.org/reactive-react-redux/-/reactive-react-redux-4.7.0.tgz","fileCount":19,"unpackedSize":52454,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJeW1dwCRA9TVsSAnZWagAAGtYP/1avQByVZ96bQ9/Trg4c\nRLkUi4r4e4tCJEJ+XFHFTT5QNAq49dX35USS9ABON9Dc4kX1qXrMlBcrKSuj\nQ2H4abIpnktmD1qtcgjp4JJC//iyUE4P9r+mPAEGL/D5yyX22WxooLIHlobx\nkyTi3YcirVIeRea9fXdlRia67LuEDz8omoQrvPRPwJGoDK7uNSmbg18+2qY4\nVkpOCv0dW7U7aAmmF0HvFeoZid01BCKyS+92LMGaFr3mF/avQTDhwxx/crFR\nueCX6zh/DLXvyt0vqidVm5gcyu0UOayWIlO/vcNh7q2Y4ayQvg6C8EUxv1NQ\nIbWLpNndIbQohKdplnDCnkUPihMlSFgGXkAFK+a+MVILnc7SHkWZITF7DHZR\n4huXnGVf7cDbi94/XE1oZJT8yhh9bEDP97OHgdN4fI7lHNzPQmJaIeVHmFCD\n2o2wsyZFzdbIO1oJusAneMhGEKNsgV4bOiPkuX0jQj3FghZ+c1VAxX2UR9zS\nbIZF+erDolwBZnvYzH5+uFVtoKybb/e/3ojiTFBOiZj1XYh5zoDoFH3ukqhT\nSb/31DQm+lHQPInRXJCukNjYa9iTd9Wb3/9YWb7I8+DrmdbR5Ortwj2Rd6bM\nnhOL9vBQ0PtLzsyDpbOGYpXcwNemb9wGfK/6D7n4qfs4uUt6ofOVW/lW5Ozv\ngGxD\r\n=LSz3\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDoc7H/FsI20jRcdcDYz6F+ztsXP2eDPY0akYxOMFPOcwIhALDsjGZhoOgaDDACxVrUYbZ2/uAG8YCJfSM0nZzX3BBa"}]},"maintainers":[{"name":"daishi","email":"daishi@axlight.com"}],"_npmUser":{"name":"daishi","email":"daishi@axlight.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/reactive-react-redux_4.7.0_1583044463586_0.00954272196317607"},"_hasShrinkwrap":false},"4.8.0":{"name":"reactive-react-redux","description":"React Redux binding with React Hooks and Proxy","version":"4.8.0","author":{"name":"Daishi Kato"},"repository":{"type":"git","url":"git+https://github.com/dai-shi/reactive-react-redux.git"},"main":"./dist/index.js","module":"./src/index.js","types":"./src/index.d.ts","sideEffects":false,"scripts":{"compile":"babel src -d dist","test":"run-s eslint tsc-test jest","eslint":"eslint --ext .js,.ts,.tsx --ignore-pattern dist .","jest":"jest","tsc-test":"tsc --project . --noEmit","examples:01_minimal":"DIR=01_minimal EXT=js webpack-dev-server","examples:02_typescript":"DIR=02_typescript webpack-dev-server","examples:03_deep":"DIR=03_deep webpack-dev-server","examples:04_immer":"DIR=04_immer webpack-dev-server","examples:05_localstate":"DIR=05_localstate webpack-dev-server","examples:06_memoization":"DIR=06_memoization webpack-dev-server","examples:07_multistore":"DIR=07_multistore webpack-dev-server","examples:08_dynamic":"DIR=08_dynamic webpack-dev-server","examples:09_thunk":"DIR=09_thunk webpack-dev-server","examples:11_todolist":"DIR=11_todolist EXT=tsx webpack-dev-server","examples:12_async":"DIR=12_async EXT=tsx webpack-dev-server"},"keywords":["react","redux","state","hooks","stateless","thisless","pure"],"license":"MIT","dependencies":{},"devDependencies":{"@babel/cli":"^7.8.4","@babel/core":"^7.8.7","@babel/preset-env":"^7.8.7","@babel/preset-react":"^7.8.3","@testing-library/react":"^9.5.0","@types/react":"^16.9.23","@types/react-dom":"^16.9.5","@types/redux-logger":"^3.0.7","@typescript-eslint/eslint-plugin":"^2.22.0","@typescript-eslint/parser":"^2.22.0","babel-loader":"^8.0.6","eslint":"^6.8.0","eslint-config-airbnb":"^18.0.1","eslint-plugin-import":"^2.20.1","eslint-plugin-jsx-a11y":"^6.2.3","eslint-plugin-react":"^7.19.0","eslint-plugin-react-hooks":"^2.5.0","html-webpack-plugin":"^3.2.0","immer":"^6.0.1","jest":"^25.1.0","npm-run-all":"^4.1.5","react":"experimental","react-dom":"experimental","redux":"^4.0.5","redux-thunk":"^2.3.0","ts-loader":"^6.2.1","typescript":"^3.8.3","webpack":"^4.42.0","webpack-cli":"^3.3.11","webpack-dev-server":"^3.10.3"},"peerDependencies":{"react":">=16.8.0","redux":">=4.0.0"},"babel":{"presets":["@babel/preset-env","@babel/preset-react"]},"gitHead":"bda6446185878c7e6a8fb9c7e4ba0693ad5f29ce","bugs":{"url":"https://github.com/dai-shi/reactive-react-redux/issues"},"homepage":"https://github.com/dai-shi/reactive-react-redux#readme","_id":"reactive-react-redux@4.8.0","_nodeVersion":"10.19.0","_npmVersion":"6.13.7","dist":{"integrity":"sha512-kLNWOC14cX946O9qv/PwF+f2G7cFTYNG5oQZg8Ft3phFIXYhmOKrN0QLkXf740SbYZB3in8u+L4Fr+7nnPTOew==","shasum":"cd6781b7bd7608cfa896f4664b0b2a6b3bd0890a","tarball":"https://registry.npmjs.org/reactive-react-redux/-/reactive-react-redux-4.8.0.tgz","fileCount":19,"unpackedSize":51452,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJeY4ZZCRA9TVsSAnZWagAA9pcP/2OsFyyYXI5owuWjEVZ6\nwzzG46BRHTTtPchx2dIOThKpL1HU5NPhHmXasclFE4qln7LtG6OQZZh8D/cw\nV/22/AA+Zw4RDgsQcUgraInCLZmJYy16SKDBNkkCvI4n14BF7VzMPg7FSimk\nu1m+KPiCBxknp0MTKP7JpfSOJ5SwQaSag3SXOlUMdRw721Rycz2v9upkHxay\nIz7D2gv5d22RtUU0vnKff2M2EwDSgiVPC1o7idC8j17MU7LwkheI1v+Xc4pK\n/IDQYZKvQaEqr3ulgAVY+IQ32j1OgVqdiacRI3ZO9RRxtxQQwHMvk8FFZfED\n5H/lkNKiFjyodqVWazux0NYcov8D3yKk6B5MmYzQpu2YEjAKyD+JIHjEgUfi\nsRXaNewSSWVKx3Maccl7DDEPvFzxrCcWvHbAOaV+ZDWMLvIdhbYGKc/JxmWd\nbDD5YmwbsvwkM6szwhwTUaxLmGciGwXg2D9AHmR7xnt3BSpeg+2IUAD07b+I\nHt786oWQmhGZdv9b9smQK8lunkAcYn4M17KWLeBPPsH8jF/8/wumVCX7W+Jd\nZ/eGSKaxxnPYret+1+l5/mHBkNHFpGtpUglEadi3oxhbPHXUcnn3jVfg2Xky\nxcAr2yxSamdhu1Cr+HFMQsISDAGO7Ay12jjsfrJLiA4I6Twwf/3IEFkuxMMO\nbfnW\r\n=0w5W\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCID71rJQ7RsYeivLuSry0c02FCVYq+7DDERvPisUmECMdAiEAgyYonWnBxFkM2ZhhuGYoLpsDW0cujAIHT85teewEikM="}]},"maintainers":[{"name":"daishi","email":"daishi@axlight.com"}],"_npmUser":{"name":"daishi","email":"daishi@axlight.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/reactive-react-redux_4.8.0_1583580760670_0.5155495917374553"},"_hasShrinkwrap":false},"5.0.0-alpha.1":{"name":"reactive-react-redux","description":"React Redux binding with React Hooks and Proxy","version":"5.0.0-alpha.1","author":{"name":"Daishi Kato"},"repository":{"type":"git","url":"git+https://github.com/dai-shi/reactive-react-redux.git"},"source":"./src/index.ts","main":"./dist/index.js","module":"./dist/index.esm.js","browser":"./dist/index.umd.js","types":"./dist/src/index.d.ts","sideEffects":false,"scripts":{"compile":"microbundle build --format cjs,es,umd","test":"run-s eslint tsc-test jest","eslint":"eslint --ext .js,.ts,.tsx --ignore-pattern dist .","jest":"jest --preset ts-jest/presets/js-with-ts","tsc-test":"tsc --project . --noEmit","apidoc":"documentation readme --section API --markdown-toc false --parse-extension ts src/*.ts","examples:01_minimal":"DIR=01_minimal EXT=js webpack-dev-server","examples:02_typescript":"DIR=02_typescript webpack-dev-server","examples:03_deep":"DIR=03_deep webpack-dev-server","examples:04_immer":"DIR=04_immer webpack-dev-server","examples:05_localstate":"DIR=05_localstate webpack-dev-server","examples:06_memoization":"DIR=06_memoization webpack-dev-server","examples:07_multistore":"DIR=07_multistore webpack-dev-server","examples:08_dynamic":"DIR=08_dynamic webpack-dev-server","examples:09_thunk":"DIR=09_thunk webpack-dev-server","examples:11_todolist":"DIR=11_todolist EXT=tsx webpack-dev-server","examples:12_async":"DIR=12_async EXT=tsx webpack-dev-server"},"keywords":["react","redux","state","hooks","stateless","thisless","pure"],"license":"MIT","dependencies":{"proxy-compare":"^1.0.1"},"devDependencies":{"@testing-library/react":"^9.5.0","@types/jest":"^25.1.4","@types/react":"^16.9.23","@types/react-dom":"^16.9.5","@types/redux-logger":"^3.0.7","@typescript-eslint/eslint-plugin":"^2.22.0","@typescript-eslint/parser":"^2.22.0","documentation":"^12.1.4","eslint":"^6.8.0","eslint-config-airbnb":"^18.0.1","eslint-plugin-import":"^2.20.1","eslint-plugin-jsx-a11y":"^6.2.3","eslint-plugin-react":"^7.19.0","eslint-plugin-react-hooks":"^2.5.0","html-webpack-plugin":"^3.2.0","immer":"^6.0.1","jest":"^25.1.0","microbundle":"^0.12.0-next.8","npm-run-all":"^4.1.5","react":"experimental","react-dom":"experimental","redux":"^4.0.5","redux-thunk":"^2.3.0","ts-jest":"^25.2.1","ts-loader":"^6.2.1","typescript":"^3.8.3","webpack":"^4.42.0","webpack-cli":"^3.3.11","webpack-dev-server":"^3.10.3"},"peerDependencies":{"react":">=16.14.0","redux":">=4.0.0"},"readme":"# reactive-react-redux\n\n[![Build Status](https://travis-ci.com/dai-shi/reactive-react-redux.svg?branch=master)](https://travis-ci.com/dai-shi/reactive-react-redux)\n[![npm version](https://badge.fury.io/js/reactive-react-redux.svg)](https://badge.fury.io/js/reactive-react-redux)\n[![bundle size](https://badgen.net/bundlephobia/minzip/reactive-react-redux)](https://bundlephobia.com/result?p=reactive-react-redux)\n\nReact Redux binding with React Hooks and Proxy\n\n> If you are looking for a non-Redux library, please visit [react-tracked](https://github.com/dai-shi/react-tracked) which has the same hooks API.\n\n## Introduction\n\nThis is a library to bind React and Redux with Hooks API.\nIt has mostly the same API as the official\n[react-redux Hooks API](https://react-redux.js.org/api/hooks),\nso it can be used as a drop-in replacement\nif you are using only basic functionality.\n\nThere are two major features in this library\nthat are not in the official react-redux.\n\n### 1. useTrackedState hook\n\nThis library provides another hook `useTrackedState`\nwhich is a simpler API than already simple `useSelector`.\nIt returns an entire state, but the library takes care of\noptimization of re-renders.\nMost likely, `useTrackedState` performs better than\n`useSelector` without perfectly tuned selectors.\n\nTechnically, `useTrackedState` has no [stale props](https://react-redux.js.org/api/hooks#stale-props-and-zombie-children) issue.\n\n### 2. useMutableSource without Context\n\nreact-redux v7 has APIs around Context.\nThis library is implemented with useMutableSource,\nand it patches the Redux store.\nAPIs are provided without Context.\nIt's up to developers to use Context based on them.\nCheck out `./examples/11_todolist/src/context.ts`.\n\nThere's another difference from react-redux v7.\nThis library directly use useMutableSource, and requires\nuseCallback for the selector in useSelector.\n[equalityFn](https://react-redux.js.org/api/hooks#equality-comparisons-and-updates) is not supported.\n\n## How tracking works\n\nA hook `useTrackedState` returns an entire Redux state object with Proxy,\nand it keeps track of which properties of the object are used\nin render. When the state is updated, this hook checks\nwhether used properties are changed.\nOnly if it detects changes in the state,\nit triggers a component to re-render.\n\n## Install\n\n```bash\nnpm install reactive-react-redux\n```\n\n## Usage (useTrackedState)\n\n```javascript\nimport React from 'react';\nimport { createStore } from 'redux';\nimport {\n  patchStore,\n  useTrackedState,\n} from 'reactive-react-redux';\n\nconst initialState = {\n  count: 0,\n  text: 'hello',\n};\n\nconst reducer = (state = initialState, action) => {\n  switch (action.type) {\n    case 'increment': return { ...state, count: state.count + 1 };\n    case 'decrement': return { ...state, count: state.count - 1 };\n    case 'setText': return { ...state, text: action.text };\n    default: return state;\n  }\n};\n\nconst store = patchStoroe(createStore(reducer));\n\nconst Counter = () => {\n  const state = useTrackedState(store);\n  const { dispatch } = store;\n  return (\n    <div>\n      {Math.random()}\n      <div>\n        <span>Count: {state.count}</span>\n        <button type=\"button\" onClick={() => dispatch({ type: 'increment' })}>+1</button>\n        <button type=\"button\" onClick={() => dispatch({ type: 'decrement' })}>-1</button>\n      </div>\n    </div>\n  );\n};\n\nconst TextBox = () => {\n  const state = useTrackedState(store);\n  const { dispatch } = store;\n  return (\n    <div>\n      {Math.random()}\n      <div>\n        <span>Text: {state.text}</span>\n        <input value={state.text} onChange={event => dispatch({ type: 'setText', text: event.target.value })} />\n      </div>\n    </div>\n  );\n};\n\nconst App = () => (\n  <>\n    <h1>Counter</h1>\n    <Counter />\n    <Counter />\n    <h1>TextBox</h1>\n    <TextBox />\n    <TextBox />\n  </>\n);\n```\n\n## API\n\n<!-- Generated by documentation.js. Update this documentation by updating the source code. -->\n\n### patchStore\n\npatch Redux store for React\n\n#### Parameters\n\n-   `store` **Store&lt;State, Action>** \n\n#### Examples\n\n```javascript\nimport { createStore } from 'redux';\nimport { patchStore } from 'reactive-react-redux';\n\nconst reducer = ...;\nconst store = patchStore(createStore(reducer));\n```\n\n### useSelector\n\nuseSelector hook\n\nselector has to be stable. Either define it outside render\nor use useCallback if selector uses props.\n\n#### Parameters\n\n-   `patchedStore` **PatchedStore&lt;State, Action>** \n-   `selector` **function (state: State): Selected** \n\n#### Examples\n\n```javascript\nimport { useCallback } from 'react';\nimport { useSelector } from 'reactive-react-redux';\n\nconst Component = ({ count }) => {\n  const isBigger = useSelector(store, useCallack(state => state.count > count, [count]));\n  ...\n};\n```\n\n### useTrackedState\n\nuseTrackedState hook\n\nIt return the Redux state wrapped by Proxy,\nand the state prperty access is tracked.\nIt will only re-render if accessed properties are changed.\n\n#### Parameters\n\n-   `patchedStore` **PatchedStore&lt;State, Action>** \n-   `opts` **Opts**  (optional, default `{}`)\n\n#### Examples\n\n```javascript\nimport { useTrackedState } from 'reactive-react-redux';\n\nconst Component = () => {\n  const state = useTrackedState(store);\n  ...\n};\n```\n\n## Recipes\n\n### Context\n\nYou can create Context based APIs like react-redux v7.\n\n```typescript\nimport { createContext, createElement, useContext } from 'react';\nimport {\n  PatchedStore,\n  useSelector as useSelectorOrig,\n  useTrackedState as useTrackedStateOrig,\n} from 'reactive-react-redux';\n\nexport type State = ...;\n\nexport type Action = ...;\n\nconst Context = createContext(new Proxy({}, {\n  get() { throw new Error('use Provider'); },\n}) as PatchedStore<State, Action>);\n\nexport const Provider: React.FC<{ store: PatchedStore<State, Action> }> = ({\n  store,\n  children,\n}) => createElement(Context.Provider, { value: store }, children);\n\nexport const useDispatch = () => useContext(Context).dispatch;\n\nexport const useSelector = <Selected>(\n  selector: (state: State) => Selected,\n) => useSelectorOrig(useContext(Context), selector);\n\nexport const useTrackedState = () => useTrackedStateOrig(useContext(Context));\n```\n\n### useTrackedSelector\n\nYou can create a selector hook with tracking support.\n\n```javascript\nimport { useTrackedState } from 'reactive-react-redux';\n\nexport const useTrackedSelector = selector => selector(useTrackedState());\n```\n\nPlease refer [this issue](https://github.com/dai-shi/reactive-react-redux/issues/41) for more information.\n\n### useTracked\n\nYou can combine useTrackedState and useDispatch to\nmake a hook that returns a tuple like `useReducer`.\n\n```javascript\nimport { useTrackedState, useDispatch } from 'reactive-react-redux';\n\nexport const useTracked = () => {\n  const state = useTrackedState();\n  const dispatch = useDispatch();\n  return useMemo(() => [state, dispatch], [state, dispatch]);\n};\n```\n\n## Caveats\n\nProxy and state usage tracking may not work 100% as expected.\nThere are some limitations and workarounds.\n\n### Proxied states are referentially equal only in per-hook basis\n\n```javascript\nconst state1 = useTrackedState();\nconst state2 = useTrackedState();\n// state1 and state2 is not referentially equal\n// even if the underlying redux state is referentially equal.\n```\n\nYou should use `useTrackedState` only once in a component.\n\n### An object referential change doesn't trigger re-render if an property of the object is accessed in previous render\n\n```javascript\nconst state = useTrackedState();\nconst { foo } = state;\nreturn <Child key={foo.id} foo={foo} />;\n\nconst Child = React.memo(({ foo }) => {\n  // ...\n};\n// if foo doesn't change, Child won't render, so foo.id is only marked as used.\n// it won't trigger Child to re-render even if foo is changed.\n```\n\nYou need to explicitly notify an object as used in a memoized component.\n\n```javascript\nconst Child = React.memo(({ foo }) => {\n  trackMemo(foo);\n  // ...\n};\n```\n\nCheck out [this issue](https://github.com/dai-shi/react-tracked/issues/30)\nto learn more about the problem and trackMemo.\n\n### Proxied state might behave unexpectedly outside render\n\nProxies are basically transparent, and it should behave like normal objects.\nHowever, there can be edge cases where it behaves unexpectedly.\nFor example, if you console.log a proxied value,\nit will display a proxy wrapping an object.\nNotice, it will be kept tracking outside render,\nso any prorerty access will mark as used to trigger re-render on updates.\n\nuseTrackedState will unwrap a Proxy before wrapping with a new Proxy,\nhence, it will work fine in usual use cases.\nThere's only one known pitfall: If you wrap proxied state with your own Proxy\noutside the control of useTrackedState,\nit might lead memory leaks, because useTrackedState\nwouldn't know how to unwrap your own Proxy.\n\nTo work around such edge cases, the first option is to use primitive values.\n\n```javascript\nconst state = useTrackedState();\nconst dispatch = useUpdate();\ndispatch({ type: 'FOO', value: state.fooObj }); // Instead of using objects,\ndispatch({ type: 'FOO', value: state.fooStr }); // Use primitives.\n```\n\nThe second option is to use `getUntrackedObject`.\n\n```javascript\nimport { getUntrackedObject } from 'react-tracked';\ndispatch({ type: 'FOO', value: getUntrackedObject(state.fooObj) });\n```\n\nYou could implement a special dispatch function to do this automatically.\n\n## Examples\n\nThe [examples](examples) folder contains working examples.\nYou can run one of them with\n\n```bash\nPORT=8080 npm run examples:01_minimal\n```\n\nand open <http://localhost:8080> in your web browser.\n\nYou can also try them in codesandbox.io:\n[01](https://codesandbox.io/s/github/dai-shi/reactive-react-redux/tree/master/examples/01_minimal)\n[02](https://codesandbox.io/s/github/dai-shi/reactive-react-redux/tree/master/examples/02_typescript)\n[03](https://codesandbox.io/s/github/dai-shi/reactive-react-redux/tree/master/examples/03_deep)\n[04](https://codesandbox.io/s/github/dai-shi/reactive-react-redux/tree/master/examples/04_immer)\n[05](https://codesandbox.io/s/github/dai-shi/reactive-react-redux/tree/master/examples/05_localstate)\n[06](https://codesandbox.io/s/github/dai-shi/reactive-react-redux/tree/master/examples/06_memoization)\n[07](https://codesandbox.io/s/github/dai-shi/reactive-react-redux/tree/master/examples/07_multistore)\n[08](https://codesandbox.io/s/github/dai-shi/reactive-react-redux/tree/master/examples/08_dynamic)\n[09](https://codesandbox.io/s/github/dai-shi/reactive-react-redux/tree/master/examples/09_thunk)\n[11](https://codesandbox.io/s/github/dai-shi/reactive-react-redux/tree/master/examples/11_todolist)\n[12](https://codesandbox.io/s/github/dai-shi/reactive-react-redux/tree/master/examples/12_async)\n\n## Benchmarks\n\n<img alt=\"benchmark result\" src=\"https://user-images.githubusercontent.com/490574/61585382-405fae80-ab95-11e9-9f28-3b1a49dd1e5f.png\" width=\"425\" />\n\nSee [#32](https://github.com/dai-shi/reactive-react-redux/issues/32) for details.\n\n## Blogs\n\n-   [A deadly simple React bindings library for Redux with Hooks API](https://blog.axlight.com/posts/a-deadly-simple-react-bindings-library-for-redux-with-hooks-api/)\n-   [Developing React custom hooks for Redux without react-redux](https://blog.axlight.com/posts/developing-react-custom-hooks-for-redux-without-react-redux/)\n-   [Integrating React and Redux, with Hooks and Proxies](https://frontarm.com/daishi-kato/redux-custom-hooks/)\n-   [New React Redux coding style with hooks without selectors](https://blog.axlight.com/posts/new-react-redux-coding-style-with-hooks-without-selectors/)\n-   [Benchmark alpha-released hooks API in React Redux with alternatives](https://blog.axlight.com/posts/benchmark-alpha-released-hooks-api-in-react-redux-with-alternatives/)\n-   [Four patterns for global state with React hooks: Context or Redux](https://blog.axlight.com/posts/four-patterns-for-global-state-with-react-hooks-context-or-redux/)\n-   [Redux meets hooks for non-redux users: a small concrete example with reactive-react-redux](https://blog.axlight.com/posts/redux-meets-hooks-for-non-redux-users-a-small-concrete-example-with-reactive-react-redux/)\n-   [Redux-less context-based useSelector hook that has same performance as React-Redux](https://blog.axlight.com/posts/benchmark-react-tracked/)\n-   [What is state usage tracking? A novel approach to intuitive and performant global state with React hooks and Proxy](https://blog.axlight.com/posts/what-is-state-usage-tracking-a-novel-approach-to-intuitive-and-performant-api-with-react-hooks-and-proxy/)\n-   [Effortless render optimization with state usage tracking with React hooks](https://blog.axlight.com/posts/effortless-render-optimization-with-state-usage-tracking-with-react-hooks/)\n-   [How I developed a Concurrent Mode friendly library for React Redux](https://blog.axlight.com/posts/how-i-developed-a-concurrent-mode-friendly-library-for-react-redux/)\n-   [React hooks-oriented Redux coding pattern without thunks and action creators](https://blog.axlight.com/posts/react-hooks-oriented-redux-coding-pattern-without-thunks-and-action-creators/)\n","readmeFilename":"README.md","gitHead":"de8f48eb0463768c2b5fd0ac415c051c58b42111","bugs":{"url":"https://github.com/dai-shi/reactive-react-redux/issues"},"homepage":"https://github.com/dai-shi/reactive-react-redux#readme","_id":"reactive-react-redux@5.0.0-alpha.1","_nodeVersion":"10.19.0","_npmVersion":"6.13.7","dist":{"integrity":"sha512-7xo1+gOg5GsRDUNB/ya964fMRlO2GYgzwVD6peA7acrX7mGyyvoK8eN4AJ2jJH5NQVz6TDspsB8jBdGchf6Vng==","shasum":"835f2ea3e2ac34da6da5ffb63bb9fe88e206dbe5","tarball":"https://registry.npmjs.org/reactive-react-redux/-/reactive-react-redux-5.0.0-alpha.1.tgz","fileCount":20,"unpackedSize":61326,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJeamryCRA9TVsSAnZWagAA/soP+QCYL/ztlm+bgQysCz4E\nCGqzjXjRpBXh/tjUXIYFiV1RPrumZO9DS5ltgc8Ha+QnGZdeLBC56p5OCZeP\nzA8aDrqeERpZJZYpKVKzkyj2vWxYSmikF+AJu9nKpmlUxKNSYJnUnptTvStQ\n4lRdWnDo7kdEmGh5HqsMOsrpPYRDAWVK8xmYq6ij9BtNXsvfaY3nbaI1iFZy\nyh1pvdU9tyGHAVSHdTw5L/9mbK0Vr5KHkSygujOFGYdNGRGR72qYO54GZbtN\nQ6pDv/gR5ZXrpuSUBbhUxUrQG6mmtRYw3nVQzbXsNew1aQ420UG/ZDaCv6Ss\nGAzTATUQZS9Zg+2djwYOPvg94D/Vt5bLcRnEIjv4sG+Rb15X2rkbub2BnMN1\nALy6rIbJDpimKleHaE7IbZWfJw1j+I8PNhMRpVbWeXLCpcjNBVOMxjKQYVrF\n0+Bp+5P4r57xmptrW71sCPPCc5MzKzsb/SyXL2bI1vX8LXua/LzodQQLXrPy\n6GsPJias6ZuBqTzmk4XJ/SIIkpqnj4zQlL1aouhkN8PJ9TLuxKTEOFWOPkqH\nP2p1/B32QDkjJOy45xd6B1X0G6bJl0R+a7IM9PYP2XT8tAI/oVeN7xuUaohH\nm5ATMl/59n/0n+NlwZYY2EhpDvSwJadDyHMbwFQ9HvcO35dRJKrJqbBuph++\nZwdt\r\n=Z8IW\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCICj9YXBEqPxC5nseIsnJcdwMk3dwIVm4R0lwcAHdlVStAiAfIjJ5amtlxfAiFLl9VvdwwjtBJRmVdEigkveHRw6c7w=="}]},"maintainers":[{"name":"daishi","email":"daishi@axlight.com"}],"_npmUser":{"name":"daishi","email":"daishi@axlight.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/reactive-react-redux_5.0.0-alpha.1_1584032497677_0.7637337617089581"},"_hasShrinkwrap":false},"5.0.0-alpha.2":{"name":"reactive-react-redux","description":"React Redux binding with React Hooks and Proxy","version":"5.0.0-alpha.2","author":{"name":"Daishi Kato"},"repository":{"type":"git","url":"git+https://github.com/dai-shi/reactive-react-redux.git"},"source":"./src/index.ts","main":"./dist/index.js","module":"./dist/index.esm.js","browser":"./dist/index.umd.js","types":"./dist/src/index.d.ts","sideEffects":false,"scripts":{"compile":"microbundle build --format cjs,es,umd","test":"run-s eslint tsc-test jest","eslint":"eslint --ext .js,.ts,.tsx --ignore-pattern dist .","jest":"jest --preset ts-jest/presets/js-with-ts","tsc-test":"tsc --project . --noEmit","apidoc":"documentation readme --section API --markdown-toc false --parse-extension ts src/*.ts","examples:01_minimal":"DIR=01_minimal EXT=js webpack-dev-server","examples:02_typescript":"DIR=02_typescript webpack-dev-server","examples:03_deep":"DIR=03_deep webpack-dev-server","examples:04_immer":"DIR=04_immer webpack-dev-server","examples:05_localstate":"DIR=05_localstate webpack-dev-server","examples:06_memoization":"DIR=06_memoization webpack-dev-server","examples:07_multistore":"DIR=07_multistore webpack-dev-server","examples:08_dynamic":"DIR=08_dynamic webpack-dev-server","examples:09_thunk":"DIR=09_thunk webpack-dev-server","examples:11_todolist":"DIR=11_todolist EXT=tsx webpack-dev-server","examples:12_async":"DIR=12_async EXT=tsx webpack-dev-server"},"keywords":["react","redux","state","hooks","stateless","thisless","pure"],"license":"MIT","dependencies":{"proxy-compare":"^1.0.1"},"devDependencies":{"@testing-library/react":"^9.5.0","@types/jest":"^25.1.4","@types/react":"^16.9.23","@types/react-dom":"^16.9.5","@types/redux-logger":"^3.0.7","@typescript-eslint/eslint-plugin":"^2.22.0","@typescript-eslint/parser":"^2.22.0","documentation":"^12.1.4","eslint":"^6.8.0","eslint-config-airbnb":"^18.0.1","eslint-plugin-import":"^2.20.1","eslint-plugin-jsx-a11y":"^6.2.3","eslint-plugin-react":"^7.19.0","eslint-plugin-react-hooks":"^2.5.0","html-webpack-plugin":"^3.2.0","immer":"^6.0.1","jest":"^25.1.0","microbundle":"^0.12.0-next.8","npm-run-all":"^4.1.5","react":"experimental","react-dom":"experimental","redux":"^4.0.5","redux-thunk":"^2.3.0","ts-jest":"^25.2.1","ts-loader":"^6.2.1","typescript":"^3.8.3","webpack":"^4.42.0","webpack-cli":"^3.3.11","webpack-dev-server":"^3.10.3"},"peerDependencies":{"react":">=16.14.0","redux":">=4.0.0"},"gitHead":"c7a52fcbf91de543ee5e9670053c88f1854107f1","bugs":{"url":"https://github.com/dai-shi/reactive-react-redux/issues"},"homepage":"https://github.com/dai-shi/reactive-react-redux#readme","_id":"reactive-react-redux@5.0.0-alpha.2","_nodeVersion":"10.19.0","_npmVersion":"6.13.7","dist":{"integrity":"sha512-JSBIs1Qoef+jo1cRP2oAuo9HSOjh3sh0hxPS14rbuO6mhaSePz5WBFV5T0fkNBqd4yAPLFrsTjo4U2cFS2MZFQ==","shasum":"e807d8443ac57ec9621ef15133dc9f6fc58d6198","tarball":"https://registry.npmjs.org/reactive-react-redux/-/reactive-react-redux-5.0.0-alpha.2.tgz","fileCount":20,"unpackedSize":58163,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJeb0XwCRA9TVsSAnZWagAA/PMQAJT5Odqbszg2hzVr9j1o\nFMnN1XshzWqtKBk5wpN4YQddUYVsNYfho6a9kvX5+MaTbNGdlnVsYHKwXZCd\nrQ63ydToP8a4d+XZ8KMt+TKEdJb9mZX889wH6u0+ptHsQGJ8sEIuqBTVKtE0\nug4Sfhp6bCJPii9cBqRvig/6mlV2wwbzjEJ/JSZoY/AcM+oMfFkSqawqFIh+\nGRDykVTyfVPrxGYdvCEOxS4oSZ+/0bynJyEfTupv0egRCJoGSds24cEdRbO6\niil4R7EOiKnby5iq2wK0lyWwNfhsfibY4kN8Ti4Tf1GjT/8QlbPa0IAIDhRW\nUzP1ICVPAt06cfisQKiLfi4Wzh9ddl1nJDjbM2aXFdZw0ZcDj62J7aEiVICt\n7IGQ+GsXQ7pN6ZNjwNxs0JJhZaYC/89XjqvwJJFep6Z/ABVDciw7hpmUFJpA\nLw0wWwtd2GXf8KW8AHvqnx8d+P9dk4TKWHdz5XBpbp1hrDnSVmqmFQVAqYU6\nwogaGOXT7/DGnd9Pocam/guJGsDEzVPGGbWUcrdr+t56bSK8ZB0+T28CmE3o\nprImi83GUvroJhb+rfPvld0yIojOKqmXS465/VqfF58xW9a4paNLpQqiOZy7\ny3BHHkfty4fOKufNWoHugg0pdYrHaUnbRQ63SfDBeXSbbZdFzwoCGy5DWbH4\nX+js\r\n=zvXD\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIAVaLbNyIg4t3jNmOHjoW3IqmSyl9h3dzuenKYmZeUA+AiBIWuigXtqyJTDDZZ21d2Tdvuig6icVbsc/1fgDAWkuYA=="}]},"maintainers":[{"name":"daishi","email":"daishi@axlight.com"}],"_npmUser":{"name":"daishi","email":"daishi@axlight.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/reactive-react-redux_5.0.0-alpha.2_1584350704393_0.191838458352247"},"_hasShrinkwrap":false},"4.9.0":{"name":"reactive-react-redux","description":"React Redux binding with React Hooks and Proxy","version":"4.9.0","author":{"name":"Daishi Kato"},"repository":{"type":"git","url":"git+https://github.com/dai-shi/reactive-react-redux.git"},"main":"./dist/index.js","module":"./src/index.js","types":"./src/index.d.ts","sideEffects":false,"scripts":{"compile":"babel src -d dist","test":"run-s eslint tsc-test jest","eslint":"eslint --ext .js,.ts,.tsx --ignore-pattern dist .","jest":"jest","tsc-test":"tsc --project . --noEmit","examples:01_minimal":"DIR=01_minimal EXT=js webpack-dev-server","examples:02_typescript":"DIR=02_typescript webpack-dev-server","examples:03_deep":"DIR=03_deep webpack-dev-server","examples:04_immer":"DIR=04_immer webpack-dev-server","examples:05_localstate":"DIR=05_localstate webpack-dev-server","examples:06_memoization":"DIR=06_memoization webpack-dev-server","examples:07_multistore":"DIR=07_multistore webpack-dev-server","examples:08_dynamic":"DIR=08_dynamic webpack-dev-server","examples:09_thunk":"DIR=09_thunk webpack-dev-server","examples:11_todolist":"DIR=11_todolist EXT=tsx webpack-dev-server","examples:12_async":"DIR=12_async EXT=tsx webpack-dev-server","examples:13_memo":"DIR=13_memo webpack-dev-server"},"keywords":["react","redux","state","hooks","stateless","thisless","pure"],"license":"MIT","dependencies":{},"devDependencies":{"@babel/cli":"^7.8.4","@babel/core":"^7.8.7","@babel/preset-env":"^7.8.7","@babel/preset-react":"^7.8.3","@testing-library/react":"^10.0.1","@types/react":"^16.9.23","@types/react-dom":"^16.9.5","@types/redux-logger":"^3.0.7","@typescript-eslint/eslint-plugin":"^2.24.0","@typescript-eslint/parser":"^2.24.0","babel-loader":"^8.0.6","eslint":"^6.8.0","eslint-config-airbnb":"^18.1.0","eslint-plugin-import":"^2.20.1","eslint-plugin-jsx-a11y":"^6.2.3","eslint-plugin-react":"^7.19.0","eslint-plugin-react-hooks":"^2.5.0","html-webpack-plugin":"^3.2.0","immer":"^6.0.2","jest":"^25.1.0","npm-run-all":"^4.1.5","react":"experimental","react-dom":"experimental","redux":"^4.0.5","redux-thunk":"^2.3.0","ts-loader":"^6.2.1","typescript":"^3.8.3","webpack":"^4.42.0","webpack-cli":"^3.3.11","webpack-dev-server":"^3.10.3"},"peerDependencies":{"react":">=16.8.0","redux":">=4.0.0"},"babel":{"presets":["@babel/preset-env","@babel/preset-react"]},"gitHead":"890df1691d0fa592033191fa5a7ea487365cf5f0","bugs":{"url":"https://github.com/dai-shi/reactive-react-redux/issues"},"homepage":"https://github.com/dai-shi/reactive-react-redux#readme","_id":"reactive-react-redux@4.9.0","_nodeVersion":"10.19.0","_npmVersion":"6.14.4","dist":{"integrity":"sha512-OVXUtwiZSwi0YPl/Eh7MrpDzlka+I5DkFnjrsGeoKFKmAlJBjXFRRgFYh7i6XWTgnp0EaMCUnmRzwEHRru6WPQ==","shasum":"6fd1a16139de603640464ce20388588290a54c5e","tarball":"https://registry.npmjs.org/reactive-react-redux/-/reactive-react-redux-4.9.0.tgz","fileCount":21,"unpackedSize":52508,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJet/BYCRA9TVsSAnZWagAA+O4P/2SZC3n425JP+Fk2GwXs\nQQ90ZJk+Y4bvx5iz/AT3A64bPJHsx3ypTDEIuNhBAEtf+H31mx6R6EBbcONZ\n1AMvdCkLfUTRJnZHMjSkANAmD22az1zQwy0ocCBooFxYiTnlJ1UKo7g2PKL7\nQwDOHpbOH6bA6yRcUDlgINkKZBkYdjPJk4G4hCJB2RlmcfO63TV3CpZV2QIF\n4mT163Q8ZYsefMhzguKG+HDuOCvMuvlxIBS16db3hgHUVGlMk/nE5mqN3UZM\nyamsa0wwVQ28/GMU+dodtcWaB6MShzhJRq19O++84HPV6674d7cdb3K9tdkF\nu+HVkCBIi7N1Q1COx9Rf6RjT7gQ/fZZJ8RfE4vT7XqKw20ozEpNi44Z9cv/z\nXyZZO17SQcl9TuwN2yWgP9Z9eDhr3G4RuveMYTsiunE2bUCaBi+qw3Z48zvm\nr4gIKVoYRZCyTCdbm5RM/K0c1oVPznatNOUCpnWQJOke32B1QyqAZ0Cjv2zR\ngwSyCHsuxEfyu/WYGUAHtOnzpsAuz+jYA6ojwIHsa6smdEyQOhHnDLcSQ6wX\n2vCxsznBAtsdaqLduBBZwzQGrdsTC0/R3bwB8/95Gt/bfq7XH7ZmQSgqTRxR\n7PfHdhz6+Pp9RPF6Wcu6meBSjLJo7SXGaF9oPcui2E0Z2QHICcocD/WCXOol\nRNWZ\r\n=hoyh\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIFO8llocf/Zfjwrr8e9fs3KrmA7njcVILHMEDYfO17m5AiB/CKW1EaAFsVvJTN1qyyMAbV7bcVC1W9Hwu4kbihSnuQ=="}]},"maintainers":[{"name":"daishi","email":"daishi@axlight.com"}],"_npmUser":{"name":"daishi","email":"daishi@axlight.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/reactive-react-redux_4.9.0_1589112919810_0.1531662359904089"},"_hasShrinkwrap":false},"5.0.0-alpha.3":{"name":"reactive-react-redux","description":"React Redux binding with React Hooks and Proxy","version":"5.0.0-alpha.3","publishConfig":{"tag":"next"},"author":{"name":"Daishi Kato"},"repository":{"type":"git","url":"git+https://github.com/dai-shi/reactive-react-redux.git"},"source":"./src/index.ts","main":"./dist/index.js","module":"./dist/index.esm.js","browser":"./dist/index.umd.js","types":"./dist/src/index.d.ts","sideEffects":false,"scripts":{"compile":"microbundle build --format cjs,es,umd","test":"run-s eslint tsc-test jest","eslint":"eslint --ext .js,.ts,.tsx --ignore-pattern dist .","jest":"jest --preset ts-jest/presets/js-with-ts","tsc-test":"tsc --project . --noEmit","apidoc":"documentation readme --section API --markdown-toc false --parse-extension ts src/*.ts","examples:01_minimal":"DIR=01_minimal EXT=js webpack-dev-server","examples:02_typescript":"DIR=02_typescript webpack-dev-server","examples:03_deep":"DIR=03_deep webpack-dev-server","examples:04_immer":"DIR=04_immer webpack-dev-server","examples:05_localstate":"DIR=05_localstate webpack-dev-server","examples:06_memoization":"DIR=06_memoization webpack-dev-server","examples:07_multistore":"DIR=07_multistore webpack-dev-server","examples:08_dynamic":"DIR=08_dynamic webpack-dev-server","examples:09_thunk":"DIR=09_thunk webpack-dev-server","examples:11_todolist":"DIR=11_todolist EXT=tsx webpack-dev-server","examples:12_async":"DIR=12_async EXT=tsx webpack-dev-server","examples:13_memo":"DIR=13_memo webpack-dev-server"},"keywords":["react","redux","state","hooks","stateless","thisless","pure"],"license":"MIT","dependencies":{"proxy-compare":"^1.0.1"},"devDependencies":{"@testing-library/react":"^10.0.4","@types/jest":"^25.2.1","@types/react":"^16.9.35","@types/react-dom":"^16.9.8","@types/redux-logger":"^3.0.7","@typescript-eslint/eslint-plugin":"^2.31.0","@typescript-eslint/parser":"^2.31.0","documentation":"^13.0.0","eslint":"^7.0.0","eslint-config-airbnb":"^18.1.0","eslint-plugin-import":"^2.20.2","eslint-plugin-jsx-a11y":"^6.2.3","eslint-plugin-react":"^7.19.0","eslint-plugin-react-hooks":"^4.0.0","html-webpack-plugin":"^4.3.0","immer":"^6.0.5","jest":"^26.0.1","microbundle":"^0.12.0","npm-run-all":"^4.1.5","react":"experimental","react-dom":"experimental","redux":"^4.0.5","redux-thunk":"^2.3.0","ts-jest":"^25.5.1","ts-loader":"^7.0.3","typescript":"^3.8.3","webpack":"^4.43.0","webpack-cli":"^3.3.11","webpack-dev-server":"^3.11.0"},"peerDependencies":{"react":">=16.14.0","redux":">=4.0.0"},"readme":"# reactive-react-redux\n\n[![Build Status](https://travis-ci.com/dai-shi/reactive-react-redux.svg?branch=master)](https://travis-ci.com/dai-shi/reactive-react-redux)\n[![npm version](https://badge.fury.io/js/reactive-react-redux.svg)](https://badge.fury.io/js/reactive-react-redux)\n[![bundle size](https://badgen.net/bundlephobia/minzip/reactive-react-redux)](https://bundlephobia.com/result?p=reactive-react-redux)\n\nReact Redux binding with React Hooks and Proxy\n\n> If you are looking for a non-Redux library, please visit [react-tracked](https://github.com/dai-shi/react-tracked) which has the same hooks API.\n\n## Introduction\n\nThis is a library to bind React and Redux with Hooks API.\nIt has mostly the same API as the official\n[react-redux Hooks API](https://react-redux.js.org/api/hooks),\nso it can be used as a drop-in replacement\nif you are using only basic functionality.\n\nThere are two major features in this library\nthat are not in the official react-redux.\n\n### 1. useTrackedState hook\n\nThis library provides another hook `useTrackedState`\nwhich is a simpler API than already simple `useSelector`.\nIt returns an entire state, but the library takes care of\noptimization of re-renders.\nMost likely, `useTrackedState` performs better than\n`useSelector` without perfectly tuned selectors.\n\nTechnically, `useTrackedState` has no [stale props](https://react-redux.js.org/api/hooks#stale-props-and-zombie-children) issue.\n\n### 2. useMutableSource without Context\n\nreact-redux v7 has APIs around Context.\nThis library is implemented with useMutableSource,\nand it patches the Redux store.\nAPIs are provided without Context.\nIt's up to developers to use Context based on them.\nCheck out `./examples/11_todolist/src/context.ts`.\n\nThere's another difference from react-redux v7.\nThis library directly use useMutableSource, and requires\nuseCallback for the selector in useSelector.\n[equalityFn](https://react-redux.js.org/api/hooks#equality-comparisons-and-updates) is not supported.\n\n## How tracking works\n\nA hook `useTrackedState` returns an entire Redux state object with Proxy,\nand it keeps track of which properties of the object are used\nin render. When the state is updated, this hook checks\nwhether used properties are changed.\nOnly if it detects changes in the state,\nit triggers a component to re-render.\n\n## Install\n\n```bash\nnpm install reactive-react-redux\n```\n\n## Usage (useTrackedState)\n\n```javascript\nimport React from 'react';\nimport { createStore } from 'redux';\nimport {\n  patchStore,\n  useTrackedState,\n} from 'reactive-react-redux';\n\nconst initialState = {\n  count: 0,\n  text: 'hello',\n};\n\nconst reducer = (state = initialState, action) => {\n  switch (action.type) {\n    case 'increment': return { ...state, count: state.count + 1 };\n    case 'decrement': return { ...state, count: state.count - 1 };\n    case 'setText': return { ...state, text: action.text };\n    default: return state;\n  }\n};\n\nconst store = patchStore(createStore(reducer));\n\nconst Counter = () => {\n  const state = useTrackedState(store);\n  const { dispatch } = store;\n  return (\n    <div>\n      {Math.random()}\n      <div>\n        <span>Count: {state.count}</span>\n        <button type=\"button\" onClick={() => dispatch({ type: 'increment' })}>+1</button>\n        <button type=\"button\" onClick={() => dispatch({ type: 'decrement' })}>-1</button>\n      </div>\n    </div>\n  );\n};\n\nconst TextBox = () => {\n  const state = useTrackedState(store);\n  const { dispatch } = store;\n  return (\n    <div>\n      {Math.random()}\n      <div>\n        <span>Text: {state.text}</span>\n        <input value={state.text} onChange={event => dispatch({ type: 'setText', text: event.target.value })} />\n      </div>\n    </div>\n  );\n};\n\nconst App = () => (\n  <>\n    <h1>Counter</h1>\n    <Counter />\n    <Counter />\n    <h1>TextBox</h1>\n    <TextBox />\n    <TextBox />\n  </>\n);\n```\n\n## API\n\n<!-- Generated by documentation.js. Update this documentation by updating the source code. -->\n\n### patchStore\n\npatch Redux store for React\n\n#### Parameters\n\n-   `store` **Store&lt;State, Action>** \n\n#### Examples\n\n```javascript\nimport { createStore } from 'redux';\nimport { patchStore } from 'reactive-react-redux';\n\nconst reducer = ...;\nconst store = patchStore(createStore(reducer));\n```\n\n### useTrackedState\n\nuseTrackedState hook\n\nIt return the Redux state wrapped by Proxy,\nand the state prperty access is tracked.\nIt will only re-render if accessed properties are changed.\n\n#### Parameters\n\n-   `patchedStore` **PatchedStore&lt;State, Action>** \n-   `opts` **Opts**  (optional, default `{}`)\n\n#### Examples\n\n```javascript\nimport { useTrackedState } from 'reactive-react-redux';\n\nconst Component = () => {\n  const state = useTrackedState(store);\n  ...\n};\n```\n\n### useSelector\n\nuseSelector hook\n\nselector has to be stable. Either define it outside render\nor use useCallback if selector uses props.\n\n#### Parameters\n\n-   `patchedStore` **PatchedStore&lt;State, Action>** \n-   `selector` **function (state: State): Selected** \n\n#### Examples\n\n```javascript\nimport { useCallback } from 'react';\nimport { useSelector } from 'reactive-react-redux';\n\nconst Component = ({ count }) => {\n  const isBigger = useSelector(store, useCallack(state => state.count > count, [count]));\n  ...\n};\n```\n\n### memo\n\nmemo\n\nUsing `React.memo` with tracked state is not compatible,\nbecause `React.memo` stops state access, thus no tracking occurs.\nThis is a special memo to be used instead of `React.memo` with tracking support.\n\n#### Parameters\n\n-   `Component` **any** \n-   `areEqual` **any?** \n\n#### Examples\n\n```javascript\nimport { memo } from 'reactive-react-redux';\n\nconst ChildComponent = memo(({ obj1, obj2 }) => {\n  // ...\n});\n```\n\n## Recipes\n\n### Context\n\nYou can create Context based APIs like react-redux v7.\n\n```typescript\nimport { createContext, createElement, useContext } from 'react';\nimport {\n  PatchedStore,\n  useSelector as useSelectorOrig,\n  useTrackedState as useTrackedStateOrig,\n} from 'reactive-react-redux';\n\nexport type State = ...;\n\nexport type Action = ...;\n\nconst Context = createContext(new Proxy({}, {\n  get() { throw new Error('use Provider'); },\n}) as PatchedStore<State, Action>);\n\nexport const Provider: React.FC<{ store: PatchedStore<State, Action> }> = ({\n  store,\n  children,\n}) => createElement(Context.Provider, { value: store }, children);\n\nexport const useDispatch = () => useContext(Context).dispatch;\n\nexport const useSelector = <Selected>(\n  selector: (state: State) => Selected,\n) => useSelectorOrig(useContext(Context), selector);\n\nexport const useTrackedState = () => useTrackedStateOrig(useContext(Context));\n```\n\n### useTrackedSelector\n\nYou can create a selector hook with tracking support.\n\n```javascript\nimport { useTrackedState } from 'reactive-react-redux';\n\nexport const useTrackedSelector = (patchedStore, selector) => selector(useTrackedState(patchedStore));\n```\n\nPlease refer [this issue](https://github.com/dai-shi/reactive-react-redux/issues/41) for more information.\n\n### useTracked\n\nYou can combine useTrackedState and useDispatch to\nmake a hook that returns a tuple like `useReducer`.\n\n```javascript\nimport { useTrackedState, useDispatch } from 'reactive-react-redux';\n\nexport const useTracked = (patchedStore) => {\n  const state = useTrackedState(patchedStore);\n  const dispatch = useDispatch(patchedStore);\n  return useMemo(() => [state, dispatch], [state, dispatch]);\n};\n```\n\n## Caveats\n\nProxy and state usage tracking may not work 100% as expected.\nThere are some limitations and workarounds.\n\n### Proxied states are referentially equal only in per-hook basis\n\n```javascript\nconst state1 = useTrackedState(patchedStore);\nconst state2 = useTrackedState(patchedStore);\n// state1 and state2 is not referentially equal\n// even if the underlying redux state is referentially equal.\n```\n\nYou should use `useTrackedState` only once in a component.\n\n### An object referential change doesn't trigger re-render if an property of the object is accessed in previous render\n\n```javascript\nconst state = useTrackedState(patchedStore);\nconst { foo } = state;\nreturn <Child key={foo.id} foo={foo} />;\n\nconst Child = React.memo(({ foo }) => {\n  // ...\n};\n// if foo doesn't change, Child won't render, so foo.id is only marked as used.\n// it won't trigger Child to re-render even if foo is changed.\n```\n\nYou need to use a special `memo` provided by this library.\n\n```javascript\nimport { memo } from 'reactive-react-redux';\n\nconst Child = memo(({ foo }) => {\n  // ...\n};\n```\n\n### Proxied state might behave unexpectedly outside render\n\nProxies are basically transparent, and it should behave like normal objects.\nHowever, there can be edge cases where it behaves unexpectedly.\nFor example, if you console.log a proxied value,\nit will display a proxy wrapping an object.\nNotice, it will be kept tracking outside render,\nso any prorerty access will mark as used to trigger re-render on updates.\n\nuseTrackedState will unwrap a Proxy before wrapping with a new Proxy,\nhence, it will work fine in usual use cases.\nThere's only one known pitfall: If you wrap proxied state with your own Proxy\noutside the control of useTrackedState,\nit might lead memory leaks, because useTrackedState\nwouldn't know how to unwrap your own Proxy.\n\nTo work around such edge cases, the first option is to use primitive values.\n\n```javascript\nconst state = useTrackedState(patchedStore);\nconst dispatch = useUpdate(patchedStore);\ndispatch({ type: 'FOO', value: state.fooObj }); // Instead of using objects,\ndispatch({ type: 'FOO', value: state.fooStr }); // Use primitives.\n```\n\nThe second option is to use `getUntrackedObject`.\n\n```javascript\nimport { getUntrackedObject } from 'react-tracked';\ndispatch({ type: 'FOO', value: getUntrackedObject(state.fooObj) });\n```\n\nYou could implement a special dispatch function to do this automatically.\n\n## Examples\n\nThe [examples](examples) folder contains working examples.\nYou can run one of them with\n\n```bash\nPORT=8080 npm run examples:01_minimal\n```\n\nand open <http://localhost:8080> in your web browser.\n\nYou can also try them in codesandbox.io:\n[01](https://codesandbox.io/s/github/dai-shi/reactive-react-redux/tree/master/examples/01_minimal)\n[02](https://codesandbox.io/s/github/dai-shi/reactive-react-redux/tree/master/examples/02_typescript)\n[03](https://codesandbox.io/s/github/dai-shi/reactive-react-redux/tree/master/examples/03_deep)\n[04](https://codesandbox.io/s/github/dai-shi/reactive-react-redux/tree/master/examples/04_immer)\n[05](https://codesandbox.io/s/github/dai-shi/reactive-react-redux/tree/master/examples/05_localstate)\n[06](https://codesandbox.io/s/github/dai-shi/reactive-react-redux/tree/master/examples/06_memoization)\n[07](https://codesandbox.io/s/github/dai-shi/reactive-react-redux/tree/master/examples/07_multistore)\n[08](https://codesandbox.io/s/github/dai-shi/reactive-react-redux/tree/master/examples/08_dynamic)\n[09](https://codesandbox.io/s/github/dai-shi/reactive-react-redux/tree/master/examples/09_thunk)\n[11](https://codesandbox.io/s/github/dai-shi/reactive-react-redux/tree/master/examples/11_todolist)\n[12](https://codesandbox.io/s/github/dai-shi/reactive-react-redux/tree/master/examples/12_async)\n[13](https://codesandbox.io/s/github/dai-shi/reactive-react-redux/tree/master/examples/13_memo)\n\n## Benchmarks\n\n<img alt=\"benchmark result\" src=\"https://user-images.githubusercontent.com/490574/61585382-405fae80-ab95-11e9-9f28-3b1a49dd1e5f.png\" width=\"425\" />\n\nSee [#32](https://github.com/dai-shi/reactive-react-redux/issues/32) for details.\n\n## Blogs\n\n-   [A deadly simple React bindings library for Redux with Hooks API](https://blog.axlight.com/posts/a-deadly-simple-react-bindings-library-for-redux-with-hooks-api/)\n-   [Developing React custom hooks for Redux without react-redux](https://blog.axlight.com/posts/developing-react-custom-hooks-for-redux-without-react-redux/)\n-   [Integrating React and Redux, with Hooks and Proxies](https://frontarm.com/daishi-kato/redux-custom-hooks/)\n-   [New React Redux coding style with hooks without selectors](https://blog.axlight.com/posts/new-react-redux-coding-style-with-hooks-without-selectors/)\n-   [Benchmark alpha-released hooks API in React Redux with alternatives](https://blog.axlight.com/posts/benchmark-alpha-released-hooks-api-in-react-redux-with-alternatives/)\n-   [Four patterns for global state with React hooks: Context or Redux](https://blog.axlight.com/posts/four-patterns-for-global-state-with-react-hooks-context-or-redux/)\n-   [Redux meets hooks for non-redux users: a small concrete example with reactive-react-redux](https://blog.axlight.com/posts/redux-meets-hooks-for-non-redux-users-a-small-concrete-example-with-reactive-react-redux/)\n-   [Redux-less context-based useSelector hook that has same performance as React-Redux](https://blog.axlight.com/posts/benchmark-react-tracked/)\n-   [What is state usage tracking? A novel approach to intuitive and performant global state with React hooks and Proxy](https://blog.axlight.com/posts/what-is-state-usage-tracking-a-novel-approach-to-intuitive-and-performant-api-with-react-hooks-and-proxy/)\n-   [Effortless render optimization with state usage tracking with React hooks](https://blog.axlight.com/posts/effortless-render-optimization-with-state-usage-tracking-with-react-hooks/)\n-   [How I developed a Concurrent Mode friendly library for React Redux](https://blog.axlight.com/posts/how-i-developed-a-concurrent-mode-friendly-library-for-react-redux/)\n-   [React hooks-oriented Redux coding pattern without thunks and action creators](https://blog.axlight.com/posts/react-hooks-oriented-redux-coding-pattern-without-thunks-and-action-creators/)\n","readmeFilename":"README.md","gitHead":"670f1d3f20a6da894d21d4826c4fb2edc5caae8a","bugs":{"url":"https://github.com/dai-shi/reactive-react-redux/issues"},"homepage":"https://github.com/dai-shi/reactive-react-redux#readme","_id":"reactive-react-redux@5.0.0-alpha.3","_nodeVersion":"10.19.0","_npmVersion":"6.14.4","dist":{"integrity":"sha512-VPzdX45NFgws99HQ1pzu/QXl6tCYXHu2Xc3kpYkO061YNGVBkHCeoYfTFf92VWmZONMdijbuil84wHu/ucNnqQ==","shasum":"9a05cd00bd471af44aa94a34b892fddec2b1f86f","tarball":"https://registry.npmjs.org/reactive-react-redux/-/reactive-react-redux-5.0.0-alpha.3.tgz","fileCount":22,"unpackedSize":64244,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJevAaLCRA9TVsSAnZWagAAPJMQAIC+L0fO2xl926Uq7qYJ\ngS+yCRxEoHN25JmWDzeoxiXhfqVABu9Y2LSO4jqmZpaJhzk2BJvuDpGWX4Ug\nQRFln+Z+5Lb2DZyp9/cleqnCTBjna190TxVI7PZfcqEt9JmyVbiUycTFo3WF\nnDkHrH8mBTYViGaSL+hnyDEla8rPV6wISeZ0ouc5WimZLHyoNkTxU7y6UtDl\nc+Oeg4msdtu2uie4NkRDV8QvYMppC9LuOL5SqGvLJBip+5vkkA5BWOJnf2dn\n+QaEivQwaZUlJzcZDLmNmDug8cFgsMlzX9PSAwkKC7B2Bp0B8vdE+RhKGiyJ\nE5npRoN6LSnB62s6y7GLg7/bQjrqaZRqpIvfccFmRuRrmMRbfSLB+buBKn8V\ntOfqYwmXXwEC+zkHnaOJcTq5kQqZpLGuSsdPsYFUesi+Hz/0eAKvYv4NZVJi\nyv7rIAbKQGO3BAOEVAf3ubEHy297o/SZKTLUsHIwek0vyrTebRIUm3r+pISe\nkIKupXwgTafE6+IFeYn2Ayoph0SHNvQ+TlfiLPBGdl0WbkKe4WyvyhOhpeRw\nRXzh7G1Dkb2VpBHkFISIu4ThTEwwNLaMicyGL+p3zIrOiBlART4yieGYX1zV\nfPb59ua81NtujzroWyckNCMpaRA6UqDDRUU9ytheiEptCM9XZTEhUPKgFQfR\nUiWA\r\n=KRue\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIE0Q4S+paTJF2/e+FP1a4LaCT++s/Kddc4ZNaJ4qO3oPAiBYUowjNg3qJjBT5CqWHnvvyUKflyk112NxguC6CDtUFA=="}]},"maintainers":[{"name":"daishi","email":"daishi@axlight.com"}],"_npmUser":{"name":"daishi","email":"daishi@axlight.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/reactive-react-redux_5.0.0-alpha.3_1589380746750_0.3971728388690199"},"_hasShrinkwrap":false},"5.0.0-alpha.4":{"name":"reactive-react-redux","description":"React Redux binding with React Hooks and Proxy","version":"5.0.0-alpha.4","publishConfig":{"tag":"next"},"author":{"name":"Daishi Kato"},"repository":{"type":"git","url":"git+https://github.com/dai-shi/reactive-react-redux.git"},"source":"./src/index.ts","main":"./dist/index.umd.js","module":"./dist/index.modern.js","types":"./dist/src/index.d.ts","sideEffects":false,"scripts":{"compile":"microbundle build -f modern,umd","test":"run-s eslint tsc-test jest","eslint":"eslint --ext .js,.ts,.tsx --ignore-pattern dist .","jest":"jest --preset ts-jest/presets/js-with-ts","tsc-test":"tsc --project . --noEmit","apidoc":"documentation readme --section API --markdown-toc false --parse-extension ts src/*.ts","examples:01_minimal":"DIR=01_minimal EXT=js webpack-dev-server","examples:02_typescript":"DIR=02_typescript webpack-dev-server","examples:03_deep":"DIR=03_deep webpack-dev-server","examples:04_immer":"DIR=04_immer webpack-dev-server","examples:05_localstate":"DIR=05_localstate webpack-dev-server","examples:06_memoization":"DIR=06_memoization webpack-dev-server","examples:07_multistore":"DIR=07_multistore webpack-dev-server","examples:08_dynamic":"DIR=08_dynamic webpack-dev-server","examples:09_thunk":"DIR=09_thunk webpack-dev-server","examples:11_todolist":"DIR=11_todolist EXT=tsx webpack-dev-server","examples:12_async":"DIR=12_async EXT=tsx webpack-dev-server","examples:13_memo":"DIR=13_memo webpack-dev-server"},"keywords":["react","redux","state","hooks","stateless","thisless","pure"],"license":"MIT","dependencies":{"proxy-compare":"^1.0.2"},"devDependencies":{"@testing-library/react":"^10.4.3","@types/jest":"^26.0.3","@types/react":"^16.9.41","@types/react-dom":"^16.9.8","@types/redux-logger":"^3.0.8","@typescript-eslint/eslint-plugin":"^3.5.0","@typescript-eslint/parser":"^3.5.0","documentation":"^13.0.2","eslint":"^7.4.0","eslint-config-airbnb":"^18.2.0","eslint-plugin-import":"^2.22.0","eslint-plugin-jsx-a11y":"^6.3.1","eslint-plugin-react":"^7.20.3","eslint-plugin-react-hooks":"^4.0.5","html-webpack-plugin":"^4.3.0","immer":"^7.0.5","jest":"^26.1.0","microbundle":"^0.12.2","npm-run-all":"^4.1.5","react":"experimental","react-dom":"experimental","redux":"^4.0.5","redux-thunk":"^2.3.0","ts-jest":"^26.1.1","ts-loader":"^7.0.5","typescript":"^3.9.6","webpack":"^4.43.0","webpack-cli":"^3.3.12","webpack-dev-server":"^3.11.0"},"peerDependencies":{"react":">=16.14.0","redux":">=4.0.0"},"gitHead":"e3d50a8c34604b08dfca7bccdb2f1948ff416ce8","readme":"# reactive-react-redux\n\n[![CI](https://img.shields.io/github/workflow/status/dai-shi/reactive-react-redux/CI)](https://github.com/dai-shi/reactive-react-redux/actions?query=workflow%3ACI)\n[![npm](https://img.shields.io/npm/v/reactive-react-redux)](https://www.npmjs.com/package/reactive-react-redux)\n[![size](https://img.shields.io/bundlephobia/minzip/reactive-react-redux)](https://bundlephobia.com/result?p=reactive-react-redux)\n\nReact Redux binding with React Hooks and Proxy\n\n> If you are looking for a non-Redux library, please visit [react-tracked](https://github.com/dai-shi/react-tracked) which has the same hooks API.\n\n## Introduction\n\nThis is a library to bind React and Redux with Hooks API.\nIt has mostly the same API as the official\n[react-redux Hooks API](https://react-redux.js.org/api/hooks),\nso it can be used as a drop-in replacement\nif you are using only basic functionality.\n\nThere are two major features in this library\nthat are not in the official react-redux.\n\n### 1. useTrackedState hook\n\nThis library provides another hook `useTrackedState`\nwhich is a simpler API than already simple `useSelector`.\nIt returns an entire state, but the library takes care of\noptimization of re-renders.\nMost likely, `useTrackedState` performs better than\n`useSelector` without perfectly tuned selectors.\n\nTechnically, `useTrackedState` has no [stale props](https://react-redux.js.org/api/hooks#stale-props-and-zombie-children) issue.\n\n### 2. useMutableSource without Context\n\nreact-redux v7 has APIs around Context.\nThis library is implemented with useMutableSource,\nand it patches the Redux store.\nAPIs are provided without Context.\nIt's up to developers to use Context based on them.\nCheck out `./examples/11_todolist/src/context.ts`.\n\nThere's another difference from react-redux v7.\nThis library directly use useMutableSource, and requires\nuseCallback for the selector in useSelector.\n[equalityFn](https://react-redux.js.org/api/hooks#equality-comparisons-and-updates) is not supported.\n\n## How tracking works\n\nA hook `useTrackedState` returns an entire Redux state object with Proxy,\nand it keeps track of which properties of the object are used\nin render. When the state is updated, this hook checks\nwhether used properties are changed.\nOnly if it detects changes in the state,\nit triggers a component to re-render.\n\n## Install\n\n```bash\nnpm install reactive-react-redux\n```\n\n## Usage (useTrackedState)\n\n```javascript\nimport React from 'react';\nimport { createStore } from 'redux';\nimport {\n  patchStore,\n  useTrackedState,\n} from 'reactive-react-redux';\n\nconst initialState = {\n  count: 0,\n  text: 'hello',\n};\n\nconst reducer = (state = initialState, action) => {\n  switch (action.type) {\n    case 'increment': return { ...state, count: state.count + 1 };\n    case 'decrement': return { ...state, count: state.count - 1 };\n    case 'setText': return { ...state, text: action.text };\n    default: return state;\n  }\n};\n\nconst store = patchStore(createStore(reducer));\n\nconst Counter = () => {\n  const state = useTrackedState(store);\n  const { dispatch } = store;\n  return (\n    <div>\n      {Math.random()}\n      <div>\n        <span>Count: {state.count}</span>\n        <button type=\"button\" onClick={() => dispatch({ type: 'increment' })}>+1</button>\n        <button type=\"button\" onClick={() => dispatch({ type: 'decrement' })}>-1</button>\n      </div>\n    </div>\n  );\n};\n\nconst TextBox = () => {\n  const state = useTrackedState(store);\n  const { dispatch } = store;\n  return (\n    <div>\n      {Math.random()}\n      <div>\n        <span>Text: {state.text}</span>\n        <input value={state.text} onChange={event => dispatch({ type: 'setText', text: event.target.value })} />\n      </div>\n    </div>\n  );\n};\n\nconst App = () => (\n  <>\n    <h1>Counter</h1>\n    <Counter />\n    <Counter />\n    <h1>TextBox</h1>\n    <TextBox />\n    <TextBox />\n  </>\n);\n```\n\n## API\n\n<!-- Generated by documentation.js. Update this documentation by updating the source code. -->\n\n### patchStore\n\npatch Redux store for React\n\n#### Parameters\n\n-   `store` **Store&lt;State, Action>** \n\n#### Examples\n\n```javascript\nimport { createStore } from 'redux';\nimport { patchStore } from 'reactive-react-redux';\n\nconst reducer = ...;\nconst store = patchStore(createStore(reducer));\n```\n\n### useTrackedState\n\nuseTrackedState hook\n\nIt return the Redux state wrapped by Proxy,\nand the state prperty access is tracked.\nIt will only re-render if accessed properties are changed.\n\n#### Parameters\n\n-   `patchedStore` **PatchedStore&lt;State, Action>** \n-   `opts` **Opts**  (optional, default `{}`)\n\n#### Examples\n\n```javascript\nimport { useTrackedState } from 'reactive-react-redux';\n\nconst Component = () => {\n  const state = useTrackedState(store);\n  ...\n};\n```\n\n### useSelector\n\nuseSelector hook\n\nselector has to be stable. Either define it outside render\nor use useCallback if selector uses props.\n\n#### Parameters\n\n-   `patchedStore` **PatchedStore&lt;State, Action>** \n-   `selector` **function (state: State): Selected** \n\n#### Examples\n\n```javascript\nimport { useCallback } from 'react';\nimport { useSelector } from 'reactive-react-redux';\n\nconst Component = ({ count }) => {\n  const isBigger = useSelector(store, useCallack(state => state.count > count, [count]));\n  ...\n};\n```\n\n### memo\n\nmemo\n\nUsing `React.memo` with tracked state is not compatible,\nbecause `React.memo` stops state access, thus no tracking occurs.\nThis is a special memo to be used instead of `React.memo` with tracking support.\n\n#### Parameters\n\n-   `Component` **any** \n-   `areEqual` **any?** \n\n#### Examples\n\n```javascript\nimport { memo } from 'reactive-react-redux';\n\nconst ChildComponent = memo(({ obj1, obj2 }) => {\n  // ...\n});\n```\n\n## Recipes\n\n### Context\n\nYou can create Context based APIs like react-redux v7.\n\n```typescript\nimport { createContext, createElement, useContext } from 'react';\nimport {\n  PatchedStore,\n  useSelector as useSelectorOrig,\n  useTrackedState as useTrackedStateOrig,\n} from 'reactive-react-redux';\n\nexport type State = ...;\n\nexport type Action = ...;\n\nconst Context = createContext(new Proxy({}, {\n  get() { throw new Error('use Provider'); },\n}) as PatchedStore<State, Action>);\n\nexport const Provider: React.FC<{ store: PatchedStore<State, Action> }> = ({\n  store,\n  children,\n}) => createElement(Context.Provider, { value: store }, children);\n\nexport const useDispatch = () => useContext(Context).dispatch;\n\nexport const useSelector = <Selected>(\n  selector: (state: State) => Selected,\n) => useSelectorOrig(useContext(Context), selector);\n\nexport const useTrackedState = () => useTrackedStateOrig(useContext(Context));\n```\n\n### useTrackedSelector\n\nYou can create a selector hook with tracking support.\n\n```javascript\nimport { useTrackedState } from 'reactive-react-redux';\n\nexport const useTrackedSelector = (patchedStore, selector) => selector(useTrackedState(patchedStore));\n```\n\nPlease refer [this issue](https://github.com/dai-shi/reactive-react-redux/issues/41) for more information.\n\n### useTracked\n\nYou can combine useTrackedState and useDispatch to\nmake a hook that returns a tuple like `useReducer`.\n\n```javascript\nimport { useTrackedState, useDispatch } from 'reactive-react-redux';\n\nexport const useTracked = (patchedStore) => {\n  const state = useTrackedState(patchedStore);\n  const dispatch = useDispatch(patchedStore);\n  return useMemo(() => [state, dispatch], [state, dispatch]);\n};\n```\n\n## Caveats\n\nProxy and state usage tracking may not work 100% as expected.\nThere are some limitations and workarounds.\n\n### Proxied states are referentially equal only in per-hook basis\n\n```javascript\nconst state1 = useTrackedState(patchedStore);\nconst state2 = useTrackedState(patchedStore);\n// state1 and state2 is not referentially equal\n// even if the underlying redux state is referentially equal.\n```\n\nYou should use `useTrackedState` only once in a component.\n\n### An object referential change doesn't trigger re-render if an property of the object is accessed in previous render\n\n```javascript\nconst state = useTrackedState(patchedStore);\nconst { foo } = state;\nreturn <Child key={foo.id} foo={foo} />;\n\nconst Child = React.memo(({ foo }) => {\n  // ...\n};\n// if foo doesn't change, Child won't render, so foo.id is only marked as used.\n// it won't trigger Child to re-render even if foo is changed.\n```\n\nYou need to use a special `memo` provided by this library.\n\n```javascript\nimport { memo } from 'reactive-react-redux';\n\nconst Child = memo(({ foo }) => {\n  // ...\n};\n```\n\n### Proxied state might behave unexpectedly outside render\n\nProxies are basically transparent, and it should behave like normal objects.\nHowever, there can be edge cases where it behaves unexpectedly.\nFor example, if you console.log a proxied value,\nit will display a proxy wrapping an object.\nNotice, it will be kept tracking outside render,\nso any prorerty access will mark as used to trigger re-render on updates.\n\nuseTrackedState will unwrap a Proxy before wrapping with a new Proxy,\nhence, it will work fine in usual use cases.\nThere's only one known pitfall: If you wrap proxied state with your own Proxy\noutside the control of useTrackedState,\nit might lead memory leaks, because useTrackedState\nwouldn't know how to unwrap your own Proxy.\n\nTo work around such edge cases, the first option is to use primitive values.\n\n```javascript\nconst state = useTrackedState(patchedStore);\nconst dispatch = useUpdate(patchedStore);\ndispatch({ type: 'FOO', value: state.fooObj }); // Instead of using objects,\ndispatch({ type: 'FOO', value: state.fooStr }); // Use primitives.\n```\n\nThe second option is to use `getUntrackedObject`.\n\n```javascript\nimport { getUntrackedObject } from 'react-tracked';\ndispatch({ type: 'FOO', value: getUntrackedObject(state.fooObj) });\n```\n\nYou could implement a special dispatch function to do this automatically.\n\n## Examples\n\nThe [examples](examples) folder contains working examples.\nYou can run one of them with\n\n```bash\nPORT=8080 npm run examples:01_minimal\n```\n\nand open <http://localhost:8080> in your web browser.\n\nYou can also try them in codesandbox.io:\n[01](https://codesandbox.io/s/github/dai-shi/reactive-react-redux/tree/master/examples/01_minimal)\n[02](https://codesandbox.io/s/github/dai-shi/reactive-react-redux/tree/master/examples/02_typescript)\n[03](https://codesandbox.io/s/github/dai-shi/reactive-react-redux/tree/master/examples/03_deep)\n[04](https://codesandbox.io/s/github/dai-shi/reactive-react-redux/tree/master/examples/04_immer)\n[05](https://codesandbox.io/s/github/dai-shi/reactive-react-redux/tree/master/examples/05_localstate)\n[06](https://codesandbox.io/s/github/dai-shi/reactive-react-redux/tree/master/examples/06_memoization)\n[07](https://codesandbox.io/s/github/dai-shi/reactive-react-redux/tree/master/examples/07_multistore)\n[08](https://codesandbox.io/s/github/dai-shi/reactive-react-redux/tree/master/examples/08_dynamic)\n[09](https://codesandbox.io/s/github/dai-shi/reactive-react-redux/tree/master/examples/09_thunk)\n[11](https://codesandbox.io/s/github/dai-shi/reactive-react-redux/tree/master/examples/11_todolist)\n[12](https://codesandbox.io/s/github/dai-shi/reactive-react-redux/tree/master/examples/12_async)\n[13](https://codesandbox.io/s/github/dai-shi/reactive-react-redux/tree/master/examples/13_memo)\n\n## Benchmarks\n\n<img alt=\"benchmark result\" src=\"https://user-images.githubusercontent.com/490574/61585382-405fae80-ab95-11e9-9f28-3b1a49dd1e5f.png\" width=\"425\" />\n\nSee [#32](https://github.com/dai-shi/reactive-react-redux/issues/32) for details.\n\n## Blogs\n\n-   [A deadly simple React bindings library for Redux with Hooks API](https://blog.axlight.com/posts/a-deadly-simple-react-bindings-library-for-redux-with-hooks-api/)\n-   [Developing React custom hooks for Redux without react-redux](https://blog.axlight.com/posts/developing-react-custom-hooks-for-redux-without-react-redux/)\n-   [Integrating React and Redux, with Hooks and Proxies](https://frontarm.com/daishi-kato/redux-custom-hooks/)\n-   [New React Redux coding style with hooks without selectors](https://blog.axlight.com/posts/new-react-redux-coding-style-with-hooks-without-selectors/)\n-   [Benchmark alpha-released hooks API in React Redux with alternatives](https://blog.axlight.com/posts/benchmark-alpha-released-hooks-api-in-react-redux-with-alternatives/)\n-   [Four patterns for global state with React hooks: Context or Redux](https://blog.axlight.com/posts/four-patterns-for-global-state-with-react-hooks-context-or-redux/)\n-   [Redux meets hooks for non-redux users: a small concrete example with reactive-react-redux](https://blog.axlight.com/posts/redux-meets-hooks-for-non-redux-users-a-small-concrete-example-with-reactive-react-redux/)\n-   [Redux-less context-based useSelector hook that has same performance as React-Redux](https://blog.axlight.com/posts/benchmark-react-tracked/)\n-   [What is state usage tracking? A novel approach to intuitive and performant global state with React hooks and Proxy](https://blog.axlight.com/posts/what-is-state-usage-tracking-a-novel-approach-to-intuitive-and-performant-api-with-react-hooks-and-proxy/)\n-   [Effortless render optimization with state usage tracking with React hooks](https://blog.axlight.com/posts/effortless-render-optimization-with-state-usage-tracking-with-react-hooks/)\n-   [How I developed a Concurrent Mode friendly library for React Redux](https://blog.axlight.com/posts/how-i-developed-a-concurrent-mode-friendly-library-for-react-redux/)\n-   [React hooks-oriented Redux coding pattern without thunks and action creators](https://blog.axlight.com/posts/react-hooks-oriented-redux-coding-pattern-without-thunks-and-action-creators/)\n","readmeFilename":"README.md","bugs":{"url":"https://github.com/dai-shi/reactive-react-redux/issues"},"homepage":"https://github.com/dai-shi/reactive-react-redux#readme","_id":"reactive-react-redux@5.0.0-alpha.4","_nodeVersion":"12.18.1","_npmVersion":"6.14.5","dist":{"integrity":"sha512-V2MRGdj9rJNw6l00IXo6767PxY2btpuwZAifJ35EtXYAStMkrYta7e544spakcDMbcv080fJ9XgtVxlPQEoCEQ==","shasum":"d911154ef8ec203d5f8fe4e1bba05c6b5102c831","tarball":"https://registry.npmjs.org/reactive-react-redux/-/reactive-react-redux-5.0.0-alpha.4.tgz","fileCount":20,"unpackedSize":53479,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJe/712CRA9TVsSAnZWagAAX7cQAJcTzEnPlvKbf2HW3mXK\nf+cNRmzUNZ1JIDDg9mOzMRqH0Ee3xn8CjDCNadiMVw3UGt6r5ShvCfbWButf\nLlEhe9SZZf5rer9jkcAHe32aZgHH5eZHNfvGwYxXEVOD0lWGtbeBn+9AaY9k\nyiVE2K7ecG/6e4Xo63IyJYq7uwIoC5NZ07vRVTdG92G0vfY3I4PV2a3pL90c\nTrZ+uaiGATeojZveAU24d2XCINawX6WKtSgnWwg49ufI319OIDag+RjfQCEq\nfJUj1BtYV3BiNuTw2gfgQpE4H5q1AJ1k452b+l8DsEAM3Q9Aif7keytWWPcQ\nXyPJyrHk6spcWy3gEKNcOCRBuYbXFZ77LgXG7UJ5KdFc2L1E6+5J8dBSpkv4\nE164G8hplq26y9taLNpTnjKb0IRWOCHLYyfAXOWnmZFbBYmb/G3PTMwUeXV6\nH8uxJgxcP3U8fMltbq2cX45BrjJE4ffFzxwsqBNCvvHZNtlRQ1ha1kekaU2n\nutjCjzvO17XSd8L2DEHmnoJu7h8UKkmGcE0/QgUNdKa8btU2o+/5hFTR7Ly7\ngfSheFQks41dmgcawmhpK8uXsQPU4ePYd1XVoSl3GUe+v9oD3PwKJgccxbSO\nNOPWCNpvcD0DotZlYWci/90+LzUSP0hdL6D6sWehC1EJs1uzZXhgr0E3WDU2\nk+nG\r\n=Rtlz\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDuiCt1CxqsdSEU94Cw5YDbZCDvN5DgbFiNc6EIERKqsQIgMHhkYDOvZLDrifyr+nsW+2ceplNJBojWRiGwzF8UoM0="}]},"maintainers":[{"name":"daishi","email":"daishi@axlight.com"}],"_npmUser":{"name":"daishi","email":"daishi@axlight.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/reactive-react-redux_5.0.0-alpha.4_1593818486385_0.47622268785528754"},"_hasShrinkwrap":false},"5.0.0-alpha.5":{"name":"reactive-react-redux","description":"React Redux binding with React Hooks and Proxy","version":"5.0.0-alpha.5","publishConfig":{"tag":"next"},"author":{"name":"Daishi Kato"},"repository":{"type":"git","url":"git+https://github.com/dai-shi/reactive-react-redux.git"},"source":"./src/index.ts","main":"./dist/index.umd.js","module":"./dist/index.modern.js","types":"./dist/src/index.d.ts","sideEffects":false,"scripts":{"compile":"microbundle build -f modern,umd","test":"run-s eslint tsc-test jest","eslint":"eslint --ext .js,.ts,.tsx --ignore-pattern dist .","jest":"jest --preset ts-jest/presets/js-with-ts","tsc-test":"tsc --project . --noEmit","apidoc":"documentation readme --section API --markdown-toc false --parse-extension ts src/*.ts","examples:01_minimal":"DIR=01_minimal EXT=js webpack-dev-server","examples:02_typescript":"DIR=02_typescript webpack-dev-server","examples:03_deep":"DIR=03_deep webpack-dev-server","examples:04_immer":"DIR=04_immer webpack-dev-server","examples:05_localstate":"DIR=05_localstate webpack-dev-server","examples:06_memoization":"DIR=06_memoization webpack-dev-server","examples:07_multistore":"DIR=07_multistore webpack-dev-server","examples:08_dynamic":"DIR=08_dynamic webpack-dev-server","examples:09_thunk":"DIR=09_thunk webpack-dev-server","examples:11_todolist":"DIR=11_todolist EXT=tsx webpack-dev-server","examples:12_async":"DIR=12_async EXT=tsx webpack-dev-server","examples:13_memo":"DIR=13_memo webpack-dev-server"},"keywords":["react","redux","state","hooks","stateless","thisless","pure"],"license":"MIT","dependencies":{"proxy-compare":"^1.0.2"},"devDependencies":{"@testing-library/react":"^10.4.7","@types/jest":"^26.0.8","@types/react":"^16.9.44","@types/react-dom":"^16.9.8","@types/redux-logger":"^3.0.8","@typescript-eslint/eslint-plugin":"^3.8.0","@typescript-eslint/parser":"^3.8.0","documentation":"^13.0.2","eslint":"^7.6.0","eslint-config-airbnb":"^18.2.0","eslint-plugin-import":"^2.22.0","eslint-plugin-jsx-a11y":"^6.3.1","eslint-plugin-react":"^7.20.5","eslint-plugin-react-hooks":"^4.0.8","html-webpack-plugin":"^4.3.0","immer":"^7.0.7","jest":"^26.2.2","microbundle":"^0.12.3","npm-run-all":"^4.1.5","react":"experimental","react-dom":"experimental","redux":"^4.0.5","redux-thunk":"^2.3.0","ts-jest":"^26.1.4","ts-loader":"^8.0.2","typescript":"^3.9.7","webpack":"^4.44.1","webpack-cli":"^3.3.12","webpack-dev-server":"^3.11.0"},"peerDependencies":{"react":">=16.14.0","redux":">=4.0.0"},"gitHead":"3c59ed31143003dfa480251a1e345aafa65f8e9e","readme":"# reactive-react-redux\n\n[![CI](https://img.shields.io/github/workflow/status/dai-shi/reactive-react-redux/CI)](https://github.com/dai-shi/reactive-react-redux/actions?query=workflow%3ACI)\n[![npm](https://img.shields.io/npm/v/reactive-react-redux)](https://www.npmjs.com/package/reactive-react-redux)\n[![size](https://img.shields.io/bundlephobia/minzip/reactive-react-redux)](https://bundlephobia.com/result?p=reactive-react-redux)\n\nReact Redux binding with React Hooks and Proxy\n\n> If you are looking for a non-Redux library, please visit [react-tracked](https://github.com/dai-shi/react-tracked) which has the same hooks API.\n\n## Introduction\n\nThis is a library to bind React and Redux with Hooks API.\nIt has mostly the same API as the official\n[react-redux Hooks API](https://react-redux.js.org/api/hooks),\nso it can be used as a drop-in replacement\nif you are using only basic functionality.\n\nThere are two major features in this library\nthat are not in the official react-redux.\n\n### 1. useTrackedState hook\n\nThis library provides another hook `useTrackedState`\nwhich is a simpler API than already simple `useSelector`.\nIt returns an entire state, but the library takes care of\noptimization of re-renders.\nMost likely, `useTrackedState` performs better than\n`useSelector` without perfectly tuned selectors.\n\nTechnically, `useTrackedState` has no [stale props](https://react-redux.js.org/api/hooks#stale-props-and-zombie-children) issue.\n\n### 2. useMutableSource without Context\n\nreact-redux v7 has APIs around Context.\nThis library is implemented with useMutableSource,\nand it patches the Redux store.\nAPIs are provided without Context.\nIt's up to developers to use Context based on them.\nCheck out `./examples/11_todolist/src/context.ts`.\n\nThere's another difference from react-redux v7.\nThis library directly use useMutableSource, and requires\nuseCallback for the selector in useSelector.\n[equalityFn](https://react-redux.js.org/api/hooks#equality-comparisons-and-updates) is not supported.\n\n## How tracking works\n\nA hook `useTrackedState` returns an entire Redux state object with Proxy,\nand it keeps track of which properties of the object are used\nin render. When the state is updated, this hook checks\nwhether used properties are changed.\nOnly if it detects changes in the state,\nit triggers a component to re-render.\n\n## Install\n\n```bash\nnpm install reactive-react-redux\n```\n\n## Usage (useTrackedState)\n\n```javascript\nimport React from 'react';\nimport { createStore } from 'redux';\nimport {\n  patchStore,\n  useTrackedState,\n} from 'reactive-react-redux';\n\nconst initialState = {\n  count: 0,\n  text: 'hello',\n};\n\nconst reducer = (state = initialState, action) => {\n  switch (action.type) {\n    case 'increment': return { ...state, count: state.count + 1 };\n    case 'decrement': return { ...state, count: state.count - 1 };\n    case 'setText': return { ...state, text: action.text };\n    default: return state;\n  }\n};\n\nconst store = patchStore(createStore(reducer));\n\nconst Counter = () => {\n  const state = useTrackedState(store);\n  const { dispatch } = store;\n  return (\n    <div>\n      {Math.random()}\n      <div>\n        <span>Count: {state.count}</span>\n        <button type=\"button\" onClick={() => dispatch({ type: 'increment' })}>+1</button>\n        <button type=\"button\" onClick={() => dispatch({ type: 'decrement' })}>-1</button>\n      </div>\n    </div>\n  );\n};\n\nconst TextBox = () => {\n  const state = useTrackedState(store);\n  const { dispatch } = store;\n  return (\n    <div>\n      {Math.random()}\n      <div>\n        <span>Text: {state.text}</span>\n        <input value={state.text} onChange={event => dispatch({ type: 'setText', text: event.target.value })} />\n      </div>\n    </div>\n  );\n};\n\nconst App = () => (\n  <>\n    <h1>Counter</h1>\n    <Counter />\n    <Counter />\n    <h1>TextBox</h1>\n    <TextBox />\n    <TextBox />\n  </>\n);\n```\n\n## API\n\n<!-- Generated by documentation.js. Update this documentation by updating the source code. -->\n\n### patchStore\n\npatch Redux store for React\n\n#### Parameters\n\n-   `store` **Store&lt;State, Action>** \n\n#### Examples\n\n```javascript\nimport { createStore } from 'redux';\nimport { patchStore } from 'reactive-react-redux';\n\nconst reducer = ...;\nconst store = patchStore(createStore(reducer));\n```\n\n### useTrackedState\n\nuseTrackedState hook\n\nIt return the Redux state wrapped by Proxy,\nand the state prperty access is tracked.\nIt will only re-render if accessed properties are changed.\n\n#### Parameters\n\n-   `patchedStore` **PatchedStore&lt;State, Action>** \n-   `opts` **Opts**  (optional, default `{}`)\n\n#### Examples\n\n```javascript\nimport { useTrackedState } from 'reactive-react-redux';\n\nconst Component = () => {\n  const state = useTrackedState(store);\n  ...\n};\n```\n\n### useSelector\n\nuseSelector hook\n\nselector has to be stable. Either define it outside render\nor use useCallback if selector uses props.\n\n#### Parameters\n\n-   `patchedStore` **PatchedStore&lt;State, Action>** \n-   `selector` **function (state: State): Selected** \n\n#### Examples\n\n```javascript\nimport { useCallback } from 'react';\nimport { useSelector } from 'reactive-react-redux';\n\nconst Component = ({ count }) => {\n  const isBigger = useSelector(store, useCallack(state => state.count > count, [count]));\n  ...\n};\n```\n\n### memo\n\nmemo\n\nUsing `React.memo` with tracked state is not compatible,\nbecause `React.memo` stops state access, thus no tracking occurs.\nThis is a special memo to be used instead of `React.memo` with tracking support.\n\n#### Parameters\n\n-   `Component` **any** \n-   `areEqual` **any?** \n\n#### Examples\n\n```javascript\nimport { memo } from 'reactive-react-redux';\n\nconst ChildComponent = memo(({ obj1, obj2 }) => {\n  // ...\n});\n```\n\n## Recipes\n\n### Context\n\nYou can create Context based APIs like react-redux v7.\n\n```typescript\nimport { createContext, createElement, useContext } from 'react';\nimport {\n  PatchedStore,\n  useSelector as useSelectorOrig,\n  useTrackedState as useTrackedStateOrig,\n} from 'reactive-react-redux';\n\nexport type State = ...;\n\nexport type Action = ...;\n\nconst Context = createContext(new Proxy({}, {\n  get() { throw new Error('use Provider'); },\n}) as PatchedStore<State, Action>);\n\nexport const Provider: React.FC<{ store: PatchedStore<State, Action> }> = ({\n  store,\n  children,\n}) => createElement(Context.Provider, { value: store }, children);\n\nexport const useDispatch = () => useContext(Context).dispatch;\n\nexport const useSelector = <Selected>(\n  selector: (state: State) => Selected,\n) => useSelectorOrig(useContext(Context), selector);\n\nexport const useTrackedState = () => useTrackedStateOrig(useContext(Context));\n```\n\n### useTrackedSelector\n\nYou can create a selector hook with tracking support.\n\n```javascript\nimport { useTrackedState } from 'reactive-react-redux';\n\nexport const useTrackedSelector = (patchedStore, selector) => selector(useTrackedState(patchedStore));\n```\n\nPlease refer [this issue](https://github.com/dai-shi/reactive-react-redux/issues/41) for more information.\n\n### useTracked\n\nYou can combine useTrackedState and useDispatch to\nmake a hook that returns a tuple like `useReducer`.\n\n```javascript\nimport { useTrackedState, useDispatch } from 'reactive-react-redux';\n\nexport const useTracked = (patchedStore) => {\n  const state = useTrackedState(patchedStore);\n  const dispatch = useDispatch(patchedStore);\n  return useMemo(() => [state, dispatch], [state, dispatch]);\n};\n```\n\n## Caveats\n\nProxy and state usage tracking may not work 100% as expected.\nThere are some limitations and workarounds.\n\n### Proxied states are referentially equal only in per-hook basis\n\n```javascript\nconst state1 = useTrackedState(patchedStore);\nconst state2 = useTrackedState(patchedStore);\n// state1 and state2 is not referentially equal\n// even if the underlying redux state is referentially equal.\n```\n\nYou should use `useTrackedState` only once in a component.\n\n### An object referential change doesn't trigger re-render if an property of the object is accessed in previous render\n\n```javascript\nconst state = useTrackedState(patchedStore);\nconst { foo } = state;\nreturn <Child key={foo.id} foo={foo} />;\n\nconst Child = React.memo(({ foo }) => {\n  // ...\n};\n// if foo doesn't change, Child won't render, so foo.id is only marked as used.\n// it won't trigger Child to re-render even if foo is changed.\n```\n\nYou need to use a special `memo` provided by this library.\n\n```javascript\nimport { memo } from 'reactive-react-redux';\n\nconst Child = memo(({ foo }) => {\n  // ...\n};\n```\n\n### Proxied state might behave unexpectedly outside render\n\nProxies are basically transparent, and it should behave like normal objects.\nHowever, there can be edge cases where it behaves unexpectedly.\nFor example, if you console.log a proxied value,\nit will display a proxy wrapping an object.\nNotice, it will be kept tracking outside render,\nso any prorerty access will mark as used to trigger re-render on updates.\n\nuseTrackedState will unwrap a Proxy before wrapping with a new Proxy,\nhence, it will work fine in usual use cases.\nThere's only one known pitfall: If you wrap proxied state with your own Proxy\noutside the control of useTrackedState,\nit might lead memory leaks, because useTrackedState\nwouldn't know how to unwrap your own Proxy.\n\nTo work around such edge cases, the first option is to use primitive values.\n\n```javascript\nconst state = useTrackedState(patchedStore);\nconst dispatch = useUpdate(patchedStore);\ndispatch({ type: 'FOO', value: state.fooObj }); // Instead of using objects,\ndispatch({ type: 'FOO', value: state.fooStr }); // Use primitives.\n```\n\nThe second option is to use `getUntrackedObject`.\n\n```javascript\nimport { getUntrackedObject } from 'react-tracked';\ndispatch({ type: 'FOO', value: getUntrackedObject(state.fooObj) });\n```\n\nYou could implement a special dispatch function to do this automatically.\n\n## Examples\n\nThe [examples](examples) folder contains working examples.\nYou can run one of them with\n\n```bash\nPORT=8080 npm run examples:01_minimal\n```\n\nand open <http://localhost:8080> in your web browser.\n\nYou can also try them in codesandbox.io:\n[01](https://codesandbox.io/s/github/dai-shi/reactive-react-redux/tree/master/examples/01_minimal)\n[02](https://codesandbox.io/s/github/dai-shi/reactive-react-redux/tree/master/examples/02_typescript)\n[03](https://codesandbox.io/s/github/dai-shi/reactive-react-redux/tree/master/examples/03_deep)\n[04](https://codesandbox.io/s/github/dai-shi/reactive-react-redux/tree/master/examples/04_immer)\n[05](https://codesandbox.io/s/github/dai-shi/reactive-react-redux/tree/master/examples/05_localstate)\n[06](https://codesandbox.io/s/github/dai-shi/reactive-react-redux/tree/master/examples/06_memoization)\n[07](https://codesandbox.io/s/github/dai-shi/reactive-react-redux/tree/master/examples/07_multistore)\n[08](https://codesandbox.io/s/github/dai-shi/reactive-react-redux/tree/master/examples/08_dynamic)\n[09](https://codesandbox.io/s/github/dai-shi/reactive-react-redux/tree/master/examples/09_thunk)\n[11](https://codesandbox.io/s/github/dai-shi/reactive-react-redux/tree/master/examples/11_todolist)\n[12](https://codesandbox.io/s/github/dai-shi/reactive-react-redux/tree/master/examples/12_async)\n[13](https://codesandbox.io/s/github/dai-shi/reactive-react-redux/tree/master/examples/13_memo)\n\n## Benchmarks\n\n<img alt=\"benchmark result\" src=\"https://user-images.githubusercontent.com/490574/61585382-405fae80-ab95-11e9-9f28-3b1a49dd1e5f.png\" width=\"425\" />\n\nSee [#32](https://github.com/dai-shi/reactive-react-redux/issues/32) for details.\n\n## Blogs\n\n-   [A deadly simple React bindings library for Redux with Hooks API](https://blog.axlight.com/posts/a-deadly-simple-react-bindings-library-for-redux-with-hooks-api/)\n-   [Developing React custom hooks for Redux without react-redux](https://blog.axlight.com/posts/developing-react-custom-hooks-for-redux-without-react-redux/)\n-   [Integrating React and Redux, with Hooks and Proxies](https://frontarm.com/daishi-kato/redux-custom-hooks/)\n-   [New React Redux coding style with hooks without selectors](https://blog.axlight.com/posts/new-react-redux-coding-style-with-hooks-without-selectors/)\n-   [Benchmark alpha-released hooks API in React Redux with alternatives](https://blog.axlight.com/posts/benchmark-alpha-released-hooks-api-in-react-redux-with-alternatives/)\n-   [Four patterns for global state with React hooks: Context or Redux](https://blog.axlight.com/posts/four-patterns-for-global-state-with-react-hooks-context-or-redux/)\n-   [Redux meets hooks for non-redux users: a small concrete example with reactive-react-redux](https://blog.axlight.com/posts/redux-meets-hooks-for-non-redux-users-a-small-concrete-example-with-reactive-react-redux/)\n-   [Redux-less context-based useSelector hook that has same performance as React-Redux](https://blog.axlight.com/posts/benchmark-react-tracked/)\n-   [What is state usage tracking? A novel approach to intuitive and performant global state with React hooks and Proxy](https://blog.axlight.com/posts/what-is-state-usage-tracking-a-novel-approach-to-intuitive-and-performant-api-with-react-hooks-and-proxy/)\n-   [Effortless render optimization with state usage tracking with React hooks](https://blog.axlight.com/posts/effortless-render-optimization-with-state-usage-tracking-with-react-hooks/)\n-   [How I developed a Concurrent Mode friendly library for React Redux](https://blog.axlight.com/posts/how-i-developed-a-concurrent-mode-friendly-library-for-react-redux/)\n-   [React hooks-oriented Redux coding pattern without thunks and action creators](https://blog.axlight.com/posts/react-hooks-oriented-redux-coding-pattern-without-thunks-and-action-creators/)\n","readmeFilename":"README.md","bugs":{"url":"https://github.com/dai-shi/reactive-react-redux/issues"},"homepage":"https://github.com/dai-shi/reactive-react-redux#readme","_id":"reactive-react-redux@5.0.0-alpha.5","_nodeVersion":"12.18.3","_npmVersion":"6.14.6","dist":{"integrity":"sha512-akoTP5qtXthCZ+KqlzY9Xf8tPxJyh5mjHzFD5erwuHfMvZCtcW2MRFHbGf9loKk9+DZLG7ZQyF2F6ppFLKunWQ==","shasum":"9f6d9712a24813a9c019ea8e6eb415f6d474ede2","tarball":"https://registry.npmjs.org/reactive-react-redux/-/reactive-react-redux-5.0.0-alpha.5.tgz","fileCount":20,"unpackedSize":53794,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJfKVCyCRA9TVsSAnZWagAArX0P/03uqOKBKJe1i9+b7X5t\nVNvjLbKmZnKs3e+/DMG0GJXhvR7+vWSuutTtHdhk4Eud/Ju1IEz5RBYQkwp1\n6kyp4e58HgGYP/MfXhp89x9/iOn0IUOaVnWrsL6WhuGAtoWLRhGBdqM+dVnD\nZyo2mWluGgMvwobqwvNwMZgJ7xobBXDkEm9vN8J9pHh2SRh1P5015z4ikJ8o\nxeBE+owaQaf74jHVm+gsfiWxvmgodwtxYjtHh3ulnmzHYthvvnu3hnBYlfsM\nX01Eu1c4/gCV8i0aQxG61k4rxsBC+7XrpW6shkT4lEa2T8oXzhRQFsFF9FdR\nrOcOiib3z66e+FP9UYFAWBIB/0leXRX4+MqRmRd8NVZS3laxSjxQ6Ouuasqi\nUfZ38VUTx/2Y3+QCK7LX8uhWHVrGzXXHquUStdaEwpi3h3GDVXQZwl536Axe\nFSCuDZQgm3WKkiBKjJ2EJJ03WU59e96tZxvgTSRCPlGXZbgVT+jnkK/2uqq2\nrNFQtfs0Ym9QM1pFsQ/y90T81e8AGdudJc/IIV3q45+puSBva47yMrHbIZh3\nWGoWWNb0RrX9PwKOiRjYTC4s8JQg/8UEudJrFn5iTldNorH5yIK41ZZqcyRy\ntknO44dbyJxPumFHyrBGy50OUSAkuG2HQmhZD5vYs0NrJHRCqBMo5REXxBM4\nQVNy\r\n=Ec/e\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIEAyhMC29uEKRwrGiLSa2Vrw+/tf06/4EL2GxZzfZ7xuAiEAtS+k6CkfX9SzVSneHuOhEksZTZYD5pHz/i76piXCiIc="}]},"maintainers":[{"name":"daishi","email":"daishi@axlight.com"}],"_npmUser":{"name":"daishi","email":"daishi@axlight.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/reactive-react-redux_5.0.0-alpha.5_1596543153775_0.9722851999981326"},"_hasShrinkwrap":false},"5.0.0-alpha.6":{"name":"reactive-react-redux","description":"React Redux binding with React Hooks and Proxy","version":"5.0.0-alpha.6","publishConfig":{"tag":"next"},"author":{"name":"Daishi Kato"},"repository":{"type":"git","url":"git+https://github.com/dai-shi/reactive-react-redux.git"},"source":"./src/index.ts","main":"./dist/index.umd.js","module":"./dist/index.modern.js","types":"./dist/src/index.d.ts","sideEffects":false,"scripts":{"compile":"microbundle build -f modern,umd","test":"run-s eslint tsc-test jest","eslint":"eslint --ext .js,.ts,.tsx --ignore-pattern dist .","jest":"jest --preset ts-jest/presets/js-with-ts","tsc-test":"tsc --project . --noEmit","apidoc":"documentation readme --section API --markdown-toc false --parse-extension ts src/*.ts","examples:01_minimal":"DIR=01_minimal EXT=js webpack-dev-server","examples:02_typescript":"DIR=02_typescript webpack-dev-server","examples:03_deep":"DIR=03_deep webpack-dev-server","examples:04_immer":"DIR=04_immer webpack-dev-server","examples:05_localstate":"DIR=05_localstate webpack-dev-server","examples:06_memoization":"DIR=06_memoization webpack-dev-server","examples:07_multistore":"DIR=07_multistore webpack-dev-server","examples:08_dynamic":"DIR=08_dynamic webpack-dev-server","examples:09_thunk":"DIR=09_thunk webpack-dev-server","examples:11_todolist":"DIR=11_todolist EXT=tsx webpack-dev-server","examples:12_async":"DIR=12_async EXT=tsx webpack-dev-server","examples:13_memo":"DIR=13_memo webpack-dev-server"},"keywords":["react","redux","state","hooks","stateless","thisless","pure"],"license":"MIT","dependencies":{"proxy-compare":"^1.1.3"},"devDependencies":{"@testing-library/react":"^11.2.2","@types/jest":"^26.0.19","@types/react":"^17.0.0","@types/react-dom":"^17.0.0","@types/redux-logger":"^3.0.8","@typescript-eslint/eslint-plugin":"^4.10.0","@typescript-eslint/parser":"^4.10.0","documentation":"^13.1.0","eslint":"^7.15.0","eslint-config-airbnb":"^18.2.1","eslint-plugin-import":"^2.22.1","eslint-plugin-jsx-a11y":"^6.4.1","eslint-plugin-react":"^7.21.5","eslint-plugin-react-hooks":"^4.2.0","html-webpack-plugin":"^4.5.0","immer":"^8.0.0","jest":"^26.6.3","microbundle":"^0.12.4","npm-run-all":"^4.1.5","react":"experimental","react-dom":"experimental","redux":"^4.0.5","redux-thunk":"^2.3.0","ts-jest":"^26.4.4","ts-loader":"^8.0.12","typescript":"^4.1.3","webpack":"^4.44.2","webpack-cli":"^3.3.12","webpack-dev-server":"^3.11.0"},"peerDependencies":{"react":">=18.0.0","redux":">=4.0.0"},"gitHead":"2921dcb68f280b506ce2ef09483a372e01877dd8","readme":"There are several projects related to this repo.\nHere's the index for those.\n\n- reactive-react-redux v5-alpha (this repo): This has an experimental react-redux binding with useMutableSource. It provides useTrackedState, which tracks the usage of state in render, and it's originally proposed in this repo.\n- [react-tracked](https://github.com/dai-shi/react-tracked): This project is to provide useTrackedState with React Context. v1.5 is fairly stable.\n- [react-redux #1503](https://github.com/reduxjs/react-redux/pull/1503): A pull request to add useTrackedState to the official react-redux library.\n- [react-tracked #71](https://github.com/dai-shi/react-tracked/pull/71): This provides createTrackedSelector that will create useTrackedState from useSelector.\n- [proxy-memoize](https://github.com/dai-shi/proxy-memoize): This is another project which is not tied to React, but combined with useSelector, we get a similarfunctionality like useTrackedState.\n\n----\n\n# reactive-react-redux\n\n[![CI](https://img.shields.io/github/workflow/status/dai-shi/reactive-react-redux/CI)](https://github.com/dai-shi/reactive-react-redux/actions?query=workflow%3ACI)\n[![npm](https://img.shields.io/npm/v/reactive-react-redux)](https://www.npmjs.com/package/reactive-react-redux)\n[![size](https://img.shields.io/bundlephobia/minzip/reactive-react-redux)](https://bundlephobia.com/result?p=reactive-react-redux)\n\nReact Redux binding with React Hooks and Proxy\n\n> If you are looking for a non-Redux library, please visit [react-tracked](https://github.com/dai-shi/react-tracked) which has the same hooks API.\n\n## Introduction\n\nThis is a library to bind React and Redux with Hooks API.\nIt has mostly the same API as the official\n[react-redux Hooks API](https://react-redux.js.org/api/hooks),\nso it can be used as a drop-in replacement\nif you are using only basic functionality.\n\nThere are two major features in this library\nthat are not in the official react-redux.\n\n### 1. useTrackedState hook\n\nThis library provides another hook `useTrackedState`\nwhich is a simpler API than already simple `useSelector`.\nIt returns an entire state, but the library takes care of\noptimization of re-renders.\nMost likely, `useTrackedState` performs better than\n`useSelector` without perfectly tuned selectors.\n\nTechnically, `useTrackedState` has no [stale props](https://react-redux.js.org/api/hooks#stale-props-and-zombie-children) issue.\n\n### 2. useMutableSource without Context\n\nreact-redux v7 has APIs around Context.\nThis library is implemented with useMutableSource,\nand it patches the Redux store.\nAPIs are provided without Context.\nIt's up to developers to use Context based on them.\nCheck out `./examples/11_todolist/src/context.ts`.\n\nThere's another difference from react-redux v7.\nThis library directly use useMutableSource, and requires\nuseCallback for the selector in useSelector.\n[equalityFn](https://react-redux.js.org/api/hooks#equality-comparisons-and-updates) is not supported.\n\n## How tracking works\n\nA hook `useTrackedState` returns an entire Redux state object with Proxy,\nand it keeps track of which properties of the object are used\nin render. When the state is updated, this hook checks\nwhether used properties are changed.\nOnly if it detects changes in the state,\nit triggers a component to re-render.\n\n## Install\n\n```bash\nnpm install reactive-react-redux\n```\n\n## Usage (useTrackedState)\n\n```javascript\nimport React from 'react';\nimport { createStore } from 'redux';\nimport {\n  patchStore,\n  useTrackedState,\n} from 'reactive-react-redux';\n\nconst initialState = {\n  count: 0,\n  text: 'hello',\n};\n\nconst reducer = (state = initialState, action) => {\n  switch (action.type) {\n    case 'increment': return { ...state, count: state.count + 1 };\n    case 'decrement': return { ...state, count: state.count - 1 };\n    case 'setText': return { ...state, text: action.text };\n    default: return state;\n  }\n};\n\nconst store = patchStore(createStore(reducer));\n\nconst Counter = () => {\n  const state = useTrackedState(store);\n  const { dispatch } = store;\n  return (\n    <div>\n      {Math.random()}\n      <div>\n        <span>Count: {state.count}</span>\n        <button type=\"button\" onClick={() => dispatch({ type: 'increment' })}>+1</button>\n        <button type=\"button\" onClick={() => dispatch({ type: 'decrement' })}>-1</button>\n      </div>\n    </div>\n  );\n};\n\nconst TextBox = () => {\n  const state = useTrackedState(store);\n  const { dispatch } = store;\n  return (\n    <div>\n      {Math.random()}\n      <div>\n        <span>Text: {state.text}</span>\n        <input value={state.text} onChange={event => dispatch({ type: 'setText', text: event.target.value })} />\n      </div>\n    </div>\n  );\n};\n\nconst App = () => (\n  <>\n    <h1>Counter</h1>\n    <Counter />\n    <Counter />\n    <h1>TextBox</h1>\n    <TextBox />\n    <TextBox />\n  </>\n);\n```\n\n## API\n\n<!-- Generated by documentation.js. Update this documentation by updating the source code. -->\n\n### patchStore\n\npatch Redux store for React\n\n#### Parameters\n\n-   `store` **Store&lt;State, Action>** \n\n#### Examples\n\n```javascript\nimport { createStore } from 'redux';\nimport { patchStore } from 'reactive-react-redux';\n\nconst reducer = ...;\nconst store = patchStore(createStore(reducer));\n```\n\n### useTrackedState\n\nuseTrackedState hook\n\nIt return the Redux state wrapped by Proxy,\nand the state prperty access is tracked.\nIt will only re-render if accessed properties are changed.\n\n#### Parameters\n\n-   `patchedStore` **PatchedStore&lt;State, Action>** \n-   `opts` **Opts**  (optional, default `{}`)\n\n#### Examples\n\n```javascript\nimport { useTrackedState } from 'reactive-react-redux';\n\nconst Component = () => {\n  const state = useTrackedState(store);\n  ...\n};\n```\n\n### useSelector\n\nuseSelector hook\n\nselector has to be stable. Either define it outside render\nor use useCallback if selector uses props.\n\n#### Parameters\n\n-   `patchedStore` **PatchedStore&lt;State, Action>** \n-   `selector` **function (state: State): Selected** \n\n#### Examples\n\n```javascript\nimport { useCallback } from 'react';\nimport { useSelector } from 'reactive-react-redux';\n\nconst Component = ({ count }) => {\n  const isBigger = useSelector(store, useCallack(state => state.count > count, [count]));\n  ...\n};\n```\n\n### memo\n\nmemo\n\nUsing `React.memo` with tracked state is not compatible,\nbecause `React.memo` stops state access, thus no tracking occurs.\nThis is a special memo to be used instead of `React.memo` with tracking support.\n\n#### Parameters\n\n-   `Component` **any** \n-   `areEqual` **any?** \n\n#### Examples\n\n```javascript\nimport { memo } from 'reactive-react-redux';\n\nconst ChildComponent = memo(({ obj1, obj2 }) => {\n  // ...\n});\n```\n\n## Recipes\n\n### Context\n\nYou can create Context based APIs like react-redux v7.\n\n```typescript\nimport { createContext, createElement, useContext } from 'react';\nimport {\n  PatchedStore,\n  useSelector as useSelectorOrig,\n  useTrackedState as useTrackedStateOrig,\n} from 'reactive-react-redux';\n\nexport type State = ...;\n\nexport type Action = ...;\n\nconst Context = createContext(new Proxy({}, {\n  get() { throw new Error('use Provider'); },\n}) as PatchedStore<State, Action>);\n\nexport const Provider: React.FC<{ store: PatchedStore<State, Action> }> = ({\n  store,\n  children,\n}) => createElement(Context.Provider, { value: store }, children);\n\nexport const useDispatch = () => useContext(Context).dispatch;\n\nexport const useSelector = <Selected>(\n  selector: (state: State) => Selected,\n) => useSelectorOrig(useContext(Context), selector);\n\nexport const useTrackedState = () => useTrackedStateOrig(useContext(Context));\n```\n\n### useTrackedSelector\n\nYou can create a selector hook with tracking support.\n\n```javascript\nimport { useTrackedState } from 'reactive-react-redux';\n\nexport const useTrackedSelector = (patchedStore, selector) => selector(useTrackedState(patchedStore));\n```\n\nPlease refer [this issue](https://github.com/dai-shi/reactive-react-redux/issues/41) for more information.\n\n### useTracked\n\nYou can combine useTrackedState and useDispatch to\nmake a hook that returns a tuple like `useReducer`.\n\n```javascript\nimport { useTrackedState, useDispatch } from 'reactive-react-redux';\n\nexport const useTracked = (patchedStore) => {\n  const state = useTrackedState(patchedStore);\n  const dispatch = useDispatch(patchedStore);\n  return useMemo(() => [state, dispatch], [state, dispatch]);\n};\n```\n\n## Caveats\n\nProxy and state usage tracking may not work 100% as expected.\nThere are some limitations and workarounds.\n\n### Proxied states are referentially equal only in per-hook basis\n\n```javascript\nconst state1 = useTrackedState(patchedStore);\nconst state2 = useTrackedState(patchedStore);\n// state1 and state2 is not referentially equal\n// even if the underlying redux state is referentially equal.\n```\n\nYou should use `useTrackedState` only once in a component.\n\n### An object referential change doesn't trigger re-render if an property of the object is accessed in previous render\n\n```javascript\nconst state = useTrackedState(patchedStore);\nconst { foo } = state;\nreturn <Child key={foo.id} foo={foo} />;\n\nconst Child = React.memo(({ foo }) => {\n  // ...\n};\n// if foo doesn't change, Child won't render, so foo.id is only marked as used.\n// it won't trigger Child to re-render even if foo is changed.\n```\n\nYou need to use a special `memo` provided by this library.\n\n```javascript\nimport { memo } from 'reactive-react-redux';\n\nconst Child = memo(({ foo }) => {\n  // ...\n};\n```\n\n### Proxied state might behave unexpectedly outside render\n\nProxies are basically transparent, and it should behave like normal objects.\nHowever, there can be edge cases where it behaves unexpectedly.\nFor example, if you console.log a proxied value,\nit will display a proxy wrapping an object.\nNotice, it will be kept tracking outside render,\nso any prorerty access will mark as used to trigger re-render on updates.\n\nuseTrackedState will unwrap a Proxy before wrapping with a new Proxy,\nhence, it will work fine in usual use cases.\nThere's only one known pitfall: If you wrap proxied state with your own Proxy\noutside the control of useTrackedState,\nit might lead memory leaks, because useTrackedState\nwouldn't know how to unwrap your own Proxy.\n\nTo work around such edge cases, the first option is to use primitive values.\n\n```javascript\nconst state = useTrackedState(patchedStore);\nconst dispatch = useUpdate(patchedStore);\ndispatch({ type: 'FOO', value: state.fooObj }); // Instead of using objects,\ndispatch({ type: 'FOO', value: state.fooStr }); // Use primitives.\n```\n\nThe second option is to use `getUntrackedObject`.\n\n```javascript\nimport { getUntrackedObject } from 'react-tracked';\ndispatch({ type: 'FOO', value: getUntrackedObject(state.fooObj) });\n```\n\nYou could implement a special dispatch function to do this automatically.\n\n## Examples\n\nThe [examples](examples) folder contains working examples.\nYou can run one of them with\n\n```bash\nPORT=8080 npm run examples:01_minimal\n```\n\nand open <http://localhost:8080> in your web browser.\n\nYou can also try them in codesandbox.io:\n[01](https://codesandbox.io/s/github/dai-shi/reactive-react-redux/tree/master/examples/01_minimal)\n[02](https://codesandbox.io/s/github/dai-shi/reactive-react-redux/tree/master/examples/02_typescript)\n[03](https://codesandbox.io/s/github/dai-shi/reactive-react-redux/tree/master/examples/03_deep)\n[04](https://codesandbox.io/s/github/dai-shi/reactive-react-redux/tree/master/examples/04_immer)\n[05](https://codesandbox.io/s/github/dai-shi/reactive-react-redux/tree/master/examples/05_localstate)\n[06](https://codesandbox.io/s/github/dai-shi/reactive-react-redux/tree/master/examples/06_memoization)\n[07](https://codesandbox.io/s/github/dai-shi/reactive-react-redux/tree/master/examples/07_multistore)\n[08](https://codesandbox.io/s/github/dai-shi/reactive-react-redux/tree/master/examples/08_dynamic)\n[09](https://codesandbox.io/s/github/dai-shi/reactive-react-redux/tree/master/examples/09_thunk)\n[11](https://codesandbox.io/s/github/dai-shi/reactive-react-redux/tree/master/examples/11_todolist)\n[12](https://codesandbox.io/s/github/dai-shi/reactive-react-redux/tree/master/examples/12_async)\n[13](https://codesandbox.io/s/github/dai-shi/reactive-react-redux/tree/master/examples/13_memo)\n\n## Benchmarks\n\n<img alt=\"benchmark result\" src=\"https://user-images.githubusercontent.com/490574/61585382-405fae80-ab95-11e9-9f28-3b1a49dd1e5f.png\" width=\"425\" />\n\nSee [#32](https://github.com/dai-shi/reactive-react-redux/issues/32) for details.\n\n## Blogs\n\n-   [A deadly simple React bindings library for Redux with Hooks API](https://blog.axlight.com/posts/a-deadly-simple-react-bindings-library-for-redux-with-hooks-api/)\n-   [Developing React custom hooks for Redux without react-redux](https://blog.axlight.com/posts/developing-react-custom-hooks-for-redux-without-react-redux/)\n-   [Integrating React and Redux, with Hooks and Proxies](https://frontarm.com/daishi-kato/redux-custom-hooks/)\n-   [New React Redux coding style with hooks without selectors](https://blog.axlight.com/posts/new-react-redux-coding-style-with-hooks-without-selectors/)\n-   [Benchmark alpha-released hooks API in React Redux with alternatives](https://blog.axlight.com/posts/benchmark-alpha-released-hooks-api-in-react-redux-with-alternatives/)\n-   [Four patterns for global state with React hooks: Context or Redux](https://blog.axlight.com/posts/four-patterns-for-global-state-with-react-hooks-context-or-redux/)\n-   [Redux meets hooks for non-redux users: a small concrete example with reactive-react-redux](https://blog.axlight.com/posts/redux-meets-hooks-for-non-redux-users-a-small-concrete-example-with-reactive-react-redux/)\n-   [Redux-less context-based useSelector hook that has same performance as React-Redux](https://blog.axlight.com/posts/benchmark-react-tracked/)\n-   [What is state usage tracking? A novel approach to intuitive and performant global state with React hooks and Proxy](https://blog.axlight.com/posts/what-is-state-usage-tracking-a-novel-approach-to-intuitive-and-performant-api-with-react-hooks-and-proxy/)\n-   [Effortless render optimization with state usage tracking with React hooks](https://blog.axlight.com/posts/effortless-render-optimization-with-state-usage-tracking-with-react-hooks/)\n-   [How I developed a Concurrent Mode friendly library for React Redux](https://blog.axlight.com/posts/how-i-developed-a-concurrent-mode-friendly-library-for-react-redux/)\n-   [React hooks-oriented Redux coding pattern without thunks and action creators](https://blog.axlight.com/posts/react-hooks-oriented-redux-coding-pattern-without-thunks-and-action-creators/)\n","readmeFilename":"README.md","bugs":{"url":"https://github.com/dai-shi/reactive-react-redux/issues"},"homepage":"https://github.com/dai-shi/reactive-react-redux#readme","_id":"reactive-react-redux@5.0.0-alpha.6","_nodeVersion":"12.20.0","_npmVersion":"6.14.8","dist":{"integrity":"sha512-HJHdSEEhQEut5d/z0Vdq4aEHhziA92Meme7cjWsbemPA2DtdY2zJLGdvDPkomyebtQG01A6ZShRLjpFTPtxU9A==","shasum":"8c9cb5139b806e335170d76f242b4ddec0234205","tarball":"https://registry.npmjs.org/reactive-react-redux/-/reactive-react-redux-5.0.0-alpha.6.tgz","fileCount":20,"unpackedSize":52720,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJf3W6PCRA9TVsSAnZWagAAp+AQAIgq4kdMMbCb5XkYkEO8\nzDvhi8zB8NqMGFWJ8FZO/Y7JOgMxpS5ZMIIOylS+eFLIuraYvJdToH04lGgo\n/jVxBlwbBbA8K9DKlpS3xuqvFqSFKULrU9OSCgvOgjQSNmJa8FQl/t5w74YG\n3/vNpAo504StHUMb8rP7KjKH3MEx2S3mzvDYRwk7w3LiVvhhs6WVWfN+MxTE\niVO/FJB9g/6JazOspV4JjD7p2yA4MFiT8dyeZah2BqxJwiikP1sRtWmRDfpY\nuSvRhjv9L2wdGoo0diNGkOe7gCeOe7QxcVSsU2+y633jGODblmnzM5FXQM6v\nDvEdeECmDXrQOKHeYqmHGiJnZ50WmfjLVX8wm9kj6EsMkCi5CZWLZ8W0b/So\n2+0zADXCg5Q8+3EOUIjYvqQjdm3pF7LHe6qn4ldmT7W6AA+vOxkItwl+Y2vT\n8VXS4q2MReB4UZ5Tbgf3Abww+tacIyPBSXpERP7BJcUgT7sRmDo050zv1ggg\nGRHCuo0tIgTqH4D4DosQwme3vPik4gXdNQq7JSuL8H0VSncDHH200agSKyU/\nVbCOQ67+H62bTHaorlt4kVRQwSLEvqlEK7xFQirXrNUke6pmAnf00Yv2ohW8\n1SunQT0rCGB9OY89T/HaLzUMC/aiVPLHWLHfYH5sDmVA/cHD9YxhCoRkxN8q\n6Cnz\r\n=PVwA\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQC5fYavcDh4Itr4wXdhtMl68FXouaiZb0Md9vAQlm+MewIhAISWYb5GsD3om6Djrs0FUBLtZDsJj1neHOyvUDRvwSe7"}]},"_npmUser":{"name":"daishi","email":"daishi@axlight.com"},"directories":{},"maintainers":[{"name":"daishi","email":"daishi@axlight.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/reactive-react-redux_5.0.0-alpha.6_1608347279302_0.3843011529697109"},"_hasShrinkwrap":false},"5.0.0-alpha.7":{"name":"reactive-react-redux","description":"React Redux binding with React Hooks and Proxy","version":"5.0.0-alpha.7","publishConfig":{"tag":"next"},"author":{"name":"Daishi Kato"},"repository":{"type":"git","url":"git+https://github.com/dai-shi/reactive-react-redux.git"},"source":"./src/index.ts","main":"./dist/index.umd.js","module":"./dist/index.modern.js","types":"./dist/src/index.d.ts","sideEffects":false,"scripts":{"compile":"microbundle build -f modern,umd","test":"run-s eslint tsc-test jest","eslint":"eslint --ext .js,.ts,.tsx --ignore-pattern dist .","jest":"jest --preset ts-jest/presets/js-with-ts","tsc-test":"tsc --project . --noEmit","apidoc":"documentation readme --section API --markdown-toc false --parse-extension ts src/*.ts","examples:01_minimal":"DIR=01_minimal EXT=js webpack-dev-server","examples:02_typescript":"DIR=02_typescript webpack-dev-server","examples:03_deep":"DIR=03_deep webpack-dev-server","examples:04_immer":"DIR=04_immer webpack-dev-server","examples:05_localstate":"DIR=05_localstate webpack-dev-server","examples:06_memoization":"DIR=06_memoization webpack-dev-server","examples:07_multistore":"DIR=07_multistore webpack-dev-server","examples:08_dynamic":"DIR=08_dynamic webpack-dev-server","examples:09_thunk":"DIR=09_thunk webpack-dev-server","examples:11_todolist":"DIR=11_todolist EXT=tsx webpack-dev-server","examples:12_async":"DIR=12_async EXT=tsx webpack-dev-server","examples:13_memo":"DIR=13_memo webpack-dev-server"},"keywords":["react","redux","state","hooks","stateless","thisless","pure"],"license":"MIT","dependencies":{"proxy-compare":"^1.1.3"},"devDependencies":{"@testing-library/react":"^11.2.2","@types/jest":"^26.0.19","@types/react":"^17.0.0","@types/react-dom":"^17.0.0","@types/redux-logger":"^3.0.8","@typescript-eslint/eslint-plugin":"^4.11.1","@typescript-eslint/parser":"^4.11.1","documentation":"^13.1.0","eslint":"^7.16.0","eslint-config-airbnb":"^18.2.1","eslint-plugin-import":"^2.22.1","eslint-plugin-jsx-a11y":"^6.4.1","eslint-plugin-react":"^7.21.5","eslint-plugin-react-hooks":"^4.2.0","html-webpack-plugin":"^4.5.0","immer":"^8.0.0","jest":"^26.6.3","microbundle":"^0.13.0","npm-run-all":"^4.1.5","react":"experimental","react-dom":"experimental","redux":"^4.0.5","redux-thunk":"^2.3.0","ts-jest":"^26.4.4","ts-loader":"^8.0.12","typescript":"^4.1.3","webpack":"^4.44.2","webpack-cli":"^3.3.12","webpack-dev-server":"^3.11.1"},"peerDependencies":{"react":">=18.0.0","redux":">=4.0.0"},"gitHead":"5eeb26cc671d8852d59bff2fdeaab7ae143847d1","readme":"There are several projects related to this repo.\nHere's the index of those.\n\n- reactive-react-redux v5-alpha (this repo): This has an experimental react-redux binding with useMutableSource. It provides useTrackedState, which tracks the usage of state in render, and it's originally proposed in this repo.\n- [react-tracked](https://github.com/dai-shi/react-tracked): This project is to provide useTrackedState with React Context. v1.6 provides createTrackedSelector that will create useTrackedState from useSelector.\n- [react-redux #1503](https://github.com/reduxjs/react-redux/pull/1503): A pull request to add useTrackedState to the official react-redux library.\n- [proxy-memoize](https://github.com/dai-shi/proxy-memoize): This is another project which is not tied to React, but combined with useSelector, we get a similar functionality like useTrackedState.\n\n----\n\n# reactive-react-redux\n\n[![CI](https://img.shields.io/github/workflow/status/dai-shi/reactive-react-redux/CI)](https://github.com/dai-shi/reactive-react-redux/actions?query=workflow%3ACI)\n[![npm](https://img.shields.io/npm/v/reactive-react-redux)](https://www.npmjs.com/package/reactive-react-redux)\n[![size](https://img.shields.io/bundlephobia/minzip/reactive-react-redux)](https://bundlephobia.com/result?p=reactive-react-redux)\n\nReact Redux binding with React Hooks and Proxy\n\n> If you are looking for a non-Redux library, please visit [react-tracked](https://github.com/dai-shi/react-tracked) which has the same hooks API.\n\n## Introduction\n\nThis is a library to bind React and Redux with Hooks API.\nIt has mostly the same API as the official\n[react-redux Hooks API](https://react-redux.js.org/api/hooks),\nso it can be used as a drop-in replacement\nif you are using only basic functionality.\n\nThere are two major features in this library\nthat are not in the official react-redux.\n\n### 1. useTrackedState hook\n\nThis library provides another hook `useTrackedState`\nwhich is a simpler API than already simple `useSelector`.\nIt returns an entire state, but the library takes care of\noptimization of re-renders.\nMost likely, `useTrackedState` performs better than\n`useSelector` without perfectly tuned selectors.\n\nTechnically, `useTrackedState` has no [stale props](https://react-redux.js.org/api/hooks#stale-props-and-zombie-children) issue.\n\n### 2. useMutableSource without Context\n\nreact-redux v7 has APIs around Context.\nThis library is implemented with useMutableSource,\nand it patches the Redux store.\nAPIs are provided without Context.\nIt's up to developers to use Context based on them.\nCheck out `./examples/11_todolist/src/context.ts`.\n\nThere's another difference from react-redux v7.\nThis library directly use useMutableSource, and requires\nuseCallback for the selector in useSelector.\n[equalityFn](https://react-redux.js.org/api/hooks#equality-comparisons-and-updates) is not supported.\n\n## How tracking works\n\nA hook `useTrackedState` returns an entire Redux state object with Proxy,\nand it keeps track of which properties of the object are used\nin render. When the state is updated, this hook checks\nwhether used properties are changed.\nOnly if it detects changes in the state,\nit triggers a component to re-render.\n\n## Install\n\n```bash\nnpm install reactive-react-redux\n```\n\n## Usage (useTrackedState)\n\n```javascript\nimport React from 'react';\nimport { createStore } from 'redux';\nimport {\n  patchStore,\n  useTrackedState,\n} from 'reactive-react-redux';\n\nconst initialState = {\n  count: 0,\n  text: 'hello',\n};\n\nconst reducer = (state = initialState, action) => {\n  switch (action.type) {\n    case 'increment': return { ...state, count: state.count + 1 };\n    case 'decrement': return { ...state, count: state.count - 1 };\n    case 'setText': return { ...state, text: action.text };\n    default: return state;\n  }\n};\n\nconst store = patchStore(createStore(reducer));\n\nconst Counter = () => {\n  const state = useTrackedState(store);\n  const { dispatch } = store;\n  return (\n    <div>\n      {Math.random()}\n      <div>\n        <span>Count: {state.count}</span>\n        <button type=\"button\" onClick={() => dispatch({ type: 'increment' })}>+1</button>\n        <button type=\"button\" onClick={() => dispatch({ type: 'decrement' })}>-1</button>\n      </div>\n    </div>\n  );\n};\n\nconst TextBox = () => {\n  const state = useTrackedState(store);\n  const { dispatch } = store;\n  return (\n    <div>\n      {Math.random()}\n      <div>\n        <span>Text: {state.text}</span>\n        <input value={state.text} onChange={event => dispatch({ type: 'setText', text: event.target.value })} />\n      </div>\n    </div>\n  );\n};\n\nconst App = () => (\n  <>\n    <h1>Counter</h1>\n    <Counter />\n    <Counter />\n    <h1>TextBox</h1>\n    <TextBox />\n    <TextBox />\n  </>\n);\n```\n\n## API\n\n<!-- Generated by documentation.js. Update this documentation by updating the source code. -->\n\n### patchStore\n\npatch Redux store for React\n\n#### Parameters\n\n-   `store` **Store&lt;State, Action>** \n\n#### Examples\n\n```javascript\nimport { createStore } from 'redux';\nimport { patchStore } from 'reactive-react-redux';\n\nconst reducer = ...;\nconst store = patchStore(createStore(reducer));\n```\n\n### useTrackedState\n\nuseTrackedState hook\n\nIt return the Redux state wrapped by Proxy,\nand the state prperty access is tracked.\nIt will only re-render if accessed properties are changed.\n\n#### Parameters\n\n-   `patchedStore` **PatchedStore&lt;State, Action>** \n-   `opts` **Opts**  (optional, default `{}`)\n\n#### Examples\n\n```javascript\nimport { useTrackedState } from 'reactive-react-redux';\n\nconst Component = () => {\n  const state = useTrackedState(store);\n  ...\n};\n```\n\n### useSelector\n\nuseSelector hook\n\nselector has to be stable. Either define it outside render\nor use useCallback if selector uses props.\n\n#### Parameters\n\n-   `patchedStore` **PatchedStore&lt;State, Action>** \n-   `selector` **function (state: State): Selected** \n\n#### Examples\n\n```javascript\nimport { useCallback } from 'react';\nimport { useSelector } from 'reactive-react-redux';\n\nconst Component = ({ count }) => {\n  const isBigger = useSelector(store, useCallack(state => state.count > count, [count]));\n  ...\n};\n```\n\n### memo\n\nmemo\n\nUsing `React.memo` with tracked state is not compatible,\nbecause `React.memo` stops state access, thus no tracking occurs.\nThis is a special memo to be used instead of `React.memo` with tracking support.\n\n#### Parameters\n\n-   `Component` **any** \n-   `areEqual` **any?** \n\n#### Examples\n\n```javascript\nimport { memo } from 'reactive-react-redux';\n\nconst ChildComponent = memo(({ obj1, obj2 }) => {\n  // ...\n});\n```\n\n## Recipes\n\n### Context\n\nYou can create Context based APIs like react-redux v7.\n\n```typescript\nimport { createContext, createElement, useContext } from 'react';\nimport {\n  PatchedStore,\n  useSelector as useSelectorOrig,\n  useTrackedState as useTrackedStateOrig,\n} from 'reactive-react-redux';\n\nexport type State = ...;\n\nexport type Action = ...;\n\nconst Context = createContext(new Proxy({}, {\n  get() { throw new Error('use Provider'); },\n}) as PatchedStore<State, Action>);\n\nexport const Provider: React.FC<{ store: PatchedStore<State, Action> }> = ({\n  store,\n  children,\n}) => createElement(Context.Provider, { value: store }, children);\n\nexport const useDispatch = () => useContext(Context).dispatch;\n\nexport const useSelector = <Selected>(\n  selector: (state: State) => Selected,\n) => useSelectorOrig(useContext(Context), selector);\n\nexport const useTrackedState = () => useTrackedStateOrig(useContext(Context));\n```\n\n### useTrackedSelector\n\nYou can create a selector hook with tracking support.\n\n```javascript\nimport { useTrackedState } from 'reactive-react-redux';\n\nexport const useTrackedSelector = (patchedStore, selector) => selector(useTrackedState(patchedStore));\n```\n\nPlease refer [this issue](https://github.com/dai-shi/reactive-react-redux/issues/41) for more information.\n\n### useTracked\n\nYou can combine useTrackedState and useDispatch to\nmake a hook that returns a tuple like `useReducer`.\n\n```javascript\nimport { useTrackedState, useDispatch } from 'reactive-react-redux';\n\nexport const useTracked = (patchedStore) => {\n  const state = useTrackedState(patchedStore);\n  const dispatch = useDispatch(patchedStore);\n  return useMemo(() => [state, dispatch], [state, dispatch]);\n};\n```\n\n## Caveats\n\nProxy and state usage tracking may not work 100% as expected.\nThere are some limitations and workarounds.\n\n### Proxied states are referentially equal only in per-hook basis\n\n```javascript\nconst state1 = useTrackedState(patchedStore);\nconst state2 = useTrackedState(patchedStore);\n// state1 and state2 is not referentially equal\n// even if the underlying redux state is referentially equal.\n```\n\nYou should use `useTrackedState` only once in a component.\n\n### An object referential change doesn't trigger re-render if an property of the object is accessed in previous render\n\n```javascript\nconst state = useTrackedState(patchedStore);\nconst { foo } = state;\nreturn <Child key={foo.id} foo={foo} />;\n\nconst Child = React.memo(({ foo }) => {\n  // ...\n};\n// if foo doesn't change, Child won't render, so foo.id is only marked as used.\n// it won't trigger Child to re-render even if foo is changed.\n```\n\nYou need to use a special `memo` provided by this library.\n\n```javascript\nimport { memo } from 'reactive-react-redux';\n\nconst Child = memo(({ foo }) => {\n  // ...\n};\n```\n\n### Proxied state might behave unexpectedly outside render\n\nProxies are basically transparent, and it should behave like normal objects.\nHowever, there can be edge cases where it behaves unexpectedly.\nFor example, if you console.log a proxied value,\nit will display a proxy wrapping an object.\nNotice, it will be kept tracking outside render,\nso any prorerty access will mark as used to trigger re-render on updates.\n\nuseTrackedState will unwrap a Proxy before wrapping with a new Proxy,\nhence, it will work fine in usual use cases.\nThere's only one known pitfall: If you wrap proxied state with your own Proxy\noutside the control of useTrackedState,\nit might lead memory leaks, because useTrackedState\nwouldn't know how to unwrap your own Proxy.\n\nTo work around such edge cases, the first option is to use primitive values.\n\n```javascript\nconst state = useTrackedState(patchedStore);\nconst dispatch = useUpdate(patchedStore);\ndispatch({ type: 'FOO', value: state.fooObj }); // Instead of using objects,\ndispatch({ type: 'FOO', value: state.fooStr }); // Use primitives.\n```\n\nThe second option is to use `getUntrackedObject`.\n\n```javascript\nimport { getUntrackedObject } from 'react-tracked';\ndispatch({ type: 'FOO', value: getUntrackedObject(state.fooObj) });\n```\n\nYou could implement a special dispatch function to do this automatically.\n\n## Examples\n\nThe [examples](examples) folder contains working examples.\nYou can run one of them with\n\n```bash\nPORT=8080 npm run examples:01_minimal\n```\n\nand open <http://localhost:8080> in your web browser.\n\nYou can also try them in codesandbox.io:\n[01](https://codesandbox.io/s/github/dai-shi/reactive-react-redux/tree/master/examples/01_minimal)\n[02](https://codesandbox.io/s/github/dai-shi/reactive-react-redux/tree/master/examples/02_typescript)\n[03](https://codesandbox.io/s/github/dai-shi/reactive-react-redux/tree/master/examples/03_deep)\n[04](https://codesandbox.io/s/github/dai-shi/reactive-react-redux/tree/master/examples/04_immer)\n[05](https://codesandbox.io/s/github/dai-shi/reactive-react-redux/tree/master/examples/05_localstate)\n[06](https://codesandbox.io/s/github/dai-shi/reactive-react-redux/tree/master/examples/06_memoization)\n[07](https://codesandbox.io/s/github/dai-shi/reactive-react-redux/tree/master/examples/07_multistore)\n[08](https://codesandbox.io/s/github/dai-shi/reactive-react-redux/tree/master/examples/08_dynamic)\n[09](https://codesandbox.io/s/github/dai-shi/reactive-react-redux/tree/master/examples/09_thunk)\n[11](https://codesandbox.io/s/github/dai-shi/reactive-react-redux/tree/master/examples/11_todolist)\n[12](https://codesandbox.io/s/github/dai-shi/reactive-react-redux/tree/master/examples/12_async)\n[13](https://codesandbox.io/s/github/dai-shi/reactive-react-redux/tree/master/examples/13_memo)\n\n## Benchmarks\n\n<img alt=\"benchmark result\" src=\"https://user-images.githubusercontent.com/490574/61585382-405fae80-ab95-11e9-9f28-3b1a49dd1e5f.png\" width=\"425\" />\n\nSee [#32](https://github.com/dai-shi/reactive-react-redux/issues/32) for details.\n\n## Blogs\n\n-   [A deadly simple React bindings library for Redux with Hooks API](https://blog.axlight.com/posts/a-deadly-simple-react-bindings-library-for-redux-with-hooks-api/)\n-   [Developing React custom hooks for Redux without react-redux](https://blog.axlight.com/posts/developing-react-custom-hooks-for-redux-without-react-redux/)\n-   [Integrating React and Redux, with Hooks and Proxies](https://frontarm.com/daishi-kato/redux-custom-hooks/)\n-   [New React Redux coding style with hooks without selectors](https://blog.axlight.com/posts/new-react-redux-coding-style-with-hooks-without-selectors/)\n-   [Benchmark alpha-released hooks API in React Redux with alternatives](https://blog.axlight.com/posts/benchmark-alpha-released-hooks-api-in-react-redux-with-alternatives/)\n-   [Four patterns for global state with React hooks: Context or Redux](https://blog.axlight.com/posts/four-patterns-for-global-state-with-react-hooks-context-or-redux/)\n-   [Redux meets hooks for non-redux users: a small concrete example with reactive-react-redux](https://blog.axlight.com/posts/redux-meets-hooks-for-non-redux-users-a-small-concrete-example-with-reactive-react-redux/)\n-   [Redux-less context-based useSelector hook that has same performance as React-Redux](https://blog.axlight.com/posts/benchmark-react-tracked/)\n-   [What is state usage tracking? A novel approach to intuitive and performant global state with React hooks and Proxy](https://blog.axlight.com/posts/what-is-state-usage-tracking-a-novel-approach-to-intuitive-and-performant-api-with-react-hooks-and-proxy/)\n-   [Effortless render optimization with state usage tracking with React hooks](https://blog.axlight.com/posts/effortless-render-optimization-with-state-usage-tracking-with-react-hooks/)\n-   [How I developed a Concurrent Mode friendly library for React Redux](https://blog.axlight.com/posts/how-i-developed-a-concurrent-mode-friendly-library-for-react-redux/)\n-   [React hooks-oriented Redux coding pattern without thunks and action creators](https://blog.axlight.com/posts/react-hooks-oriented-redux-coding-pattern-without-thunks-and-action-creators/)\n","readmeFilename":"README.md","bugs":{"url":"https://github.com/dai-shi/reactive-react-redux/issues"},"homepage":"https://github.com/dai-shi/reactive-react-redux#readme","_id":"reactive-react-redux@5.0.0-alpha.7","_nodeVersion":"12.20.0","_npmVersion":"6.14.8","dist":{"integrity":"sha512-xybwvOIvCVZVBeLmf/gxkIR12fHfrTigkGIbARNWkVLYtiGh2zKgcmaE+VylUnBGazTt5oejGP8bopyrLImd6Q==","shasum":"4a063afcc5c99b0ad769524b65e9bfdb32cd993b","tarball":"https://registry.npmjs.org/reactive-react-redux/-/reactive-react-redux-5.0.0-alpha.7.tgz","fileCount":20,"unpackedSize":52894,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJf7AKrCRA9TVsSAnZWagAATw8QAJ3oDgpCCIcOCYMP5lpf\nvjfJYXUgw5SV8ZB6wJbviRhcyRannHc68CsGCnMZXxqdnFfyDJWK2w4/Rykr\nl2pNnzghAlNq/pw+KVwOd2qaYsWvCmD3PLc0rlqLHy2W1yxmKDiD3/CiLjg2\nSWq+qRILl4FYB1TWIGbdBBSKSRuR1uwevNedmJ3yUhaiOMdnnij0zjZGcHwP\nNdIbdNeNu5GrJH+53CWFSeKu6R6gUaauU11P+qeQw42rqSF4y9AqomDLdBlF\nHpKM467D3lbAsjfxoSGCAEqnJnhfiVojtTTQ1Yp8y8Mq+vvmMkR+IdhVfTTt\nPItY1eunULXqfl3bQo8xcTgyFNoJ/M1Rt2ogFHzR7BFfYrLLqzhRlYYV2slO\nDvEjEdJfqJaEdB3yPYkzG9LtiHmfZmbaqLcmoPOcgDlzzqkPkDUGmbQ8RrZb\nf9rDRNxAF3d7OOq2b5A3/Tz4nt06FyUd7ObF2DlouyOnCLdwC1mhFvtno7qm\nVnGTca8dQ8P+0QH7VthlqAx/JWqKq4a+nr+AiNJ8T85aZZdyfbvXJHLmj3YS\nMQySseeIfV2mLXc9q238bBS6WkBh7tn4rIH8IVHNNCjjLT7NrxZpCsw3UWCe\nmlNfsbwCChmX9f8uwnawXhvjMBHO44awGU+b/fRtrSBnMk7c90TGwjd3Wc1r\n87QG\r\n=ke9v\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDS7jpl6n1/KpbhA7VSQx7JgTUH433CjaufbA/1lK/H5wIgfVxTwAb1V1wyfLdUkEtFxpUA3mtfXel9kff73mD/+p8="}]},"_npmUser":{"name":"daishi","email":"daishi@axlight.com"},"directories":{},"maintainers":[{"name":"daishi","email":"daishi@axlight.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/reactive-react-redux_5.0.0-alpha.7_1609302699237_0.9152699821190928"},"_hasShrinkwrap":false}},"time":{"created":"2019-03-31T15:40:47.063Z","1.7.0":"2019-03-31T15:40:47.245Z","modified":"2022-05-15T11:32:03.267Z","1.8.0":"2019-04-02T15:57:11.193Z","2.0.0":"2019-04-13T13:41:50.421Z","2.0.1":"2019-04-14T22:56:18.393Z","3.0.0-alpha.0":"2019-05-12T03:08:40.626Z","3.0.0-alpha.1":"2019-05-12T14:57:21.642Z","3.0.0":"2019-05-18T00:03:34.817Z","4.0.0-alpha.0":"2019-06-13T00:18:35.422Z","4.0.0-alpha.1":"2019-06-13T12:00:07.595Z","4.0.0-alpha.2":"2019-06-13T12:17:54.487Z","4.0.0-beta.0":"2019-06-13T23:06:42.841Z","4.0.0":"2019-06-22T07:50:02.533Z","4.1.0":"2019-07-20T06:40:32.758Z","4.2.0-alpha.0":"2019-07-24T16:14:29.187Z","4.2.0":"2019-07-27T09:03:20.463Z","4.2.1":"2019-10-05T05:16:55.267Z","4.3.0":"2019-10-08T23:40:55.101Z","4.4.0":"2019-10-17T10:48:32.783Z","4.4.1":"2020-01-23T15:53:35.589Z","4.5.0":"2020-02-03T13:00:50.070Z","4.6.0":"2020-02-24T02:02:09.274Z","4.6.1":"2020-02-26T02:50:54.893Z","4.7.0":"2020-03-01T06:34:23.723Z","4.8.0":"2020-03-07T11:32:40.815Z","5.0.0-alpha.1":"2020-03-12T17:01:37.874Z","5.0.0-alpha.2":"2020-03-16T09:25:04.536Z","4.9.0":"2020-05-10T12:15:19.920Z","5.0.0-alpha.3":"2020-05-13T14:39:06.887Z","5.0.0-alpha.4":"2020-07-03T23:21:26.503Z","5.0.0-alpha.5":"2020-08-04T12:12:33.923Z","5.0.0-alpha.6":"2020-12-19T03:07:59.497Z","5.0.0-alpha.7":"2020-12-30T04:31:39.449Z"},"maintainers":[{"name":"daishi","email":"daishi@axlight.com"}],"description":"React Redux binding with React Hooks and Proxy","homepage":"https://github.com/dai-shi/reactive-react-redux#readme","keywords":["react","redux","state","hooks","stateless","thisless","pure"],"repository":{"type":"git","url":"git+https://github.com/dai-shi/reactive-react-redux.git"},"author":{"name":"Daishi Kato"},"bugs":{"url":"https://github.com/dai-shi/reactive-react-redux/issues"},"license":"MIT","readme":"","readmeFilename":""}