{"_id":"nebenan-redux-tools","_rev":"113-189c6782f54284d467043aa75890a214","name":"nebenan-redux-tools","dist-tags":{"beta":"6.9.0-beta.1","latest":"6.9.0"},"versions":{"1.0.0":{"name":"nebenan-redux-tools","version":"1.0.0","author":{"name":"Nebenan.de","email":"max@nebenan.de"},"license":"SEE LICENSE IN LICENSE FILE","_id":"nebenan-redux-tools@1.0.0","maintainers":[{"name":"suprmax","email":"max@degterev.me"}],"homepage":"https://nebenan.de/","bugs":{"url":"https://github.com/good-hood-gmbh/nebenan-redux-tools/issues"},"dist":{"shasum":"75af10122f8d001b04a6baccb3c34b41bce1008c","tarball":"https://registry.npmjs.org/nebenan-redux-tools/-/nebenan-redux-tools-1.0.0.tgz","fileCount":19,"integrity":"sha512-thAPZxV9zDzTOT8qECcMzgnNLbeokw1AYmfkjha4TLAQdG5lPqVPeUxkyV7hKS4f2iHxBWB0ow8OQwG2v5HY4g==","signatures":[{"sig":"MEUCIDptvZPoJYFr2ip8jJfykXPy75wBD6HfAxAbtwTzf5aTAiEAvYLsgtwONOCXCmNK/bCpa6rDbkt61iLgy/dXFvkTWYA=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":24936,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbcv+lCRA9TVsSAnZWagAAUUsQAI4NTykCcedj8v/w5vYS\nFIPtdR5w0xeg0XvH8ynt4RIG2+0NK2qUsUm6zBg/ulc8gkI9YzN0T23qh+iz\nr03oOSU4fLWhTIvfk7X9rUga3exhItf+rvpIcv5vfAE2B5hYTr+P5PG566Wo\nTqG+nZFJUDBhJZx6FZjN+JnTyhp/2Zdt5IqQPwoNlq4I/j+JYnrgDXy/pCtj\nT2E/mzZ3aths4jAtrWfZNWwszfE56E1PNUjsWiQlmHP603dP+8PBrV16aa4m\nITfsE1Bv4S2VtAlx5X/Baa+coWpXZm15eVYM3zG/RRwb0csiEA0jB8SmTwMf\n7PH1N70dv6D54XTO106iZg2MLHYGJPCrpsAGIPuS9TTJ4SrpUdl0rNu6Qw8N\nUyAw8B9Z7LXXWqaILfz8Z54ND/nzuxSZzI9bJZucSm4lElatQAMzPSs1KOAK\n/LsG18H95jsaPgMGMhYMXtcNU2YL0MR7dSguTqm49vAVEnGMhjTujHfES5rR\nYebJR0CfpazK3eryU71thyA3slMvz+Akk3+uzNzzrd49vZevUaTsWnc0R3Qk\nyqR/bqchN9oRz2PwoyUuBUhJULPloUlXh3z7IVk0zlfpmH32KHkiRC67xPYY\nDQhvs2RygsMWoKXZxk2/LomeK+HUoO7hXkrXFAZIiSAGTuy/uyqrJCIMAqza\nL35c\r\n=yqaj\r\n-----END PGP SIGNATURE-----\r\n"},"engines":{"node":"^8.x.x"},"gitHead":"c9e43967065975ebdcaff3f423a0aedbb495b974","scripts":{"lint":"eslint --ext .es,.js ./","test":"npm run build:babel && env TZ='Europe/Berlin' mocha \"test/**/*.js\"","clean":"rm -rf ./lib/ || exit 1","build:babel":"NODE_ENV=production babel src --out-dir lib --copy-files","lint:tofile":"eslint --ext .es,.js --no-color -o ./eslint-report.log ./","test:tofile":"npm run build:babel && mocha --no-colors -R spec \"test/**/*.js\" 2>&1 | tee test-report.log","prepublishOnly":"npm run clean && npm run build:babel"},"_npmUser":{"name":"suprmax","email":"max@degterev.me"},"deprecated":"Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.","repository":{"url":"git+https://github.com/good-hood-gmbh/nebenan-redux-tools.git","type":"git"},"_npmVersion":"6.1.0","description":"A set of redux helpers","directories":{},"_nodeVersion":"8.11.3","dependencies":{"js-cookie":"^2.2.0"},"_hasShrinkwrap":false,"devDependencies":{"chai":"4.1.2","mocha":"5.2.0","sinon":"^6.1.5","eslint":"^5.3.0","lodash":"^4.17.10","updeep":"^1.0.0","babel-cli":"6.26.0","js-cookie":"^2.2.0","proxyquire":"2.0.1","babel-register":"6.26.0","babel-preset-env":"1.7.0","babel-preset-stage-3":"6.24.1","escape-string-regexp":"^1.0.5","eslint-plugin-import":"^2.14.0","local-storage-adapter":"^2.0.0","eslint-config-airbnb-base":"^13.1.0","babel-plugin-transform-runtime":"6.23.0","babel-plugin-transform-node-env-inline":"0.4.3"},"peerDependencies":{"lodash":"^4.17.10","updeep":"^1.0.0","escape-string-regexp":"^1.0.5","local-storage-adapter":"^2.0.0"},"_npmOperationalInternal":{"tmp":"tmp/nebenan-redux-tools_1.0.0_1534263205302_0.9373600523668344","host":"s3://npm-registry-packages"}},"2.0.0":{"name":"nebenan-redux-tools","version":"2.0.0","author":{"name":"Nebenan.de","email":"max@nebenan.de"},"license":"SEE LICENSE IN LICENSE FILE","_id":"nebenan-redux-tools@2.0.0","maintainers":[{"name":"suprmax","email":"max@degterev.me"}],"homepage":"https://nebenan.de/","bugs":{"url":"https://github.com/good-hood-gmbh/nebenan-redux-tools/issues"},"dist":{"shasum":"3cc0389a30816666f53f6c308b9b0c1f6400f0be","tarball":"https://registry.npmjs.org/nebenan-redux-tools/-/nebenan-redux-tools-2.0.0.tgz","fileCount":20,"integrity":"sha512-i5hR4QuW44263YPOr98rrWI+UOY6oGWIDqh/F1pv8SvnRuBinN017fIcaNQeFgeVPb1eBYVoKamObycPzlNyKg==","signatures":[{"sig":"MEUCIQDgq/K3apKvGWWQsU/u3HbUhWvTKnX1nVQSJ+r8zw8gAgIgMWUnMeiWb9cfuIO/+hPEWEHUwQZc2UICu7hfwQObgjU=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":26949,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJcGjzUCRA9TVsSAnZWagAAwQ4QAI2hpoeCdsOEv47QuxrU\n9ptiP5AEEW38x7C8dViybEU/HF6BiV4eGbgJRaRT0qpiI4tQ1r5+SPhjaBCh\n8vGhAGIXV65XWiD4H0uA78l143zZ55lVc9POe21ylXsLRKPraMhTNx7REuiE\nqmHB1L4u2aVBBgydR380XD/fcdgkUSm8gHTYGEqbDG84Odf3+CoyB6PpeKhx\nhjycQ5P42pd6UCgdzG4os9nNl6skXPrlqWbQ3IFUsboeiD1cCA+sM5XWswxL\nm2q6VfDaP2JxA5nCyUHBjzkh2Ew1rzPOz4yznt9k6Gkpmy7hhwJT8TYVf6hN\nQNle16zKlDInKq24JI8sZhZufPdMUlOBwLAyJNxS63q5js+Fi3e5lpaThsym\nZR0kFom4UVsWEB5bpYUWhFrXYc0BJszTcmX88WrbXZM3yrO9FmZ0DJTO6wXq\ngJzqRO+sBt9NYeQDeYxdzyo8imsaftpPWK3TQXxho/bFm2P+wTZvA16it1ad\nG6psNEaXqKmYR+MFk7OshwZJ/rRulztVWH467Sro7LMdl4DTy/wMVUHEa8Js\nTYZ6vLaSuUmBLapesDZ1jCEu1P4/YKZEadUXMmVnQ51JAO+3nygXZwmupuTg\n5RJkuJRA7JdPrltw3QDK0prVe418eO+NC86O/xW7ZUWt03zKbjXzUXBymXgt\nDdDi\r\n=h63O\r\n-----END PGP SIGNATURE-----\r\n"},"engines":{"node":"^10.x.x"},"gitHead":"f0eba5a357a8d1cc31236382c2d8179091eedfe8","scripts":{"lint":"eslint --ext .es,.js ./","test":"npm run build:babel && TZ='GMT' mocha \"test/**/*.js\"","check":"npm test && npm run lint && echo \"\\033[0;32mReady to publish\\033[0m\"","clean":"rm -rf ./lib/ || exit 1","reinstall":"rm -rf node_modules package-lock.json && npm install","build:babel":"NODE_ENV=production babel src --out-dir lib --copy-files","lint:tofile":"eslint --ext .es,.js --no-color -o ./eslint-report.log ./","test:tofile":"npm run build:babel && TZ='GMT' mocha --no-colors -R spec \"test/**/*.js\" 2>&1 | tee test-report.log","prepublishOnly":"npm run check && npm run clean && npm run build:babel"},"_npmUser":{"name":"suprmax","email":"max@degterev.me"},"deprecated":"Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.","repository":{"url":"git+https://github.com/good-hood-gmbh/nebenan-redux-tools.git","type":"git"},"_npmVersion":"6.4.1","description":"A set of redux helpers","directories":{},"_nodeVersion":"10.14.1","dependencies":{"js-cookie":"^2.2.0"},"_hasShrinkwrap":false,"devDependencies":{"chai":"^4.2.0","mocha":"^5.2.0","sinon":"^7.2.2","eslint":"^5.10.0","lodash":"^4.17.11","updeep":"^1.1.0","@babel/cli":"^7.1.0","proxyquire":"^2.1.0","@babel/core":"^7.1.0","@babel/runtime":"^7.2.0","@babel/preset-env":"^7.1.0","escape-string-regexp":"^1.0.5","eslint-plugin-import":"^2.14.0","local-storage-adapter":"^2.0.0","eslint-config-airbnb-base":"^13.1.0","@babel/plugin-transform-runtime":"^7.1.0","babel-plugin-add-module-exports":"^1.0.0","@babel/plugin-proposal-json-strings":"^7.0.0","@babel/plugin-transform-strict-mode":"^7.0.0"},"peerDependencies":{"lodash":"^4.17.10","updeep":"^1.0.0","@babel/runtime":"^7.0.0","escape-string-regexp":"^1.0.5","local-storage-adapter":"^2.0.0"},"_npmOperationalInternal":{"tmp":"tmp/nebenan-redux-tools_2.0.0_1545223379587_0.7062958965272845","host":"s3://npm-registry-packages"}},"3.0.0-beta1":{"name":"nebenan-redux-tools","version":"3.0.0-beta1","author":{"name":"Nebenan.de","email":"max@nebenan.de"},"license":"SEE LICENSE IN LICENSE FILE","_id":"nebenan-redux-tools@3.0.0-beta1","maintainers":[{"name":"suprmax","email":"max@degterev.me"}],"homepage":"https://nebenan.de/","bugs":{"url":"https://github.com/good-hood-gmbh/nebenan-redux-tools/issues"},"dist":{"shasum":"dc331d202486123ea7a4b4129b443ee02ce3b295","tarball":"https://registry.npmjs.org/nebenan-redux-tools/-/nebenan-redux-tools-3.0.0-beta1.tgz","fileCount":19,"integrity":"sha512-uPfZt05kFbfs5Slxs7ijNEYDHMNOj5cIG3oUZzYYFxrw3DSY+4DnoqkmEuFrvTMTRSU9udpPdJM/se1asKVzmQ==","signatures":[{"sig":"MEYCIQCVyXm0MDoRHO5am8CBk9JCw+wVC+MdzMawOHnw1V1GpwIhAO2msnckxAcVVrvlzFctxoOc6tBAtdmU5DQ7lIuWHbR4","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":26673,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJcN64rCRA9TVsSAnZWagAA2cIQAJfHlGJU7+MAV12E5r4P\nw8oZCju+Bsrlq8v9onfKKqRsffd16Kkoi6krFR1vUEi6DbuQXR78dm77ZdPu\nUQIEDsAM96ruH4uB8832WOH9Nm1TVsSWuGDrzP38OtAlAuKUpkGVTPMYP1Ue\n4hQcuneENEo0mKvrjrxLQVDy01tl9a/Yf6rF/OVH09194oAWq4x03QGVzpQm\nL5rg1Zm5y4fwh7r0JFkYtrv4DbLRJW6XsUy1cUfyKGo12GSLR4ayw+/T/SU1\nYCbWyVf7xCNA0pcp68VBV2y20nXlO2CyqOzDxHSRh/zXJ4hgex2me1FpYl87\nGQsOwsaJ3ceM6YL69umaRtRlgCoW/WGBOiqvv9Ik5TtJz3RxfUex27ugZiu0\ntzhKAh0efYd9gqcP5sAzFnuCyRftjaMfWQmDf1659+8FSVbmcLr0W6vjwaBA\nb+ieoe8oclImpSzL/vZfmyYnKyeime52my/r+U2qnIa/3UZChRCcjHzZmAeA\nLw94xt5ghN0KwlZFysY1LqMz+2u14TRQBSagmLaV/Bh0Ps8xhfPuedYbjZbk\nQthEgrsqsr3DWr2YGVxKvN05/HkkPqfny1boCHbYJsstSbD+v0jIgUzJNxvv\n42eWSK+MJzie+snKNDF/9eZC8lElQaNchtPvTemIL/LmfV0UONvf8dsO1EZd\nZLeD\r\n=220b\r\n-----END PGP SIGNATURE-----\r\n"},"engines":{"node":"^10.x.x"},"gitHead":"b731c6b1c4d48a05336abecaa7281fb5f77590e2","scripts":{"lint":"eslint --ext .es,.js ./","test":"npm run build:babel && TZ='GMT' mocha \"test/**/*.js\"","check":"npm test && npm run lint && echo \"\\033[0;32mReady to publish\\033[0m\"","clean":"rm -rf ./lib/ || exit 1","reinstall":"rm -rf node_modules package-lock.json && npm install","build:babel":"NODE_ENV=production babel src --out-dir lib --copy-files","lint:tofile":"eslint --ext .es,.js --no-color -o ./eslint-report.log ./","test:tofile":"npm run build:babel && TZ='GMT' mocha --no-colors -R spec \"test/**/*.js\" 2>&1 | tee test-report.log","prepublishOnly":"npm run check && npm run clean && npm run build:babel"},"_npmUser":{"name":"suprmax","email":"max@degterev.me"},"deprecated":"Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.","repository":{"url":"git+https://github.com/good-hood-gmbh/nebenan-redux-tools.git","type":"git"},"_npmVersion":"6.5.0","description":"A set of redux helpers","directories":{},"_nodeVersion":"10.14.2","dependencies":{"js-cookie":"^2.2.0"},"_hasShrinkwrap":false,"devDependencies":{"chai":"^4.2.0","axios":"^0.18.0","mocha":"^5.2.0","sinon":"^7.2.2","eslint":"^5.10.0","lodash":"^4.17.11","updeep":"^1.1.0","@babel/cli":"^7.1.0","proxyquire":"^2.1.0","@babel/core":"^7.1.0","@babel/runtime":"^7.2.0","@babel/preset-env":"^7.1.0","escape-string-regexp":"^1.0.5","eslint-plugin-import":"^2.14.0","local-storage-adapter":"^2.0.0","eslint-config-airbnb-base":"^13.1.0","@babel/plugin-transform-runtime":"^7.1.0","babel-plugin-add-module-exports":"^1.0.0","@babel/plugin-proposal-json-strings":"^7.0.0","@babel/plugin-transform-strict-mode":"^7.0.0"},"peerDependencies":{"axios":"^0.18.0","lodash":"^4.17.10","updeep":"^1.0.0","@babel/runtime":"^7.0.0","escape-string-regexp":"^1.0.5","local-storage-adapter":"^2.0.0"},"_npmOperationalInternal":{"tmp":"tmp/nebenan-redux-tools_3.0.0-beta1_1547152939123_0.883978033532989","host":"s3://npm-registry-packages"}},"3.0.0-beta2":{"name":"nebenan-redux-tools","version":"3.0.0-beta2","author":{"name":"Nebenan.de","email":"max@nebenan.de"},"license":"SEE LICENSE IN LICENSE FILE","_id":"nebenan-redux-tools@3.0.0-beta2","maintainers":[{"name":"suprmax","email":"max@degterev.me"}],"homepage":"https://nebenan.de/","bugs":{"url":"https://github.com/good-hood-gmbh/nebenan-redux-tools/issues"},"dist":{"shasum":"890e2034c818ac7b22cf2769468f95e84d4bfb45","tarball":"https://registry.npmjs.org/nebenan-redux-tools/-/nebenan-redux-tools-3.0.0-beta2.tgz","fileCount":19,"integrity":"sha512-37T9CRZg5086yWcMnW8C9XBr7QiWcyVr4cdGgDBaGXaFoqur7nP/l6yNO7iFiMmtTP0/psXWYU7vNXVlGmLroQ==","signatures":[{"sig":"MEUCIFXoy24aqXcdLnAeb7maFcmnyWAoARknLWCxXS/eg9I4AiEAywzcvbkNabinMaPgL5FxdfVcgL2qSoQVLirXogfhx6k=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":26561,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJcPMSPCRA9TVsSAnZWagAAdYYP/3HJ9IlRKXz4PkSMm9ze\nZvnIUsjGxe+tjJ5Wfk6slfES5GpNIFQFiEiotdnRpiOSX/HO6MGvU6yg+Ujo\ntLwYzOy68i/wCWqR0W1gipLaTwSRCInLQO8Zcycz9fmv1/lPgkHLkY0QeZkg\nb1hZofWfhTM6GrjCCgVKsJEgnaR9FHu2ncZqptn/zeiCAmIqQy4OAM5mhpre\niSdQIGM6Ih1fpN7jgrVi7CqEtLBPKe7xskF1/645aeNk8j5AiZm/iLZvbQ5/\nX5afW6CJFXGOExoESrA9uuKr4XtlpAZPWNH/Awh6g83hvg0tdX7GkS/uAQuN\n8K79DAD08+SKFU8y8+zKUtuIiShH6IYfF9q6uiS2UX6pjMJNQoi9k5d5weDw\nPxVLbHsWNYF9XDcoGKOU4H/fHW0Hymo/efFn88hB4XvigyzWmH46QV5e40UD\ncWAJuagCUK2GGYXfI2hAgtPDX7h7Aduegde5lxLs7+0x/znd0iLujJY8c/wA\nvjYoPs2Is61LhZ+k79wT0Fp2ofKxbKtXTL70XaDXO+Mb9+gWl7Gjk9sJFHWb\nx+5ZbMn5vkNx65vBXU8yKeQnXS/byhHwbYoReF2H4U9KKr3uyApHNeRkS7tM\nbHTRtuFRSDk+aBn61b9Wv34scSSBmObyh94rCnbtYyb8WFR2lnSZhqD0JMTt\nC66z\r\n=erHs\r\n-----END PGP SIGNATURE-----\r\n"},"engines":{"node":"^10.x.x"},"gitHead":"0aac8a21c2abcbb1cc5669b0e9da466e484d358d","scripts":{"lint":"eslint --ext .es,.js ./","test":"npm run build:babel && TZ='GMT' mocha \"test/**/*.js\"","check":"npm test && npm run lint && echo \"\\033[0;32mReady to publish\\033[0m\"","clean":"rm -rf ./lib/ || exit 1","reinstall":"rm -rf node_modules package-lock.json && npm install","build:babel":"NODE_ENV=production babel src --out-dir lib --copy-files","lint:tofile":"eslint --ext .es,.js --no-color -o ./eslint-report.log ./","test:tofile":"npm run build:babel && TZ='GMT' mocha --no-colors -R spec \"test/**/*.js\" 2>&1 | tee test-report.log","prepublishOnly":"npm run check && npm run clean && npm run build:babel"},"_npmUser":{"name":"suprmax","email":"max@degterev.me"},"deprecated":"Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.","repository":{"url":"git+https://github.com/good-hood-gmbh/nebenan-redux-tools.git","type":"git"},"_npmVersion":"6.4.1","description":"A set of redux helpers","directories":{},"_nodeVersion":"8.12.0","dependencies":{"js-cookie":"^2.2.0"},"_hasShrinkwrap":false,"devDependencies":{"chai":"^4.2.0","axios":"^0.18.0","mocha":"^5.2.0","sinon":"^7.2.2","eslint":"^5.10.0","lodash":"^4.17.11","updeep":"^1.1.0","@babel/cli":"^7.1.0","proxyquire":"^2.1.0","@babel/core":"^7.1.0","@babel/runtime":"^7.2.0","@babel/preset-env":"^7.1.0","escape-string-regexp":"^1.0.5","eslint-plugin-import":"^2.14.0","local-storage-adapter":"^2.0.0","eslint-config-airbnb-base":"^13.1.0","@babel/plugin-transform-runtime":"^7.1.0","babel-plugin-add-module-exports":"^1.0.0","@babel/plugin-proposal-json-strings":"^7.0.0","@babel/plugin-transform-strict-mode":"^7.0.0"},"peerDependencies":{"axios":"^0.18.0","lodash":"^4.17.10","updeep":"^1.0.0","@babel/runtime":"^7.0.0","escape-string-regexp":"^1.0.5","local-storage-adapter":"^2.0.0"},"_npmOperationalInternal":{"tmp":"tmp/nebenan-redux-tools_3.0.0-beta2_1547486350644_0.3360614229460641","host":"s3://npm-registry-packages"}},"3.0.0":{"name":"nebenan-redux-tools","version":"3.0.0","author":{"name":"Nebenan.de","email":"max@nebenan.de"},"license":"SEE LICENSE IN LICENSE FILE","_id":"nebenan-redux-tools@3.0.0","maintainers":[{"name":"suprmax","email":"max@degterev.me"}],"homepage":"https://nebenan.de/","bugs":{"url":"https://github.com/good-hood-gmbh/nebenan-redux-tools/issues"},"dist":{"shasum":"3d48c07f33fa61d383343a0cf4d3e55b8d5bbfe2","tarball":"https://registry.npmjs.org/nebenan-redux-tools/-/nebenan-redux-tools-3.0.0.tgz","fileCount":19,"integrity":"sha512-BflNx+CLSeyn+e5pNFVlatz/1fZCsoT45C7WVJMHngewrvPzAM91PmEOfLEFO3wYzGTeZml5EiVeagZMTMt3PA==","signatures":[{"sig":"MEYCIQD70CBfe7QU4TbdNOqRtqWMU2pjEnaWLVQG6jKz9KvLTAIhAOOG7bglBJMNvt0UVMSgv5Dl19JX0qzZ6Gr6gFcDeksK","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":26555,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJcPdk0CRA9TVsSAnZWagAAhAcQAJpoTpI71oN8mAIqwkaQ\nGu1X2O3E6ZOxOO9sotGa6Qp9CbP0wuySlwjLzt1skBl6rtocHmk7RYy08IhS\nlqdvF9xraoVP7PMu6fL0vsxD37UXgcC3rzqZ2gOnJZPqZ+eiFTsm4bBSLhxA\nR4FINwZhwaZ8h1v0zmcKTs5yBoPFrR/iH5dfCGT7+4sBEWLl+wFtJgg4ctL8\nKYr7LyPbZxD1wDv20S5bsiIhwYS4D/3bFEoil6279XZQIIrrOLirS3dJ/XB2\nubOpd6ifNNbJjdXDweN/q6Vmk4Cx1SgtnK695efSwuMnj5R7bwVBUpq/qvns\npvOIL5/PdVsKEpejALfRpTG0rxcj3zgbMjUPeZ9bVsXaNcXw9kflhYFW/URn\njteh7CFIxvaEnDILUGLCgNKm/0bOkJqZ467+rkVeg28QI9lry4OdapdPygc6\nqKrCSFB22dwGB9Ku5hf46kTJ94h4qE1YCHZS2X2uX1/kFGcRTSgGYWPKFPNg\nyjgMUGndNEYDTnVpgMKxqtPx2WwmXvr7MbS1t40wW92Co+WqSAyaxpsGPiPU\nfINUiUq4HdFMdQ/HYHqCXJpX7DmIQW2bpFRGhFRUEyHM63pymahVYQ7+OiWp\nlbd4MM67UoZguoo1pweBthWa++/Q6Um0pu0EhF2eTht7zt+U03rLUeatKpR6\n1uJk\r\n=gXNG\r\n-----END PGP SIGNATURE-----\r\n"},"engines":{"node":"^10.x.x"},"gitHead":"f35961a074fd76b05a9e847fa685aadc71d5095b","scripts":{"lint":"eslint --ext .es,.js ./","test":"npm run build:babel && TZ='GMT' mocha \"test/**/*.js\"","check":"npm test && npm run lint && echo \"\\033[0;32mReady to publish\\033[0m\"","clean":"rm -rf ./lib/ || exit 1","reinstall":"rm -rf node_modules package-lock.json && npm install","build:babel":"NODE_ENV=production babel src --out-dir lib --copy-files","lint:tofile":"eslint --ext .es,.js --no-color -o ./eslint-report.log ./","test:tofile":"npm run build:babel && TZ='GMT' mocha --no-colors -R spec \"test/**/*.js\" 2>&1 | tee test-report.log","prepublishOnly":"npm run check && npm run clean && npm run build:babel"},"_npmUser":{"name":"suprmax","email":"max@degterev.me"},"deprecated":"Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.","repository":{"url":"git+https://github.com/good-hood-gmbh/nebenan-redux-tools.git","type":"git"},"_npmVersion":"6.4.1","description":"A set of redux helpers","directories":{},"_nodeVersion":"8.12.0","dependencies":{"js-cookie":"^2.2.0"},"_hasShrinkwrap":false,"devDependencies":{"chai":"^4.2.0","axios":"^0.18.0","mocha":"^5.2.0","sinon":"^7.2.2","eslint":"^5.10.0","lodash":"^4.17.11","updeep":"^1.1.0","@babel/cli":"^7.1.0","proxyquire":"^2.1.0","@babel/core":"^7.1.0","@babel/runtime":"^7.2.0","@babel/preset-env":"^7.1.0","escape-string-regexp":"^1.0.5","eslint-plugin-import":"^2.14.0","local-storage-adapter":"^2.0.0","eslint-config-airbnb-base":"^13.1.0","@babel/plugin-transform-runtime":"^7.1.0","babel-plugin-add-module-exports":"^1.0.0","@babel/plugin-proposal-json-strings":"^7.0.0","@babel/plugin-transform-strict-mode":"^7.0.0"},"peerDependencies":{"axios":"^0.18.0","lodash":"^4.17.10","updeep":"^1.0.0","@babel/runtime":"^7.0.0","escape-string-regexp":"^1.0.5","local-storage-adapter":"^2.0.0"},"_npmOperationalInternal":{"tmp":"tmp/nebenan-redux-tools_3.0.0_1547557171568_0.9008931559679922","host":"s3://npm-registry-packages"}},"4.0.0":{"name":"nebenan-redux-tools","version":"4.0.0","author":{"name":"Nebenan.de","email":"max@nebenan.de"},"license":"SEE LICENSE IN LICENSE FILE","_id":"nebenan-redux-tools@4.0.0","maintainers":[{"name":"suprmax","email":"max@degterev.me"}],"homepage":"https://nebenan.de/","bugs":{"url":"https://github.com/good-hood-gmbh/nebenan-redux-tools/issues"},"dist":{"shasum":"f271e21fda8805caca894fd0e3cec1f1024a7f97","tarball":"https://registry.npmjs.org/nebenan-redux-tools/-/nebenan-redux-tools-4.0.0.tgz","fileCount":19,"integrity":"sha512-q/Q8sf82oUfE1L7n/dOFxvwqOaSLRMx9j9gS10Lim7z+PX+kPkeDC7Saq5otobQDdyvarzc9IXytP0PivuMjKw==","signatures":[{"sig":"MEQCIGJYa6LUxtZD2MgLq/+c9kr/tTPJPwuTbP8d64EyFBEpAiA5jKJE/kAodibVc6l+8b8we6VZFs3Ikpgu7oMefuK/Mg==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":26532,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJctdN6CRA9TVsSAnZWagAASOQP/jJv8lvVyYD7PMNlDR8g\nOmVwlHlcC734D62/QBvOFgOMLWP8dQSo3wvs1ILPu3KPO5CewGkwCZOiUqlH\nZNvinTH779NV3mxyfMCS8KN6e4EbLNWnLeZgWKJoGaG7HZIqITGAZraHxlzW\nnF27cauz+U0IcAKN7HHLVxdJIxyxTqwZ+XVhV5cpJOfPEoZ07BWaboSLztxA\nWVB/SpviRhaGC+ADnuf9Zg7PePbVHZB6LiJp4pa1i6ejxGGo+Q9P6tdrxdfz\na/nkHyhkKU4YYf3UuOVP3b5icgS5rpEfZNJNMA3TLMZAjx3HQ8BYHIKNMmPS\nDEts/JEfqqEPG2g1/r7vV3MxdVgV1ykrMOcoJxa6X6N4QZmotm8HsHVEcAJ5\nCNdxHqSyMOvdDzWejSO7L6bIARnpW1p2NFq3hNsPU8crD4MrvpzQf69Y9omM\ncJjmvU/9bSiM4I/Smd7S4ptQ35l4/IxGXk0zmsrI5Lnp7He+yw3Ldmyv+DRB\nqdl8HcHY7swfijhx1hhKRTYBxMn8s3TjKVuUGG5rJR5YcaRyRZxl3znOPKBe\nOie/YshTuVSlMHAsSs/2chMV5h2hBXIktwLqK0EUEmca52Njf3wCOOwWPCyD\nIfEP2jX7gnZ08SLo3NcR/Z0qcDH8DjGBVtopQQzgGHzCdOhmKqkdJTnG6p+3\nICGH\r\n=1+2l\r\n-----END PGP SIGNATURE-----\r\n"},"engines":{"node":"^10.x.x"},"gitHead":"c016973dd77fa74fdb45e74dd9498898cadaed57","scripts":{"lint":"eslint --ext .es,.js ./","test":"npm run build:babel && TZ='GMT' mocha \"test/**/*.js\"","check":"npm test && npm run lint && echo \"\\033[0;32mReady to publish\\033[0m\"","clean":"rm -rf ./lib/ || exit 1","reinstall":"rm -rf node_modules package-lock.json && npm install","build:babel":"NODE_ENV=production babel src --out-dir lib --copy-files","lint:tofile":"eslint --ext .es,.js --no-color -o ./eslint-report.log ./","test:tofile":"npm run build:babel && TZ='GMT' mocha --no-colors -R spec \"test/**/*.js\" 2>&1 | tee test-report.log","prepublishOnly":"npm run check && npm run clean && npm run build:babel"},"_npmUser":{"name":"suprmax","email":"max@degterev.me"},"deprecated":"Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.","repository":{"url":"git+https://github.com/good-hood-gmbh/nebenan-redux-tools.git","type":"git"},"_npmVersion":"6.9.0","description":"A set of redux helpers","directories":{},"_nodeVersion":"10.15.0","dependencies":{"js-cookie":"^2.2.0"},"_hasShrinkwrap":false,"devDependencies":{"qs":"^6.7.0","chai":"^4.2.0","axios":"^0.18.0","mocha":"^6.1.3","sinon":"^7.3.1","eslint":"^5.16.0","lodash":"^4.17.11","updeep":"^1.1.0","@babel/cli":"^7.4.3","proxyquire":"^2.1.0","@babel/core":"^7.4.3","@babel/runtime":"^7.4.3","@babel/preset-env":"^7.4.3","escape-string-regexp":"^1.0.5","eslint-plugin-import":"^2.17.1","local-storage-adapter":"^2.0.0","eslint-config-airbnb-base":"^13.1.0","@babel/plugin-transform-runtime":"^7.4.3","babel-plugin-add-module-exports":"^1.0.0","@babel/plugin-proposal-json-strings":"^7.0.0","@babel/plugin-transform-strict-mode":"^7.0.0"},"peerDependencies":{"qs":"^6.7.0","axios":"^0.18.0","lodash":"^4.17.10","updeep":"^1.0.0","@babel/runtime":"^7.0.0","escape-string-regexp":"^1.0.5","local-storage-adapter":"^2.0.0"},"_npmOperationalInternal":{"tmp":"tmp/nebenan-redux-tools_4.0.0_1555420026230_0.530611330605288","host":"s3://npm-registry-packages"}},"4.1.0":{"name":"nebenan-redux-tools","version":"4.1.0","author":{"name":"Nebenan.de","email":"max@nebenan.de"},"license":"SEE LICENSE IN LICENSE FILE","_id":"nebenan-redux-tools@4.1.0","maintainers":[{"name":"suprmax","email":"max@degterev.me"}],"homepage":"https://nebenan.de/","bugs":{"url":"https://github.com/good-hood-gmbh/nebenan-redux-tools/issues"},"dist":{"shasum":"df1f336ea8584e2941c73f2837fd75401780d99e","tarball":"https://registry.npmjs.org/nebenan-redux-tools/-/nebenan-redux-tools-4.1.0.tgz","fileCount":20,"integrity":"sha512-OiYIjYupoUmbTZVcRcohGIjBRLqJQabDGG2NKv/M0BbIXB26CTZiXATwQtk0JaNm1bHYKzn7xKTrtBZq7TrMwQ==","signatures":[{"sig":"MEUCIQDrzcJBUSID4KqVWNFjWaqdWNCIak4OVMwnRu8OACSf3gIgG/fSf9FPf2s3CDIqO4JxHs1FpD5WYl39DeJ5FeatQ6U=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":32809,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJct0VkCRA9TVsSAnZWagAAzjsP/0lPvboSDo4EQUt2TRnc\nRbNzdJwrYD5zJK8htEovKaX6J330wxv5D+JRjfi89PicR6wtMwnjtNLMywIg\nljezeJqBvTud5vAChbEJJ2P9RoXNva7v0eEOQUDtfffqKv7CAy2tnNokjZg2\nuu6C/5A+j9XZftQrDMS7bB8EnzjvF2TpN7YBlgsmgLWhOYIeMHOuTa0wsXKY\n8BYBLpQoQBbtvjItf9mlSb3IwL0Ph4FFv+dB/gBpdU5jPdKyUNwIkb26fkKh\nYGqz0EAMnyyUKZXptSIH4eiEmSQwckSeZrArF3YtMS+A+7F+D8DR3vmV7ygE\niNkyTYAFmKWHZ4FeQ7CPRNAuAi5liSHNfcTXm2Iu2bsAud8gif5jw+KY49mw\nj3QZJQAFHwC/xejmoO2v0EJTtg+2pX4wA31t4GTQ3urbCwWtcTj/QMfuZLYO\nKQInoE8a2Mns73PvTkN6p8BVllHGBr2Sw2kYE0IzuLoASU5cFoneDWZgwKkM\nJOvEby92vSySz2/v9uRIUqHyVybjFHRYNWDA357g514ILq+ipOKiQ3ruif5B\n1vaTuyuxt4Wy+uev2tqod1yT6oIk43ZNNobFQ6wLaI1mqupaCoBBYr36G2Ub\nfQcLemyPf+HNBp4IlfTxUQYoNWN1tU63fQj6mlFwMRVd9HAOSuFYjYbnIFw9\n64HT\r\n=Kcro\r\n-----END PGP SIGNATURE-----\r\n"},"engines":{"node":"^10.x.x"},"gitHead":"c2f0eca1d9e530ab214933b032ab5189d55abfed","scripts":{"lint":"eslint --ext .es,.js ./","test":"npm run build:babel && TZ='GMT' mocha \"test/**/*.js\"","check":"npm test && npm run lint && echo \"\\033[0;32mReady to publish\\033[0m\"","clean":"rm -rf ./lib/ || exit 1","reinstall":"rm -rf node_modules package-lock.json && npm install","build:babel":"NODE_ENV=production babel src --out-dir lib --copy-files","lint:tofile":"eslint --ext .es,.js --no-color -o ./eslint-report.log ./","test:tofile":"npm run build:babel && TZ='GMT' mocha --no-colors -R spec \"test/**/*.js\" 2>&1 | tee test-report.log","prepublishOnly":"npm run check && npm run clean && npm run build:babel"},"_npmUser":{"name":"suprmax","email":"max@degterev.me"},"deprecated":"Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.","repository":{"url":"git+https://github.com/good-hood-gmbh/nebenan-redux-tools.git","type":"git"},"_npmVersion":"6.9.0","description":"A set of redux helpers","directories":{},"_nodeVersion":"8.12.0","dependencies":{"js-cookie":"^2.2.0"},"_hasShrinkwrap":false,"devDependencies":{"qs":"^6.7.0","chai":"^4.2.0","axios":"^0.18.0","mocha":"^6.1.3","sinon":"^7.3.1","eslint":"^5.16.0","lodash":"^4.17.11","updeep":"^1.1.0","@babel/cli":"^7.4.3","proxyquire":"^2.1.0","@babel/core":"^7.4.3","@babel/runtime":"^7.4.3","@babel/preset-env":"^7.4.3","escape-string-regexp":"^2.0.0","eslint-plugin-import":"^2.17.1","local-storage-adapter":"^2.0.0","eslint-config-airbnb-base":"^13.1.0","@babel/plugin-transform-runtime":"^7.4.3","babel-plugin-add-module-exports":"^1.0.0","@babel/plugin-proposal-json-strings":"^7.0.0","@babel/plugin-transform-strict-mode":"^7.0.0"},"peerDependencies":{"qs":"^6.7.0","axios":"^0.18.0","lodash":"^4.17.10","updeep":"^1.0.0","@babel/runtime":"^7.0.0","escape-string-regexp":"^2.0.0","local-storage-adapter":"^2.0.0"},"_npmOperationalInternal":{"tmp":"tmp/nebenan-redux-tools_4.1.0_1555514724214_0.7503325355179082","host":"s3://npm-registry-packages"}},"4.2.0":{"name":"nebenan-redux-tools","version":"4.2.0","author":{"name":"Nebenan.de","email":"max@nebenan.de"},"license":"SEE LICENSE IN LICENSE FILE","_id":"nebenan-redux-tools@4.2.0","maintainers":[{"name":"suprmax","email":"max@degterev.me"}],"homepage":"https://nebenan.de/","bugs":{"url":"https://github.com/good-hood-gmbh/nebenan-redux-tools/issues"},"dist":{"shasum":"2ce4bc087e55317cf731b03e8ebff3b155d14b65","tarball":"https://registry.npmjs.org/nebenan-redux-tools/-/nebenan-redux-tools-4.2.0.tgz","fileCount":20,"integrity":"sha512-hQQn+IzgKU+Wy8WinJYBGFn2yNQ4joB122+9B5cU3bxl6NcyJ5O7LeB7h9A/k6tG/9N1iB0QGZwxNhNoaNUlrQ==","signatures":[{"sig":"MEUCIDjikZbPf2lVJe0U6wT8fGRoALU0n2+QoBvpbTT3Uqv/AiEApcFp9twUfqZJuoiDQ6k4MNvwvKev9wurrKEpxtGUZ88=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":32809,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJct0svCRA9TVsSAnZWagAA2zQP/24fJCssdTZ06Wr7paX8\nnafAQFQKjFjQkfnoGETKG8jnZXPC4suSdLjxwWwQBbVIU1HKSKTL00J2rNKg\nrswFYIjIOjx/L0G9P055fUW1q2Yq2pgl3Dj2wCmCLzBA/jiLJ1T+Hmis1/Yi\nL8krsh51dUtzBe7Zsgi2r5iDmrlyt6BlPzpC5iAdSQ9x5fC7BbsCPCUAdtv/\nqq0nmv2UpJ9EhTcypdKDSU72DJJEaWsBo4dDQFSqNsaL5yk/Y9JD5PPNzZ/T\nsyBqB6md8cGSAETK5hZnKwNwX9oSFuXRIL7JV1NZ7vZIYQPDOa+W/QxLfZZL\nIqW1nUc99DtjZEPTDhWHJG3cWRnwbODpUtKeH7mAJ3TfdDyijH05ELtMCHqA\ninw3kmB4RZdqjKoKUk94HczB/JwuHeVitjOSKCJ7JpysLCbD5FbizCVHjVvj\nUjAgWMwPuhUS0WO3kslywxjiAQPYZYfhJFobTT9wTn0cbnVsbikh5LU158Xv\nLnl2vXPA/VatQyb3KjxRNZMWjX6gyLomnAOzh5m4wdXISDouP7I51oaI788/\n2ngr7Ez8TA9mN/ZCK6MaTSBvXIpWGjeyG00HWfRQzrG04Qrpvkg28W+Oqs/Z\na5PhfwAt2TrmESZ71lbCMmL4gIou7WusMSD/OH/L+R77FcSUihRZ9+Jfpdq8\nEvJ9\r\n=WFdr\r\n-----END PGP SIGNATURE-----\r\n"},"engines":{"node":"^10.x.x"},"gitHead":"0b58a3e4ed8fa7e05428ccb3ad948ecc830590f2","scripts":{"lint":"eslint --ext .es,.js ./","test":"npm run build:babel && TZ='GMT' mocha \"test/**/*.js\"","check":"npm test && npm run lint && echo \"\\033[0;32mReady to publish\\033[0m\"","clean":"rm -rf ./lib/ || exit 1","reinstall":"rm -rf node_modules package-lock.json && npm install","build:babel":"NODE_ENV=production babel src --out-dir lib --copy-files","lint:tofile":"eslint --ext .es,.js --no-color -o ./eslint-report.log ./","test:tofile":"npm run build:babel && TZ='GMT' mocha --no-colors -R spec \"test/**/*.js\" 2>&1 | tee test-report.log","prepublishOnly":"npm run check && npm run clean && npm run build:babel"},"_npmUser":{"name":"suprmax","email":"max@degterev.me"},"deprecated":"Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.","repository":{"url":"git+https://github.com/good-hood-gmbh/nebenan-redux-tools.git","type":"git"},"_npmVersion":"6.9.0","description":"A set of redux helpers","directories":{},"_nodeVersion":"8.12.0","dependencies":{"js-cookie":"^2.2.0"},"_hasShrinkwrap":false,"devDependencies":{"qs":"^6.7.0","chai":"^4.2.0","axios":"^0.18.0","mocha":"^6.1.3","sinon":"^7.3.1","eslint":"^5.16.0","lodash":"^4.17.11","updeep":"^1.1.0","@babel/cli":"^7.4.3","proxyquire":"^2.1.0","@babel/core":"^7.4.3","@babel/runtime":"^7.4.3","@babel/preset-env":"^7.4.3","escape-string-regexp":"^1.0.5","eslint-plugin-import":"^2.17.1","local-storage-adapter":"^2.0.0","eslint-config-airbnb-base":"^13.1.0","@babel/plugin-transform-runtime":"^7.4.3","babel-plugin-add-module-exports":"^1.0.0","@babel/plugin-proposal-json-strings":"^7.0.0","@babel/plugin-transform-strict-mode":"^7.0.0"},"peerDependencies":{"qs":"^6.7.0","axios":"^0.18.0","lodash":"^4.17.10","updeep":"^1.0.0","@babel/runtime":"^7.0.0","escape-string-regexp":"^1.0.5","local-storage-adapter":"^2.0.0"},"_npmOperationalInternal":{"tmp":"tmp/nebenan-redux-tools_4.2.0_1555516206845_0.9136817401451356","host":"s3://npm-registry-packages"}},"4.3.0":{"name":"nebenan-redux-tools","version":"4.3.0","author":{"name":"Nebenan.de","email":"max@nebenan.de"},"license":"SEE LICENSE IN LICENSE FILE","_id":"nebenan-redux-tools@4.3.0","maintainers":[{"name":"suprmax","email":"max@degterev.me"}],"homepage":"https://nebenan.de/","bugs":{"url":"https://github.com/good-hood-gmbh/nebenan-redux-tools/issues"},"dist":{"shasum":"abb468ab77074e7c15a07eeeb76be784986b2e75","tarball":"https://registry.npmjs.org/nebenan-redux-tools/-/nebenan-redux-tools-4.3.0.tgz","fileCount":20,"integrity":"sha512-MN2xhvkr5lPgzPUtPwA0bai6g3vIS0GJ7n8QQ//o7TI8e5lM2+VJCvwlSWKfvrbDTZUUQobVIawE39e9CMiK3g==","signatures":[{"sig":"MEQCIAfzJHFBDuxQ2uVGLJ2hYAgrW9EWT6UT99NG6MaZqvvBAiAGgz2N0rTg8uoZXOWDkdUXukmnz81gomfuuybt6gcEqA==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":32809,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJcvzx8CRA9TVsSAnZWagAAi+cQAItjonBr2Li2Kdar9Ssq\nA+1uqJwynxQV6ta/ZK7RMcJlgfThxQZGYSt8JOoVrATNEsrTqCNThulSHNMK\nDsCzEYruprNge2hZWVOAOKHSBhyFK5p3Msc4o0g+IhWP83pZNaM/5JeYeGG2\n8BiVmLt1s+PmNrjCb570ELkikRWGV74mBkaNQ+iqBPrwjXWDWSrfHRv6oG+v\n4Gf+n6wWspOmzUlU2SnZCIFajZg6AlpSOZ5xjpH2t/hw4/B62yA1/KDuluXE\nFLxrC8jbqEMOiTDI+FAA1Zi9l0a+cfIIEiVISvCViu8IyQe/4ftF48WkhNO7\nf3eGNrsBB5O1zyUrk5E/DkD/JD3DEGO5T4wtCIxmbl/SFlVA7NAmm0VzFBYj\ng8e18WfVT/iiLWV5SqeRgSuJO601VnZZKm+FPpKL+DAg/F7l2SsOmv1JzfWN\nLCTpj8l8eVXaBGlXA6qDzvwf1eAG9HVKpYafnxRn4FiOsAvitDqF+/w9GAYP\nrgjNnCqQMKzbO1+yQPtVY9tQmXvJFdbS4MEaM3u9+koX8Gkvld1U9wUm2OOD\nZrNFUPgjaQsC2zOYMe0D6qlGIGYldUfvZl9HmVkD2XvTjj2FD5mi4+7tNYrZ\n0hbFIBPYwuqpApc9AGhqKj4gM4soGnHUwPzT5dXJjoi10+G1vl+avPpZqi3S\ntGwR\r\n=ORai\r\n-----END PGP SIGNATURE-----\r\n"},"engines":{"node":"^10.x.x"},"gitHead":"53d537619b2c62ed7882ef6a7fb27d18db610935","scripts":{"lint":"eslint --ext .es,.js ./","test":"npm run build:babel && TZ='GMT' mocha \"test/**/*.js\"","check":"npm test && npm run lint && echo \"\\033[0;32mReady to publish\\033[0m\"","clean":"rm -rf ./lib/ || exit 1","reinstall":"rm -rf node_modules package-lock.json && npm install","build:babel":"NODE_ENV=production babel src --out-dir lib --copy-files","lint:tofile":"eslint --ext .es,.js --no-color -o ./eslint-report.log ./","test:tofile":"npm run build:babel && TZ='GMT' mocha --no-colors -R spec \"test/**/*.js\" 2>&1 | tee test-report.log","prepublishOnly":"npm run check && npm run clean && npm run build:babel"},"_npmUser":{"name":"suprmax","email":"max@degterev.me"},"deprecated":"Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.","repository":{"url":"git+https://github.com/good-hood-gmbh/nebenan-redux-tools.git","type":"git"},"_npmVersion":"6.9.0","description":"A set of redux helpers","directories":{},"_nodeVersion":"8.12.0","dependencies":{"js-cookie":"^2.2.0"},"_hasShrinkwrap":false,"devDependencies":{"qs":"^6.7.0","chai":"^4.2.0","axios":"^0.18.0","mocha":"^6.1.4","sinon":"^7.3.2","eslint":"^5.16.0","lodash":"^4.17.11","updeep":"^1.1.0","@babel/cli":"^7.4.3","proxyquire":"^2.1.0","@babel/core":"^7.4.3","@babel/runtime":"^7.4.3","@babel/preset-env":"^7.4.3","escape-string-regexp":"^2.0.0","eslint-plugin-import":"^2.17.1","local-storage-adapter":"^2.0.0","eslint-config-airbnb-base":"^13.1.0","@babel/plugin-transform-runtime":"^7.4.3","babel-plugin-add-module-exports":"^1.0.2","@babel/plugin-proposal-json-strings":"^7.0.0","@babel/plugin-transform-strict-mode":"^7.0.0"},"peerDependencies":{"qs":"^6.7.0","axios":"^0.18.0","lodash":"^4.17.10","updeep":"^1.0.0","@babel/runtime":"^7.0.0","escape-string-regexp":"^2.0.0","local-storage-adapter":"^2.0.0"},"_npmOperationalInternal":{"tmp":"tmp/nebenan-redux-tools_4.3.0_1556036731974_0.39453594776161194","host":"s3://npm-registry-packages"}},"4.3.1":{"name":"nebenan-redux-tools","version":"4.3.1","author":{"name":"Nebenan.de","email":"max@nebenan.de"},"license":"SEE LICENSE IN LICENSE FILE","_id":"nebenan-redux-tools@4.3.1","maintainers":[{"name":"suprmax","email":"max@degterev.me"}],"homepage":"https://nebenan.de/","bugs":{"url":"https://github.com/good-hood-gmbh/nebenan-redux-tools/issues"},"dist":{"shasum":"faac2e590e6d370a1e7900204a1f3e2b68a2f119","tarball":"https://registry.npmjs.org/nebenan-redux-tools/-/nebenan-redux-tools-4.3.1.tgz","fileCount":19,"integrity":"sha512-xpp/rPHNCS+5OPn0yr+3kMXs1l7HeRg/bo30oubQ/ebSSu0ju7JRWR5gg0WVXCHZnitjJkH/nficVY+2DHy0Ng==","signatures":[{"sig":"MEYCIQCknM5UauObkCKjGl2i+7WxlXF33mi+o4c311nmRoAiJgIhAJXFODN6M7twF2Ej+fDtVLiu8EcOwuWze+TzUT/Q3QK8","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":26659,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJcwvmkCRA9TVsSAnZWagAAHz0P/A3Zuf6stSzlkqN3YTqt\nE2sm5adFv4MWap3sd3fHeb4cjpXPsJUWzC60eDVxc7raURhtUT9Ar3j+Inoy\nXFWXD91PHSRGdmZUs/L6et3q5jD2UGLMYtCWNLq6XTvol8XAHlo2EEqFXlXg\n1Yl30kCjRkD0VB100Xd/HfDA9JTBlfnYWASP/B59dZaxZsnR6ecJgx5zdYlo\n7zWsuSSp64lE5zY/BWyzu0tddf4oT82Biimk0mDeUqyhbKzg/eO0z4d86yuX\nSzHAeAHXlx4yLKrb9a1CvQd31SnBaMjkRll/5kcLrmWEj1/xs0UiAG4abiSY\nHLlSFXRnobxoEm+8xLIyQDNTtAGwz32JTrUD0M+VAtfqZKYoIskcTcV7b2o2\niUDccS9WrysKS3uJK8bYHADGUzj2ZQNWKQpaX07dJy+HNUaZEs57DuXFEOlk\nrwuYEitW1U8PXH5JDB56rS5pCXyaY2hhGe1zdiFGSW1OMSokggEc7+2+kolv\nKckzxXmv6V0HAJ1zdaN+t41WSNYI6O83vZtvv/r8Od69nL8Pb4KPnon4LdFC\nafmtE6saa5nC7NXvvagDSNvoloNz4Xq+ZTAzmNx+lssi1InigyUDAGdQmPJq\niiB3wIvmKEvEniOyMWIvCTM2dmcevRJXkOD+S9qqJpU7S2OWzXNksuKdExFY\nKY8g\r\n=ZK7p\r\n-----END PGP SIGNATURE-----\r\n"},"engines":{"node":"^10.x.x"},"gitHead":"bf92ff9888629e5a29ccbcc4e3835ab6315766a7","scripts":{"lint":"eslint --ext .es,.js ./","test":"npm run build:babel && TZ='GMT' mocha \"test/**/*.js\"","check":"npm test && npm run lint && echo \"\\033[0;32mReady to publish\\033[0m\"","clean":"rm -rf ./lib/ || exit 1","reinstall":"rm -rf node_modules package-lock.json && npm install","build:babel":"NODE_ENV=production babel src --out-dir lib --copy-files","lint:tofile":"eslint --ext .es,.js --no-color -o ./eslint-report.log ./","test:tofile":"npm run build:babel && TZ='GMT' mocha --no-colors -R spec \"test/**/*.js\" 2>&1 | tee test-report.log","prepublishOnly":"npm run check && npm run clean && npm run build:babel"},"_npmUser":{"name":"suprmax","email":"max@degterev.me"},"deprecated":"Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.","repository":{"url":"git+https://github.com/good-hood-gmbh/nebenan-redux-tools.git","type":"git"},"_npmVersion":"6.9.0","description":"A set of redux helpers","directories":{},"_nodeVersion":"10.15.0","dependencies":{"js-cookie":"^2.2.0"},"_hasShrinkwrap":false,"devDependencies":{"qs":"^6.7.0","chai":"^4.2.0","axios":"^0.18.0","mocha":"^6.1.4","sinon":"^7.3.2","eslint":"^5.16.0","lodash":"^4.17.11","updeep":"^1.1.0","@babel/cli":"^7.4.3","proxyquire":"^2.1.0","@babel/core":"^7.4.3","@babel/runtime":"^7.4.3","@babel/preset-env":"^7.4.3","escape-string-regexp":"1.0.5","eslint-plugin-import":"^2.17.1","local-storage-adapter":"^2.0.0","eslint-config-airbnb-base":"^13.1.0","@babel/plugin-transform-runtime":"^7.4.3","babel-plugin-add-module-exports":"^1.0.2","@babel/plugin-proposal-json-strings":"^7.0.0","@babel/plugin-transform-strict-mode":"^7.0.0"},"peerDependencies":{"qs":"^6.7.0","axios":"^0.18.0","lodash":"^4.17.10","updeep":"^1.0.0","@babel/runtime":"^7.0.0","escape-string-regexp":"1.0.5","local-storage-adapter":"^2.0.0"},"_npmOperationalInternal":{"tmp":"tmp/nebenan-redux-tools_4.3.1_1556281764350_0.4522183630624481","host":"s3://npm-registry-packages"}},"4.4.0":{"name":"nebenan-redux-tools","version":"4.4.0","author":{"name":"Nebenan.de","email":"max@nebenan.de"},"license":"SEE LICENSE IN LICENSE FILE","_id":"nebenan-redux-tools@4.4.0","maintainers":[{"name":"suprmax","email":"max@degterev.me"}],"homepage":"https://nebenan.de/","bugs":{"url":"https://github.com/good-hood-gmbh/nebenan-redux-tools/issues"},"dist":{"shasum":"b7d4936122eb82ce6eb57936c4b29168b398baa0","tarball":"https://registry.npmjs.org/nebenan-redux-tools/-/nebenan-redux-tools-4.4.0.tgz","fileCount":19,"integrity":"sha512-LnHoGddpxgM6IoVmv6SwEDUtZr4ec2ZQnxSXaxIYt68G9JGMus1bEv2GGRfD8TerEYkVk+0wSSY2ZVz7rHS2hg==","signatures":[{"sig":"MEQCICTXsWioT/simExFw7XpUpvd0s4KoMWWQrb7wx+4TFmoAiA28l2LdOwLELA/Gpv7vxKGR81c7ZWp0tBhfWBL4udwcw==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":26659,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJc9+4QCRA9TVsSAnZWagAA6kYQAIb0ysDer5RUd/TKNJff\nlK6p2TPjuZQv43SI7WbyQc3VDYtWHe0jCFKqpZY9PjuumbV5oom5a037LxV8\nem1bPUdBaSfhK9/AuWfhECulWP/RDyxHxkSY+a4PzAoRi6I/qf5CwqI8u3bC\nBuPECK32mYYZs8JFAYmsp3TXc5ttnJoZd59aAYE2hg5HCoD/poofLbdiBNfz\nl2vtW5nelnT7FoM/uUL0SqQsA0n5Sf9/RuM37CmgwGs7K1/HvaT/nKrkED5+\nt/3/5qNFhSUkKVAUchbm8hzcx4Ft5mRwIOIpfAbwGpBTzwgjO8DAhKwEWBsH\nbpZwrpEKfH0zH6PVojx0+ZENvoTSG6plolfxuoHuBIFA4Eva4kYIOm2S4M2L\n0bX8dFFZ8rm17/eLfy/hi24p7KRRygOC79oJd7Q/UnuXppxt3XTWOFviyzEN\nPicl5qqb2UfmACyzBmGSX20uyT/xQAO3ng4CrtrynVmV7j2XAgTJs2gCb6cU\nzs5ghP79+JtnUgUBPri594Lfxf/fPHI0rwm+tnkwrSZ9DSyJBCuwKiXeDqEI\nBNo5bW5pqbffj0P3gIR6cx8Eh13svMfLUg5aVaj4edqXipk6saqyNdfkx2Ix\nqbR0mBpsob3kpW5Dxo2O9N1eZhzPfpa/hRWbs4/kz9xIRaJtkl564YVTdHig\nCwzj\r\n=mK/w\r\n-----END PGP SIGNATURE-----\r\n"},"engines":{"node":"^10.x.x"},"gitHead":"ecdccdc8143b909633403e422a74d1e6341abf6d","scripts":{"lint":"eslint --ext .es,.js ./","test":"npm run build:babel && TZ='GMT' mocha \"test/**/*.js\"","check":"npm test && npm run lint && echo \"\\033[0;32mReady to publish\\033[0m\"","clean":"rm -rf ./lib/ || exit 1","reinstall":"rm -rf node_modules package-lock.json && npm install","build:babel":"NODE_ENV=production babel src --out-dir lib --copy-files","lint:tofile":"eslint --ext .es,.js --no-color -o ./eslint-report.log ./","test:tofile":"npm run build:babel && TZ='GMT' mocha --no-colors -R spec \"test/**/*.js\" 2>&1 | tee test-report.log","prepublishOnly":"npm run check && npm run clean && npm run build:babel"},"_npmUser":{"name":"suprmax","email":"max@degterev.me"},"deprecated":"Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.","repository":{"url":"git+https://github.com/good-hood-gmbh/nebenan-redux-tools.git","type":"git"},"_npmVersion":"6.9.0","description":"A set of redux helpers","directories":{},"_nodeVersion":"10.15.0","dependencies":{"js-cookie":"^2.2.0"},"_hasShrinkwrap":false,"devDependencies":{"qs":"^6.7.0","chai":"^4.2.0","axios":"^0.19.0","mocha":"^6.1.4","sinon":"^7.3.2","eslint":"^5.16.0","lodash":"^4.17.11","updeep":"^1.1.0","@babel/cli":"^7.4.4","proxyquire":"^2.1.0","@babel/core":"^7.4.5","@babel/runtime":"^7.4.5","@babel/preset-env":"^7.4.5","escape-string-regexp":"1.0.5","eslint-plugin-import":"^2.17.3","local-storage-adapter":"^2.0.0","eslint-config-airbnb-base":"^13.1.0","@babel/plugin-transform-runtime":"^7.4.4","babel-plugin-add-module-exports":"^1.0.2","@babel/plugin-proposal-json-strings":"^7.0.0","@babel/plugin-transform-strict-mode":"^7.0.0"},"peerDependencies":{"qs":"^6.7.0","axios":"^0.19.0","lodash":"^4.17.10","updeep":"^1.0.0","@babel/runtime":"^7.0.0","escape-string-regexp":"1.0.5","local-storage-adapter":"^2.0.0"},"_npmOperationalInternal":{"tmp":"tmp/nebenan-redux-tools_4.4.0_1559752207826_0.5005597567605837","host":"s3://npm-registry-packages"}},"4.4.1":{"name":"nebenan-redux-tools","version":"4.4.1","author":{"name":"Nebenan.de","email":"max@nebenan.de"},"license":"SEE LICENSE IN LICENSE FILE","_id":"nebenan-redux-tools@4.4.1","maintainers":[{"name":"suprmax","email":"max@degterev.me"}],"homepage":"https://nebenan.de/","bugs":{"url":"https://github.com/good-hood-gmbh/nebenan-redux-tools/issues"},"dist":{"shasum":"13022b504d2133501941529414432adebbf7534e","tarball":"https://registry.npmjs.org/nebenan-redux-tools/-/nebenan-redux-tools-4.4.1.tgz","fileCount":19,"integrity":"sha512-Qx6mMLMPnG+iKjw4ETr/v5fXwdHFiXbOxWw6zIePdsBkzPVw9f2OuwHLHAXOdHY8u2YiY0CEtx6e0dVEO+VVMA==","signatures":[{"sig":"MEYCIQCOn9M4zPYtktn50YZ4/UhxXhE8Sk2fDX8HZCG7qOKqaAIhAPC0AO9R1psaRsa2fGA3iK9ht7ITbHGYH/Lc9U9P0BFC","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":29175,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdVX7cCRA9TVsSAnZWagAAnX0QAKGDoUQqslg+gxpgNi3i\n0oHlcGhga+WUSNLjNDK0vxsyd2/kY5dLMKityojnbsKggZn3jO6HsFPWOUyq\n9NfX8zZhIapK8phklRFL2w0TmNl1FPWN1lccyFD2OREuxn5kj6Qf/kmCrD4O\n6HbmeNA/fo7ghtOpIUNPYHNoVn+GYcE2rfCoPs/3c0Rc0MK/llbAuyZmjcLR\nG+7/eU32tnFjfKkesJgFQvtnodtcUC3ncw+OsjTQvl3ttOHSwHQOP4u8Tvu/\nOZ+5wik0Fx4Mn9mWQirF8aj7Li2XgC7g1ik9jQKMGBWjOPs80WYvpJjQNrvf\nR4OEg0Abgbj6KcEBFV6voCj83lJQrwVCxHq20gLAUWJeFOsJkznrnBdZYJCo\nxcRE7fHXp1jxeQMg9FZ05HmCTghY96f1X1hkKJcKMdl8brZKuxExV3mOD2ZQ\nd9kxpIwl9w88+UDPUsiY62EsHDbA13i40qHNpOFbKgwl7KcKGekqmj9oJL+k\n8/7bIDQwqaz3Gxa+fz96PRdhbloi56aiGvQAOHpHiBO3KiZTjak7mfjHxPK9\npY40BBe5GLG25wB/bSaR401xbiQsN3iVl9xG3eLhx4sc73LsZ7oibnZJYVhv\nCWSWmq5BLh6Yfutc/7AB/C+6Is5Tdzzzt6GuMedrE+tYz80kBisAgBb+eT52\n8mos\r\n=cOpk\r\n-----END PGP SIGNATURE-----\r\n"},"engines":{"node":"^10.x.x"},"gitHead":"67716bea112a96bbe0f8a97a05562f3129cfc878","scripts":{"lint":"eslint --ext .es,.js ./","test":"npm run build:babel && TZ='GMT' mocha \"test/**/*.js\"","check":"npm test && npm run lint && echo \"\\033[0;32mReady to publish\\033[0m\"","clean":"rm -rf ./lib/ || exit 1","reinstall":"rm -rf node_modules package-lock.json && npm install","build:babel":"NODE_ENV=production babel src --out-dir lib --copy-files","lint:tofile":"eslint --ext .es,.js --no-color -o ./eslint-report.log ./","test:tofile":"npm run build:babel && TZ='GMT' mocha --no-colors -R spec \"test/**/*.js\" 2>&1 | tee test-report.log","prepublishOnly":"npm run check && npm run clean && npm run build:babel"},"_npmUser":{"name":"suprmax","email":"max@degterev.me"},"deprecated":"Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.","repository":{"url":"git+https://github.com/good-hood-gmbh/nebenan-redux-tools.git","type":"git"},"_npmVersion":"6.10.3","description":"A set of redux helpers","directories":{},"_nodeVersion":"10.16.0","dependencies":{"js-cookie":"^2.2.1"},"_hasShrinkwrap":false,"devDependencies":{"qs":"^6.7.0","chai":"^4.2.0","axios":"^0.19.0","mocha":"^6.2.0","sinon":"^7.4.1","eslint":"^6.1.0","lodash":"^4.17.15","updeep":"^1.1.0","@babel/cli":"^7.5.5","proxyquire":"^2.1.3","@babel/core":"^7.5.5","@babel/runtime":"^7.5.5","@babel/preset-env":"^7.5.5","escape-string-regexp":"1.0.5","eslint-plugin-import":"^2.18.2","local-storage-adapter":"^2.0.0","eslint-config-airbnb-base":"^14.0.0","@babel/plugin-transform-runtime":"^7.5.5","babel-plugin-add-module-exports":"^1.0.2","@babel/plugin-proposal-json-strings":"^7.0.0","@babel/plugin-transform-strict-mode":"^7.0.0"},"peerDependencies":{"qs":"^6.7.0","axios":"^0.19.0","lodash":"^4.17.15","updeep":"^1.1.0","@babel/runtime":"^7.5.5","escape-string-regexp":"1.0.5","local-storage-adapter":"^2.0.0"},"_npmOperationalInternal":{"tmp":"tmp/nebenan-redux-tools_4.4.1_1565884123944_0.4644145016601784","host":"s3://npm-registry-packages"}},"4.5.0":{"name":"nebenan-redux-tools","version":"4.5.0","author":{"name":"Nebenan.de","email":"max@nebenan.de"},"license":"SEE LICENSE IN LICENSE FILE","_id":"nebenan-redux-tools@4.5.0","maintainers":[{"name":"suprmax","email":"max@degterev.me"}],"homepage":"https://nebenan.de/","bugs":{"url":"https://github.com/good-hood-gmbh/nebenan-redux-tools/issues"},"dist":{"shasum":"0532b53e576541363ed9972c01f7a4cc3c88c4fc","tarball":"https://registry.npmjs.org/nebenan-redux-tools/-/nebenan-redux-tools-4.5.0.tgz","fileCount":19,"integrity":"sha512-9FnVlq0opQp5RG09ti0GOTihCHSuIGiNR0EOmn8wcAozu4pS8exOi4lMA7WGkliQg1p04rFXHgkZ//MI2LJ+SQ==","signatures":[{"sig":"MEUCIQDfol0NoHxGTMCU5b51Jv/9ByX6GWGmwcvDUSh/5CoRFgIgbm7KOgAp/Q1bufNbaj+KfZU0NRriSccDrteeDw0g1gw=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":29407,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdZnihCRA9TVsSAnZWagAA3noP/2VfJckOdjZbtEKzaq6E\nILQM6gp2OnDvg3KobpOZHeAK8XNjhRg+4JIiMocpjzPamlzg0tnnQSDH2Wni\n1GkUQSJQtB8OYMluaw7/0Gj949y8qV8jxvf17VbhmMqWOOu4Px7KCz9WaTB0\nWJklijNPtHFf6HLDVRJCnVMiNmCWWg2pROciuv4BI/sQk77w2g2rRISiY0HI\ndeBhCCyKiX+EA/2jeks+/yQlOCSy4JtLFvvPkOLvrtAecGghIVHtOh7DDx69\nNlRLUI2IB63j90zTsOCZa6ianMZiF/mNcYhwXf8XY5M4XUtFCcMyQ4XZp/Zw\nsG7M94Eih4xU/5EDzcYnv7hCdqNpsvyDvdO3Ge+d9RLpfUWU9KP1or/9Tw1L\nWthzZXL48XCDUVPu5o7/DlFnq7Vx0TuNwLu4sSBM1yMuij6dp3wmPfv0y0Wz\n312eaFrfJ4w1zWC4mBSp9rmUW0J20hZlM5tgIpJpsaACO8A33/VV7Q6AE0+z\n+I1vvZLVCVZeC3JH3zXL2pnz6eeCApQE8NaocMowu2qRoSSQ1Nhy8IA6PvQn\nfyw/IJWLAC44p/iXmxChpm/KANJOX246AXpHqCe5gPciMOY5U5vPeIpjcnGI\nPx5Tei2TxPepo5nYDl9Ei7SXE0CBtqd81J/l5RiEG7IaiROtz4Rc27JNMN6A\nbHxP\r\n=pUGF\r\n-----END PGP SIGNATURE-----\r\n"},"engines":{"node":"^10.x.x"},"gitHead":"fd97f10daebeb6ea71368456fd6399ba77baee9e","scripts":{"lint":"eslint --ext .es,.js ./","test":"npm run build:babel && TZ='GMT' mocha \"test/**/*.js\"","check":"npm test && npm run lint && echo \"\\033[0;32mReady to publish\\033[0m\"","clean":"rm -rf ./lib/ || exit 1","reinstall":"rm -rf node_modules package-lock.json && npm install","build:babel":"NODE_ENV=production babel src --out-dir lib --copy-files","lint:tofile":"eslint --ext .es,.js --no-color -o ./eslint-report.log ./","test:tofile":"npm run build:babel && TZ='GMT' mocha --no-colors -R spec \"test/**/*.js\" 2>&1 | tee test-report.log","prepublishOnly":"npm run check && npm run clean && npm run build:babel"},"_npmUser":{"name":"suprmax","email":"max@degterev.me"},"deprecated":"Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.","repository":{"url":"git+https://github.com/good-hood-gmbh/nebenan-redux-tools.git","type":"git"},"_npmVersion":"6.11.2","description":"A set of redux helpers","directories":{},"_nodeVersion":"10.16.0","dependencies":{"js-cookie":"^2.2.1"},"_hasShrinkwrap":false,"devDependencies":{"qs":"^6.8.0","chai":"^4.2.0","axios":"^0.19.0","mocha":"^6.2.0","sinon":"^7.4.1","eslint":"^6.2.2","lodash":"^4.17.15","updeep":"^1.1.0","@babel/cli":"^7.5.5","proxyquire":"^2.1.3","@babel/core":"^7.5.5","@babel/runtime":"^7.5.5","@babel/preset-env":"^7.5.5","escape-string-regexp":"1.0.5","eslint-plugin-import":"^2.18.2","local-storage-adapter":"^2.0.0","eslint-config-airbnb-base":"^14.0.0","@babel/plugin-transform-runtime":"^7.5.5","babel-plugin-add-module-exports":"^1.0.2","@babel/plugin-proposal-json-strings":"^7.0.0","@babel/plugin-transform-strict-mode":"^7.0.0"},"peerDependencies":{"qs":"^6.7.0","axios":"^0.19.0","lodash":"^4.17.15","updeep":"^1.1.0","@babel/runtime":"^7.5.5","escape-string-regexp":"1.0.5","local-storage-adapter":"^2.0.0"},"_npmOperationalInternal":{"tmp":"tmp/nebenan-redux-tools_4.5.0_1566996641072_0.0374137816335256","host":"s3://npm-registry-packages"}},"4.6.1":{"name":"nebenan-redux-tools","version":"4.6.1","author":{"name":"Nebenan.de","email":"max@nebenan.de"},"license":"SEE LICENSE IN LICENSE FILE","_id":"nebenan-redux-tools@4.6.1","maintainers":[{"name":"suprmax","email":"max@degterev.me"}],"homepage":"https://nebenan.de/","bugs":{"url":"https://github.com/good-hood-gmbh/nebenan-redux-tools/issues"},"dist":{"shasum":"dafe1ac966a75184761558f98ecbb3e243c4240c","tarball":"https://registry.npmjs.org/nebenan-redux-tools/-/nebenan-redux-tools-4.6.1.tgz","fileCount":20,"integrity":"sha512-Uxv03q8elBMVrXRWjz16iW1tO84gTI2G+tpqZ7XqFeYeDy/3Ou94g+rsqkdGRl/HIBQYm3esuLBtzk4CE9kHrg==","signatures":[{"sig":"MEUCIDHGPAfW89wN0aNnGQvf3+fS7mBMgjWYN3xxBiALWXpEAiEAwKZA2GwZZFj5mOIiPdHtacFgMeM78QXU8wIFt5WtMts=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":21086,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdijTbCRA9TVsSAnZWagAAPecP/3I0jGjZ7+0GRIF7qq3f\nIezDQiUbox9xg0k1GypWbYuAkNoUIXOipTFMTTJroc8Q/LY7tA9CqVNAyvnF\nTkNbwx64k+T8uaOXrlR2qhupC+wnZPDgGnprM2Zzcp/ikK8SSEKBAdcV+5l+\nJuzHqULwEDUuVqI16L5K8roruCjBZS9x7x09tsipNgoz0tB2PDDc/TsOACm3\nKMpsX5TI4ZRq0Xt5feCRaufQQxm7SRGouR5H+Jfpp8Fm6/o2HSDX337Uo08c\nU8J2HLpUuYClVfq+/ysZDAVXjyC1RyUF+yNIr1c4j+vTiHBDH4Cqh+bDu2Tk\nSjFeBckAMYhhk3rY9NN+t5AlYQPDMIKOMmSpV1BR+ZMGddnWF3duf06wVEQE\nryVKsvQ+gwBCu3yPCO4UMJECNmD9Lk0h5/mTdsovzEye30jLpWZZOupOYXOm\n2UDwCCSm6JpJMonvDfjkCC+jn0gFHvW7xHHeBHfuFI3of8LE9bly3nw3FUDO\nlaX8NPK9VEGIotJqfG4xuVlnhzb6JqMncavuNc6bEhiBomidQKKWYoGdKC8I\nD4H4Re/YubvRJsRasKGOD+Z689jEhsz81LKqQfgOIVE4nR6x1tao4PLIl3kv\nw4QHTdDnfeObRscA5GFZwXjLhpGyWa1PaojYjTLp3lCaq2diLjOe9oWI7KgU\n2Rum\r\n=h8z8\r\n-----END PGP SIGNATURE-----\r\n"},"engines":{"node":"^10.x.x"},"gitHead":"e990fbdc97d2d0cbfb1e8d22f34b9f434f8b0e3e","scripts":{"lint":"eslint --ext .es,.js ./","test":"npm run compile && TZ='GMT' mocha \"test/**/*.js\"","build":"npm run compile && npm run minify","check":"npm test && npm run lint && echo \"\\033[0;32mReady to publish\\033[0m\"","clean":"rm -rf ./lib/ || exit 1","minify":"find ./lib -name '*.js' -exec terser {} -o {} --config-file terser.json \\;","compile":"NODE_ENV=production babel src --out-dir lib --copy-files","reinstall":"rm -rf node_modules package-lock.json && npm install","lint:tofile":"eslint --ext .es,.js --no-color -o ./eslint-report.log ./","test:tofile":"npm run compile && TZ='GMT' mocha --no-colors -R spec \"test/**/*.js\" 2>&1 | tee test-report.log","prepublishOnly":"npm run check && npm run clean && npm run build"},"_npmUser":{"name":"suprmax","email":"max@degterev.me"},"deprecated":"Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.","repository":{"url":"git+https://github.com/good-hood-gmbh/nebenan-redux-tools.git","type":"git"},"_npmVersion":"6.10.3","description":"A set of redux helpers","directories":{},"_nodeVersion":"10.16.0","dependencies":{"js-cookie":"^2.2.1"},"_hasShrinkwrap":false,"devDependencies":{"qs":"^6.9.0","chai":"^4.2.0","axios":"^0.19.0","mocha":"^6.2.0","sinon":"^7.5.0","eslint":"^6.4.0","lodash":"^4.17.15","terser":"^4.2.1","updeep":"^1.2.0","@babel/cli":"^7.6.2","proxyquire":"^2.1.3","@babel/core":"^7.6.2","@babel/runtime":"^7.6.2","@babel/preset-env":"^7.6.2","escape-string-regexp":"1.0.5","eslint-plugin-import":"^2.18.2","local-storage-adapter":"^2.0.0","eslint-config-airbnb-base":"^14.0.0","@babel/plugin-transform-runtime":"^7.6.2","babel-plugin-add-module-exports":"^1.0.2","@babel/plugin-proposal-json-strings":"^7.0.0","@babel/plugin-transform-strict-mode":"^7.0.0"},"peerDependencies":{"qs":"^6.9.0","axios":"^0.19.0","lodash":"^4.17.15","updeep":"^1.2.0","@babel/runtime":"^7.6.2","escape-string-regexp":"1.0.5","local-storage-adapter":"^2.0.0"},"_npmOperationalInternal":{"tmp":"tmp/nebenan-redux-tools_4.6.1_1569338586281_0.8446926612013206","host":"s3://npm-registry-packages"}},"4.6.2":{"name":"nebenan-redux-tools","version":"4.6.2","author":{"name":"Nebenan.de","email":"max@nebenan.de"},"license":"SEE LICENSE IN LICENSE FILE","_id":"nebenan-redux-tools@4.6.2","maintainers":[{"name":"suprmax","email":"max@degterev.me"}],"homepage":"https://nebenan.de/","bugs":{"url":"https://github.com/good-hood-gmbh/nebenan-redux-tools/issues"},"dist":{"shasum":"42373a9a424381661bfb4c3c8a7364695da3af3d","tarball":"https://registry.npmjs.org/nebenan-redux-tools/-/nebenan-redux-tools-4.6.2.tgz","fileCount":20,"integrity":"sha512-54yt79/hyPBXuSzrJF6079+mxkVFfPq9w1ksyEjrNOk1zoerhm27aC5frMN5ociGDWunouNBaju9ivhMORNqaA==","signatures":[{"sig":"MEUCICFtkXlqgIx+vvqpcXggqfKv8BWJtmDhqRulhS2KsYZtAiEA3I4a80JuxSENuxz3CkSyJTvD7Kz8GZbLP51GtttZVMU=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":21005,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdtuq9CRA9TVsSAnZWagAABH8QAJkldaChBpwx9UAwO6Wn\nivZZ0UydHjJ4+pTcDqwQQ0WmDGA59Ga5AmC2gQOQcSehSkgrk2nHac6i6gmv\no7iUcGGwyaramjWaaal6Hv0jkREwTooxFoO6WUSyinuOsaslOMwchmnQsjRX\n+Ilndww9eZTCFocxUPUl9ovVduJ08A1ysUZOCGaDJPsJdBw+Gd/p7w90gwu1\nDNCZFwSRM26Dp0G3LAhhZ9u0yiQkvwutmddQk03P0//pRLXs6FZLA2m3Q9z/\np1eDBCYQqLPlUFKJbJ/bf27CDZRohGfr4V0+n3pQqwy6o5VYFmJSBmDs0bnD\nAn2yjFrftf6J/5xQCbZcrLHuDdFFuexHpy/SxiVc/2JD9zGdDTdCvxnEhA2L\nOQsQ4aN0SR9y7ard/GJaRIjn0elx7huRxGp4PA0WpI7p1D3pDqcTQFmaXuyd\n8GaWD2FOMIzd20581rfdlKbfTcnaZcpet6nO8Qg4DzhjI49BWx4PDJhIGD3b\nAdQBu7Qpmx+7TDbBUa3cd6216bqrAEU3HKNCcyFtm86Zi5Qni5bZryktqa8E\nleH0TYxFt0vg5MR9if9GOtT/FsJBCEC3BZ3GEOhGDoBLerltTI+x/wkgUq31\nAEm4O6/lT6j305lZt86HPtMdIVOH3Bc2GiHfFV+YqKsvm5gkz2WvTx1lw+BH\nBnaC\r\n=Ic49\r\n-----END PGP SIGNATURE-----\r\n"},"gitHead":"637bdeb126e9cc2ece8441ecf7df8344a982ffae","scripts":{"lint":"eslint --ext .es,.js ./","test":"npm run compile && TZ='GMT' mocha \"test/**/*.js\"","build":"npm run compile && npm run minify","check":"npm test && npm run lint && echo \"\\033[0;32mReady to publish\\033[0m\"","clean":"rm -rf ./lib/ || exit 1","minify":"find ./lib -name '*.js' -exec terser {} -o {} --config-file terser.json \\;","compile":"NODE_ENV=production babel src --out-dir lib --copy-files","reinstall":"rm -rf node_modules package-lock.json && npm install","lint:tofile":"eslint --ext .es,.js --no-color -o ./eslint-report.log ./","test:tofile":"npm run compile && TZ='GMT' mocha --no-colors -R spec \"test/**/*.js\" 2>&1 | tee test-report.log","prepublishOnly":"npm run check && npm run clean && npm run build"},"_npmUser":{"name":"suprmax","email":"max@degterev.me"},"deprecated":"Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.","repository":{"url":"git+https://github.com/good-hood-gmbh/nebenan-redux-tools.git","type":"git"},"_npmVersion":"6.12.0","description":"A set of redux helpers","directories":{},"_nodeVersion":"12.13.0","dependencies":{"js-cookie":"^2.2.1"},"_hasShrinkwrap":false,"devDependencies":{"qs":"^6.9.0","chai":"^4.2.0","axios":"^0.19.0","mocha":"^6.2.2","sinon":"^7.5.0","eslint":"^6.6.0","lodash":"^4.17.15","terser":"^4.3.9","updeep":"^1.2.0","@babel/cli":"^7.6.4","proxyquire":"^2.1.3","@babel/core":"^7.6.4","@babel/runtime":"^7.6.3","@babel/preset-env":"^7.6.3","escape-string-regexp":"1.0.5","local-storage-adapter":"^2.0.0","eslint-config-nebenan-base":"^1.0.2","@babel/plugin-transform-runtime":"^7.6.2","babel-plugin-add-module-exports":"^1.0.2","@babel/plugin-proposal-json-strings":"^7.0.0","@babel/plugin-transform-strict-mode":"^7.0.0"},"peerDependencies":{"qs":"^6.9.0","axios":"^0.19.0","lodash":"^4.17.15","updeep":"^1.2.0","@babel/runtime":"^7.6.2","escape-string-regexp":"1.0.5","local-storage-adapter":"^2.0.0"},"_npmOperationalInternal":{"tmp":"tmp/nebenan-redux-tools_4.6.2_1572268733374_0.0032347237882255353","host":"s3://npm-registry-packages"}},"4.7.0":{"name":"nebenan-redux-tools","version":"4.7.0","author":{"name":"Nebenan.de","email":"max@nebenan.de"},"license":"SEE LICENSE IN LICENSE FILE","_id":"nebenan-redux-tools@4.7.0","maintainers":[{"name":"suprmax","email":"max@degterev.me"}],"homepage":"https://nebenan.de/","bugs":{"url":"https://github.com/good-hood-gmbh/nebenan-redux-tools/issues"},"dist":{"shasum":"c458fc56a9278e14d599119be1546cec1b74119d","tarball":"https://registry.npmjs.org/nebenan-redux-tools/-/nebenan-redux-tools-4.7.0.tgz","fileCount":20,"integrity":"sha512-rIPf0WumfMsM6yESQUXK+HjHJtTXirDpehAmTiNtA6ekxT72KLGXL5n9OTLHTdRtLirPQ+2JbjOTaQZFKiX4Sg==","signatures":[{"sig":"MEUCIQCnudEVsNriWuJIBE8c63JEt9QsDBZgJFinmT/p4FFyNQIgJ5VoyDi3UIEtaNO5tfLGryZd/E/IHg0PcUmxDUUN9dg=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":21770,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdxB6xCRA9TVsSAnZWagAAkBgP/2mVXW6RY2w/PmjrMzyM\n7BhbD/SzU3I88vwYZjzUZZXrk340+xntj5fhQgysf0XBRZx99lWQP5oL78d5\nNGKlPZCg7T7Ph6Ri+amOYcH0UbJ/trQO/jNQbqPWbDxuVhmy7Z8HWHL72hvX\nMgoVgzXbirvnJpFEFgLxNo4dvisCS6VcG5TnrdBj3SvGlknnZi7BmBfEMpt5\nR6jDhHIp1fKJMeziV/VeKguZUGE2JHhOC+3an9qVPE4g1E3WkCG5JIOaoEYw\nUnSjf/mALFdggDeItue1kE2llBdlRG9/tcapTELKlMff6PDrJpk5Oa7FOG5k\n+Bd+eAL4Y4l40/ZkQkJRUtpwwGlP882BNl5N8tkJaFpB+cO0N69OnwIsxtVw\nTUfih0LDvLqolof/697Bf1FRT3SgR92cyZvny673WxqpMprPxXhOm+SPi3Cx\nV90N0jJ1Z3dPDf4y+N3zLIXj2DRXkG+wQJxCLzS5bzuDKJSGjxURgWo/5uWX\ngI65K5qeJlhZZWXQRaCsxpU5SVEiQNY9NwU4QD/71N8z7fO35zqrB2A5ZmN9\nXB+iNHUJ0U+uf2NAKzyNSfq/SgYAaLev87zEO+XyUUnSKVDVciVviSbOAM17\nhkI05WNZwfch5pjU4CH9pXEgYk7ImJH2PvwHniqvqb1u50qb1upgE92VCdRO\nO4NH\r\n=ZzeM\r\n-----END PGP SIGNATURE-----\r\n"},"gitHead":"f10678d2f8df0aad6183ace0774dc4c119637b04","scripts":{"lint":"eslint --ext .es,.js ./","test":"npm run compile && TZ='GMT' mocha \"test/**/*.js\"","build":"npm run compile && npm run minify","check":"npm test && npm run lint && echo \"\\033[0;32mReady to publish\\033[0m\"","clean":"rm -rf ./lib/ || exit 1","minify":"find ./lib -name '*.js' -exec terser {} -o {} --config-file terser.json \\;","compile":"NODE_ENV=production babel src --out-dir lib --copy-files","reinstall":"rm -rf node_modules package-lock.json && npm install","lint:tofile":"eslint --ext .es,.js --no-color -o ./eslint-report.log ./","test:tofile":"npm run compile && TZ='GMT' mocha --no-colors -R spec \"test/**/*.js\" 2>&1 | tee test-report.log","prepublishOnly":"npm run check && npm run clean && npm run build"},"_npmUser":{"name":"suprmax","email":"max@degterev.me"},"deprecated":"Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.","repository":{"url":"git+https://github.com/good-hood-gmbh/nebenan-redux-tools.git","type":"git"},"_npmVersion":"6.12.0","description":"A set of redux helpers","directories":{},"_nodeVersion":"12.13.0","dependencies":{"js-cookie":"^2.2.1"},"_hasShrinkwrap":false,"devDependencies":{"qs":"^6.9.0","chai":"^4.2.0","axios":"^0.19.0","mocha":"^6.2.2","sinon":"^7.5.0","eslint":"^6.6.0","lodash":"^4.17.15","terser":"^4.3.9","updeep":"^1.2.0","@babel/cli":"^7.7.0","proxyquire":"^2.1.3","@babel/core":"^7.7.2","@babel/runtime":"^7.7.2","@babel/preset-env":"^7.7.1","local-storage-adapter":"^2.0.0","eslint-config-nebenan-base":"^1.0.2","escape-string-regexp-browser":"1.0.0","@babel/plugin-transform-runtime":"^7.6.2","babel-plugin-add-module-exports":"^1.0.2","@babel/plugin-proposal-json-strings":"^7.0.0","@babel/plugin-transform-strict-mode":"^7.0.0"},"peerDependencies":{"qs":"^6.9.0","axios":"^0.19.0","lodash":"^4.17.15","updeep":"^1.2.0","@babel/runtime":"^7.6.2","local-storage-adapter":"^2.0.0","escape-string-regexp-browser":"1.0.0"},"_npmOperationalInternal":{"tmp":"tmp/nebenan-redux-tools_4.7.0_1573134001427_0.4308878495422217","host":"s3://npm-registry-packages"}},"4.7.1":{"name":"nebenan-redux-tools","version":"4.7.1","author":{"name":"Nebenan.de","email":"max@nebenan.de"},"license":"SEE LICENSE IN LICENSE FILE","_id":"nebenan-redux-tools@4.7.1","maintainers":[{"name":"atomiomi","email":"atomio.ak@gmail.com"},{"name":"nebenan-owner","email":"max@nebenan.de"},{"name":"peterhassler","email":"peter.h@nebenan.de"},{"name":"suprmax","email":"max@degterev.me"}],"homepage":"https://nebenan.de/","bugs":{"url":"https://github.com/good-hood-gmbh/nebenan-redux-tools/issues"},"dist":{"shasum":"b780b6ac6377d4e349efd3da5f084775ec419c09","tarball":"https://registry.npmjs.org/nebenan-redux-tools/-/nebenan-redux-tools-4.7.1.tgz","fileCount":20,"integrity":"sha512-I7wQKSuINFae9snvWXGHa9KyeawmVigoGAJ/PEHFrH6lr2jkGWuSMw/7aKhPMWXj8HZ6s+dRPKEQPrZgkwJrpg==","signatures":[{"sig":"MEUCIGGMtpNVmrzgw7kYeFhj2PrlXAV3UP7bBzdwuSgSKVmrAiEAtJswdupdO5J/4cbkRSV26nYZUHuJTywBahtE+ip47pk=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":22768,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJenwLSCRA9TVsSAnZWagAAHuMQAIB+7X9RD793XC/miNmd\nC0aC/jYw4/kcFEp65+Guay9g52bMHEVE75/fLkVfq5paQlsf8ECa9luW6ZkU\nyqnbwLNUCB9W7wXmZn3+HKclSZllfOXndQXxeVH9RXUz9wMb1Q2tjt4H3oV7\nzIRg1ZEdqzkUr89khaY519Z6O9BXZSzbki4JRJwbK2FXYoa0L8JHn55mX6xj\nI1oAFMVDDSkgIN4BobiOAjbY8dcjLN0gqPst6W1uNMmbOdzunzcMojfYagT2\naOWDvbKbtjI+R/Ocgccmpquwvb4VjXstKoZvVG/85ibZRxlZKPpIy4TKxwQ/\n2L29wD3r73MXbLV6Mh3V7zYAurqKZCp7W+vYWkc7WlZnXIPcRzqDR2LaCjq/\nAgTLODV21HdLaGWMGnhkMMsjM8ajtUxvN8VR0EhStMpui1xtdAjfRPHqlXOu\n2i0RYbP/qN52OMuIo09tRsAotOObRtYhmFg00Y2p0lVdIkhNP0g3cZXnAMip\nGSeeMJQDgwlIfpRSIsWtXRjSd84CvcTd70xEIvGGlV040ZRzhatH/6AzMgwt\nPmz9c4PHjgBZqoynx0lGO3bSBMgsIY+bwEVzq5J/V2c6vgWMrepU7LzP8vCH\n5tjKNP13vEymog5E9DGTeveQFsT5hMJh4U3jHFrnEULnPlem1k6aSDNCujRb\nzYzv\r\n=NOth\r\n-----END PGP SIGNATURE-----\r\n"},"gitHead":"c11b58c7d10993a0dea383a5a6b5dae34a2dfd6a","scripts":{"lint":"eslint --ext .es,.js ./","test":"npm run compile && TZ='GMT' mocha \"test/**/*.js\"","build":"npm run compile && npm run minify","check":"npm test && npm run lint && echo \"\\033[0;32mReady to publish\\033[0m\"","clean":"rm -rf ./lib/ || exit 1","minify":"find ./lib -name '*.js' -exec terser {} -o {} --config-file terser.json \\;","compile":"NODE_ENV=production babel src --out-dir lib --copy-files","reinstall":"rm -rf node_modules package-lock.json && npm install","lint:tofile":"eslint --ext .es,.js --no-color -o ./eslint-report.log ./","test:tofile":"npm run compile && TZ='GMT' mocha --no-colors -R spec \"test/**/*.js\" 2>&1 | tee test-report.log","prepublishOnly":"npm run check && npm run clean && npm run build"},"_npmUser":{"name":"atomiomi","email":"atomio.ak@gmail.com"},"deprecated":"Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.","repository":{"url":"git+https://github.com/good-hood-gmbh/nebenan-redux-tools.git","type":"git"},"_npmVersion":"6.14.4","description":"A set of redux helpers","directories":{},"_nodeVersion":"12.13.0","dependencies":{"js-cookie":"^2.2.1"},"_hasShrinkwrap":false,"devDependencies":{"qs":"^6.9.0","chai":"^4.2.0","axios":"^0.19.0","mocha":"^6.2.2","sinon":"^7.5.0","eslint":"^6.8.0","lodash":"^4.17.15","terser":"^4.3.9","updeep":"^1.2.0","@babel/cli":"^7.7.0","proxyquire":"^2.1.3","@babel/core":"^7.7.2","@babel/runtime":"^7.7.2","@babel/preset-env":"^7.7.1","local-storage-adapter":"^2.0.0","eslint-config-nebenan-base":"^1.3.1","escape-string-regexp-browser":"1.0.0","@babel/plugin-transform-runtime":"^7.6.2","babel-plugin-add-module-exports":"^1.0.2","@babel/plugin-proposal-json-strings":"^7.0.0","@babel/plugin-transform-strict-mode":"^7.0.0"},"peerDependencies":{"qs":"^6.9.0","axios":"^0.19.0","lodash":"^4.17.15","updeep":"^1.2.0","@babel/runtime":"^7.6.2","local-storage-adapter":"^2.0.0","escape-string-regexp-browser":"1.0.0"},"_npmOperationalInternal":{"tmp":"tmp/nebenan-redux-tools_4.7.1_1587479250364_0.5638785792583201","host":"s3://npm-registry-packages"}},"4.8.0":{"name":"nebenan-redux-tools","version":"4.8.0","author":{"name":"Nebenan.de","email":"max@nebenan.de"},"license":"SEE LICENSE IN LICENSE FILE","_id":"nebenan-redux-tools@4.8.0","maintainers":[{"name":"atomiomi","email":"atomio.ak@gmail.com"},{"name":"nebenan-owner","email":"max@nebenan.de"},{"name":"ozerovs","email":"ozerovsa@gmail.com"},{"name":"peterhassler","email":"peter.h@nebenan.de"},{"name":"suprmax","email":"max@degterev.me"}],"homepage":"https://nebenan.de/","bugs":{"url":"https://github.com/good-hood-gmbh/nebenan-redux-tools/issues"},"dist":{"shasum":"de879653fc9daf67bf855ea8e7b4050d255e379f","tarball":"https://registry.npmjs.org/nebenan-redux-tools/-/nebenan-redux-tools-4.8.0.tgz","fileCount":20,"integrity":"sha512-3mZkveiQcvkEynkoebxhpxYZSoSAwQJoXK0ukTbv7uOurdk83gdlRP8L++J2LcvMGeHJjjLoHhWILYl1U2Dz6A==","signatures":[{"sig":"MEUCIG3pBoz2TmjgJkE7KWCRdEGthJqn3FjzCHp/X0210uVxAiEAnpOY0xBHIuHr4/rOL1+GOKTYbSQdsZWcOlqTJ5p3S/A=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":22932,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJe3feYCRA9TVsSAnZWagAAGmAP/jisHgDWWd33dWTSf3oM\nOrAWTFH172npHtrx+pLaxVzTRtKbnoaKiluztO9ZZrCjShwZqZxzjmKvmEfo\nA++2oH3HRyLXxkoW9GeHQwzqJIti7gPh+w9WhXfAM/wjvslmaY3dHkciqhbt\nrj5kb1CXxeVWUHdn+ET2CFxnadoS9zGjyXBt3zlUUCuPcbMAUVfzeDD901Np\nh7Kg8NbhwZ525k3XCC/ykCH30hEOJ0KUhu5gT5T7Zq3gsLoztXL25h70Ieip\nIktfwDYV4z/9m5a6B4IpaRMZPjatrED569isDmVBgFxCkrcqwnVuQZfsvKhv\npfGYt9yGMWyNhoei65M9fQT7NnbpMjp0qk9/1wxaAsDgCn/NlSFisqckBkMd\nqb2Tg0t+ReefccVR13DDi+pEJqmHGM/edhASxxdXuEZoPkHVcYfbWyvPZRKz\nZ4YYJ5w0NpvBdM5KFWIjRlK343la2IsyCDW0W8IMmQ+crxkbhVLdMV/s3bR9\nmd+4dOwRGeRasVL8FFIHStWFGMTIKW27a7l5Oja0Lhl55ULRo/4udl4ixrBh\nk83WzEri1Vte9ymC3EkcahavXvqEWA8SKOt7eSQPrAMbp5GLLhRqBy0sBCft\nYmvGD53d1gWlzoQz8WAFsNYMs6CWPydaPU7xGt+k9zyO1BOntmj4TIzwqEFD\nY16f\r\n=e9a0\r\n-----END PGP SIGNATURE-----\r\n"},"gitHead":"b54fdb93838b7f29955b81e33c438dec7184b03d","scripts":{"lint":"eslint --ext .es,.js ./","test":"npm run compile && TZ='GMT' mocha \"test/**/*.js\"","build":"npm run compile && npm run minify","check":"npm test && npm run lint && echo \"\\033[0;32mReady to publish\\033[0m\"","clean":"rm -rf ./lib/ || exit 1","minify":"find ./lib -name '*.js' -exec terser {} -o {} --config-file terser.json \\;","compile":"NODE_ENV=production babel src --out-dir lib --copy-files","reinstall":"rm -rf node_modules package-lock.json && npm install","lint:tofile":"eslint --ext .es,.js --no-color -o ./eslint-report.log ./","test:tofile":"npm run compile && TZ='GMT' mocha --no-colors -R spec \"test/**/*.js\" 2>&1 | tee test-report.log","prepublishOnly":"npm run check && npm run clean && npm run build"},"_npmUser":{"name":"atomiomi","email":"atomio.ak@gmail.com"},"deprecated":"Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.","repository":{"url":"git+https://github.com/good-hood-gmbh/nebenan-redux-tools.git","type":"git"},"_npmVersion":"6.14.5","description":"A set of redux helpers","directories":{},"_nodeVersion":"12.16.2","dependencies":{"js-cookie":"^2.2.1"},"_hasShrinkwrap":false,"devDependencies":{"qs":"^6.9.0","chai":"^4.2.0","axios":"^0.19.0","mocha":"^6.2.2","sinon":"^7.5.0","eslint":"^6.8.0","lodash":"^4.17.15","terser":"^4.3.9","updeep":"^1.2.0","@babel/cli":"^7.7.0","proxyquire":"^2.1.3","@babel/core":"^7.7.2","@babel/runtime":"^7.7.2","@babel/preset-env":"^7.7.1","local-storage-adapter":"^2.0.0","eslint-config-nebenan-base":"^1.3.1","escape-string-regexp-browser":"1.0.0","@babel/plugin-transform-runtime":"^7.6.2","babel-plugin-add-module-exports":"^1.0.2","@babel/plugin-proposal-json-strings":"^7.0.0","@babel/plugin-transform-strict-mode":"^7.0.0"},"peerDependencies":{"qs":"^6.9.0","axios":"^0.19.0","lodash":"^4.17.15","updeep":"^1.2.0","@babel/runtime":"^7.6.2","local-storage-adapter":"^2.0.0","escape-string-regexp-browser":"1.0.0"},"_npmOperationalInternal":{"tmp":"tmp/nebenan-redux-tools_4.8.0_1591605144366_0.6110064932552615","host":"s3://npm-registry-packages"}},"5.0.0":{"name":"nebenan-redux-tools","version":"5.0.0","author":{"name":"Nebenan.de","email":"max@nebenan.de"},"license":"SEE LICENSE IN LICENSE FILE","_id":"nebenan-redux-tools@5.0.0","maintainers":[{"name":"atomiomi","email":"atomio.ak@gmail.com"},{"name":"nebenan-owner","email":"max@nebenan.de"},{"name":"ozerovs","email":"ozerovsa@gmail.com"},{"name":"peterhassler","email":"peter.h@nebenan.de"},{"name":"suprmax","email":"max@degterev.me"}],"homepage":"https://nebenan.de/","bugs":{"url":"https://github.com/good-hood-gmbh/nebenan-redux-tools/issues"},"dist":{"shasum":"6b34ab295ba4d64c08b7dd574bd64e45ba9064c5","tarball":"https://registry.npmjs.org/nebenan-redux-tools/-/nebenan-redux-tools-5.0.0.tgz","fileCount":25,"integrity":"sha512-oxt7soE02cq293BaDUomp9ZLwFZ2+PG5HqSAbCeASvVV5+jSDx2g9FU5rmddDkFrgOgPx5fxRK/qHsnm7HkK2Q==","signatures":[{"sig":"MEQCIDE+hE4IdzCuWPGMsHjPueH7BfzL1LFPtl1cTezse3kHAiBfjaDhhBVOIDgoRXLncrUsAlaTEUiTS8T5kdFOQdhXMA==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":25999,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJfRMWACRA9TVsSAnZWagAAg3kP/11zAszw1FxQvuTwW/wK\njMtdXYqB1jO9LnXyUvLOjtXTvJsLde91zDNvb/zdnWStoif1iFiF9qqMXyzI\nqSbG3DuRZKyY0fCHSo9O2K40j+rWRWYQKqgMBlHE0R4z2LTDMkp6vZdJDZox\nIgtXPG6h3AfrcjZC05pmEQeuQiqDI7Rsz/NIMqrN7Kc9g1j3Y/cNW5rngjEa\nkh8++cjCgUDPv/YNNmfKWy2oFT/UL750+z6MwmVihbNiNEczfeFUGNLPm0AU\n2ZhfQMutcizqoG6ymy3Lkdgloou/HQjH8ZkfvmFgic0zFBEePvJFltN2WEEH\nNCYCey9TfaiNGqGlPar+W+NB6xyZ8ugCMAuBBscF6tTponWjm8IM8G6zDzZT\n+XGnRNMjuq3pD8x+mek1UsdBqt27Ejbc9vS71lWBcUEeV8NKJlRh9JZhJ4yB\nZGLvdsUuHge6BMgKNP5MzndrmxqkPCWh/v4t3N9orI2oTt5mKQL9+ZW3Uo+y\n9prr6J5vf6CF9/G0vzjZIvWe/GeCST14ZIX2RsOQyiU7fZDmH1igpeASSLKS\n3jaAJFXmMZMvlV/oWEVOXM1jr6S6X/hVZ2LIXE+/7uX+f+OUPK2GGDEA4oG8\nQzM9WYqbfyyB0wmFFV9f8U7eFtTz5RndB7bqiInkDGqi1qnOLVvdoSpH/Gh7\nkXs+\r\n=Z3kx\r\n-----END PGP SIGNATURE-----\r\n"},"gitHead":"fc228f5a158d07b936d950e19ed1075db42647c3","scripts":{"lint":"eslint --ext .es,.js ./","test":"npm run compile && TZ='GMT' mocha \"test/**/*.js\"","build":"npm run compile && npm run minify","check":"npm test && npm run lint && echo \"\\033[0;32mReady to publish\\033[0m\"","clean":"rm -rf ./lib/ || exit 1","minify":"find ./lib -name '*.js' -exec terser {} -o {} --config-file terser.json \\;","compile":"NODE_ENV=production babel src --out-dir lib --copy-files","reinstall":"rm -rf node_modules package-lock.json && npm install","lint:tofile":"eslint --ext .es,.js --no-color -o ./eslint-report.log ./","test:tofile":"npm run compile && TZ='GMT' mocha --no-colors -R spec \"test/**/*.js\" 2>&1 | tee test-report.log","prepublishOnly":"npm run check && npm run clean && npm run build"},"_npmUser":{"name":"atomiomi","email":"atomio.ak@gmail.com"},"deprecated":"Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.","repository":{"url":"git+https://github.com/good-hood-gmbh/nebenan-redux-tools.git","type":"git"},"_npmVersion":"6.14.8","description":"A set of redux helpers","directories":{},"_nodeVersion":"12.16.2","dependencies":{"js-cookie":"^2.2.1"},"_hasShrinkwrap":false,"devDependencies":{"qs":"^6.9.0","chai":"^4.2.0","axios":"^0.19.0","mocha":"^6.2.2","react":"^16.13.1","sinon":"^7.5.0","eslint":"^6.8.0","lodash":"^4.17.15","terser":"^4.3.9","updeep":"^1.2.0","@babel/cli":"^7.7.0","proxyquire":"^2.1.3","@babel/core":"^7.7.2","react-redux":"^7.2.1","@babel/runtime":"^7.7.2","@babel/preset-env":"^7.7.1","nebenan-react-hocs":"^5.7.0","local-storage-adapter":"^2.0.0","eslint-config-nebenan-base":"^1.3.1","escape-string-regexp-browser":"1.0.0","@babel/plugin-transform-runtime":"^7.6.2","babel-plugin-add-module-exports":"^1.0.2","@babel/plugin-proposal-json-strings":"^7.0.0","@babel/plugin-transform-strict-mode":"^7.0.0"},"peerDependencies":{"qs":"^6.9.0","axios":"^0.19.0","react":"^16.12.0","lodash":"^4.17.15","updeep":"^1.2.0","react-redux":"^7.2.1","@babel/runtime":"^7.6.2","nebenan-react-hocs":"^5.7.0","local-storage-adapter":"^2.0.0","escape-string-regexp-browser":"1.0.0"},"_npmOperationalInternal":{"tmp":"tmp/nebenan-redux-tools_5.0.0_1598342528302_0.08715723371720197","host":"s3://npm-registry-packages"}},"5.0.1":{"name":"nebenan-redux-tools","version":"5.0.1","author":{"name":"Nebenan.de","email":"max@nebenan.de"},"license":"SEE LICENSE IN LICENSE FILE","_id":"nebenan-redux-tools@5.0.1","maintainers":[{"name":"atomiomi","email":"atomio.ak@gmail.com"},{"name":"nebenan-owner","email":"max@nebenan.de"},{"name":"ozerovs","email":"ozerovsa@gmail.com"},{"name":"peterhassler","email":"peter.h@nebenan.de"},{"name":"suprmax","email":"max@degterev.me"}],"homepage":"https://nebenan.de/","bugs":{"url":"https://github.com/good-hood-gmbh/nebenan-redux-tools/issues"},"dist":{"shasum":"88e44a88e66d208fd1fd6019430c7b04610addbd","tarball":"https://registry.npmjs.org/nebenan-redux-tools/-/nebenan-redux-tools-5.0.1.tgz","fileCount":25,"integrity":"sha512-VT/h15tSWUa8Ujrfr0Bu5ziW/heDwX0Jo5XcL7M6L+E+sut7TTttaMms2qwuo39Eg5QLQMFV4Hjt4UMZ063hRA==","signatures":[{"sig":"MEUCIETMj3mR/u64Xpzw2Ko7RqOwRCKLxmtC5RU4LUwvM7WEAiEA0LGy4RCEOJxlH8bWbmH2tDPConbILuQuzMJi4aa5SqU=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":26312,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJfRPT4CRA9TVsSAnZWagAA3jIP/j8M2ek7ixZ5EX0CRSwy\nX7wOCPcA8f17wkyTk4kBmpUG6bVVhLXkfwvnqPQRnKH+bOrv6xYyca4XlkPw\ndMkqQV4m+e2fNyVN3gfz3mWeqtn0bRerTns/Omzm2absgDpmD+NSLfihFMVo\nQLC18M13IdPtcOENiTmaubyABs6EqNkVyecJYuVI7OhGNu0i/JlQFnImxDIZ\naXp4wRHA78R4iEc96vKjVZmu8Ut46Ji+6UuNkXBUIv0zE1n74yZZ2ZUUMoTk\nRLYe/TIXSbPtnESdqCKd3Qd+/skO85pbZVUIEdYwiy+MzCzwRqAiKUIeyiRa\n8zHFvigr+7tSM9Tly799ieqZm17Rkw9EAz7Q79WOVJqBZS5itBzKuuDMsTt1\noYIzMn90zqz09nxbDAMcPH52DZHK3xsG7DjsQPq28v6qxoglJlflgP5pM6lu\nbyK8GyNlAj8PUnpsCN/vkDhdv9mj08UbGUOSVvllD1I+vxnbPyQhoBNsUzVD\nwIexvkgSZae619rexamIJjnH8zpoZlTg+5HB8+/aSS8OIfQ8Y/0jkbdpGIBB\nF30bL281iBgfdeRXYFLvlIl6cKsoNokKh/KYSRF0SFS7evHvfEDMqB3AGO5R\nwfeNKPq82fInvRTko8pyu6q0AcXJNe7bJKvkZqD7Hsaa38kB+Gt8lGYD2DNA\nXVJW\r\n=z5Ob\r\n-----END PGP SIGNATURE-----\r\n"},"gitHead":"548683e043fb10ce4189adc6d4c16f913259c19d","scripts":{"lint":"eslint --ext .es,.js ./","test":"npm run compile && TZ='GMT' mocha \"test/**/*.js\"","build":"npm run compile && npm run minify","check":"npm test && npm run lint && echo \"\\033[0;32mReady to publish\\033[0m\"","clean":"rm -rf ./lib/ || exit 1","minify":"find ./lib -name '*.js' -exec terser {} -o {} --config-file terser.json \\;","compile":"NODE_ENV=production babel src --out-dir lib --copy-files","reinstall":"rm -rf node_modules package-lock.json && npm install","lint:tofile":"eslint --ext .es,.js --no-color -o ./eslint-report.log ./","test:tofile":"npm run compile && TZ='GMT' mocha --no-colors -R spec \"test/**/*.js\" 2>&1 | tee test-report.log","prepublishOnly":"npm run check && npm run clean && npm run build"},"_npmUser":{"name":"suprmax","email":"max@degterev.me"},"deprecated":"Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.","repository":{"url":"git+https://github.com/good-hood-gmbh/nebenan-redux-tools.git","type":"git"},"_npmVersion":"6.14.4","description":"A set of redux helpers","directories":{},"_nodeVersion":"12.16.2","dependencies":{"js-cookie":"^2.2.1"},"_hasShrinkwrap":false,"devDependencies":{"qs":"^6.9.0","chai":"^4.2.0","axios":"^0.20.0","mocha":"^8.1.1","react":"^16.13.1","redux":"^4.0.5","sinon":"^9.0.3","eslint":"^7.7.0","lodash":"^4.17.15","terser":"^5.2.1","updeep":"^1.2.0","date-fns":"^2.15.0","@babel/cli":"^7.7.0","proxyquire":"^2.1.3","@babel/core":"^7.7.2","react-redux":"^7.2.1","react-router":"^5.2.0","@babel/runtime":"^7.7.2","nebenan-helpers":"^4.2.0","@babel/preset-env":"^7.7.1","nebenan-react-hocs":"^5.7.0","local-storage-adapter":"^2.0.0","eslint-config-nebenan-base":"^1.3.1","escape-string-regexp-browser":"1.0.0","@babel/plugin-transform-runtime":"^7.6.2","babel-plugin-add-module-exports":"^1.0.2","@babel/plugin-proposal-json-strings":"^7.0.0","@babel/plugin-transform-strict-mode":"^7.0.0"},"peerDependencies":{"qs":"^6.9.0","axios":"^0.20.0","react":"^16.12.0","lodash":"^4.17.15","updeep":"^1.2.0","react-redux":"^7.2.1","@babel/runtime":"^7.6.2","nebenan-react-hocs":"^5.7.0","local-storage-adapter":"^2.0.0","escape-string-regexp-browser":"1.0.0"},"_npmOperationalInternal":{"tmp":"tmp/nebenan-redux-tools_5.0.1_1598354680043_0.8557795983545129","host":"s3://npm-registry-packages"}},"5.1.0":{"name":"nebenan-redux-tools","version":"5.1.0","author":{"name":"Nebenan.de","email":"max@nebenan.de"},"license":"SEE LICENSE IN LICENSE FILE","_id":"nebenan-redux-tools@5.1.0","maintainers":[{"name":"atomiomi","email":"atomio.ak@gmail.com"},{"name":"nebenan-owner","email":"max@nebenan.de"},{"name":"ozerovs","email":"ozerovsa@gmail.com"},{"name":"peterhassler","email":"peter.h@nebenan.de"},{"name":"suprmax","email":"max@degterev.me"}],"homepage":"https://nebenan.de/","bugs":{"url":"https://github.com/good-hood-gmbh/nebenan-redux-tools/issues"},"dist":{"shasum":"546a1a16186177165e89cc7ddb30c88c2fff67f1","tarball":"https://registry.npmjs.org/nebenan-redux-tools/-/nebenan-redux-tools-5.1.0.tgz","fileCount":25,"integrity":"sha512-hTfRaVqtks+PhBNDyzqzrTtCdG4kdkX84nrzjfTFc95zmZbkqDKqpx2U503DkeUrGXsnJbHd/tJjBPC1LAQU7A==","signatures":[{"sig":"MEUCIQDOtlhz4+/52UpQCKpxkBkijCMrCD1nTw91vqoFV3KEMQIgaDRbH9CjOOE+f2LaQeRXi9Ios4F+gKcj8BPZtohokm0=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":26411,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJfT6/jCRA9TVsSAnZWagAAVXcP/2LNVF9b9O8Bk542B9bP\n6Jyp0RRfM4kCgkOg0SVzu4ZO/6JXsii9DIoqaPX7uTbf6OKk3kG13+NuUuvI\nSJTHKAbd1RpZUa+f8+lajsATcfGYaMtjXPShWf4aVxjs/540BGtaO7nG8ybf\nuUfBcetCSB3f6c7zvVRhOfrzO8Py+NLX8KaCydaKFJVxmNDiZ7tKrAXzX5BP\nQU+gygnPCR0VCr0Hh6O6tnXH33L2vHwjdwCxegTtKmlUXsqibVggeLCn0XO0\nl6x/2QGmmbf2v1BxVTH8uhcVM8ofTM6fUzzsuk9eohOyRQYP5TNqMjgxmF1x\n+YwDCY+as3fsPm72rGxOaz58blnEZia1iSJjc98xG6oTNWDj5HZiUfo4/2hW\nVFklZHjoRjcR+vKK1aZL67eH+JaZEtP7FsJ6zpqBGkRpAJ9NZ+YNaMRE2CKc\nG4NN8AbLgrN1Pk3sdnqkPMLHDWZRd7A4/5FiwAdm1eb2b01IUC4jkIeTGZ3z\navaAm1Qd5mvz7eakYcZAwZHNlpo/7Xxc04FQ1F1gP/odNYeGFeDi17koz1QD\n+q5rb5qs9JSxPl4bI0CPL/kz1Fe/AFNkQ2gTcrVpUadBwioJpU65MjsMvvrM\nHSV9u4nT2l79My29r+ZpaaARvJlYurzkPK019XYZLi/xuST43hbnXahZO2fB\nE/Po\r\n=cr/N\r\n-----END PGP SIGNATURE-----\r\n"},"gitHead":"17656f84c1bf116b4272f6b2cbbb75af2b74847e","scripts":{"lint":"eslint --ext .es,.js ./","test":"npm run compile && TZ='GMT' mocha \"test/**/*.js\"","build":"npm run compile && npm run minify","check":"npm test && npm run lint && echo \"\\033[0;32mReady to publish\\033[0m\"","clean":"rm -rf ./lib/ || exit 1","minify":"find ./lib -name '*.js' -exec terser {} -o {} --config-file terser.json \\;","compile":"NODE_ENV=production babel src --out-dir lib --copy-files","reinstall":"rm -rf node_modules package-lock.json && npm install","lint:tofile":"eslint --ext .es,.js --no-color -o ./eslint-report.log ./","test:tofile":"npm run compile && TZ='GMT' mocha --no-colors -R spec \"test/**/*.js\" 2>&1 | tee test-report.log","prepublishOnly":"npm run check && npm run clean && npm run build"},"_npmUser":{"name":"suprmax","email":"max@degterev.me"},"deprecated":"Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.","repository":{"url":"git+https://github.com/good-hood-gmbh/nebenan-redux-tools.git","type":"git"},"_npmVersion":"6.14.4","description":"A set of redux helpers","directories":{},"_nodeVersion":"12.16.2","dependencies":{"js-cookie":"^2.2.1"},"_hasShrinkwrap":false,"devDependencies":{"qs":"^6.9.0","chai":"^4.2.0","axios":"^0.20.0","mocha":"^8.1.3","react":"^16.13.1","redux":"^4.0.5","sinon":"^9.0.3","eslint":"^7.8.1","lodash":"^4.17.15","terser":"^5.2.1","updeep":"^1.2.0","date-fns":"^2.16.1","@babel/cli":"^7.11.5","proxyquire":"^2.1.3","@babel/core":"^7.11.5","react-redux":"^7.2.1","react-router":"^5.2.0","@babel/runtime":"^7.7.2","nebenan-helpers":"^4.2.0","@babel/preset-env":"^7.11.5","nebenan-react-hocs":"^5.8.0","local-storage-adapter":"^2.0.0","eslint-config-nebenan-base":"^1.3.1","escape-string-regexp-browser":"1.0.0","@babel/plugin-transform-runtime":"^7.11.5","babel-plugin-add-module-exports":"^1.0.2","@babel/plugin-proposal-json-strings":"^7.0.0","@babel/plugin-transform-strict-mode":"^7.0.0"},"peerDependencies":{"qs":"^6.9.0","axios":"^0.20.0","react":"^16.12.0","lodash":"^4.17.15","updeep":"^1.2.0","react-redux":"^7.2.1","@babel/runtime":"^7.6.2","nebenan-react-hocs":"^5.7.0","local-storage-adapter":"^2.0.0","escape-string-regexp-browser":"1.0.0"},"_npmOperationalInternal":{"tmp":"tmp/nebenan-redux-tools_5.1.0_1599057891494_0.01928733969830576","host":"s3://npm-registry-packages"}},"5.2.0-beta.0":{"name":"nebenan-redux-tools","version":"5.2.0-beta.0","author":{"name":"Nebenan.de","email":"max@nebenan.de"},"license":"SEE LICENSE IN LICENSE FILE","_id":"nebenan-redux-tools@5.2.0-beta.0","maintainers":[{"name":"ozerovs","email":"ozerovsa@gmail.com"},{"name":"peterhassler","email":"peter.h@nebenan.de"},{"name":"nebenan-owner","email":"max@nebenan.de"},{"name":"suprmax","email":"max@degterev.me"},{"name":"atomiomi","email":"atomio.ak@gmail.com"}],"homepage":"https://nebenan.de/","bugs":{"url":"https://github.com/good-hood-gmbh/nebenan-redux-tools/issues"},"dist":{"shasum":"e9d6ca07d7fd967586ab446d4892df39ab6ede3d","tarball":"https://registry.npmjs.org/nebenan-redux-tools/-/nebenan-redux-tools-5.2.0-beta.0.tgz","fileCount":23,"integrity":"sha512-x2bReNFMfdioLTkkpxrHMb4eZ+qbp/V8ro05EtuPQa/kgd5Vk371ytDkl9SPdJVujmGAho4d6frggnGIGRJiqQ==","signatures":[{"sig":"MEUCIGBEfZw9GrND9NqgLkkQbyCUX93BYxOp6EJ5mD1+YN9uAiEAp5VapiOf57YGDKcNez3jyhfusCHG4r+ZTySWC9eACUc=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":36752,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJfmFtjCRA9TVsSAnZWagAARNsP/A1qIaFmDHbNTj03PVvh\nlkl1zJt4fI3w6yF+ST94CQS5LswM5Yuk3LaayPr4VW+7z0sefdJj4weBAxqL\nRtYDytbJThs/A1ACjwWAok3BCAlyYQRNdfCADm1LptCgguj5v8oDgNFvSDwV\ncSm7sqcz86nR85ei/sSEh5hyG4mbL6CYy9izgfpQEK1VqbTxTW0tWW6rwJfd\ns6C7WYiw0RM6lgUdO8EeLCyv2CtE5JCUvcxrl6MmHWBH2qmTDD6GEf7+2+NL\nZXlULlS8qr/uU/3HjGN+k15fMSKY+bf8JdNm++B3sy2gyEue9cYLJAfTHYgP\n+ALC0TDORyQS8c5Dnm9csC6YfgBBkQHQl5XrYXm9h8+6zqVD/JKLSWNrffPB\n3dLfnPtgnZpZ/1vVn+azjOEXffz9s6iOPMycZ1knvECv2IExRoVatwdFvZPW\nPkLl6HONIrFCoDADYNINS62fNTWoM6v01xiUnmLHcbvN6iczzH6D4NlQvTTK\nhf0C5hoJeWm3BR5o36+LAeCPeeY5XkFat4yyO36XUZVxu371/fj59HW0tNcH\n/gDb1bova7qmL2SmatrF2YCKR+oXtRK4SO+o3QuxFKw0/7l31B0Lc118iVW8\n8aZRuavaTuQ9wiqNYofz3h4aEWRPXUNcC13T30E8KMWIFV78qby8egQ2+cRq\nQgpR\r\n=F+SS\r\n-----END PGP SIGNATURE-----\r\n"},"gitHead":"006ac2e588dfcc6ad2aecd0e962935df1005fb4a","scripts":{"lint":"eslint --ext .es,.js ./","test":"npm run compile && TZ='GMT' mocha \"test/**/*.js\"","build":"npm run compile","check":"npm test && npm run lint && echo \"\\033[0;32mReady to publish\\033[0m\"","clean":"rm -rf ./lib/ || exit 1","compile":"NODE_ENV=production babel src --out-dir lib --copy-files","reinstall":"rm -rf node_modules package-lock.json && npm install","lint:tofile":"eslint --ext .es,.js --no-color -o ./eslint-report.log ./","test:tofile":"npm run compile && TZ='GMT' mocha --no-colors -R spec \"test/**/*.js\" 2>&1 | tee test-report.log","prepublishOnly":"npm run check && npm run clean && npm run build"},"_npmUser":{"name":"suprmax","email":"max@degterev.me"},"deprecated":"Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.","repository":{"url":"git+https://github.com/good-hood-gmbh/nebenan-redux-tools.git","type":"git"},"_npmVersion":"6.14.8","description":"A set of redux helpers","directories":{},"_nodeVersion":"12.18.3","dependencies":{"js-cookie":"^2.2.1"},"_hasShrinkwrap":false,"devDependencies":{"qs":"^6.9.0","chai":"^4.2.0","axios":"^0.21.0","mocha":"^8.1.3","react":"^17.0.1","redux":"^4.0.5","sinon":"^9.0.3","eslint":"^7.8.1","lodash":"^4.17.15","updeep":"^1.2.0","date-fns":"^2.16.1","@babel/cli":"^7.11.5","proxyquire":"^2.1.3","@babel/core":"^7.11.5","react-redux":"^7.2.1","react-router":"^5.2.0","@babel/runtime":"^7.7.2","nebenan-helpers":"^4.2.0","@babel/preset-env":"^7.11.5","nebenan-react-hocs":"^5.11.0-beta.0","local-storage-adapter":"^2.0.0","eslint-config-nebenan-base":"^1.3.1","escape-string-regexp-browser":"1.1.0","@babel/plugin-transform-runtime":"^7.11.5","babel-plugin-add-module-exports":"^1.0.2","@babel/plugin-proposal-json-strings":"^7.0.0","@babel/plugin-transform-strict-mode":"^7.0.0"},"peerDependencies":{"qs":"^6.9.0","axios":"^0.21.0","react":"^16.14.0 || ^17.0.1","lodash":"^4.17.15","updeep":"^1.2.0","react-redux":"^7.2.1","@babel/runtime":"^7.6.2","nebenan-react-hocs":"^5.11.0-beta.0","local-storage-adapter":"^2.0.0","escape-string-regexp-browser":"1.1.0"},"_npmOperationalInternal":{"tmp":"tmp/nebenan-redux-tools_5.2.0-beta.0_1603820387378_0.9624431372454738","host":"s3://npm-registry-packages"}},"5.2.0":{"name":"nebenan-redux-tools","version":"5.2.0","author":{"name":"Nebenan.de","email":"max@nebenan.de"},"license":"SEE LICENSE IN LICENSE FILE","_id":"nebenan-redux-tools@5.2.0","maintainers":[{"name":"ozerovs","email":"ozerovsa@gmail.com"},{"name":"peterhassler","email":"peter.h@nebenan.de"},{"name":"nebenan-owner","email":"max@nebenan.de"},{"name":"suprmax","email":"max@degterev.me"},{"name":"atomiomi","email":"atomio.ak@gmail.com"}],"homepage":"https://nebenan.de/","bugs":{"url":"https://github.com/good-hood-gmbh/nebenan-redux-tools/issues"},"dist":{"shasum":"cf391e3731120adc3b8776910b3889068744faee","tarball":"https://registry.npmjs.org/nebenan-redux-tools/-/nebenan-redux-tools-5.2.0.tgz","fileCount":23,"integrity":"sha512-NCELJooImLPa64SJuCjRUeOFbYqoLN5q4+esuwF51djvJaS+sLi6oTE0wC07R7xyX0X7WUDhg9p7nocQgxx3kg==","signatures":[{"sig":"MEQCICNhUdLfGIoSxyCMw6jCMzJPr7AHzPGuKxlc0ry6zo0+AiA/An6e6VdfVQsHvFH+QE4LSpTbLDLml5GvppCvahXhJw==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":36731,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJfmF2zCRA9TVsSAnZWagAAEncP/3THT5CDigaF/tEVxEkP\nbNLYcge54/p36KglyMmLKeT4CN8QEqZP8jICQ+WIi2TNl/w0uWxJGHNZ8ro6\n7/nOq3zwpTdzMM9IUtdOOc8Tz1sXbZpnvxaJ3xU+p+oI1i3J5qAKvNU+cIwA\n5OS+NKy0OTw6uKe4Qf6NLXt/ZZ7u2nftDLS2FCW/NH2sr0ew5E/nGkqFeZ6U\nLPfY4BPc930xQl9O0gnoaD2GvWaP9H0jS+3dEb10MKHOb1TvUM0UniEGz8b/\nNrUIQal1e+YxN1idfbdM+FKg7QyN0MkxGGLdqyKBsQy+2yJUhBFVFUU6FHB6\nU0L1B9SCtfg4y+577kREEei//xqpsxmjnCrk+Z98L5mv8uxdLcK3UrNXO4d/\njhyjdFBfhDUJzmK8SUnl8U4A066LDkjjsBBAvVESNdRzbDv/qZVdB9hJPd/N\nIJRtsglPdjT4x1EYTs7jQMz07HfmiEPnG4MqwNjXoCqR5uyPAmTwdrKgUbaY\new+xbfAFLQicC4DGeNzjvwPOgIl1o/QPEWc+lJ1GIDDj0CG+ZLebmmv2xsKm\nCB02FE0CwIUIFO8XXtI0FZi9RzjwledhVD8T6AfEiaLhNQSeSDOuCVMC5s3M\nN2sQoPJO017ggnZhyKJO7pVA11P0yO7S6r2thgthy1G5N1MhT6dyLfcagez1\nYtql\r\n=Aa/a\r\n-----END PGP SIGNATURE-----\r\n"},"gitHead":"45931ce93b6ac2dafaccea30d8052046dce58f29","scripts":{"lint":"eslint --ext .es,.js ./","test":"npm run compile && TZ='GMT' mocha \"test/**/*.js\"","build":"npm run compile","check":"npm test && npm run lint && echo \"\\033[0;32mReady to publish\\033[0m\"","clean":"rm -rf ./lib/ || exit 1","compile":"NODE_ENV=production babel src --out-dir lib --copy-files","reinstall":"rm -rf node_modules package-lock.json && npm install","lint:tofile":"eslint --ext .es,.js --no-color -o ./eslint-report.log ./","test:tofile":"npm run compile && TZ='GMT' mocha --no-colors -R spec \"test/**/*.js\" 2>&1 | tee test-report.log","prepublishOnly":"npm run check && npm run clean && npm run build"},"_npmUser":{"name":"suprmax","email":"max@degterev.me"},"deprecated":"Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.","repository":{"url":"git+https://github.com/good-hood-gmbh/nebenan-redux-tools.git","type":"git"},"_npmVersion":"6.14.8","description":"A set of redux helpers","directories":{},"_nodeVersion":"12.18.3","dependencies":{"js-cookie":"^2.2.1"},"_hasShrinkwrap":false,"devDependencies":{"qs":"^6.9.0","chai":"^4.2.0","axios":"^0.21.0","mocha":"^8.1.3","react":"^17.0.1","redux":"^4.0.5","sinon":"^9.0.3","eslint":"^7.8.1","lodash":"^4.17.15","updeep":"^1.2.0","date-fns":"^2.16.1","@babel/cli":"^7.11.5","proxyquire":"^2.1.3","@babel/core":"^7.11.5","react-redux":"^7.2.1","react-router":"^5.2.0","@babel/runtime":"^7.7.2","nebenan-helpers":"^4.2.0","@babel/preset-env":"^7.11.5","nebenan-react-hocs":"^5.11.0","local-storage-adapter":"^2.0.0","eslint-config-nebenan-base":"^1.3.1","escape-string-regexp-browser":"1.1.0","@babel/plugin-transform-runtime":"^7.11.5","babel-plugin-add-module-exports":"^1.0.2","@babel/plugin-proposal-json-strings":"^7.0.0","@babel/plugin-transform-strict-mode":"^7.0.0"},"peerDependencies":{"qs":"^6.9.0","axios":"^0.21.0","react":"^16.14.0 || ^17.0.1","lodash":"^4.17.15","updeep":"^1.2.0","react-redux":"^7.2.1","@babel/runtime":"^7.7.2","nebenan-react-hocs":"^5.11.0","local-storage-adapter":"^2.0.0","escape-string-regexp-browser":"1.1.0"},"_npmOperationalInternal":{"tmp":"tmp/nebenan-redux-tools_5.2.0_1603820978982_0.06813661515741942","host":"s3://npm-registry-packages"}},"5.3.0":{"name":"nebenan-redux-tools","version":"5.3.0","author":{"name":"Nebenan.de","email":"max@nebenan.de"},"license":"SEE LICENSE IN LICENSE FILE","_id":"nebenan-redux-tools@5.3.0","maintainers":[{"name":"ozerovs","email":"ozerovsa@gmail.com"},{"name":"peterhassler","email":"peter.h@nebenan.de"},{"name":"nebenan-owner","email":"max@nebenan.de"},{"name":"suprmax","email":"max@degterev.me"},{"name":"atomiomi","email":"atomio.ak@gmail.com"}],"homepage":"https://nebenan.de/","bugs":{"url":"https://github.com/good-hood-gmbh/nebenan-redux-tools/issues"},"dist":{"shasum":"d1ee6668e5ba93a1c9735a7b3f027a6dc0ecda79","tarball":"https://registry.npmjs.org/nebenan-redux-tools/-/nebenan-redux-tools-5.3.0.tgz","fileCount":23,"integrity":"sha512-oDH2P4SCvLNnRhMiNWpl0O6FhRS/4cFL7HUexqx7T+U8ozZ2ZeMdq26j34Ncwh1IfK+WHrKj2sGJJ54obWbDdw==","signatures":[{"sig":"MEQCIAXGePNhvbp9hcqnesvZPo5eaLw5pFUqHbE3zWM/vXPqAiB+swuE+JVInDJlT+QNGpFQGa/0ylh1dPQjHUykveX+KA==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":32993,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJfpEFSCRA9TVsSAnZWagAARx4P/R4MoZzfC1aH3jz/yq1r\nwJAROAUmXJpP0DbTgh+jvYBR2Hy3k1I3rFrHcQLs5uwhjtTeV6uNV560FvhD\n1AZzIc/dj2ngbWTZ/BrdJeK9dcjolZomVg8hC/SbK6T57e3QRn0JxyO8GT4F\nv5kj5nVRNuYBbyjQq1mn/iiI2q3EecfzEwWWiAlHJ2WxgH/XwdVvNillxNUc\ndKy2Vq6x5eq/VWZXJqjvAmyfWoFT6NjAyLeUSEYRzud4Xs5yDT6O6RocgHeK\nKlpD3MJTTg8cORwConyQarJ5Z0bhoTwXmoat4VJr7X0wc3/zEQy5iweJENBB\n5Ki3IRwD13s62QsUXeoqYu2fXhPlfq/BZVpBalTxptGL/hxtUG2ViLJDQNow\nvh465QFcLZFbbL4R1rR2n6dLfTuxUtbdzNj97Bah/46rOeuzSR7GTwgaUhOo\nmBwsenuB4Fn5JOmUR9jnFJp2UVxqCoZ/693aAwE9cNuMteG7qzK6kMCD1OHj\nNO19Et+KolM2AxkcqJeflV7ZB3bujSKY+50y5HRgGVWvx0gH4AC9p1dpap+w\nmjryI+D2gQOLidz9Ssb3wocJVjmI+2u4Uht02tVIqehxVVqmg/OPpmJ8bed/\ndveVWX+BjGKTiqVK6gUIvLYmp2/N7vQ5Yt0GEtVfa6/VPXFAq9cgnfyNrTXl\ngLHT\r\n=mh9C\r\n-----END PGP SIGNATURE-----\r\n"},"gitHead":"dd22240f39b70e26c3f222684a487fcae5de1a15","scripts":{"lint":"eslint --ext .es,.js ./","test":"npm run compile && TZ='GMT' mocha \"test/**/*.js\"","build":"npm run compile","check":"npm test && npm run lint && echo \"\\033[0;32mReady to publish\\033[0m\"","clean":"rm -rf ./lib/ || exit 1","compile":"NODE_ENV=production babel src --out-dir lib --copy-files","reinstall":"rm -rf node_modules package-lock.json && npm install","lint:tofile":"eslint --ext .es,.js --no-color -o ./eslint-report.log ./","test:tofile":"npm run compile && TZ='GMT' mocha --no-colors -R spec \"test/**/*.js\" 2>&1 | tee test-report.log","prepublishOnly":"npm run check && npm run clean && npm run build"},"_npmUser":{"name":"peterhassler","email":"peter.h@nebenan.de"},"deprecated":"Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.","repository":{"url":"git+https://github.com/good-hood-gmbh/nebenan-redux-tools.git","type":"git"},"_npmVersion":"6.14.8","description":"A set of redux helpers","directories":{},"_nodeVersion":"14.15.0","dependencies":{"js-cookie":"^2.2.1"},"_hasShrinkwrap":false,"devDependencies":{"qs":"^6.9.0","chai":"^4.2.0","axios":"^0.21.0","mocha":"^8.1.3","react":"^17.0.1","redux":"^4.0.5","sinon":"^9.0.3","eslint":"^7.8.1","lodash":"^4.17.15","updeep":"^1.2.0","date-fns":"^2.16.1","@babel/cli":"^7.11.5","proxyquire":"^2.1.3","@babel/core":"^7.11.5","react-redux":"^7.2.1","react-router":"^5.2.0","@babel/runtime":"^7.7.2","nebenan-helpers":"^4.2.0","@babel/preset-env":"^7.11.5","nebenan-react-hocs":"^5.11.0","local-storage-adapter":"^2.0.0","eslint-config-nebenan-base":"^1.3.1","browserslist-config-nebenan":"^1.0.0-beta.0","escape-string-regexp-browser":"1.1.0","@babel/plugin-transform-runtime":"^7.11.5","babel-plugin-add-module-exports":"^1.0.2","@babel/plugin-proposal-json-strings":"^7.0.0","@babel/plugin-transform-strict-mode":"^7.0.0"},"peerDependencies":{"qs":"^6.9.0","axios":"^0.21.0","react":"^16.14.0 || ^17.0.1","lodash":"^4.17.15","updeep":"^1.2.0","react-redux":"^7.2.1","@babel/runtime":"^7.7.2","nebenan-react-hocs":"^5.11.0","local-storage-adapter":"^2.0.0","escape-string-regexp-browser":"1.1.0"},"_npmOperationalInternal":{"tmp":"tmp/nebenan-redux-tools_5.3.0_1604600146229_0.9183662578361653","host":"s3://npm-registry-packages"}},"5.4.0-beta.0":{"name":"nebenan-redux-tools","version":"5.4.0-beta.0","author":{"name":"Nebenan.de","email":"max@nebenan.de"},"license":"SEE LICENSE IN LICENSE FILE","_id":"nebenan-redux-tools@5.4.0-beta.0","maintainers":[{"name":"ozerovs","email":"ozerovsa@gmail.com"},{"name":"peterhassler","email":"peter.h@nebenan.de"},{"name":"nebenan-owner","email":"max@nebenan.de"},{"name":"suprmax","email":"max@degterev.me"},{"name":"atomiomi","email":"atomio.ak@gmail.com"}],"homepage":"https://nebenan.de/","bugs":{"url":"https://github.com/good-hood-gmbh/nebenan-redux-tools/issues"},"dist":{"shasum":"95137a07e519fe2185ed9c4fbca782506e5c818a","tarball":"https://registry.npmjs.org/nebenan-redux-tools/-/nebenan-redux-tools-5.4.0-beta.0.tgz","fileCount":23,"integrity":"sha512-7r/L3rVns/ihHi/zuvksAwF7bY/2IIsDWc7pjfWMDqbLkFRW70ndwddQ7xXu36T0INvLYbUmFs75ImZEblerkw==","signatures":[{"sig":"MEUCIDG2j1MiSmDGKzJ8oFO161jeO9LZVP23OoUEMDKXREFqAiEAggXzDEEV5U/4eYB+xsSTKOU3MRnyCSgqC76bqVv3lCc=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":27940,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJftTMDCRA9TVsSAnZWagAAJvcP/i+EXm1MQ2Bs+mE73LMV\ncl5HX5sOQfu6+/GXWoxR8OcHwf5KqF9y7F5IaLCfwxafL0Ll7jI3PGeqlfyi\nXgw7YrVuVVHy2VPNL5EMWB2lBJXRnCTruNKK5NPfPONAn8xX216eIQAbAN4U\nrzNnSuSBGcA6wsXjwpUu4DYnI0BDbThofYBpvj7PPTsCOGg0mkVq9wInGyL7\nAlgWoZ9aiTOzpW0IEkvUkHfwkQuywp2uhZz9rseDWYGqT29jVrMaZvhCliU3\n2v/YnkQXoBKNSJP4T+/Q0gxazOxCTeEIR09/gY+eAJdohhS+crJzkda7Sae7\nXmGiHkJ6oF9lTjNBLiPFhVVUiQA5QK7rI5sdd+3ojTPiUlKl2ceWizw15iN9\nxZEHLyK75jVX/wtx15visb8ihcB2QMEdI3Mgi6m+Et5xBBWm0gOZUdmlWnZg\nas8x9xSkvKISvdonfIsN9jMu2qrHg6f5yTCyVaNFIzYveHmM25ehPpmcY+bE\nNYp6h17sTmbONIuBw/RYQgnD3w/gGMHxrdvBqvL7H7KXHTIbsxOBZycQ3C3S\nShhQV2BB+dktNPH7o7923mtKn9+/ZT4+YcHGzC7AplOJQugH183E3DvgVsJN\ng59N4ttVOerS/n3zUmwDYvoImC4AdXWqW8z06e1LIkwG3vHznyP/ogrNOp8p\n1Esa\r\n=kN1T\r\n-----END PGP SIGNATURE-----\r\n"},"readme":"nebenan-redux-tools\n====================\n\nA set of redux helpers\n","gitHead":"8ce5dcaa6b2203128711bb99b1d6268795cf4642","scripts":{"lint":"eslint --ext .es,.js ./","test":"npm run compile && TZ='GMT' mocha \"test/**/*.js\"","build":"npm run compile","check":"npm test && npm run lint && echo \"\\033[0;32mReady to publish\\033[0m\"","clean":"rm -rf ./lib/ || exit 1","compile":"NODE_ENV=production babel src --out-dir lib --copy-files","reinstall":"rm -rf node_modules package-lock.json && npm install","lint:tofile":"eslint --ext .es,.js --no-color -o ./eslint-report.log ./","test:tofile":"npm run compile && TZ='GMT' mocha --no-colors -R spec \"test/**/*.js\" 2>&1 | tee test-report.log","prepublishOnly":"npm run check && npm run clean && npm run build"},"_npmUser":{"name":"suprmax","email":"max@degterev.me"},"deprecated":"Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.","repository":{"url":"git+https://github.com/good-hood-gmbh/nebenan-redux-tools.git","type":"git"},"_npmVersion":"6.14.8","description":"A set of redux helpers","directories":{},"_nodeVersion":"14.15.0","dependencies":{"js-cookie":"^2.2.1"},"_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"qs":"^6.9.0","chai":"^4.2.0","axios":"^0.21.0","mocha":"^8.2.1","react":"^17.0.1","redux":"^4.0.5","sinon":"^9.2.1","eslint":"^7.13.0","lodash":"^4.17.15","updeep":"^1.2.0","date-fns":"^2.16.1","@babel/cli":"^7.11.5","proxyquire":"^2.1.3","@babel/core":"^7.11.5","react-redux":"^7.2.1","react-router":"^5.2.0","@babel/runtime":"^7.12.5","nebenan-helpers":"^4.4.0","@babel/preset-env":"^7.11.5","nebenan-react-hocs":"^6.0.0","local-storage-adapter":"^2.0.0","eslint-config-nebenan-base":"^1.3.1","browserslist-config-nebenan":"^1.0.0","escape-string-regexp-browser":"1.1.0","@babel/plugin-transform-runtime":"^7.11.5","babel-plugin-add-module-exports":"^1.0.2","@babel/plugin-proposal-json-strings":"^7.0.0","@babel/plugin-transform-strict-mode":"^7.0.0"},"peerDependencies":{"qs":"^6.9.0","axios":"^0.21.0","react":"^16.14.0 || ^17.0.1","lodash":"^4.17.15","updeep":"^1.2.0","react-redux":"^7.2.1","@babel/runtime":"^7.12.5","nebenan-react-hocs":"^5.11.0 || ^6.0.0","local-storage-adapter":"^2.0.0","escape-string-regexp-browser":"1.1.0"},"_npmOperationalInternal":{"tmp":"tmp/nebenan-redux-tools_5.4.0-beta.0_1605710595191_0.2196906587814833","host":"s3://npm-registry-packages"}},"5.4.0":{"name":"nebenan-redux-tools","version":"5.4.0","author":{"name":"Nebenan.de","email":"max@nebenan.de"},"license":"SEE LICENSE IN LICENSE FILE","_id":"nebenan-redux-tools@5.4.0","maintainers":[{"name":"ozerovs","email":"ozerovsa@gmail.com"},{"name":"peterhassler","email":"peter.h@nebenan.de"},{"name":"nebenan-owner","email":"max@nebenan.de"},{"name":"suprmax","email":"max@degterev.me"},{"name":"atomiomi","email":"atomio.ak@gmail.com"}],"homepage":"https://nebenan.de/","bugs":{"url":"https://github.com/good-hood-gmbh/nebenan-redux-tools/issues"},"dist":{"shasum":"9a8da39677b844e19a34f72db0c8da58bba12497","tarball":"https://registry.npmjs.org/nebenan-redux-tools/-/nebenan-redux-tools-5.4.0.tgz","fileCount":23,"integrity":"sha512-I2daAtyJBJHEcLFl0mJO2A03I8MvjVfrXOGx0Rp20JergmVq+44PxCBRdL2jVEr6BdnJD1X27aUpE9yKsrwfbw==","signatures":[{"sig":"MEUCIDIJ2+xq0uWXQE1nYSFqgvUblW5uDMh1PiTOPvnKSQC4AiEA1vGtXJMntW9Bb5/++dor+CN3Sc52m1H/azw2TWy0pgE=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":27933,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJftlX2CRA9TVsSAnZWagAAbFkQAIvOGNHM0THqfAu8QOhr\ngQxxrCb1qq+e/v590zo24uthbMXarfEcelmKN/CrBHy53vaOC1rG3wLpn0KF\nJXZp7449Ul1dNKO8cKIa2e2rVpUM0oPyV8lFdZkLlIsSBWhUjR0r6VN0itAx\nCOgyPxerGMWDaDQ0dGTLOh42ce+wEzOsQ4oZ4ZF9F4bGEdkqduHjG9JRIV+0\ny+2ki5rMfIiyR4giWnFc782VsVs8/SA5JpeVq2eJLpppo3MZ8HCiBVZXh/9N\n932j5tLpZwA2INlq9G5R4V6v/VNSf3QkmfmR9tWhOjwTfyEXBPEQ0ad3LbPW\nza67UMJoyua4r6QzkkrBNpWVzQE48EXEYVXa8l6f0EVpejumhaoTkgcs3Kf1\nqa+bdQCkJ5XJl0aBJlMWljbW8c36dbrw07glkTmvfe2PW+agjvOezm/MfXcd\n12Mip1qvnmoUoB0NK/poakhiT6F3AWD/PjgxzVTn+tmh32ngYndlAOZVYB9Z\nDfeD5mViBJem/vywoLap7KXYyicSgwyFtthXhlUgqup0afnF+fUVe9Mo0ftO\ndhPEaY/DV7YTLd3/1lGl+75hHCG3mPh67lVZzWLp4JuyhBMEJjijuUWeNZcC\nYurnkl5TYqmyKNTP3+PP0PT5OHKrgZlyKjHbyiss9wsn5krziBdcpsmaxMK/\nOF70\r\n=TlfU\r\n-----END PGP SIGNATURE-----\r\n"},"gitHead":"a3ff2e4ec3faf8252b92af41c5cc1e70869ed06e","scripts":{"lint":"eslint --ext .es,.js ./","test":"npm run compile && TZ='GMT' mocha \"test/**/*.js\"","build":"npm run compile","check":"npm test && npm run lint && echo \"\\033[0;32mReady to publish\\033[0m\"","clean":"rm -rf ./lib/ || exit 1","compile":"NODE_ENV=production babel src --out-dir lib --copy-files","reinstall":"rm -rf node_modules package-lock.json && npm install","lint:tofile":"eslint --ext .es,.js --no-color -o ./eslint-report.log ./","test:tofile":"npm run compile && TZ='GMT' mocha --no-colors -R spec \"test/**/*.js\" 2>&1 | tee test-report.log","prepublishOnly":"npm run check && npm run clean && npm run build"},"_npmUser":{"name":"suprmax","email":"max@degterev.me"},"deprecated":"Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.","repository":{"url":"git+https://github.com/good-hood-gmbh/nebenan-redux-tools.git","type":"git"},"_npmVersion":"6.14.8","description":"A set of redux helpers","directories":{},"_nodeVersion":"14.15.0","dependencies":{"js-cookie":"^2.2.1"},"_hasShrinkwrap":false,"devDependencies":{"qs":"^6.9.0","chai":"^4.2.0","axios":"^0.21.0","mocha":"^8.2.1","react":"^17.0.1","redux":"^4.0.5","sinon":"^9.2.1","eslint":"^7.13.0","lodash":"^4.17.15","updeep":"^1.2.0","date-fns":"^2.16.1","@babel/cli":"^7.11.5","proxyquire":"^2.1.3","@babel/core":"^7.11.5","react-redux":"^7.2.1","react-router":"^5.2.0","@babel/runtime":"^7.12.5","nebenan-helpers":"^4.4.0","@babel/preset-env":"^7.11.5","nebenan-react-hocs":"^6.0.0","local-storage-adapter":"^2.0.0","eslint-config-nebenan-base":"^1.3.1","browserslist-config-nebenan":"^1.0.0","escape-string-regexp-browser":"1.1.0","@babel/plugin-transform-runtime":"^7.11.5","babel-plugin-add-module-exports":"^1.0.2","@babel/plugin-proposal-json-strings":"^7.0.0","@babel/plugin-transform-strict-mode":"^7.0.0"},"peerDependencies":{"qs":"^6.9.0","axios":"^0.21.0","react":"^16.14.0 || ^17.0.1","lodash":"^4.17.15","updeep":"^1.2.0","react-redux":"^7.2.1","@babel/runtime":"^7.12.5","nebenan-react-hocs":"^5.11.0 || ^6.0.0","local-storage-adapter":"^2.0.0","escape-string-regexp-browser":"1.1.0"},"_npmOperationalInternal":{"tmp":"tmp/nebenan-redux-tools_5.4.0_1605785078288_0.900561319858614","host":"s3://npm-registry-packages"}},"5.5.0":{"name":"nebenan-redux-tools","version":"5.5.0","author":{"name":"Nebenan.de","email":"max@nebenan.de"},"license":"SEE LICENSE IN LICENSE FILE","_id":"nebenan-redux-tools@5.5.0","maintainers":[{"name":"ozerovs","email":"ozerovsa@gmail.com"},{"name":"peterhassler","email":"peter.h@nebenan.de"},{"name":"nebenan-owner","email":"max@nebenan.de"},{"name":"suprmax","email":"max@degterev.me"},{"name":"atomiomi","email":"atomio.ak@gmail.com"}],"homepage":"https://nebenan.de/","bugs":{"url":"https://github.com/good-hood-gmbh/nebenan-redux-tools/issues"},"dist":{"shasum":"f9be464e6cea4c476d1ab7ec864cf16b24fd91fe","tarball":"https://registry.npmjs.org/nebenan-redux-tools/-/nebenan-redux-tools-5.5.0.tgz","fileCount":23,"integrity":"sha512-3S+Wir0NaHLF6cZ+g+wjLCCKtXP6OF9puVNj+4F7w1wv19JF4sw/hv27cPSgVpaG7YNsusT2rN4VQC6MKI83dA==","signatures":[{"sig":"MEUCIFjVzF94q2AklvRUEeHGohoVXrnxMTis6es/wmkVNnJtAiEA8X1ClM9+4PJbLTnX53XJsCX+3IgECU85Vn8mYIAhp+o=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":27943,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJft/aRCRA9TVsSAnZWagAAYu0P/A5VX35T7vd4YbvWSKpV\nsMEx1giXS2YKdd3ghxnnKSfMjro3GuM2sGxVC+puqeNdUAGEO+v9dP+4AxtI\nJpPq1Mia8FpjRdxLnCx/qpPqlGoQatnxdjL0xQpWBQZS1pvpyrwwqMhAFgGz\nvQ8HDTDS8pr7dFK3+XRTNGQPAA1WzcL7zJzTNzNnGUaQFWpIM4rFui95/z7/\ntPOWFcCZkyxjgeE0UeyneThI0yYz4GHYc7G46c3jLBi55oPYQCU89IXdsp5f\njDZNlh6H1Qz8VC/KUYxXFu9dMSXNRCWHpZ2cIlolkHNQOHeobp200SOGhRc5\nK9rdw6AU3NgaRQjptH0nvnEaTynTCq/6KaYYtiSwYohXHfPJlXdcrbTLO4GQ\nfuyEgOrOIpTntTGpprOqyZDD/1DMTh21sjP1xFEun2IxHIWiSo1iK2/5U7wc\nhd/4BbgKiHbPza8Rt9rKYeHK3FLE+gK7KsevbLvj8U2TxEdqjglvbWGAjA8n\nIbIK8BNiurgdXUdPLVacZ8za09dXooD+ABTwDosEEO948Ti5lewSDtr9VuGv\nFe0l2GzsDvYLSMTw+34FwQzWwyH9geLdcMJYZYbsVFrRMJQU02g98YwTjaU5\n0Z7mjr9eCDwVz+rlAh+cY2kAM+tXfLl//QP69TUmY6Q1oJzqn1C/Lk2Fp3Ir\nUHHV\r\n=QREO\r\n-----END PGP SIGNATURE-----\r\n"},"gitHead":"5abeb9d4383804b3561fd6547aeae86ed314801d","scripts":{"lint":"eslint --ext .es,.js ./","test":"npm run compile && TZ='GMT' mocha \"test/**/*.js\"","build":"npm run compile","check":"npm test && npm run lint && echo \"\\033[0;32mReady to publish\\033[0m\"","clean":"rm -rf ./lib/ || exit 1","compile":"NODE_ENV=production babel src --out-dir lib --copy-files","reinstall":"rm -rf node_modules package-lock.json && npm install","lint:tofile":"eslint --ext .es,.js --no-color -o ./eslint-report.log ./","test:tofile":"npm run compile && TZ='GMT' mocha --no-colors -R spec \"test/**/*.js\" 2>&1 | tee test-report.log","prepublishOnly":"npm run check && npm run clean && npm run build"},"_npmUser":{"name":"suprmax","email":"max@degterev.me"},"deprecated":"Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.","repository":{"url":"git+https://github.com/good-hood-gmbh/nebenan-redux-tools.git","type":"git"},"_npmVersion":"6.14.8","description":"A set of redux helpers","directories":{},"_nodeVersion":"14.15.0","dependencies":{"js-cookie":"^2.2.1"},"_hasShrinkwrap":false,"devDependencies":{"qs":"^6.9.0","chai":"^4.2.0","axios":"^0.21.0","mocha":"^8.2.1","react":"^17.0.1","redux":"^4.0.5","sinon":"^9.2.1","eslint":"^7.13.0","lodash":"^4.17.15","updeep":"^1.2.0","date-fns":"^2.16.1","@babel/cli":"^7.11.5","proxyquire":"^2.1.3","@babel/core":"^7.11.5","react-redux":"^7.2.1","react-router":"^5.2.0","@babel/runtime":"^7.12.5","nebenan-helpers":"^4.5.0","@babel/preset-env":"^7.11.5","nebenan-react-hocs":"^7.0.0","local-storage-adapter":"^2.0.0","eslint-config-nebenan-base":"^1.3.1","browserslist-config-nebenan":"^1.0.0","escape-string-regexp-browser":"1.1.0","@babel/plugin-transform-runtime":"^7.11.5","babel-plugin-add-module-exports":"^1.0.2","@babel/plugin-proposal-json-strings":"^7.0.0","@babel/plugin-transform-strict-mode":"^7.0.0"},"peerDependencies":{"qs":"^6.9.0","axios":"^0.21.0","react":"^16.14.0 || ^17.0.1","lodash":"^4.17.15","updeep":"^1.2.0","react-redux":"^7.2.1","@babel/runtime":"^7.12.5","nebenan-react-hocs":"^5.11.0 || ^6.0.0 || ^7.0.0","local-storage-adapter":"^2.0.0","escape-string-regexp-browser":"1.1.0"},"_npmOperationalInternal":{"tmp":"tmp/nebenan-redux-tools_5.5.0_1605891728872_0.3051150672939653","host":"s3://npm-registry-packages"}},"5.6.0":{"name":"nebenan-redux-tools","version":"5.6.0","author":{"name":"Nebenan.de","email":"max@nebenan.de"},"license":"SEE LICENSE IN LICENSE FILE","_id":"nebenan-redux-tools@5.6.0","maintainers":[{"name":"ozerovs","email":"ozerovsa@gmail.com"},{"name":"peterhassler","email":"peter.h@nebenan.de"},{"name":"nebenan-owner","email":"max@nebenan.de"},{"name":"suprmax","email":"max@degterev.me"},{"name":"atomiomi","email":"atomio.ak@gmail.com"}],"homepage":"https://nebenan.de/","bugs":{"url":"https://github.com/good-hood-gmbh/nebenan-redux-tools/issues"},"dist":{"shasum":"794a6cb2b2b1feb47129d115fd8de3660ba74f7a","tarball":"https://registry.npmjs.org/nebenan-redux-tools/-/nebenan-redux-tools-5.6.0.tgz","fileCount":24,"integrity":"sha512-WFTIRl6uYJc2FY2ozRid3ky/2lKZpw2e4yDMOwrsKwZOJkjDjkXv2xjoa4p1D1eBYsHA0vJu9oE4v4pdg8ze9Q==","signatures":[{"sig":"MEQCIA8I+oi3LfXawctjBek81NaCJKOm83qHrTOTiHc45cijAiAivz3LDLqGFVIZBAwVxaGYt+dIGmbym2d2dgOT6dpvbA==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":28824,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJfyhACCRA9TVsSAnZWagAAv9kP/iMJH7nC1ycD+xuukKuS\nzvT8aEn48rCJMwnZ5+9OKwveuN4aIagvfkgBpgTyHzFBfz8MgNqNCXLAMr0K\noWsdMx7fNKqq9O/C9VmbWYk1B9wJDSxCR3SgAW/ZgtiHqjZOol+N2/35Y72G\nu+CReYqtmFSWdk4TnhrExVVOophbrbBeSHc6sEwqX1BQ4ZDDm8u05uyReriJ\nXGzCpVYfMkKG1ymtPtag5fO/XyWBzjwNO1UkkRRo/EZpZj2zoNh3LOf49xwn\naCQnDJ3qlxjPn+BLYkb1lW9/iuz7DEdmNdN0/dp+ZOM5bk6Di4n9Mee3N1kd\nNQLZxBQMJPFe4M2cEO/QhKjafqgSuNaJfhtajMWM2fYEPKApctcZtbML+fTT\nYn9C95HTN6JLniwuSdlGSl38u2zWVSwJqGHFHHA4dikBt6G32dCBcsU0vkh3\nnEzWP9SzhJmelwB3tTo0d9F39nqD5LGzCwLDOtvmPPGn4HFTbvZJ+f25MPVY\ncxVOV0EHZAB79VBq8rLqs514utPcQJ4aHNgzBCzwGsTcAQTO6ljPnhpM68NQ\n1cTT71N2nmIp/dxyKLfjlKTvcyELHap2BLdeFy4EK0VxNsYFpw/RZyAB7JNf\n+7/00TQIYdnVbGHgg+Rq4Kjc4JzDpkaAVhRHkHn0FcFMg/RsYot6fSmaCSWq\njRA3\r\n=EG4t\r\n-----END PGP SIGNATURE-----\r\n"},"gitHead":"82b4f8860dc6831d8911f45723d7421a62f681eb","scripts":{"lint":"eslint --ext .es,.js ./","test":"npm run compile && TZ='GMT' mocha \"test/**/*.js\"","build":"npm run compile","check":"npm test && npm run lint && echo \"\\033[0;32mReady to publish\\033[0m\"","clean":"rm -rf ./lib/ || exit 1","compile":"NODE_ENV=production babel src --out-dir lib --copy-files","reinstall":"rm -rf node_modules package-lock.json && npm install","lint:tofile":"eslint --ext .es,.js --no-color -o ./eslint-report.log ./","test:tofile":"npm run compile && TZ='GMT' mocha --no-colors -R spec \"test/**/*.js\" 2>&1 | tee test-report.log","prepublishOnly":"npm run check && npm run clean && npm run build"},"_npmUser":{"name":"atomiomi","email":"atomio.ak@gmail.com"},"deprecated":"Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.","repository":{"url":"git+https://github.com/good-hood-gmbh/nebenan-redux-tools.git","type":"git"},"_npmVersion":"6.14.9","description":"A set of redux helpers","directories":{},"_nodeVersion":"14.15.1","dependencies":{"js-cookie":"^2.2.1"},"_hasShrinkwrap":false,"devDependencies":{"qs":"^6.9.0","chai":"^4.2.0","axios":"^0.21.0","mocha":"^8.2.1","react":"^17.0.1","redux":"^4.0.5","sinon":"^9.2.1","eslint":"^7.13.0","lodash":"^4.17.15","updeep":"^1.2.0","date-fns":"^2.16.1","@babel/cli":"^7.11.5","proxyquire":"^2.1.3","@babel/core":"^7.11.5","react-redux":"^7.2.1","react-router":"^5.2.0","@babel/runtime":"^7.12.5","nebenan-helpers":"^4.5.0","@babel/preset-env":"^7.11.5","nebenan-react-hocs":"^7.0.0","local-storage-adapter":"^2.0.0","eslint-config-nebenan-base":"^1.3.1","browserslist-config-nebenan":"^1.0.0","escape-string-regexp-browser":"1.1.0","@babel/plugin-transform-runtime":"^7.11.5","babel-plugin-add-module-exports":"^1.0.2","@babel/plugin-proposal-json-strings":"^7.0.0","@babel/plugin-transform-strict-mode":"^7.0.0"},"peerDependencies":{"qs":"^6.9.0","axios":"^0.21.0","react":"^16.14.0 || ^17.0.1","lodash":"^4.17.15","updeep":"^1.2.0","react-redux":"^7.2.1","@babel/runtime":"^7.12.5","nebenan-react-hocs":"^5.11.0 || ^6.0.0 || ^7.0.0","local-storage-adapter":"^2.0.0","escape-string-regexp-browser":"1.1.0"},"_npmOperationalInternal":{"tmp":"tmp/nebenan-redux-tools_5.6.0_1607077889118_0.5422356128838952","host":"s3://npm-registry-packages"}},"5.7.0":{"name":"nebenan-redux-tools","version":"5.7.0","author":{"name":"Nebenan.de","email":"max@nebenan.de"},"license":"SEE LICENSE IN LICENSE FILE","_id":"nebenan-redux-tools@5.7.0","maintainers":[{"name":"nomn","email":"i.m.nomn@gmail.com"},{"name":"suprmax","email":"max@degterev.me"},{"name":"atomiomi","email":"atomio.ak@gmail.com"},{"name":"nebenan-owner","email":"max@nebenan.de"},{"name":"peterhassler","email":"peter.h@nebenan.de"},{"name":"ozerovs","email":"ozerovsa@gmail.com"}],"homepage":"https://nebenan.de/","bugs":{"url":"https://github.com/good-hood-gmbh/nebenan-redux-tools/issues"},"dist":{"shasum":"b473886922d380733a310ff6530fa4037d7ab445","tarball":"https://registry.npmjs.org/nebenan-redux-tools/-/nebenan-redux-tools-5.7.0.tgz","fileCount":24,"integrity":"sha512-potZLZSYfN8CWE7nMOvq4Q+cnJdrtyKdyiWnB9Hb0n0zy60a5XyZ8NNJ2E1xQTGRAjbyt1pbXs4Mbap3cRYG4Q==","signatures":[{"sig":"MEQCIGSDQVSJbIm/kl+OOutYRWdovTSEJbMsyWcZKCUygADQAiAx43nToEHihuARaDiXPMBFHpATfoc98AwQg7szCA6F0g==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":38158,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJggD/HCRA9TVsSAnZWagAASEUP/jJazv5TuKHB13IgI104\nVTNPKrE1+7IlJymHnYdr8Vw5GX9HBUDjOC/APWXqEcECRnIgCS4OjMnzki6N\naPR5qGPWb0DNoqB9r8iZ74KVRf4h04Z+iOusTa6wwfmSj6LMBBpn2EN/8uWd\nx/sw737PtQlGpZSJFoBXe9U3l1FfooNctI+lqFw9R2ezb9t8mKAlFEvzPlUi\nzlab9Xi6zNcv68vK8H5hxvM7hw01ie1SP0W+NlrP/ob3FBYrWvltUv4kM2+2\njB4+cH4XOLg+n2uiSSYeHXeR79X35cDpGG5u4A2gSpfJK09IYyqs9bX+TNgE\nIHjMQwIlYDkS3Cl5pKDQnGlchbo1fQcYunHkX2UQxzpbZpGqEqz0Fq0zkWPw\nJhmCRWZINxo+UvGfAl206hcTFLtoYJ9ZOEew1ECIJzBo8xtVE6Zw6Ysyi1Qy\nxWVhhdEjbld00hASDydOU1gQAtM2Uhm1+qCcybCL/Fah7+4gN6EtxbcLXdTj\n0lrSI9WZ4qjoHm2sBH05REgIDbxzai6UC6tov5nLANCKZU9INxnhm/HCBXGo\n+JsXOhzD1UoVbAV/yxbpdkzop2+0ywPaC1+HTQnuP4fFF6POpgLbaroPyZhs\nrsCLBiNSPpr+5Uq2mqe9s2LjI6o0Cd/gW9nc7SRF15f/QOnFnjjXq5N+ZhCe\noaR8\r\n=UmBx\r\n-----END PGP SIGNATURE-----\r\n"},"gitHead":"0a5393152c32c0120c8377eb1c456ce050ca1eb4","scripts":{"lint":"eslint --ext .es,.js ./","test":"npm run compile && TZ='GMT' mocha \"test/**/*.js\"","build":"npm run compile","check":"npm test && npm run lint && echo \"\\033[0;32mReady to publish\\033[0m\"","clean":"rm -rf ./lib/ || exit 1","compile":"NODE_ENV=production babel src --out-dir lib --copy-files","reinstall":"rm -rf node_modules package-lock.json && npm install","lint:tofile":"eslint --ext .es,.js --no-color -o ./eslint-report.log ./","test:tofile":"npm run compile && TZ='GMT' mocha --no-colors -R spec \"test/**/*.js\" 2>&1 | tee test-report.log","prepublishOnly":"npm run check && npm run clean && npm run build"},"_npmUser":{"name":"suprmax","email":"max@degterev.me"},"deprecated":"Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.","repository":{"url":"git+https://github.com/good-hood-gmbh/nebenan-redux-tools.git","type":"git"},"_npmVersion":"7.7.5","description":"A set of redux helpers","directories":{},"_nodeVersion":"14.16.0","dependencies":{"js-cookie":"^2.2.1"},"_hasShrinkwrap":false,"devDependencies":{"qs":"^6.9.0","chai":"^4.2.0","axios":"^0.21.0","mocha":"^8.2.1","react":"^17.0.1","redux":"^4.0.5","sinon":"^10.0.0","eslint":"^7.13.0","lodash":"^4.17.15","updeep":"^1.2.0","date-fns":"^2.16.1","@babel/cli":"^7.11.5","proxyquire":"^2.1.3","@babel/core":"^7.11.5","react-redux":"^7.2.1","react-router":"^5.2.0","@babel/runtime":"^7.12.5","nebenan-helpers":"^4.5.0","@babel/preset-env":"^7.11.5","nebenan-react-hocs":"^7.0.0","local-storage-adapter":"^2.0.0","eslint-config-nebenan-base":"^1.3.1","browserslist-config-nebenan":"^1.0.0","escape-string-regexp-browser":"1.1.0","@babel/plugin-transform-runtime":"^7.11.5","babel-plugin-add-module-exports":"^1.0.2","@babel/plugin-proposal-json-strings":"^7.0.0","@babel/plugin-transform-strict-mode":"^7.0.0"},"peerDependencies":{"qs":"^6.9.0","axios":"^0.21.0","react":"^16.14.0 || ^17.0.1","lodash":"^4.17.15","updeep":"^1.2.0","react-redux":"^7.2.1","@babel/runtime":"^7.12.5","nebenan-react-hocs":"^5.11.0 || ^6.0.0 || ^7.0.0","local-storage-adapter":"^2.0.0","escape-string-regexp-browser":"1.1.0"},"_npmOperationalInternal":{"tmp":"tmp/nebenan-redux-tools_5.7.0_1619017671366_0.8743627764961661","host":"s3://npm-registry-packages"}},"5.8.0":{"name":"nebenan-redux-tools","version":"5.8.0","author":{"name":"Nebenan.de","email":"max@nebenan.de"},"license":"SEE LICENSE IN LICENSE FILE","_id":"nebenan-redux-tools@5.8.0","maintainers":[{"name":"nomn","email":"i.m.nomn@gmail.com"},{"name":"suprmax","email":"max@degterev.me"},{"name":"atomiomi","email":"atomio.ak@gmail.com"},{"name":"nebenan-owner","email":"max@nebenan.de"},{"name":"peterhassler","email":"peter.h@nebenan.de"},{"name":"ozerovs","email":"ozerovsa@gmail.com"}],"homepage":"https://nebenan.de/","bugs":{"url":"https://github.com/good-hood-gmbh/nebenan-redux-tools/issues"},"dist":{"shasum":"406204961c02382c69d20ddfdf4892323165b2f4","tarball":"https://registry.npmjs.org/nebenan-redux-tools/-/nebenan-redux-tools-5.8.0.tgz","fileCount":24,"integrity":"sha512-LleAjYficBJ0jB2dFx2TvMnDG8SAGWokA7W+MBFn6K3TPXBnFpk+Pv8l1rIS2hiLLwsTVUC+ZiVZuslc/MHPFQ==","signatures":[{"sig":"MEUCIQDvrGg75VYKsL0HIv0OdEYXw7iaK/VMVoTNC2psp4YtAAIgDso9p9T01S8chUBU/vAT074TW/W86zEPbF1y8g/r/GY=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":38168,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJgio9JCRA9TVsSAnZWagAAOuUP/3uKFQSswalD2qSru9/c\nvd32xrRrKJKpO/vWBu1DTY3EsBACHvL3RA3TvuqIf3Z2R5wOmuzulYs9O3Ec\n4ZpD0uWb+HLkH9HsXPRqOynJkeGRwJHVxBIz7RqMYuuHrvoILcEzZHcComTW\n/fDwd9WPsh/D4IpTVyaamc7w8HrE7LUqFmYv7cOXwIbpGNnMsipgXIMK4lI2\nR8SSNb8U/lsrzq1dA+ma6oaBg0N7bTF4zTjDgJCKlhPAPBZW/CKXIWu39QP9\ngVKQ7gLu8m8MtC8iFzX/jdG2emVNBRkzxMASxIdNngMzzGiFWSIwcRkfqD/m\nJcBOpLxxDCKWYXZwV5PpBhd6dvcoWcwfSh31byl/imjDjTuxadWjSRlYbr6e\n9spA9ej07gICBIBJ83EZ3V4zltZmHxyn0DYZuPRWZLk3Z111HppE2edYp7Zl\no6wk65f93DAQ4e2QjAVok3N3jYZIBOep8z8IDrjAFZ7EIifJYQarIQDO29Lh\n19h4Tbj9mSA3srylubrrzAQXFFGS/PW7oO21rXkA4WiHgOpg0DnLOcq4y/x5\nYXZ5iiGoJuvMCSekouiyQHbdRqil/os2JcVCNiuptmUOvAdEJASXGm3lTgHr\n7XP3qSfY6fa9fXLAeQno/Q4tj7kC+XYngSu63bxMi27NXGaRU08noggFJ4w5\ndfnw\r\n=ZPj3\r\n-----END PGP SIGNATURE-----\r\n"},"gitHead":"7fc7bcd7dd9184843bce28cdd39779def85d38ac","scripts":{"lint":"eslint --ext .es,.js ./","test":"npm run compile && TZ='GMT' mocha \"test/**/*.js\"","build":"npm run compile","check":"npm test && npm run lint && echo \"\\033[0;32mReady to publish\\033[0m\"","clean":"rm -rf ./lib/ || exit 1","compile":"NODE_ENV=production babel src --out-dir lib --copy-files","reinstall":"rm -rf node_modules package-lock.json && npm install","lint:tofile":"eslint --ext .es,.js --no-color -o ./eslint-report.log ./","test:tofile":"npm run compile && TZ='GMT' mocha --no-colors -R spec \"test/**/*.js\" 2>&1 | tee test-report.log","prepublishOnly":"npm run check && npm run clean && npm run build"},"_npmUser":{"name":"peterhassler","email":"peter.h@nebenan.de"},"deprecated":"Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.","repository":{"url":"git+https://github.com/good-hood-gmbh/nebenan-redux-tools.git","type":"git"},"_npmVersion":"7.8.0","description":"A set of redux helpers","directories":{},"_nodeVersion":"14.15.1","dependencies":{"js-cookie":"^2.2.1"},"_hasShrinkwrap":false,"devDependencies":{"qs":"^6.9.0","chai":"^4.2.0","axios":"^0.21.0","mocha":"^8.2.1","react":"^17.0.1","redux":"^4.0.5","sinon":"^10.0.0","eslint":"^7.13.0","lodash":"^4.17.15","updeep":"^1.2.0","date-fns":"^2.16.1","@babel/cli":"^7.11.5","proxyquire":"^2.1.3","@babel/core":"^7.11.5","react-redux":"^7.2.1","react-router":"^5.2.0","@babel/runtime":"^7.12.5","nebenan-helpers":"^5.0.0","@babel/preset-env":"^7.11.5","nebenan-react-hocs":"^8.0.0","local-storage-adapter":"^2.0.0","eslint-config-nebenan-base":"^1.3.1","browserslist-config-nebenan":"^1.0.0","escape-string-regexp-browser":"1.1.0","@babel/plugin-transform-runtime":"^7.11.5","babel-plugin-add-module-exports":"^1.0.2","@babel/plugin-proposal-json-strings":"^7.0.0","@babel/plugin-transform-strict-mode":"^7.0.0"},"peerDependencies":{"qs":"^6.9.0","axios":"^0.21.0","react":"^16.14.0 || ^17.0.1","lodash":"^4.17.15","updeep":"^1.2.0","react-redux":"^7.2.1","@babel/runtime":"^7.12.5","nebenan-react-hocs":"^5.11.0 || ^6.0.0 || ^7.0.0 || ^8.0.0","local-storage-adapter":"^2.0.0","escape-string-regexp-browser":"1.1.0"},"_npmOperationalInternal":{"tmp":"tmp/nebenan-redux-tools_5.8.0_1619693384722_0.7304713435082228","host":"s3://npm-registry-packages"}},"5.9.0":{"name":"nebenan-redux-tools","version":"5.9.0","author":{"name":"Nebenan.de","email":"max@nebenan.de"},"license":"SEE LICENSE IN LICENSE FILE","_id":"nebenan-redux-tools@5.9.0","maintainers":[{"name":"nomn","email":"i.m.nomn@gmail.com"},{"name":"suprmax","email":"max@degterev.me"},{"name":"atomiomi","email":"atomio.ak@gmail.com"},{"name":"nebenan-owner","email":"max@nebenan.de"},{"name":"peterhassler","email":"peter.h@nebenan.de"},{"name":"ozerovs","email":"ozerovsa@gmail.com"}],"homepage":"https://nebenan.de/","bugs":{"url":"https://github.com/good-hood-gmbh/nebenan-redux-tools/issues"},"dist":{"shasum":"3d1f065ea1ef7097c63e4eaf9694bc28b6ca4c6c","tarball":"https://registry.npmjs.org/nebenan-redux-tools/-/nebenan-redux-tools-5.9.0.tgz","fileCount":25,"integrity":"sha512-faIbo5oBEiEyAXkZUrni9Ho9tgnFhtPhjI9Oc2rQkd3QOEHppgeq9gw+kdcEjf9jcCNUhFWNsLk98g7PDnEZFQ==","signatures":[{"sig":"MEQCIC8cIGY9Z08JO+AAJfW846/UKV9QpQwrdTdaD1L0cHjqAiAjohskY5ARi63xZ1qeMoLSC2HLCatsP/3Szsvs4J3qDA==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":38740,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJgpRnlCRA9TVsSAnZWagAAvgYP/0R2fFyNEP1SU3AieOTX\nXAzFSbaGeUwaUNmT1YRSIq5ZMgNWknXOScUJV/p+cNnEk5jPnEZntyk8aCak\nSQJIrSuyfUb7DxinaRnGG/Zu1qRQxwk9iQxpmXC5Qigue048onLIFemGQ0Tv\nlJafbZWs7VDr5Srm9Z0/O2I7vp4T1xtRhMMys7zME5yE0JP8iQ8wohs1rcnj\nR5YC5FyjnbdQFjQaCGZEdHbLpvzexvk/X5nZbZmDuuU077f5/QxZoWlOYjvr\nPrYwd7mmkP8v+asqwhFPMKBX8gIjN2SMI+8kToQShtX1tMYJwVnkY4TCl/FM\nR0WaExlvXUIc5o+sapaXOfRkRxBbb98ZpbdT3/BVHtYvR9i/wljYlm8zEl4D\nQkjYbYb0D9MOVngChFJiVJagkl1A3G7yesqYmZniDHRSXyGPEn5Qs2i+LPGC\nKjVzevdpdl4pgdKp7s9ddn2sNMMh0wtO0U8xGlIfcCFca2PuktpA3WPylVHI\nArMUaIS0uQfS5XgMkNRN3MxAmyoLWHsPpET2U+IYL+3jObI9jwaaPwahby4f\n2LLmpjdpQV6TYBpJvaWcaa4a45xMwiZPYSp4igh2D1JRqzwAcy12GXwlDt4w\nspVqIadKmUhVOQB8Y2HI4pcRFi0R5wcLl0tqUYaFNnTLEGg3gZcVls0XTZpE\nWpXU\r\n=KeYm\r\n-----END PGP SIGNATURE-----\r\n"},"gitHead":"02bd583cfee10acf5a49f2871369b4fdf17b3e14","scripts":{"lint":"eslint --ext .es,.js ./","test":"npm run compile && TZ='GMT' mocha \"test/**/*.js\"","build":"npm run compile","check":"npm test && npm run lint && echo \"\\033[0;32mReady to publish\\033[0m\"","clean":"rm -rf ./lib/ || exit 1","compile":"NODE_ENV=production babel src --out-dir lib --copy-files","reinstall":"rm -rf node_modules package-lock.json && npm install","lint:tofile":"eslint --ext .es,.js --no-color -o ./eslint-report.log ./","test:tofile":"npm run compile && TZ='GMT' mocha --no-colors -R spec \"test/**/*.js\" 2>&1 | tee test-report.log","prepublishOnly":"npm run check && npm run clean && npm run build"},"_npmUser":{"name":"peterhassler","email":"peter.h@nebenan.de"},"deprecated":"Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.","repository":{"url":"git+https://github.com/good-hood-gmbh/nebenan-redux-tools.git","type":"git"},"_npmVersion":"7.11.2","description":"A set of redux helpers","directories":{},"_nodeVersion":"14.16.1","dependencies":{"js-cookie":"^2.2.1"},"_hasShrinkwrap":false,"devDependencies":{"qs":"^6.9.0","chai":"^4.2.0","axios":"^0.21.0","mocha":"^8.2.1","react":"^17.0.1","redux":"^4.0.5","sinon":"^10.0.0","eslint":"^7.13.0","lodash":"^4.17.15","updeep":"^1.2.0","date-fns":"^2.16.1","react-dom":"^17.0.2","@babel/cli":"^7.11.5","proxyquire":"^2.1.3","@babel/core":"^7.11.5","react-redux":"^7.2.1","react-router":"^5.2.0","@babel/runtime":"^7.12.5","nebenan-helpers":"^5.0.0","@babel/preset-env":"^7.11.5","nebenan-react-hocs":"^8.0.0","local-storage-adapter":"^2.0.0","eslint-config-nebenan-base":"^1.3.1","browserslist-config-nebenan":"^1.0.0","escape-string-regexp-browser":"1.1.0","@babel/plugin-transform-runtime":"^7.11.5","babel-plugin-add-module-exports":"^1.0.2","@babel/plugin-proposal-json-strings":"^7.0.0","@babel/plugin-transform-strict-mode":"^7.0.0"},"peerDependencies":{"qs":"^6.9.0","axios":"^0.21.0","react":"^16.14.0 || ^17.0.1","lodash":"^4.17.15","updeep":"^1.2.0","react-redux":"^7.2.1","@babel/runtime":"^7.12.5","nebenan-react-hocs":"^5.11.0 || ^6.0.0 || ^7.0.0 || ^8.0.0","local-storage-adapter":"^2.0.0","escape-string-regexp-browser":"1.1.0"},"_npmOperationalInternal":{"tmp":"tmp/nebenan-redux-tools_5.9.0_1621432805428_0.26148609940868717","host":"s3://npm-registry-packages"}},"5.10.0":{"name":"nebenan-redux-tools","version":"5.10.0","author":{"name":"Nebenan.de","email":"max@nebenan.de"},"license":"SEE LICENSE IN LICENSE FILE","_id":"nebenan-redux-tools@5.10.0","maintainers":[{"name":"nomn","email":"i.m.nomn@gmail.com"},{"name":"suprmax","email":"max@degterev.me"},{"name":"atomiomi","email":"atomio.ak@gmail.com"},{"name":"nebenan-owner","email":"max@nebenan.de"},{"name":"peterhassler","email":"peter.h@nebenan.de"},{"name":"ozerovs","email":"ozerovsa@gmail.com"}],"homepage":"https://nebenan.de/","bugs":{"url":"https://github.com/good-hood-gmbh/nebenan-redux-tools/issues"},"dist":{"shasum":"92ec9de62a01d681b4b17966a7f7f3ab14092798","tarball":"https://registry.npmjs.org/nebenan-redux-tools/-/nebenan-redux-tools-5.10.0.tgz","fileCount":26,"integrity":"sha512-8ggZZsJxHP/T6PzfzXJQy6ga2syk5CxKyCNIDNKH4JNJeGctAzkoc0C/KiJtiyUUlzDc/uTJAQWnPbAIje6PdA==","signatures":[{"sig":"MEQCIFp5tpoV2bo6kkGX04vXLlFu9NeI64iGtvTOloS4fztMAiBTRxuXPA2RPO4eyPQFApuyChQNYQqFi5JO5/D/XAr1xg==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":40233,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJgrKZyCRA9TVsSAnZWagAAchoP/AvEuhSUuRbypb4hVopG\niTRS+4iEU+T76lMkzUGNamSHQgDAXEs4+hYyicidif6T2KH5yL64XQUUh+IX\nYCc0rlLmFiI6Tx/6FhUfM6UPG83wMr/+Q/t79+wXCNeHZx7iyeHQQkQZkkdt\n0qog1Lz3QY4vpVc2dJGTCUDtpkn3l/gMlVHzZo2+nJ0KiYc30KWj/+pqM/6G\nKgmsdKvcKkF+o3I75Nrd7RhiIoijOviPIT95qqZGL7XdVwfMItH34s9KJLng\nt04xhiAUyZkthcLOz44L23zULnzhNtljhp5a+pLg3phe+sMlWc8S4PVIFjmn\nWRHSqmtLDf1xl4AuROqVGDLFi0naXomv0c96y8PracyBcQllFxCi6YVpca2s\nStcBBy7saEnf2M4lSKJVdsG8PMNwpDa1QF4tAI2b6wYPYDwiI5FmMjbKVcvf\n5GMFg7Kv6y3dD+c1X48dKrTdZ6VsUmbvG6XZM9VGXsHAvLXvM+evsxvNrkpR\nM/Rd1f68lrlsTuhRLC8TSTwNI1Gxo+LC9G4PdTH0266+R/QxWEwgR+kBwXDR\nWOFXyUxbkZ1Seg0cGc6A5aoTvkuWxXatW4q/jE2Bp3xNAt1s/y78PCoRI0Zq\nFZaghZiWkP/v7SludhLc+DiEShyoPHlL5rEA0c3uzo31c4muOELe0c075OtG\nzsol\r\n=SyQu\r\n-----END PGP SIGNATURE-----\r\n"},"gitHead":"d9af338a4db1c84df2349301c427b941b65189eb","scripts":{"lint":"eslint --ext .es,.js ./","test":"npm run compile && TZ='GMT' mocha \"test/**/*.js\"","build":"npm run compile","check":"npm test && npm run lint && echo \"\\033[0;32mReady to publish\\033[0m\"","clean":"rm -rf ./lib/ || exit 1","compile":"NODE_ENV=production babel src --out-dir lib --copy-files","reinstall":"rm -rf node_modules package-lock.json && npm install","lint:tofile":"eslint --ext .es,.js --no-color -o ./eslint-report.log ./","test:tofile":"npm run compile && TZ='GMT' mocha --no-colors -R spec \"test/**/*.js\" 2>&1 | tee test-report.log","prepublishOnly":"npm run check && npm run clean && npm run build"},"_npmUser":{"name":"peterhassler","email":"peter.h@nebenan.de"},"deprecated":"Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.","repository":{"url":"git+https://github.com/good-hood-gmbh/nebenan-redux-tools.git","type":"git"},"_npmVersion":"7.11.2","description":"A set of redux helpers","directories":{},"_nodeVersion":"14.16.1","dependencies":{"js-cookie":"^2.2.1"},"_hasShrinkwrap":false,"devDependencies":{"qs":"^6.9.0","chai":"^4.2.0","axios":"^0.21.0","mocha":"^8.2.1","react":"^17.0.1","redux":"^4.0.5","sinon":"^10.0.0","eslint":"^7.13.0","lodash":"^4.17.15","updeep":"^1.2.0","date-fns":"^2.16.1","react-dom":"^17.0.2","@babel/cli":"^7.11.5","proxyquire":"^2.1.3","@babel/core":"^7.11.5","react-redux":"^7.2.1","react-router":"^5.2.0","@babel/runtime":"^7.12.5","nebenan-helpers":"^5.0.0","@babel/preset-env":"^7.11.5","nebenan-react-hocs":"^8.0.0","local-storage-adapter":"^2.0.0","eslint-config-nebenan-base":"^1.3.1","browserslist-config-nebenan":"^1.0.0","escape-string-regexp-browser":"1.1.0","@babel/plugin-transform-runtime":"^7.11.5","babel-plugin-add-module-exports":"^1.0.2","@babel/plugin-proposal-json-strings":"^7.0.0","@babel/plugin-transform-strict-mode":"^7.0.0"},"peerDependencies":{"qs":"^6.9.0","axios":"^0.21.0","react":"^16.14.0 || ^17.0.1","lodash":"^4.17.15","updeep":"^1.2.0","react-redux":"^7.2.1","@babel/runtime":"^7.12.5","nebenan-react-hocs":"^5.11.0 || ^6.0.0 || ^7.0.0 || ^8.0.0","local-storage-adapter":"^2.0.0","escape-string-regexp-browser":"1.1.0"},"_npmOperationalInternal":{"tmp":"tmp/nebenan-redux-tools_5.10.0_1621927537679_0.8066895144417892","host":"s3://npm-registry-packages"}},"5.11.0-beta.0":{"name":"nebenan-redux-tools","version":"5.11.0-beta.0","author":{"name":"Nebenan.de","email":"max@nebenan.de"},"license":"SEE LICENSE IN LICENSE FILE","_id":"nebenan-redux-tools@5.11.0-beta.0","maintainers":[{"name":"nomn","email":"i.m.nomn@gmail.com"},{"name":"suprmax","email":"max@degterev.me"},{"name":"atomiomi","email":"atomio.ak@gmail.com"},{"name":"nebenan-owner","email":"max@nebenan.de"},{"name":"peterhassler","email":"peter.h@nebenan.de"},{"name":"ozerovs","email":"ozerovsa@gmail.com"}],"homepage":"https://nebenan.de/","bugs":{"url":"https://github.com/good-hood-gmbh/nebenan-redux-tools/issues"},"dist":{"shasum":"9b1363faa45234beec4d8bc218e14f2b8f9db580","tarball":"https://registry.npmjs.org/nebenan-redux-tools/-/nebenan-redux-tools-5.11.0-beta.0.tgz","fileCount":26,"integrity":"sha512-fIxXW+go/R2gEecBKBP4CJNT3h3GA31zskUL5A/cTsRzS6PkasKOGzC6XF2INhbuXa4FEmtXmRz1sSAmGYBg6A==","signatures":[{"sig":"MEUCIAyBFaOKVeZ/uZ/fAlMpF1MWbJMEIN0U5zR3oHPmhxelAiEA5c/TELKW4AXAW0Cerg6cLMj+sfY9ao392NoZJZbxSmI=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":40356,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJgvgJjCRA9TVsSAnZWagAAOn8P+wQJpxTE40+pulyeB4GA\nyNPyv+4fds2Vih4rSK3+EZLPgRRpn7Er5Z22ieqrlXuzkyp3Pj+KuFjKXqAC\nWU/XoVjL7h9OervEP5PAq5usvCTJY1HKvsWdZezy+Uy9wLPY0C4+7G3wpYgE\ncB5Nt+7ROWMSmpT827icHP93IWKhld/1iV8DBNelsAZa00U++39mPxN/DBlk\nlpUE+XSD49K5TKH69AuEIx5iqr3AqCgfo8YsIH04Puu6fRuoCIoL4XAj24td\nLUJfzTauOXPQ4DmGRtPDcvmzLxIBTomjt3UJcB9cJtxEgrAEMVOlMnuw4RLO\niEkEeaesogz3g9dNuABl+183yAc09HbFj3dLWyjMKhYnD6E+b0BsFJe0gR6m\n16O4+kMLT6DE4VH1VVj6Z9ApUfxM3OFZpkr6QTCdlyXakT7xr8+7Jks0Mjfz\nn+/YIa3PNoK3jSsA+uWDF7ap/qLoKCH7aLePllylOJaphKyFV7/7sXuhvC92\n1+xuB0q26IkwO4/VkC+inOBVhGHHcpPaT4AxAR1tqH2mS2Q1jtY7LSk1yqvI\n2JTGqLQ/xzgVMR/Gwi35ow6yk6BzbTOTSgSTBFM/ZFQLXIfL4vylYU8JxmCW\nbCWpMVURuRcL42w3PWNzTqojhwO1wG8l2vRRyc+cZetDrS7YREGi3hOThrHZ\nI2pP\r\n=aZov\r\n-----END PGP SIGNATURE-----\r\n"},"readme":"nebenan-redux-tools\n====================\n\nA set of redux helpers.\n\n- [Experiments Middleware](#experiments-middleware)\n- [Token Middleware](#token-middleware)\n- [Promise Middleware](#promise-middleware)\n- [Network Middleware](#network-middleware)\n  - [Trustworthy Endpoints](#trustworthy-endpoints)\n  - [API Token](#api-token)\n  - [X-Translations-Lang Header](#x-translations-lang-header)\n  - [Should Request](#should-request)\n  - [Abort Callback](#abort-callback)\n  - [Request Types](#request-types)\n  - [Pagination](#pagination)\n  - [Mock Responses](#mock-response)\n  - [Standalone Request](#standalone-request)\n  - [Customize](#customize)\n  \n# Experiments Middleware\n## Setup\n\n**NOT COMPLETE**\n```js\nimport { reducer as experiments } from 'nebenan-redux-tools/lib/experiments/state';\n\nconst reducers = { \n  // It is assumed that the experiment reducer's state\n  // is available under `state.experiments`\n  experiments \n};\n\n// ...\n\nconst createFromState = (initialState) => (\n  createStore(\n    combineReducers(reducers),\n    initialState,\n    composeEnhancers(applyMiddleware(...middleware)),\n  )\n);\n\nexport default createFromState\n```\n\n# Token Middleware\n## Setup\n**NOT COMPLETE**\n```js\nimport { reducer as token } from 'nebenan-redux-tools/lib/token';\n\nconst reducers = {\n  // It is assumed that the experiment reducer's state\n  // is available under `state.token`\n  token\n};\n\n// ...\n\nconst createFromState = (initialState) => (\n  createStore(\n    combineReducers(reducers),\n    initialState,\n    composeEnhancers(applyMiddleware(...middleware)),\n  )\n);\n\nexport default createFromState\n```\n  \n# Promise Middleware\nThe promise middleware gets triggered by dispatching actions with `promise` in payload. The middleware will dispatch resolved or rejected actions when the promise is fulfilled.\n\n```js\ndispatch({\n  type: types.GET_USERS,\n  promise: getUsersFromStorageAsync()\n})\n```\n\n```js\n// reducer\nimport { resolved, rejected } from 'nebenan-redux-tools/lib/promise';\n\nexport default (state = getDefaultState(), action) => {\n  switch(action.type) {\n    case resolved(types.GET_USERS): {\n      const usersFromStorage = action.payload;\n\n      return { ...state, users: usersFromStorage };\n    }\n\n    case rejected(types.GET_USERS): {\n      const usersFromStorage = [];\n\n      return { ...state, users: usersFromStorage };\n    }\n\n    default: {\n      return state;\n    }\n  }\n} \n```\n\n# Network Middleware\n\nThe network middleware gets triggered by dispatching actions with `request` in payload. The middleware will fire the request and dispatches resolved or rejected actions when the request is finished.\n\nExample:\n\n```js\ndispatch({\n  type: types.GET_USERS,\n  request: {\n    url: \"/users\"\n  }\n})\n```\n\n```js\nimport { resolved, rejected } from 'nebenan-redux-tools/lib/network/types';\n\nexport default (state = getDefaultState(), action) => {\n  switch(action.type) {\n    case resolved(types.GET_USERS): {\n      const usersFromResponse = action.payload;\n      \n      return { ...state, users: usersFromResponse };\n    }\n    \n    case rejected(types.GET_USERS): {\n      const usersFromResponse = [];\n      \n      return { ...state, users: usersFromResponse };\n    }\n    \n    default: {\n      return state;\n    }\n  }\n} \n```\n\n## Trustworthy Endpoints\n\nRequests to trustworthy endpoints will enable the [X-Translations-Lang Header](#x-translations-lang-header) and [API Token](#api-token) features.\n\nSet trusted domain via global config:\n```js\nimport { configureNetwork } from 'nebenan-redux-tools/lib/network';\n\nconfigureNetwork({\n  trustedDomain: \"nebenan.de\",\n  ...otherSettings\n})\n```\n\n## API Token\n\nRequests to [trustworthy endpoints](#trustworthy-endpoints) will have the `X-AUTH-TOKEN` header set, containing the api token configured in request options or through token middleware. \n\nDefault: `state.token` (see token middleware)\n\nOverwrite:\n```js\ndispatch({\n  type: \"some-type\", \n  request: {\n    url: \"/some/endpoint\",\n    token: \"special-api-token\"\n  }\n})\n```\n\n## X-Translations-Lang Header\n\nRequests to [trustworthy endpoints](#trustworthy-endpoints) will have the `X-Translations-Lang` header set, containing the locale configured in request options or through global config.\n\nDefault via global config: \n```js\nimport { configureNetwork } from 'nebenan-redux-tools/lib/network';\n\nconfigureNetwork({\n  locale: 'de-DE',\n  ...otherSettings\n})\n```\n\nOverwrite:\n```js\ndispatch({\n  type: \"some-type\",\n  request: {\n    url: \"/some/endpoint\",\n    locale: \"en-US\"  \n  }\n})\n```\n\n## Should Request\n\nPrevents unnecessary requests by checking state beforehand. \n\n```js\ndispatch({\n  type: \"some-type\",\n  request: {\n    url: \"/some/endpoint\",\n    shouldRequest(state) {\n     return !state.isFetched;\n    }\n  }\n})\n```\n\n## Abort Callback\n\nAllows to cancel running requests. You receive the cancel function by providing `getAbortCallback` in request options.\n\n```js\nlet cancelRequest;\n\ndispatch({\n  type: \"some-type\",\n  request: {\n    url: \"/some/endpoint\",\n    getAbortCallback: (callback) => {\n      cancelRequest = callback;\n    }\n  }\n})\n\n\n// later in app\ncancelRequest();\n\n```\n\n## Request Types\n\n`request.type` determines used HTTP method\n\n### `query`\n\nSends out GET request. Collects parameters from `request.query` and applies [pagination](#pagination) query options if there are any.\n\n```js\ndispatch({\n  type: \"some-type\",\n  request: {\n     url: \"/users\",\n     type: 'query',\n     query: { q: 'Peter' } \n  }\n})\n```\n\n\n### `delete` / `post` / `put`\n\n```js\ndispatch({\n  type: \"some-type\",\n  request: {\n    url: \"/some/endpoint/123\",\n    type: 'put',\n    payload: { user: { email, password }}\n  }  \n})\n```\n\n\n## Pagination\n\nThere is some boilerplate needed to fully support paginated lists loaded over the network. These helpers help with managing state and sending pagination params over the network.\n\nThe endpoint you are accessing needs to fulfill following requirements:\n- Parameters\n  - `per_page`\n  - `lower` / `higher`\n- Response\n  - `total_count` (`state.total` needs to be updated manually if field does not exist)\n\n### `assignPaginationDefaults` / `paginationGenerator` helpers\n\n```js\nimport { paginationGenerator, assignPaginationDefaults } from 'nebenan-redux-tools/lib/network/pagination';\n\nconst getDefaultState = () => assignPaginationDefaults({ entities: {} });\nconst getPaginationUpdates = paginationGenerator(types.BOOKMARKS_FETCH);\n\nexport const reducer = (state = getDefaultState(), action) => {\n  let newState = state;\n  \n  const update = getPaginationUpdates(newState, action);\n  if (update) newState = updeep(update, newState);\n  \n  switch (action.type) {\n    case resolved(types.BOOKMARKS_FETCH): {\n      const { result, entities } = parse(action.payload);\n\n      const collection = newState.collection.concat(result.bookmarks);\n\n      return updeep({ collection, entities }, newState);\n    }\n    \n    default: {\n      return newState;\n    }\n  }\n}\n```\n\nThe state now holds the following information\n```js\n{\n  // (managed by paginationGenerator)\n  currentPage: 0, \n  // datetime of last fetch (managed by paginationGenerator)\n  lastFetched: 0,\n  // request in progress (managed by paginationGenerator)\n  isFetching: false,\n  // request failed (managed by paginationGenerator) \n  isFailed: false,  \n  // total amount of items over all pages (managed by paginationGenerator)\n  total: null,\n  // item ids for current page  \n  collection: [],\n}\n```\n\n### Actions\n\nPagination query params will be added for `query` requests with either `request.pagination.first` or `request.pagination.last` set.\n\n*Only works for endpoints supporting `lower`/`higher` params.*\n\n```js\ndispatch({\n  type: types.GET_USERS,\n  request: {\n    url: \"/users\",\n    type: 'query',\n    pagination: {\n      per_page: 10, // optional\n      first: firstUserId, // optional\n      last: lastUserId // optional\n    }\n  }\n})\n```\n\n## Mock Response\n\nResponses can be mocked by using the [promise middleware](#promise-middleware). You can keep all of your request options in the action and don't need to modify reducers. Quite useful during development if you are waiting for backend to support new endpoints.\n\n\n```js\ndispatch({\n  type: types.GET_USERS,\n  promise: Promise.resolve([\n    {\n      id: 1,\n      name: \"Peter\"\n    },\n    {\n      id: 2,\n      name: \"Christina\"\n    }\n  ]),\n  request: {\n    url: \"/users\",\n    type: 'query'\n  }\n})\n```\n\n```js\n// reducer\nimport { resolved } from 'nebenan-redux-tools/lib/network/types';\n\nexport default (state = getDefaultState(), action) => {\n  switch(action.type) {\n    case resolved(types.GET_USERS): {\n      const usersFromResponse = action.payload;\n      \n      return { ...state, users: usersFromResponse };\n    }\n    \n    default: {\n      return state;\n    }\n  }\n} \n```\n\n## Standalone Request\n\nRequests can be created programmatically too.\n\n```js\nimport { createRequest } from 'nebenan-redux-tools/lib/network';\n\nconst sendFile = (file, token) => (\n  createRequest({\n    token,\n    payload: { file },\n    url: '/file-upload',\n    type: 'post',\n    multipart: true,\n  }) \n)\n\nconst handleSuccess = (payload) => {\n  // same as action.payload\n  console.log(payload);\n}\n\nsendFile(newFile, token).then(handleSuccess);\n```\n\n## Customize\n\nThe network layer uses [axios](https://github.com/axios/axios) under the hood. To access axios specific features or extend functionality you can hook into request / response generation on a global or local scale.\n\nHooks:\n- `requestHook(requestConfig, requestOptions)`\n  - `requestConfig` the [axios request config](https://github.com/axios/axios#request-config) to be mutated\n  - `requestOptions` the `request` object provided inside the action\n- `responseHook(body, requestConfig, requestOptions)`\n  - `body` response data to be mutated\n  - `requestConfig` the [axios request config](https://github.com/axios/axios#request-config)\n  - `requestOptions` the `request` object provided inside the action\n  \n### Setup global hooks\n\n```js\nimport { configureNetwork } from 'nebenan-redux-tools/lib/network';\n\nconfigureNetwork({\n  requestHook: (requestConfig, requestOptions) => {\n    // ...\n  },\n  responseHook: (body, requestConfig, requestOptions) => {\n    // ...\n  },\n  ...networkSettings\n})\n```\n\n### Action level request hook\n\n```js\nimport { createRequest } from 'nebenan-redux-tools/lib/network';\n\nconst sendFile = (file, token, onProgress) => (\n  createRequest({\n    token,\n    payload: { file },\n    url: '/file-upload',\n    type: 'post',\n    multipart: true,\n    // same as requestHook\n    customize: (requestConfig) => {\n      requestConfig.onUploadProgress = onProgress;\n    }\n  })\n)\n```\n\n","gitHead":"9b9ded2b835c2fb3d00f896941e2b7d3e4510a09","scripts":{"lint":"eslint --ext .es,.js ./","test":"npm run compile && TZ='GMT' mocha \"test/**/*.js\"","build":"npm run compile","check":"npm test && npm run lint && echo \"\\033[0;32mReady to publish\\033[0m\"","clean":"rm -rf ./lib/ || exit 1","compile":"NODE_ENV=production babel src --out-dir lib --copy-files","reinstall":"rm -rf node_modules package-lock.json && npm install","lint:tofile":"eslint --ext .es,.js --no-color -o ./eslint-report.log ./","test:tofile":"npm run compile && TZ='GMT' mocha --no-colors -R spec \"test/**/*.js\" 2>&1 | tee test-report.log","prepublishOnly":"npm run check && npm run clean && npm run build"},"_npmUser":{"name":"peterhassler","email":"peter.h@nebenan.de"},"deprecated":"Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.","repository":{"url":"git+https://github.com/good-hood-gmbh/nebenan-redux-tools.git","type":"git"},"_npmVersion":"7.16.0","description":"A set of redux helpers","directories":{},"_nodeVersion":"14.16.1","dependencies":{"js-cookie":"^2.2.1"},"_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"qs":"^6.9.0","chai":"^4.2.0","axios":"^0.21.0","mocha":"^8.2.1","react":"^17.0.1","redux":"^4.0.5","sinon":"^10.0.0","eslint":"^7.13.0","lodash":"^4.17.15","updeep":"^1.2.0","date-fns":"^2.16.1","react-dom":"^17.0.2","@babel/cli":"^7.11.5","proxyquire":"^2.1.3","@babel/core":"^7.11.5","react-redux":"^7.2.1","react-router":"^5.2.0","@babel/runtime":"^7.12.5","nebenan-helpers":"^5.0.0","@babel/preset-env":"^7.11.5","nebenan-react-hocs":"^8.0.0","local-storage-adapter":"^2.0.0","eslint-config-nebenan-base":"^1.3.1","browserslist-config-nebenan":"^1.0.0","escape-string-regexp-browser":"1.1.0","@babel/plugin-transform-runtime":"^7.11.5","babel-plugin-add-module-exports":"^1.0.2","@babel/plugin-proposal-json-strings":"^7.0.0","@babel/plugin-transform-strict-mode":"^7.0.0"},"peerDependencies":{"qs":"^6.9.0","axios":"^0.21.0","react":"^16.14.0 || ^17.0.1","lodash":"^4.17.15","updeep":"^1.2.0","react-redux":"^7.2.1","@babel/runtime":"^7.12.5","nebenan-react-hocs":"^5.11.0 || ^6.0.0 || ^7.0.0 || ^8.0.0","local-storage-adapter":"^2.0.0","escape-string-regexp-browser":"1.1.0"},"_npmOperationalInternal":{"tmp":"tmp/nebenan-redux-tools_5.11.0-beta.0_1623065187802_0.5672304605464538","host":"s3://npm-registry-packages"}},"5.11.0":{"name":"nebenan-redux-tools","version":"5.11.0","author":{"name":"Nebenan.de","email":"max@nebenan.de"},"license":"SEE LICENSE IN LICENSE FILE","_id":"nebenan-redux-tools@5.11.0","maintainers":[{"name":"nomn","email":"i.m.nomn@gmail.com"},{"name":"suprmax","email":"max@degterev.me"},{"name":"atomiomi","email":"atomio.ak@gmail.com"},{"name":"nebenan-owner","email":"max@nebenan.de"},{"name":"peterhassler","email":"peter.h@nebenan.de"},{"name":"ozerovs","email":"ozerovsa@gmail.com"}],"homepage":"https://nebenan.de/","bugs":{"url":"https://github.com/good-hood-gmbh/nebenan-redux-tools/issues"},"dist":{"shasum":"41cf8a278fd68dbbbfd6fb54b2b8910673e19683","tarball":"https://registry.npmjs.org/nebenan-redux-tools/-/nebenan-redux-tools-5.11.0.tgz","fileCount":26,"integrity":"sha512-KV3oYMgfDqTVFHWGvxUwA6tvFk/fE5Az09tU/Pv9vrNp8i1yccjasvNpyljcdpQY0kDnTKhenQjzughmu5VDNw==","signatures":[{"sig":"MEUCIQCLG7XYxj8Nm7TvFvkgdtTAEnkNP/jew4YnvQgB8gxVIwIgTfX3xgBLmZ4NWGJ8ymhYhRRDLrw9EWm0GDm5CQMJkvc=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":40349,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJgv3o9CRA9TVsSAnZWagAAmvoP/0hSIuwOhoHT8+RumckT\n72nsd9SVsH191LNo7SmSMezI//51lB2CPV7NvXSsRZJ1Ib5Rxer0LyMCiAtz\nr9JwOlqUDgXOiv+WDw7WQ5bHYRl4RRLMiW2XUWiAVK3DupaqGFQ96nlv8xx5\nnuQ2WOURXxw1T0f+At9828vwbKGNBxDbRgPK8poj2JCfdwI/jfImVaHU/yJD\ndsqaNCBrb3BWe3uMddm3Ha/M2tuWIRJI1YIy5pscCG91HUznmSm+jVlfzAk7\nDstfN0scwC990lZBQUsSP6vWng/PsJm2krtRsrzmOCVrjTD1CXavzhXu65K6\nMCMvdasTimRpJHYkdJ4jjAx/H3n/bnI/8FyqJY4oyb6reZUsPnPrqmJM0Ecz\nDykmOx89wdlXSgmE0klEKx4MRf3GGUTma8mMlFEJerkqV4kxOQTafO3k6NoT\nv/P3GLKbh3zph/QEvM9GdtGzniAC0GtDL6I6oKakzKLLOPFvw+ncFh1sFU/o\nVABJI9zfmvJR4vkGRjFzYzHXZX7fWysLqRE+8De0Wz/eIPDU9Jpd1s7iE0zJ\n5PzKVBfTSySkM0rmtufAUdxB0udvMnqajkqajg7JGyTHtX8c1uow9XGBYiei\nSHYKnxfAgjUT2jsexepPHsnEOaLFCKiRPCyS2hoxk7bMUY63rwOXWr/9hhbe\nt520\r\n=5oTn\r\n-----END PGP SIGNATURE-----\r\n"},"gitHead":"6c797b8cae5c361e2a8ebaf5da069887c1694d57","scripts":{"lint":"eslint --ext .es,.js ./","test":"npm run compile && TZ='GMT' mocha \"test/**/*.js\"","build":"npm run compile","check":"npm test && npm run lint && echo \"\\033[0;32mReady to publish\\033[0m\"","clean":"rm -rf ./lib/ || exit 1","compile":"NODE_ENV=production babel src --out-dir lib --copy-files","reinstall":"rm -rf node_modules package-lock.json && npm install","lint:tofile":"eslint --ext .es,.js --no-color -o ./eslint-report.log ./","test:tofile":"npm run compile && TZ='GMT' mocha --no-colors -R spec \"test/**/*.js\" 2>&1 | tee test-report.log","prepublishOnly":"npm run check && npm run clean && npm run build"},"_npmUser":{"name":"peterhassler","email":"peter.h@nebenan.de"},"deprecated":"Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.","repository":{"url":"git+https://github.com/good-hood-gmbh/nebenan-redux-tools.git","type":"git"},"_npmVersion":"7.16.0","description":"A set of redux helpers","directories":{},"_nodeVersion":"14.16.1","dependencies":{"js-cookie":"^2.2.1"},"_hasShrinkwrap":false,"devDependencies":{"qs":"^6.9.0","chai":"^4.2.0","axios":"^0.21.0","mocha":"^8.2.1","react":"^17.0.1","redux":"^4.0.5","sinon":"^10.0.0","eslint":"^7.13.0","lodash":"^4.17.15","updeep":"^1.2.0","date-fns":"^2.16.1","react-dom":"^17.0.2","@babel/cli":"^7.11.5","proxyquire":"^2.1.3","@babel/core":"^7.11.5","react-redux":"^7.2.1","react-router":"^5.2.0","@babel/runtime":"^7.12.5","nebenan-helpers":"^5.0.0","@babel/preset-env":"^7.11.5","nebenan-react-hocs":"^8.0.0","local-storage-adapter":"^2.0.0","eslint-config-nebenan-base":"^1.3.1","browserslist-config-nebenan":"^1.0.0","escape-string-regexp-browser":"1.1.0","@babel/plugin-transform-runtime":"^7.11.5","babel-plugin-add-module-exports":"^1.0.2","@babel/plugin-proposal-json-strings":"^7.0.0","@babel/plugin-transform-strict-mode":"^7.0.0"},"peerDependencies":{"qs":"^6.9.0","axios":"^0.21.0","react":"^16.14.0 || ^17.0.1","lodash":"^4.17.15","updeep":"^1.2.0","react-redux":"^7.2.1","@babel/runtime":"^7.12.5","nebenan-react-hocs":"^5.11.0 || ^6.0.0 || ^7.0.0 || ^8.0.0","local-storage-adapter":"^2.0.0","escape-string-regexp-browser":"1.1.0"},"_npmOperationalInternal":{"tmp":"tmp/nebenan-redux-tools_5.11.0_1623161405290_0.5043925753330274","host":"s3://npm-registry-packages"}},"5.11.1-beta.0":{"name":"nebenan-redux-tools","version":"5.11.1-beta.0","author":{"name":"Nebenan.de","email":"max@nebenan.de"},"license":"SEE LICENSE IN LICENSE FILE","_id":"nebenan-redux-tools@5.11.1-beta.0","maintainers":[{"name":"suprmax","email":"max@degterev.me"},{"name":"atomiomi","email":"atomio.ak@gmail.com"},{"name":"peterhassler","email":"peter.h@nebenan.de"},{"name":"ozerovs","email":"ozerovsa@gmail.com"},{"name":"nomn","email":"i.m.nomn@gmail.com"}],"homepage":"https://nebenan.de/","bugs":{"url":"https://github.com/good-hood-gmbh/nebenan-redux-tools/issues"},"dist":{"shasum":"e44da6c4a5bbbdffec8fe7a9ffc50516a04112f7","tarball":"https://registry.npmjs.org/nebenan-redux-tools/-/nebenan-redux-tools-5.11.1-beta.0.tgz","fileCount":26,"integrity":"sha512-+ZVlct7UsUVbvbvWjw4B9BxrOR5NNAB256oGgi2PvBiYwN+zcDLjcXf5Gz/fjlNVQA6/ymArGld9EQ+j8spShw==","signatures":[{"sig":"MEQCIBvsWH7lumOyEBJjqyRsby0H3vGEdh2WpdfARS8/BL5rAiAa5y+L9TxmZi+0r1LjsbTnIu3sL0tXVMNfawk23FYDzg==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":40447},"readme":"nebenan-redux-tools\n====================\n\nA set of redux helpers.\n\n- [Experiments Middleware](#experiments-middleware)\n- [Token Middleware](#token-middleware)\n- [Promise Middleware](#promise-middleware)\n- [Network Middleware](#network-middleware)\n  - [Trustworthy Endpoints](#trustworthy-endpoints)\n  - [API Token](#api-token)\n  - [X-Translations-Lang Header](#x-translations-lang-header)\n  - [Should Request](#should-request)\n  - [Abort Callback](#abort-callback)\n  - [Request Types](#request-types)\n  - [Pagination](#pagination)\n  - [Mock Responses](#mock-response)\n  - [Standalone Request](#standalone-request)\n  - [Customize](#customize)\n  \n# Experiments Middleware\n## Setup\n\n**NOT COMPLETE**\n```js\nimport { reducer as experiments } from 'nebenan-redux-tools/lib/experiments/state';\n\nconst reducers = { \n  // It is assumed that the experiment reducer's state\n  // is available under `state.experiments`\n  experiments \n};\n\n// ...\n\nconst createFromState = (initialState) => (\n  createStore(\n    combineReducers(reducers),\n    initialState,\n    composeEnhancers(applyMiddleware(...middleware)),\n  )\n);\n\nexport default createFromState\n```\n\n# Token Middleware\n## Setup\n**NOT COMPLETE**\n```js\nimport { reducer as token } from 'nebenan-redux-tools/lib/token';\n\nconst reducers = {\n  // It is assumed that the experiment reducer's state\n  // is available under `state.token`\n  token\n};\n\n// ...\n\nconst createFromState = (initialState) => (\n  createStore(\n    combineReducers(reducers),\n    initialState,\n    composeEnhancers(applyMiddleware(...middleware)),\n  )\n);\n\nexport default createFromState\n```\n  \n# Promise Middleware\nThe promise middleware gets triggered by dispatching actions with `promise` in payload. The middleware will dispatch resolved or rejected actions when the promise is fulfilled.\n\n```js\ndispatch({\n  type: types.GET_USERS,\n  promise: getUsersFromStorageAsync()\n})\n```\n\n```js\n// reducer\nimport { resolved, rejected } from 'nebenan-redux-tools/lib/promise';\n\nexport default (state = getDefaultState(), action) => {\n  switch(action.type) {\n    case resolved(types.GET_USERS): {\n      const usersFromStorage = action.payload;\n\n      return { ...state, users: usersFromStorage };\n    }\n\n    case rejected(types.GET_USERS): {\n      const usersFromStorage = [];\n\n      return { ...state, users: usersFromStorage };\n    }\n\n    default: {\n      return state;\n    }\n  }\n} \n```\n\n# Network Middleware\n\nThe network middleware gets triggered by dispatching actions with `request` in payload. The middleware will fire the request and dispatches resolved or rejected actions when the request is finished.\n\nExample:\n\n```js\ndispatch({\n  type: types.GET_USERS,\n  request: {\n    url: \"/users\"\n  }\n})\n```\n\n```js\nimport { resolved, rejected } from 'nebenan-redux-tools/lib/network/types';\n\nexport default (state = getDefaultState(), action) => {\n  switch(action.type) {\n    case resolved(types.GET_USERS): {\n      const usersFromResponse = action.payload;\n      \n      return { ...state, users: usersFromResponse };\n    }\n    \n    case rejected(types.GET_USERS): {\n      const usersFromResponse = [];\n      \n      return { ...state, users: usersFromResponse };\n    }\n    \n    default: {\n      return state;\n    }\n  }\n} \n```\n\n## Trustworthy Endpoints\n\nRequests to trustworthy endpoints will enable the [X-Translations-Lang Header](#x-translations-lang-header) and [API Token](#api-token) features.\n\nSet trusted domain via global config:\n```js\nimport { configureNetwork } from 'nebenan-redux-tools/lib/network';\n\nconfigureNetwork({\n  trustedDomain: \"nebenan.de\",\n  ...otherSettings\n})\n```\n\n## API Token\n\nRequests to [trustworthy endpoints](#trustworthy-endpoints) will have the `X-AUTH-TOKEN` header set, containing the api token configured in request options or through token middleware. \n\nDefault: `state.token` (see token middleware)\n\nOverwrite:\n```js\ndispatch({\n  type: \"some-type\", \n  request: {\n    url: \"/some/endpoint\",\n    token: \"special-api-token\"\n  }\n})\n```\n\n## X-Translations-Lang Header\n\nRequests to [trustworthy endpoints](#trustworthy-endpoints) will have the `X-Translations-Lang` header set, containing the locale configured in request options or through global config.\n\nDefault via global config: \n```js\nimport { configureNetwork } from 'nebenan-redux-tools/lib/network';\n\nconfigureNetwork({\n  locale: 'de-DE',\n  ...otherSettings\n})\n```\n\nOverwrite:\n```js\ndispatch({\n  type: \"some-type\",\n  request: {\n    url: \"/some/endpoint\",\n    locale: \"en-US\"  \n  }\n})\n```\n\n## Should Request\n\nPrevents unnecessary requests by checking state beforehand. \n\n```js\ndispatch({\n  type: \"some-type\",\n  request: {\n    url: \"/some/endpoint\",\n    shouldRequest(state) {\n     return !state.isFetched;\n    }\n  }\n})\n```\n\n## Abort Callback\n\nAllows to cancel running requests. You receive the cancel function by providing `getAbortCallback` in request options.\n\n```js\nlet cancelRequest;\n\ndispatch({\n  type: \"some-type\",\n  request: {\n    url: \"/some/endpoint\",\n    getAbortCallback: (callback) => {\n      cancelRequest = callback;\n    }\n  }\n})\n\n\n// later in app\ncancelRequest();\n\n```\n\n## Request Types\n\n`request.type` determines used HTTP method\n\n### `query`\n\nSends out GET request. Collects parameters from `request.query` and applies [pagination](#pagination) query options if there are any.\n\n```js\ndispatch({\n  type: \"some-type\",\n  request: {\n     url: \"/users\",\n     type: 'query',\n     query: { q: 'Peter' } \n  }\n})\n```\n\n\n### `delete` / `post` / `put`\n\n```js\ndispatch({\n  type: \"some-type\",\n  request: {\n    url: \"/some/endpoint/123\",\n    type: 'put',\n    payload: { user: { email, password }}\n  }  \n})\n```\n\n\n## Pagination\n\nThere is some boilerplate needed to fully support paginated lists loaded over the network. These helpers help with managing state and sending pagination params over the network.\n\nThe endpoint you are accessing needs to fulfill following requirements:\n- Parameters\n  - `per_page`\n  - `lower` / `higher`\n- Response\n  - `total_count` (`state.total` needs to be updated manually if field does not exist)\n\n### `assignPaginationDefaults` / `paginationGenerator` helpers\n\n```js\nimport { paginationGenerator, assignPaginationDefaults } from 'nebenan-redux-tools/lib/network/pagination';\n\nconst getDefaultState = () => assignPaginationDefaults({ entities: {} });\nconst getPaginationUpdates = paginationGenerator(types.BOOKMARKS_FETCH);\n\nexport const reducer = (state = getDefaultState(), action) => {\n  let newState = state;\n  \n  const update = getPaginationUpdates(newState, action);\n  if (update) newState = updeep(update, newState);\n  \n  switch (action.type) {\n    case resolved(types.BOOKMARKS_FETCH): {\n      const { result, entities } = parse(action.payload);\n\n      const collection = newState.collection.concat(result.bookmarks);\n\n      return updeep({ collection, entities }, newState);\n    }\n    \n    default: {\n      return newState;\n    }\n  }\n}\n```\n\nThe state now holds the following information\n```js\n{\n  // (managed by paginationGenerator)\n  currentPage: 0, \n  // datetime of last fetch (managed by paginationGenerator)\n  lastFetched: 0,\n  // request in progress (managed by paginationGenerator)\n  isFetching: false,\n  // request failed (managed by paginationGenerator) \n  isFailed: false,  \n  // total amount of items over all pages (managed by paginationGenerator)\n  total: null,\n  // item ids for current page  \n  collection: [],\n}\n```\n\n### Actions\n\nPagination query params will be added for `query` requests with either `request.pagination.first` or `request.pagination.last` set.\n\n*Only works for endpoints supporting `lower`/`higher` params.*\n\n```js\ndispatch({\n  type: types.GET_USERS,\n  request: {\n    url: \"/users\",\n    type: 'query',\n    pagination: {\n      per_page: 10, // optional\n      first: firstUserId, // optional\n      last: lastUserId // optional\n    }\n  }\n})\n```\n\n## Mock Response\n\nResponses can be mocked by using the [promise middleware](#promise-middleware). You can keep all of your request options in the action and don't need to modify reducers. Quite useful during development if you are waiting for backend to support new endpoints.\n\n\n```js\ndispatch({\n  type: types.GET_USERS,\n  promise: Promise.resolve([\n    {\n      id: 1,\n      name: \"Peter\"\n    },\n    {\n      id: 2,\n      name: \"Christina\"\n    }\n  ]),\n  request: {\n    url: \"/users\",\n    type: 'query'\n  }\n})\n```\n\n```js\n// reducer\nimport { resolved } from 'nebenan-redux-tools/lib/network/types';\n\nexport default (state = getDefaultState(), action) => {\n  switch(action.type) {\n    case resolved(types.GET_USERS): {\n      const usersFromResponse = action.payload;\n      \n      return { ...state, users: usersFromResponse };\n    }\n    \n    default: {\n      return state;\n    }\n  }\n} \n```\n\n## Standalone Request\n\nRequests can be created programmatically too.\n\n```js\nimport { createRequest } from 'nebenan-redux-tools/lib/network';\n\nconst sendFile = (file, token) => (\n  createRequest({\n    token,\n    payload: { file },\n    url: '/file-upload',\n    type: 'post',\n    multipart: true,\n  }) \n)\n\nconst handleSuccess = (payload) => {\n  // same as action.payload\n  console.log(payload);\n}\n\nsendFile(newFile, token).then(handleSuccess);\n```\n\n## Customize\n\nThe network layer uses [axios](https://github.com/axios/axios) under the hood. To access axios specific features or extend functionality you can hook into request / response generation on a global or local scale.\n\nHooks:\n- `requestHook(requestConfig, requestOptions)`\n  - `requestConfig` the [axios request config](https://github.com/axios/axios#request-config) to be mutated\n  - `requestOptions` the `request` object provided inside the action\n- `responseHook(body, requestConfig, requestOptions)`\n  - `body` response data to be mutated\n  - `requestConfig` the [axios request config](https://github.com/axios/axios#request-config)\n  - `requestOptions` the `request` object provided inside the action\n  \n### Setup global hooks\n\n```js\nimport { configureNetwork } from 'nebenan-redux-tools/lib/network';\n\nconfigureNetwork({\n  requestHook: (requestConfig, requestOptions) => {\n    // ...\n  },\n  responseHook: (body, requestConfig, requestOptions) => {\n    // ...\n  },\n  ...networkSettings\n})\n```\n\n### Action level request hook\n\n```js\nimport { createRequest } from 'nebenan-redux-tools/lib/network';\n\nconst sendFile = (file, token, onProgress) => (\n  createRequest({\n    token,\n    payload: { file },\n    url: '/file-upload',\n    type: 'post',\n    multipart: true,\n    // same as requestHook\n    customize: (requestConfig) => {\n      requestConfig.onUploadProgress = onProgress;\n    }\n  })\n)\n```\n\n","gitHead":"dcda0fe0c368d3e8a71b124328a1fade84a0164f","scripts":{"lint":"eslint --ext .es,.js ./","test":"npm run compile && TZ='GMT' mocha \"test/**/*.js\"","build":"npm run compile","check":"npm test && npm run lint && echo \"\\033[0;32mReady to publish\\033[0m\"","clean":"rm -rf ./lib/ || exit 1","compile":"NODE_ENV=production babel src --out-dir lib --copy-files","reinstall":"rm -rf node_modules package-lock.json && npm install","lint:tofile":"eslint --ext .es,.js --no-color -o ./eslint-report.log ./","test:tofile":"npm run compile && TZ='GMT' mocha --no-colors -R spec \"test/**/*.js\" 2>&1 | tee test-report.log","prepublishOnly":"npm run check && npm run clean && npm run build"},"_npmUser":{"name":"peterhassler","email":"peter.h@nebenan.de"},"deprecated":"Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.","repository":{"url":"git+https://github.com/good-hood-gmbh/nebenan-redux-tools.git","type":"git"},"_npmVersion":"7.22.0","description":"A set of redux helpers","directories":{},"_nodeVersion":"14.16.1","dependencies":{"js-cookie":"^2.2.1"},"_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"qs":"^6.9.0","chai":"^4.2.0","axios":"^0.21.0","mocha":"^8.2.1","react":"^17.0.1","redux":"^4.0.5","sinon":"^10.0.0","eslint":"^7.13.0","lodash":"^4.17.15","updeep":"^1.2.0","date-fns":"^2.16.1","react-dom":"^17.0.2","@babel/cli":"^7.11.5","proxyquire":"^2.1.3","@babel/core":"^7.11.5","react-redux":"^7.2.1","react-router":"^5.2.0","@babel/runtime":"^7.12.5","nebenan-helpers":"^5.0.0","@babel/preset-env":"^7.11.5","nebenan-react-hocs":"^8.0.0","local-storage-adapter":"^2.0.0","eslint-config-nebenan-base":"^1.3.1","browserslist-config-nebenan":"^1.0.0","escape-string-regexp-browser":"1.1.0","@babel/plugin-transform-runtime":"^7.11.5","babel-plugin-add-module-exports":"^1.0.2","@babel/plugin-proposal-json-strings":"^7.0.0","@babel/plugin-transform-strict-mode":"^7.0.0"},"peerDependencies":{"qs":"^6.9.0","axios":"^0.21.0","react":"^16.14.0 || ^17.0.1","lodash":"^4.17.15","updeep":"^1.2.0","react-redux":"^7.2.1","@babel/runtime":"^7.12.5","nebenan-react-hocs":"^5.11.0 || ^6.0.0 || ^7.0.0 || ^8.0.0","local-storage-adapter":"^2.0.0","escape-string-regexp-browser":"1.1.0"},"_npmOperationalInternal":{"tmp":"tmp/nebenan-redux-tools_5.11.1-beta.0_1632215857176_0.13064801563737372","host":"s3://npm-registry-packages"}},"5.11.1":{"name":"nebenan-redux-tools","version":"5.11.1","author":{"name":"Nebenan.de","email":"max@nebenan.de"},"license":"SEE LICENSE IN LICENSE FILE","_id":"nebenan-redux-tools@5.11.1","maintainers":[{"name":"suprmax","email":"max@degterev.me"},{"name":"atomiomi","email":"atomio.ak@gmail.com"},{"name":"peterhassler","email":"peter.h@nebenan.de"},{"name":"ozerovs","email":"ozerovsa@gmail.com"},{"name":"nomn","email":"i.m.nomn@gmail.com"}],"homepage":"https://nebenan.de/","bugs":{"url":"https://github.com/good-hood-gmbh/nebenan-redux-tools/issues"},"dist":{"shasum":"2dc7098b7e297e2d92847e6a8a02116b9b0e83d7","tarball":"https://registry.npmjs.org/nebenan-redux-tools/-/nebenan-redux-tools-5.11.1.tgz","fileCount":26,"integrity":"sha512-3DVsYTI/DvNkFRsm4uHe/AC1nRiIf5FR+SpLqbtAroYSov9plkecyMLdr9qfEWv41Ny25LhaByAnCLBsPz/PMQ==","signatures":[{"sig":"MEQCIBRvOStAqtnP3DX0l84kYfbh20CCP8+QJrF7wEeEmKi/AiAZ1LZw5VnTAW2t7fyO02U/iDPCxq3HLVH6AcrLNG7yqQ==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":40466,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJh20R4CRA9TVsSAnZWagAAecUP/Ay5WdMuWfymaJQtPmtX\n2vyo2tQnYHSFQihCDF1h2LqGIseTs4+OZibqahMx22FvM+xYgUmJGwdbC88Q\nja37W0ZHlg0ZuJkXj+IpXkmMHbzTorZnTVObdFfBio+EVGtpm5FLN+4VfibQ\n+n8NEL46aRLtTV9bKhxnf2dA9CSH4HRCGEM0tkOROYt+23Xn6ik+5F3bPmhz\nXPDEwy6JXBy29JJ0iUJKIb2+WuIkCdlPJEdeqISQsktT6wNK46Wb9jJJHakE\nDN3RR/XVS+5DU0kDFqXmRmspfTzePik0mpeyBZV//qtsdIjXVDNJAcUixDH0\nlE8bWqRKUvg8EtKl194LT1rrvgUIa9PEqlmHUGjjh2ZVAPing8THmQfdFGk0\ngX2fwzdKucAndZJY0C4h3XskLQHFd15Uov0DIPxDX2Wh23usLNOlsy+MRkSp\n7XmnlfaY2VOTx8SiIu+8zqQU1ynvjHgVY7tjnDzQBsFW5XSKkath1oCHCMsE\ntOoH65gQ/sHRLPf4M5lORf5bGxLR2dc43OECMvCP382TO95RMujfQY43SBo2\n+yguy/+Ht5iL+0xxhZjNc7ugN7CxkT5lvjr+VUrrBj1sGflclz8UzWNKgfa8\nHHCR4uz0ckGUKYe+6Ha7ErFviM0wVTmhxUcyq9dbFDs++tFOK+3qGPMtbcH+\nTrEt\r\n=mNWH\r\n-----END PGP SIGNATURE-----\r\n"},"gitHead":"a7e4796304304041d69988967314fcd35f1fe1d6","scripts":{"lint":"eslint --ext .es,.js ./","test":"npm run compile && TZ='GMT' mocha \"test/**/*.js\"","build":"npm run compile","check":"npm test && npm run lint && echo \"\\033[0;32mReady to publish\\033[0m\"","clean":"rm -rf ./lib/ || exit 1","compile":"NODE_ENV=production babel src --out-dir lib --copy-files","reinstall":"rm -rf node_modules package-lock.json && npm install","lint:tofile":"eslint --ext .es,.js --no-color -o ./eslint-report.log ./","test:tofile":"npm run compile && TZ='GMT' mocha --no-colors -R spec \"test/**/*.js\" 2>&1 | tee test-report.log","prepublishOnly":"npm run check && npm run clean && npm run build"},"_npmUser":{"name":"peterhassler","email":"peter.h@nebenan.de"},"deprecated":"Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.","repository":{"url":"git+https://github.com/good-hood-gmbh/nebenan-redux-tools.git","type":"git"},"_npmVersion":"7.22.0","description":"A set of redux helpers","directories":{},"_nodeVersion":"14.16.1","dependencies":{"js-cookie":"^2.2.1"},"_hasShrinkwrap":false,"devDependencies":{"qs":"^6.9.0","chai":"^4.2.0","axios":"^0.21.0","mocha":"^8.2.1","react":"^17.0.1","redux":"^4.0.5","sinon":"^10.0.0","eslint":"^7.13.0","lodash":"^4.17.15","updeep":"^1.2.0","date-fns":"^2.16.1","react-dom":"^17.0.2","@babel/cli":"^7.11.5","proxyquire":"^2.1.3","@babel/core":"^7.11.5","react-redux":"^7.2.1","react-router":"^5.2.0","@babel/runtime":"^7.12.5","nebenan-helpers":"^5.0.0","@babel/preset-env":"^7.11.5","nebenan-react-hocs":"^8.0.0","local-storage-adapter":"^2.0.0","eslint-config-nebenan-base":"^1.3.1","browserslist-config-nebenan":"^1.0.0","escape-string-regexp-browser":"1.1.0","@babel/plugin-transform-runtime":"^7.11.5","babel-plugin-add-module-exports":"^1.0.2","@babel/plugin-proposal-json-strings":"^7.0.0","@babel/plugin-transform-strict-mode":"^7.0.0"},"peerDependencies":{"qs":"^6.9.0","axios":"^0.21.0","react":"^16.14.0 || ^17.0.1","lodash":"^4.17.15","updeep":"^1.2.0","react-redux":"^7.2.1","@babel/runtime":"^7.12.5","nebenan-react-hocs":"^5.11.0 || ^6.0.0 || ^7.0.0 || ^8.0.0","local-storage-adapter":"^2.0.0","escape-string-regexp-browser":"1.1.0"},"_npmOperationalInternal":{"tmp":"tmp/nebenan-redux-tools_5.11.1_1632216904532_0.45126307537989274","host":"s3://npm-registry-packages"}},"5.12.0-beta.0":{"name":"nebenan-redux-tools","version":"5.12.0-beta.0","author":{"name":"Nebenan.de","email":"max@nebenan.de"},"license":"SEE LICENSE IN LICENSE FILE","_id":"nebenan-redux-tools@5.12.0-beta.0","maintainers":[{"name":"iamuchejude","email":"iamuchejude@gmail.com"},{"name":"eliasbraun","email":"elias.braun@nebenan.de"},{"name":"peterhassler","email":"peter.h@nebenan.de"},{"name":"ozerovs","email":"ozerovsa@gmail.com"},{"name":"nomn","email":"i.m.nomn@gmail.com"},{"name":"suprmax","email":"max@degterev.me"}],"homepage":"https://nebenan.de/","bugs":{"url":"https://github.com/good-hood-gmbh/nebenan-redux-tools/issues"},"dist":{"shasum":"77611469ac369a56c4656d24272c3421a19ced2e","tarball":"https://registry.npmjs.org/nebenan-redux-tools/-/nebenan-redux-tools-5.12.0-beta.0.tgz","fileCount":26,"integrity":"sha512-0Ivkod46KeA5UaskO7OQkJK7k+jlVUow1/1ou4Y8qzHxIn0Dj2II5Y1XY9IBudpB++diT7WfFa3nJ+9E2i0XOw==","signatures":[{"sig":"MEUCIQCGjtJvWXc48+r2BhaTM0Hf1dawpQrjHPH+1Q5+cLAoFQIgDASQGx0ZG5rbyjr5taQWpYQ+Pa9SJOi+Urv96Km7f7A=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":40413,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJh6SElCRA9TVsSAnZWagAAAs0QAIoVQFMMrw3R/21Un+9f\n09I/wWpm3AoQLGJGjuOaKA2M5OjyfA19THGDCxUSEU6nyKdHrFz14vckXqpC\nKGL4i7uq0jqP1SsME3qM4COsQspXU5Qvvjv/TYEuFKACMZMa3oxEtEtLvSey\n9XicdyZXeHqLYwrkjckiz3DRh++++pz8iMon/8SGfB0ll9Bb3AtnGK58EPzI\n5juU+unq5P8Qfn2Qkm4y4E1HTmZFg8F3ypVWpJDWMdYEhh0TUFbairSWDcaE\nYnv4HHR/I6Yfkuem92FCf7aUg1rdc3jSkqBeADMFADyrcXghqs7GuRZebuIR\n4VFHIXDPFKGv+x/VkoMbLwxz1MGdPH6ee+6LM9viEzlpUdXSJ3swwrLBHbsI\nvdFgJR2+INj/ROPHS+4mbfL165xlzC5V+7IK/dpxwFhcBO1vcwoYKEaW5wGo\ndf+uDPYbmu1z0fpPc+LWod5skbbWstgZhYffTTRcImynKB9nKnN9QArHpiMf\nqp9WCD/NhjN6kwzkKYf6rdiBvPQgFUrnOaSvf1x9WZ9bualkZHwPBi/rYbRv\nvZjGIrBAG/vZ4hEBXQB57hOyFtq1rzrv2DuSfAt5MJEKSRR52y8Ze1yWv7+9\nY8Vn3FY2srTdZnNWx483iHdahH8rCxKCiJkDhBUXOu2TyqMKFz0mNpgC0STl\nn3MZ\r\n=Vvzd\r\n-----END PGP SIGNATURE-----\r\n"},"readme":"nebenan-redux-tools\n====================\n\nA set of redux helpers.\n\n- [Experiments Middleware](#experiments-middleware)\n- [Token Middleware](#token-middleware)\n- [Promise Middleware](#promise-middleware)\n- [Network Middleware](#network-middleware)\n  - [Trustworthy Endpoints](#trustworthy-endpoints)\n  - [API Token](#api-token)\n  - [X-Translations-Lang Header](#x-translations-lang-header)\n  - [Should Request](#should-request)\n  - [Abort Callback](#abort-callback)\n  - [Request Types](#request-types)\n  - [Pagination](#pagination)\n  - [Mock Responses](#mock-response)\n  - [Standalone Request](#standalone-request)\n  - [Customize](#customize)\n  \n# Experiments Middleware\n## Setup\n\n**NOT COMPLETE**\n```js\nimport { reducer as experiments } from 'nebenan-redux-tools/lib/experiments/state';\n\nconst reducers = { \n  // It is assumed that the experiment reducer's state\n  // is available under `state.experiments`\n  experiments \n};\n\n// ...\n\nconst createFromState = (initialState) => (\n  createStore(\n    combineReducers(reducers),\n    initialState,\n    composeEnhancers(applyMiddleware(...middleware)),\n  )\n);\n\nexport default createFromState\n```\n\n# Token Middleware\n## Setup\n**NOT COMPLETE**\n```js\nimport { reducer as token } from 'nebenan-redux-tools/lib/token';\n\nconst reducers = {\n  // It is assumed that the experiment reducer's state\n  // is available under `state.token`\n  token\n};\n\n// ...\n\nconst createFromState = (initialState) => (\n  createStore(\n    combineReducers(reducers),\n    initialState,\n    composeEnhancers(applyMiddleware(...middleware)),\n  )\n);\n\nexport default createFromState\n```\n  \n# Promise Middleware\nThe promise middleware gets triggered by dispatching actions with `promise` in payload. The middleware will dispatch resolved or rejected actions when the promise is fulfilled.\n\n```js\ndispatch({\n  type: types.GET_USERS,\n  promise: getUsersFromStorageAsync()\n})\n```\n\n```js\n// reducer\nimport { resolved, rejected } from 'nebenan-redux-tools/lib/promise';\n\nexport default (state = getDefaultState(), action) => {\n  switch(action.type) {\n    case resolved(types.GET_USERS): {\n      const usersFromStorage = action.payload;\n\n      return { ...state, users: usersFromStorage };\n    }\n\n    case rejected(types.GET_USERS): {\n      const usersFromStorage = [];\n\n      return { ...state, users: usersFromStorage };\n    }\n\n    default: {\n      return state;\n    }\n  }\n} \n```\n\n# Network Middleware\n\nThe network middleware gets triggered by dispatching actions with `request` in payload. The middleware will fire the request and dispatches resolved or rejected actions when the request is finished.\n\nExample:\n\n```js\ndispatch({\n  type: types.GET_USERS,\n  request: {\n    url: \"/users\"\n  }\n})\n```\n\n```js\nimport { resolved, rejected } from 'nebenan-redux-tools/lib/network/types';\n\nexport default (state = getDefaultState(), action) => {\n  switch(action.type) {\n    case resolved(types.GET_USERS): {\n      const usersFromResponse = action.payload;\n      \n      return { ...state, users: usersFromResponse };\n    }\n    \n    case rejected(types.GET_USERS): {\n      const usersFromResponse = [];\n      \n      return { ...state, users: usersFromResponse };\n    }\n    \n    default: {\n      return state;\n    }\n  }\n} \n```\n\n## Trustworthy Endpoints\n\nRequests to trustworthy endpoints will enable the [X-Translations-Lang Header](#x-translations-lang-header) and [API Token](#api-token) features.\n\nSet trusted domain via global config:\n```js\nimport { configureNetwork } from 'nebenan-redux-tools/lib/network';\n\nconfigureNetwork({\n  trustedDomain: \"nebenan.de\",\n  ...otherSettings\n})\n```\n\n## API Token\n\nRequests to [trustworthy endpoints](#trustworthy-endpoints) will have the `X-AUTH-TOKEN` header set, containing the api token configured in request options or through token middleware. \n\nDefault: `state.token` (see token middleware)\n\nOverwrite:\n```js\ndispatch({\n  type: \"some-type\", \n  request: {\n    url: \"/some/endpoint\",\n    token: \"special-api-token\"\n  }\n})\n```\n\n## X-Translations-Lang Header\n\nRequests to [trustworthy endpoints](#trustworthy-endpoints) will have the `X-Translations-Lang` header set, containing the locale configured in request options or through global config.\n\nDefault via global config: \n```js\nimport { configureNetwork } from 'nebenan-redux-tools/lib/network';\n\nconfigureNetwork({\n  locale: 'de-DE',\n  ...otherSettings\n})\n```\n\nOverwrite:\n```js\ndispatch({\n  type: \"some-type\",\n  request: {\n    url: \"/some/endpoint\",\n    locale: \"en-US\"  \n  }\n})\n```\n\n## Should Request\n\nPrevents unnecessary requests by checking state beforehand. \n\n```js\ndispatch({\n  type: \"some-type\",\n  request: {\n    url: \"/some/endpoint\",\n    shouldRequest(state) {\n     return !state.isFetched;\n    }\n  }\n})\n```\n\n## Abort Callback\n\nAllows to cancel running requests. You receive the cancel function by providing `getAbortCallback` in request options.\n\n```js\nlet cancelRequest;\n\ndispatch({\n  type: \"some-type\",\n  request: {\n    url: \"/some/endpoint\",\n    getAbortCallback: (callback) => {\n      cancelRequest = callback;\n    }\n  }\n})\n\n\n// later in app\ncancelRequest();\n\n```\n\n## Request Types\n\n`request.type` determines used HTTP method\n\n### `query`\n\nSends out GET request. Collects parameters from `request.query` and applies [pagination](#pagination) query options if there are any.\n\n```js\ndispatch({\n  type: \"some-type\",\n  request: {\n     url: \"/users\",\n     type: 'query',\n     query: { q: 'Peter' } \n  }\n})\n```\n\n\n### `delete` / `post` / `put`\n\n```js\ndispatch({\n  type: \"some-type\",\n  request: {\n    url: \"/some/endpoint/123\",\n    type: 'put',\n    payload: { user: { email, password }}\n  }  \n})\n```\n\n\n## Pagination\n\nThere is some boilerplate needed to fully support paginated lists loaded over the network. These helpers help with managing state and sending pagination params over the network.\n\nThe endpoint you are accessing needs to fulfill following requirements:\n- Parameters\n  - `per_page`\n  - `lower` / `higher`\n- Response\n  - `total_count` (`state.total` needs to be updated manually if field does not exist)\n\n### `assignPaginationDefaults` / `paginationGenerator` helpers\n\n```js\nimport { paginationGenerator, assignPaginationDefaults } from 'nebenan-redux-tools/lib/network/pagination';\n\nconst getDefaultState = () => assignPaginationDefaults({ entities: {} });\nconst getPaginationUpdates = paginationGenerator(types.BOOKMARKS_FETCH);\n\nexport const reducer = (state = getDefaultState(), action) => {\n  let newState = state;\n  \n  const update = getPaginationUpdates(newState, action);\n  if (update) newState = updeep(update, newState);\n  \n  switch (action.type) {\n    case resolved(types.BOOKMARKS_FETCH): {\n      const { result, entities } = parse(action.payload);\n\n      const collection = newState.collection.concat(result.bookmarks);\n\n      return updeep({ collection, entities }, newState);\n    }\n    \n    default: {\n      return newState;\n    }\n  }\n}\n```\n\nThe state now holds the following information\n```js\n{\n  // (managed by paginationGenerator)\n  currentPage: 0, \n  // datetime of last fetch (managed by paginationGenerator)\n  lastFetched: 0,\n  // request in progress (managed by paginationGenerator)\n  isFetching: false,\n  // request failed (managed by paginationGenerator) \n  isFailed: false,  \n  // total amount of items over all pages (managed by paginationGenerator)\n  total: null,\n  // item ids for current page  \n  collection: [],\n}\n```\n\n### Actions\n\nPagination query params will be added for `query` requests with either `request.pagination.first` or `request.pagination.last` set.\n\n*Only works for endpoints supporting `lower`/`higher` params.*\n\n```js\ndispatch({\n  type: types.GET_USERS,\n  request: {\n    url: \"/users\",\n    type: 'query',\n    pagination: {\n      per_page: 10, // optional\n      first: firstUserId, // optional\n      last: lastUserId // optional\n    }\n  }\n})\n```\n\n## Mock Response\n\nResponses can be mocked by using the [promise middleware](#promise-middleware). You can keep all of your request options in the action and don't need to modify reducers. Quite useful during development if you are waiting for backend to support new endpoints.\n\n\n```js\ndispatch({\n  type: types.GET_USERS,\n  promise: Promise.resolve([\n    {\n      id: 1,\n      name: \"Peter\"\n    },\n    {\n      id: 2,\n      name: \"Christina\"\n    }\n  ]),\n  request: {\n    url: \"/users\",\n    type: 'query'\n  }\n})\n```\n\n```js\n// reducer\nimport { resolved } from 'nebenan-redux-tools/lib/network/types';\n\nexport default (state = getDefaultState(), action) => {\n  switch(action.type) {\n    case resolved(types.GET_USERS): {\n      const usersFromResponse = action.payload;\n      \n      return { ...state, users: usersFromResponse };\n    }\n    \n    default: {\n      return state;\n    }\n  }\n} \n```\n\n## Standalone Request\n\nRequests can be created programmatically too.\n\n```js\nimport { createRequest } from 'nebenan-redux-tools/lib/network';\n\nconst sendFile = (file, token) => (\n  createRequest({\n    token,\n    payload: { file },\n    url: '/file-upload',\n    type: 'post',\n    multipart: true,\n  }) \n)\n\nconst handleSuccess = (payload) => {\n  // same as action.payload\n  console.log(payload);\n}\n\nsendFile(newFile, token).then(handleSuccess);\n```\n\n## Customize\n\nThe network layer uses [axios](https://github.com/axios/axios) under the hood. To access axios specific features or extend functionality you can hook into request / response generation on a global or local scale.\n\nHooks:\n- `requestHook(requestConfig, requestOptions)`\n  - `requestConfig` the [axios request config](https://github.com/axios/axios#request-config) to be mutated\n  - `requestOptions` the `request` object provided inside the action\n- `responseHook(body, requestConfig, requestOptions)`\n  - `body` response data to be mutated\n  - `requestConfig` the [axios request config](https://github.com/axios/axios#request-config)\n  - `requestOptions` the `request` object provided inside the action\n  \n### Setup global hooks\n\n```js\nimport { configureNetwork } from 'nebenan-redux-tools/lib/network';\n\nconfigureNetwork({\n  requestHook: (requestConfig, requestOptions) => {\n    // ...\n  },\n  responseHook: (body, requestConfig, requestOptions) => {\n    // ...\n  },\n  ...networkSettings\n})\n```\n\n### Action level request hook\n\n```js\nimport { createRequest } from 'nebenan-redux-tools/lib/network';\n\nconst sendFile = (file, token, onProgress) => (\n  createRequest({\n    token,\n    payload: { file },\n    url: '/file-upload',\n    type: 'post',\n    multipart: true,\n    // same as requestHook\n    customize: (requestConfig) => {\n      requestConfig.onUploadProgress = onProgress;\n    }\n  })\n)\n```\n\n","gitHead":"aacc916a7d2f3ab02ae0d5dcaf839bb944e33370","scripts":{"lint":"eslint --ext .es,.js ./","test":"npm run compile && TZ='GMT' mocha \"test/**/*.js\"","build":"npm run compile","check":"npm test && npm run lint && echo \"\\033[0;32mReady to publish\\033[0m\"","clean":"rm -rf ./lib/ || exit 1","compile":"NODE_ENV=production babel src --out-dir lib --copy-files","reinstall":"rm -rf node_modules package-lock.json && npm install","lint:tofile":"eslint --ext .es,.js --no-color -o ./eslint-report.log ./","test:tofile":"npm run compile && TZ='GMT' mocha --no-colors -R spec \"test/**/*.js\" 2>&1 | tee test-report.log","prepublishOnly":"npm run check && npm run clean && npm run build"},"_npmUser":{"name":"nomn","email":"i.m.nomn@gmail.com"},"deprecated":"Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.","repository":{"url":"git+https://github.com/good-hood-gmbh/nebenan-redux-tools.git","type":"git"},"_npmVersion":"8.1.3","description":"A set of redux helpers","directories":{},"_nodeVersion":"16.13.0","dependencies":{"js-cookie":"^2.2.1"},"_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"qs":"^6.9.0","chai":"^4.2.0","axios":"^0.21.0","mocha":"^8.2.1","react":"^17.0.1","redux":"^4.0.5","sinon":"^10.0.0","eslint":"^7.13.0","lodash":"^4.17.15","updeep":"^1.2.0","date-fns":"^2.16.1","react-dom":"^17.0.2","@babel/cli":"^7.11.5","proxyquire":"^2.1.3","@babel/core":"^7.11.5","react-redux":"^7.2.1","react-router":"^5.2.0","@babel/runtime":"^7.12.5","nebenan-helpers":"^5.0.0","@babel/preset-env":"^7.11.5","nebenan-react-hocs":"^8.3.0-beta.0","local-storage-adapter":"^2.0.0","eslint-config-nebenan-base":"^1.3.1","browserslist-config-nebenan":"^1.0.0","escape-string-regexp-browser":"1.1.0","@babel/plugin-transform-runtime":"^7.11.5","babel-plugin-add-module-exports":"^1.0.2","@babel/plugin-proposal-json-strings":"^7.0.0","@babel/plugin-transform-strict-mode":"^7.0.0"},"peerDependencies":{"qs":"^6.9.0","axios":"^0.21.0","react":"^16.14.0 || ^17.0.1","lodash":"^4.17.15","updeep":"^1.2.0","react-redux":"^7.2.1","@babel/runtime":"^7.12.5","local-storage-adapter":"^2.0.0","escape-string-regexp-browser":"1.1.0"},"_npmOperationalInternal":{"tmp":"tmp/nebenan-redux-tools_5.12.0-beta.0_1642668325537_0.5938903363388051","host":"s3://npm-registry-packages"}},"6.0.0":{"name":"nebenan-redux-tools","version":"6.0.0","author":{"name":"Nebenan.de","email":"max@nebenan.de"},"license":"SEE LICENSE IN LICENSE FILE","_id":"nebenan-redux-tools@6.0.0","maintainers":[{"name":"iamuchejude","email":"iamuchejude@gmail.com"},{"name":"eliasbraun","email":"elias.braun@nebenan.de"},{"name":"peterhassler","email":"peter.h@nebenan.de"},{"name":"ozerovs","email":"ozerovsa@gmail.com"},{"name":"nomn","email":"i.m.nomn@gmail.com"},{"name":"suprmax","email":"max@degterev.me"}],"homepage":"https://nebenan.de/","bugs":{"url":"https://github.com/good-hood-gmbh/nebenan-redux-tools/issues"},"dist":{"shasum":"1a2817a872d52416095ace2af1d24467152a599b","tarball":"https://registry.npmjs.org/nebenan-redux-tools/-/nebenan-redux-tools-6.0.0.tgz","fileCount":26,"integrity":"sha512-+RxxcXivsClysQrGrSCDyQF4Ad42RB4U7r9CASba6dRdtJEOlOdtMmPAgd29sodXhp8EQyDd2JuCg2LXnfN3mw==","signatures":[{"sig":"MEUCIQD1i37owUSax1nMf1eqWukrGXSS4EowM1yg7XGur4hcyQIgfONRalSgOJpdGssaBb/bKE3V1EJ3Ouqaplc/hyJEf2c=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":40372,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJh8X2TCRA9TVsSAnZWagAA16sQAJepe/Elk9X95N3N6DzN\nbd6LlzoguvjcWJTFmPocjHGCUkKRaSnZ1qsqV7ZoxqmTUUULnV9pm8VZBm+n\nuvVGXq78SK/+bhRo+/86ebhqIzFTkAB6s6HfbeFVjM0Ln11x/5cgguGXENht\ny7rtei/f+Gh+IWAau1NBVFryD3HU5MTvX5r0PDnspQ4vR21OUdpUE6vPaYpb\ncCUZc10hYjx6NUioLFOALMJRxAAP4UPiPFlHsHFhNKLsS/01NCCmRArzRBml\ngZwv7yYJc8N7HJUKjIFN93txZJitpX7PcV35xi8Pibl4Tmdy6w5EgRoCZPXc\nYm7orBB15xQi2i8r9Z0rLQ0P7+OLx7YzXamRwq6VniaDyASFM+DOsj9IbhyA\nXZQm1XY72kqlj9JWeXJXYEat9wszL2WFXCDjTrUMhsXhqAAhyDE1uHMRssoF\nCz8Cuf64xvW+8iktU9UWKBAWmYe5/0LiNwSoXny9Pk4tyaXeqC9k9EMzh2/9\n2SBBEbUnL72tgeV/s0cDEOMJ265J0Q0vfhK+jCICTb6nt/67IILPbtGp9qxy\n56DsL0lAhWXLtxbKY7x4mRyn/qnn5/mIk5TVD0DKifm3weRnVKU9ZnLD+7Xe\nlbmXfO9KCVotCTgt6E49iN1rlm0GIGoLuw7j5FjMB1F+ddSjJn0qnQp0uoct\n9lch\r\n=jE+v\r\n-----END PGP SIGNATURE-----\r\n"},"gitHead":"5eae34b0d4b5f8b1e41496f23a0a348d07e33ae2","scripts":{"lint":"eslint --ext .es,.js ./","test":"npm run compile && TZ='GMT' mocha \"test/**/*.js\"","build":"npm run compile","check":"npm test && npm run lint && echo \"\\033[0;32mReady to publish\\033[0m\"","clean":"rm -rf ./lib/ || exit 1","compile":"NODE_ENV=production babel src --out-dir lib --copy-files","reinstall":"rm -rf node_modules package-lock.json && npm install","lint:tofile":"eslint --ext .es,.js --no-color -o ./eslint-report.log ./","test:tofile":"npm run compile && TZ='GMT' mocha --no-colors -R spec \"test/**/*.js\" 2>&1 | tee test-report.log","prepublishOnly":"npm run check && npm run clean && npm run build"},"_npmUser":{"name":"peterhassler","email":"peter.h@nebenan.de"},"deprecated":"Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.","repository":{"url":"git+https://github.com/good-hood-gmbh/nebenan-redux-tools.git","type":"git"},"_npmVersion":"6.14.15","description":"A set of redux helpers","directories":{},"_nodeVersion":"14.18.3","dependencies":{"lodash":"^4.17.15","js-cookie":"^2.2.1","nebenan-react-hocs":"^9.0.0"},"_hasShrinkwrap":false,"devDependencies":{"qs":"^6.9.0","chai":"^4.2.0","axios":"^0.21.0","mocha":"^8.2.1","react":"^17.0.1","redux":"^4.0.5","sinon":"^10.0.0","eslint":"^7.13.0","updeep":"^1.2.0","date-fns":"^2.16.1","react-dom":"^17.0.2","@babel/cli":"^7.11.5","proxyquire":"^2.1.3","@babel/core":"^7.11.5","react-redux":"^7.2.1","react-router":"^5.2.0","@babel/runtime":"^7.12.5","nebenan-helpers":"^5.0.0","@babel/preset-env":"^7.11.5","local-storage-adapter":"^2.0.0","eslint-config-nebenan-base":"^1.3.1","browserslist-config-nebenan":"^1.0.0","escape-string-regexp-browser":"1.1.0","@babel/plugin-transform-runtime":"^7.11.5","babel-plugin-add-module-exports":"^1.0.2","@babel/plugin-proposal-json-strings":"^7.0.0","@babel/plugin-transform-strict-mode":"^7.0.0"},"peerDependencies":{"qs":"^6.9.0","axios":"^0.21.0","react":"^16.14.0 || ^17.0.1","updeep":"^1.2.0","react-redux":"^7.2.1","@babel/runtime":"^7.12.5","local-storage-adapter":"^2.0.0","escape-string-regexp-browser":"1.1.0"},"_npmOperationalInternal":{"tmp":"tmp/nebenan-redux-tools_6.0.0_1643216274928_0.6386035013555487","host":"s3://npm-registry-packages"}},"6.0.1":{"name":"nebenan-redux-tools","version":"6.0.1","author":{"name":"Nebenan.de","email":"max@nebenan.de"},"license":"SEE LICENSE IN LICENSE FILE","_id":"nebenan-redux-tools@6.0.1","maintainers":[{"name":"iamuchejude","email":"iamuchejude@gmail.com"},{"name":"eliasbraun","email":"elias.braun@nebenan.de"},{"name":"peterhassler","email":"peter.h@nebenan.de"},{"name":"ozerovs","email":"ozerovsa@gmail.com"},{"name":"nomn","email":"i.m.nomn@gmail.com"},{"name":"suprmax","email":"max@degterev.me"}],"homepage":"https://nebenan.de/","bugs":{"url":"https://github.com/good-hood-gmbh/nebenan-redux-tools/issues"},"dist":{"shasum":"5f6754006edf46e44294e0fddd25e007e82f57a3","tarball":"https://registry.npmjs.org/nebenan-redux-tools/-/nebenan-redux-tools-6.0.1.tgz","fileCount":26,"integrity":"sha512-KiFi06SzZsExStCbcHNM4OLzpzTNwaQ7yLKkt8CGW/Jp+TvGeyoY8htYMHoA5uLrOjYKmfROG51DG3xCb5gLpQ==","signatures":[{"sig":"MEUCIQD21Chw0j0zeaCsunczYCSNlW+CzyQX6nb5sYj+fb0evQIgYoYL6FZvb8s2QnV1zbgqnPrWPsVLUz8U2aLehgzrA/Y=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":45857,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJiAPPGCRA9TVsSAnZWagAA5o0P/RONNgIzBKx4VOQyziy6\nPYIZ5eYcLIj9aH3eswpbKh9y4hGWPXBe9JV3xNGY2+quornV1TBADto+7TNu\neYKPsEVHLT+XjXvl7LdMgZ3NunTLEPlSgT9KozlMf9x3yNmcgXHOu1zxrQL5\n5eThiu1MsKg3npVmqnippWbkn88q8pX1n13IciLR5yBnr4SHAhvLpmK4vzVQ\ne44SILrYDcFO9gKJMNhUoC5lY61DgGMl4DG7Jz7yZ9BKt/CkmNHG/F0RKIzR\nV2c24UZqHrKLRPzrvMm+bL4Bjmhliwb2/Erk/I1XI0vrxrnJJKiDL5kps3zZ\n0h68fqHjQTWUoMG1bpvTxSwC/T/K71b9cX4naOjfYAtRj5G+bFok1keABdZp\nYXtIJkn/HYox7gAoK6IIr813xbLVokcL+ZJUWLmWrcz6mwGYI/FHItJej+7R\nd4dWYMomSzrYDacYiOM23ryCfBanjAksY/MngaHMk/L22QP9u0yPiFYGLvcM\n76q+l6ZOCHsMjVbkEfXRpNMTP02TlGxJUbR5W21Kt4zBpqAkTK4373wlxAY0\nQL9QgnI82kuZKR+Z/0UqfxaiqmLjFJNhhjPnDPksakrHLPYRkSRf5Z5ChN1a\ncPrKK/EqjlD76RLh4b1WhTa7VV5vsWFf8uZ996NmumzzBL0ivx25VMXoWR8c\n2gWx\r\n=Yl6P\r\n-----END PGP SIGNATURE-----\r\n"},"gitHead":"82928fd6625a33a019789375df5c88be76522de9","scripts":{"lint":"eslint --ext .es,.js ./","test":"npm run compile && TZ='GMT' mocha \"test/**/*.js\"","build":"npm run compile","check":"npm test && npm run lint && echo \"\\033[0;32mReady to publish\\033[0m\"","clean":"rm -rf ./lib/ || exit 1","compile":"NODE_ENV=production babel src --out-dir lib --copy-files","reinstall":"rm -rf node_modules package-lock.json && npm install","lint:tofile":"eslint --ext .es,.js --no-color -o ./eslint-report.log ./","test:tofile":"npm run compile && TZ='GMT' mocha --no-colors -R spec \"test/**/*.js\" 2>&1 | tee test-report.log","prepublishOnly":"npm run check && npm run clean && npm run build"},"_npmUser":{"name":"iamuchejude","email":"iamuchejude@gmail.com"},"deprecated":"Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.","repository":{"url":"git+https://github.com/good-hood-gmbh/nebenan-redux-tools.git","type":"git"},"_npmVersion":"8.4.1","description":"A set of redux helpers","directories":{},"_nodeVersion":"14.17.2","dependencies":{"qs":"^6.10.3","axios":"^0.25.0","lodash":"^4.17.21","updeep":"^1.2.1","js-cookie":"^3.0.1","escape-string-regexp-browser":"^1.1.0"},"_hasShrinkwrap":false,"devDependencies":{"chai":"^4.3.6","mocha":"^9.2.0","react":"^17.0.2","redux":"^4.1.2","sinon":"^13.0.1","eslint":"^8.8.0","react-dom":"^17.0.2","@babel/cli":"^7.17.0","proxyquire":"^2.1.3","@babel/core":"^7.17.0","react-redux":"^7.2.6","@babel/runtime":"^7.12.5","@babel/preset-env":"^7.16.11","local-storage-adapter":"^2.0.0","eslint-config-nebenan-base":"^2.0.1","browserslist-config-nebenan":"^1.0.0","@babel/plugin-transform-runtime":"^7.17.0","babel-plugin-add-module-exports":"^1.0.4","@babel/plugin-proposal-json-strings":"^7.16.7","@babel/plugin-transform-strict-mode":"^7.16.7"},"peerDependencies":{"react":"^16.14.0 || ^17.0.1","react-redux":"^7.2.1","@babel/runtime":"^7.12.5","local-storage-adapter":"^2.0.0"},"_npmOperationalInternal":{"tmp":"tmp/nebenan-redux-tools_6.0.1_1644229574015_0.5866135054603678","host":"s3://npm-registry-packages"}},"6.0.2":{"name":"nebenan-redux-tools","version":"6.0.2","author":{"name":"Nebenan.de","email":"max@nebenan.de"},"license":"SEE LICENSE IN LICENSE FILE","_id":"nebenan-redux-tools@6.0.2","maintainers":[{"name":"iamuchejude","email":"iamuchejude@gmail.com"},{"name":"eliasbraun","email":"elias.braun@nebenan.de"},{"name":"peterhassler","email":"peter.h@nebenan.de"},{"name":"ozerovs","email":"ozerovsa@gmail.com"},{"name":"nomn","email":"i.m.nomn@gmail.com"},{"name":"suprmax","email":"max@degterev.me"}],"homepage":"https://nebenan.de/","bugs":{"url":"https://github.com/good-hood-gmbh/nebenan-redux-tools/issues"},"dist":{"shasum":"5cd928b2548056df10f0b2131ab75e0f6da9b879","tarball":"https://registry.npmjs.org/nebenan-redux-tools/-/nebenan-redux-tools-6.0.2.tgz","fileCount":26,"integrity":"sha512-czj1BZixwcE/c9dod/8kPmGAljJ9/9kGA7V6ZInrVUmE5Zo1VjNI3KOvl+Wd08aegpekGz2OwN1FO1qlsHrOAA==","signatures":[{"sig":"MEYCIQCKlhmXMITYTYK5JbBb8Iao2OzRZJh84Sl2IPnCc4mh0QIhALDW49FIcdYTT3Sp6cygEcYg5hD8U+tjzAG2ITYZEJJR","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":45857,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJiAjimCRA9TVsSAnZWagAA/50P/0KHgHr4iDR03H3sp3mJ\nZGDrpXkioYSRsUul+3Za8KM11AefNYnzPwimobe7sxuaePL6GIrb9dQM65is\nYLYVGwEzTaNok65lCmOHugCsIAEmvzQQL28LhNiv9fN+yKVKura0jCIJ5XK4\naceQy5oHTyP37Kcn7WZq6WeaLZ6eWh59ifXxt89X3O0wLHt6lDIQgOsRyf67\nX2FTvbAWaIgxAPG6kEzUdWoWAi2blJqzeE0nO7seZBKcvxYPT8clFtH7mcxn\nTWNMGIQD8tx/qNIAfKXDZc4UKbJCPMmKUMJYab9IDUz71UL/y+fAVuhkY01j\ntkG+XzvmH2pDEwTDdW67As2FC1QsObykFeIZJAyQB6RMN3FSuWkw6V7x+JFc\nbvAwBIutRPflrvmacbUhA/8hSf7PpZdySc/OfgTeYx4oWuG39FwFzZd2vh1p\nwqsmxDQpkrjAsk9FeLkBios7JmYluhPu9SKBTn1UloPMQRaAcYP8aw5b+Fc9\nWU8QF2Yqqk3K7/n/rj4zbma6EIs/wrhBH1bgpQCtqYa/NhvIiLs//djCugj0\nx/nugEc5S9xCZCIoVp3q9RYauOeKl2usxbdHLh//RD0zpc2sjQIjgM7lYQvv\nQz/4rHdTBe50ySxmEYjOszQwNaPxzntcpTTQ7tXvO+hNF3NWQHpEfDeWpSVB\n+AfZ\r\n=7yMp\r\n-----END PGP SIGNATURE-----\r\n"},"gitHead":"60bc7af0af1e89c27fc502b94ca9d169275066da","scripts":{"lint":"eslint --ext .es,.js ./","test":"npm run compile && TZ='GMT' mocha \"test/**/*.js\"","build":"npm run compile","check":"npm test && npm run lint && echo \"\\033[0;32mReady to publish\\033[0m\"","clean":"rm -rf ./lib/ || exit 1","compile":"NODE_ENV=production babel src --out-dir lib --copy-files","reinstall":"rm -rf node_modules package-lock.json && npm install","lint:tofile":"eslint --ext .es,.js --no-color -o ./eslint-report.log ./","test:tofile":"npm run compile && TZ='GMT' mocha --no-colors -R spec \"test/**/*.js\" 2>&1 | tee test-report.log","prepublishOnly":"npm run check && npm run clean && npm run build"},"_npmUser":{"name":"iamuchejude","email":"iamuchejude@gmail.com"},"deprecated":"Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.","repository":{"url":"git+https://github.com/good-hood-gmbh/nebenan-redux-tools.git","type":"git"},"_npmVersion":"8.1.3","description":"A set of redux helpers","directories":{},"_nodeVersion":"14.18.1","dependencies":{"qs":"^6.10.3","axios":"^0.21.0","lodash":"^4.17.21","updeep":"^1.2.1","js-cookie":"^3.0.1","escape-string-regexp-browser":"^1.1.0"},"_hasShrinkwrap":false,"devDependencies":{"chai":"^4.3.6","mocha":"^9.2.0","react":"^17.0.2","redux":"^4.1.2","sinon":"^13.0.1","eslint":"^8.8.0","react-dom":"^17.0.2","@babel/cli":"^7.17.0","proxyquire":"^2.1.3","@babel/core":"^7.17.0","react-redux":"^7.2.6","@babel/runtime":"^7.12.5","@babel/preset-env":"^7.16.11","local-storage-adapter":"^2.0.0","eslint-config-nebenan-base":"^2.0.1","browserslist-config-nebenan":"^1.0.0","@babel/plugin-transform-runtime":"^7.17.0","babel-plugin-add-module-exports":"^1.0.4","@babel/plugin-proposal-json-strings":"^7.16.7","@babel/plugin-transform-strict-mode":"^7.16.7"},"peerDependencies":{"react":"^16.14.0 || ^17.0.1","react-redux":"^7.2.1","@babel/runtime":"^7.12.5","local-storage-adapter":"^2.0.0"},"_npmOperationalInternal":{"tmp":"tmp/nebenan-redux-tools_6.0.2_1644312742664_0.9515728514246697","host":"s3://npm-registry-packages"}},"6.1.0-beta.0":{"name":"nebenan-redux-tools","version":"6.1.0-beta.0","author":{"name":"Nebenan.de","email":"max@nebenan.de"},"license":"SEE LICENSE IN LICENSE FILE","_id":"nebenan-redux-tools@6.1.0-beta.0","maintainers":[{"name":"johip-m","email":"josip.maric@nebenan.de"},{"name":"iamuchejude","email":"iamuchejude@gmail.com"},{"name":"eliasbraun","email":"elias.braun@nebenan.de"},{"name":"peterhassler","email":"peter.h@nebenan.de"},{"name":"ozerovs","email":"ozerovsa@gmail.com"},{"name":"nomn","email":"i.m.nomn@gmail.com"},{"name":"suprmax","email":"max@degterev.me"}],"homepage":"https://nebenan.de/","bugs":{"url":"https://github.com/good-hood-gmbh/nebenan-redux-tools/issues"},"dist":{"shasum":"e1e9e3ef4734fb0edbe1c5fcbb421421e806840e","tarball":"https://registry.npmjs.org/nebenan-redux-tools/-/nebenan-redux-tools-6.1.0-beta.0.tgz","fileCount":26,"integrity":"sha512-i2Dq9ikYs4gAGr0z3I9nCBkHsphnDHw1hIqVv45yZ9fK2PLDaPxFm+PCCh9plYJYTs8mBKf1J/JRZzRpZVWu1g==","signatures":[{"sig":"MEQCIC03E+eaAeKYmS1VbDmlx6qm66PPUkMGo2SEU1tNAk2CAiBw9dCvrs6ELjUciyMzBhmT6X9Rad0pQY9pekK9eL7PXg==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":40418,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJimMMOACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmryJQ//YRPZkcxzpm/5FtjLkbcmR3vIw/M7lrJbRtN4ftwQEZywARtw\r\nVFshN3hg1Jupooy442o+t4b4OvZywTxKSSU/tnDeBTcti5ZYKWeFdxx2WQvG\r\ngAd/iYtfYSnMc9tS+VmTZLGJltlX6qR12x6w6GAp1/UUCdukykukyac1YILa\r\nwWLS2aqaLVcLNuhES+qq7MzMldQ5UYwle0P61kqtEtaGNnzdVg9/hFaiGWzE\r\nE293CeSKy3yB8dw3sBwLRDJAoA4mY9PgsIrsaLmOWL85/JnFNfcYgG7RulfL\r\nYU7E50WNTSxwaRzfJNphbGxPjm6D58RJ8nlsp/pnnQF1iKcfc1kiov2DdZmm\r\nhGo/zzOFPuQUZ69RTyV6wfoNnZgfI7uczSoeuuO7aKPbcbIXW4+khTxbla90\r\nXziVLjVB7GQy53HjnMORXMDBduM8VunB5p1ZeVx66ogV6zLTCoLqCJbc1tYe\r\nQM96JtL2cpV7BOBWK22nmhqQZ5jHBFitbRSNpYnlzjb62J55if8AKGjdt2Cb\r\nZYRgNrcNQsdtZuC5DsJaXhVACElFTNOsmpYrXgU2QWN2hJu606dhmq+Oq/5W\r\nd+rwQUW82sAaQBjE3OI2J4PQUmeIzVKIyrzaULh/9z/XEMfNH8mJPvEyaZzg\r\n1MomRHnaus9y5plEhl2Q+xcmHFbDFHycRAk=\r\n=gvqI\r\n-----END PGP SIGNATURE-----\r\n"},"readme":"nebenan-redux-tools\n====================\n\nA set of redux helpers.\n\n- [Experiments Middleware](#experiments-middleware)\n- [Token Middleware](#token-middleware)\n- [Promise Middleware](#promise-middleware)\n- [Network Middleware](#network-middleware)\n  - [Trustworthy Endpoints](#trustworthy-endpoints)\n  - [API Token](#api-token)\n  - [X-Translations-Lang Header](#x-translations-lang-header)\n  - [Should Request](#should-request)\n  - [Abort Callback](#abort-callback)\n  - [Request Types](#request-types)\n  - [Pagination](#pagination)\n  - [Mock Responses](#mock-response)\n  - [Standalone Request](#standalone-request)\n  - [Customize](#customize)\n  \n# Experiments Middleware\n## Setup\n\n**NOT COMPLETE**\n```js\nimport { reducer as experiments } from 'nebenan-redux-tools/lib/experiments/state';\n\nconst reducers = { \n  // It is assumed that the experiment reducer's state\n  // is available under `state.experiments`\n  experiments \n};\n\n// ...\n\nconst createFromState = (initialState) => (\n  createStore(\n    combineReducers(reducers),\n    initialState,\n    composeEnhancers(applyMiddleware(...middleware)),\n  )\n);\n\nexport default createFromState\n```\n\n# Token Middleware\n## Setup\n**NOT COMPLETE**\n```js\nimport { reducer as token } from 'nebenan-redux-tools/lib/token';\n\nconst reducers = {\n  // It is assumed that the experiment reducer's state\n  // is available under `state.token`\n  token\n};\n\n// ...\n\nconst createFromState = (initialState) => (\n  createStore(\n    combineReducers(reducers),\n    initialState,\n    composeEnhancers(applyMiddleware(...middleware)),\n  )\n);\n\nexport default createFromState\n```\n  \n# Promise Middleware\nThe promise middleware gets triggered by dispatching actions with `promise` in payload. The middleware will dispatch resolved or rejected actions when the promise is fulfilled.\n\n```js\ndispatch({\n  type: types.GET_USERS,\n  promise: getUsersFromStorageAsync()\n})\n```\n\n```js\n// reducer\nimport { resolved, rejected } from 'nebenan-redux-tools/lib/promise';\n\nexport default (state = getDefaultState(), action) => {\n  switch(action.type) {\n    case resolved(types.GET_USERS): {\n      const usersFromStorage = action.payload;\n\n      return { ...state, users: usersFromStorage };\n    }\n\n    case rejected(types.GET_USERS): {\n      const usersFromStorage = [];\n\n      return { ...state, users: usersFromStorage };\n    }\n\n    default: {\n      return state;\n    }\n  }\n} \n```\n\n# Network Middleware\n\nThe network middleware gets triggered by dispatching actions with `request` in payload. The middleware will fire the request and dispatches resolved or rejected actions when the request is finished.\n\nExample:\n\n```js\ndispatch({\n  type: types.GET_USERS,\n  request: {\n    url: \"/users\"\n  }\n})\n```\n\n```js\nimport { resolved, rejected } from 'nebenan-redux-tools/lib/network/types';\n\nexport default (state = getDefaultState(), action) => {\n  switch(action.type) {\n    case resolved(types.GET_USERS): {\n      const usersFromResponse = action.payload;\n      \n      return { ...state, users: usersFromResponse };\n    }\n    \n    case rejected(types.GET_USERS): {\n      const usersFromResponse = [];\n      \n      return { ...state, users: usersFromResponse };\n    }\n    \n    default: {\n      return state;\n    }\n  }\n} \n```\n\n## Trustworthy Endpoints\n\nRequests to trustworthy endpoints will enable the [X-Translations-Lang Header](#x-translations-lang-header) and [API Token](#api-token) features.\n\nSet trusted domain via global config:\n```js\nimport { configureNetwork } from 'nebenan-redux-tools/lib/network';\n\nconfigureNetwork({\n  trustedDomain: \"nebenan.de\",\n  ...otherSettings\n})\n```\n\n## API Token\n\nRequests to [trustworthy endpoints](#trustworthy-endpoints) will have the `X-AUTH-TOKEN` header set, containing the api token configured in request options or through token middleware. \n\nDefault: `state.token` (see token middleware)\n\nOverwrite:\n```js\ndispatch({\n  type: \"some-type\", \n  request: {\n    url: \"/some/endpoint\",\n    token: \"special-api-token\"\n  }\n})\n```\n\n## X-Translations-Lang Header\n\nRequests to [trustworthy endpoints](#trustworthy-endpoints) will have the `X-Translations-Lang` header set, containing the locale configured in request options or through global config.\n\nDefault via global config: \n```js\nimport { configureNetwork } from 'nebenan-redux-tools/lib/network';\n\nconfigureNetwork({\n  locale: 'de-DE',\n  ...otherSettings\n})\n```\n\nOverwrite:\n```js\ndispatch({\n  type: \"some-type\",\n  request: {\n    url: \"/some/endpoint\",\n    locale: \"en-US\"  \n  }\n})\n```\n\n## Should Request\n\nPrevents unnecessary requests by checking state beforehand. \n\n```js\ndispatch({\n  type: \"some-type\",\n  request: {\n    url: \"/some/endpoint\",\n    shouldRequest(state) {\n     return !state.isFetched;\n    }\n  }\n})\n```\n\n## Abort Callback\n\nAllows to cancel running requests. You receive the cancel function by providing `getAbortCallback` in request options.\n\n```js\nlet cancelRequest;\n\ndispatch({\n  type: \"some-type\",\n  request: {\n    url: \"/some/endpoint\",\n    getAbortCallback: (callback) => {\n      cancelRequest = callback;\n    }\n  }\n})\n\n\n// later in app\ncancelRequest();\n\n```\n\n## Request Types\n\n`request.type` determines used HTTP method\n\n### `query`\n\nSends out GET request. Collects parameters from `request.query` and applies [pagination](#pagination) query options if there are any.\n\n```js\ndispatch({\n  type: \"some-type\",\n  request: {\n     url: \"/users\",\n     type: 'query',\n     query: { q: 'Peter' } \n  }\n})\n```\n\n\n### `delete` / `post` / `put`\n\n```js\ndispatch({\n  type: \"some-type\",\n  request: {\n    url: \"/some/endpoint/123\",\n    type: 'put',\n    payload: { user: { email, password }}\n  }  \n})\n```\n\n\n## Pagination\n\nThere is some boilerplate needed to fully support paginated lists loaded over the network. These helpers help with managing state and sending pagination params over the network.\n\nThe endpoint you are accessing needs to fulfill following requirements:\n- Parameters\n  - `per_page`\n  - `lower` / `higher`\n- Response\n  - `total_count` (`state.total` needs to be updated manually if field does not exist)\n\n### `assignPaginationDefaults` / `paginationGenerator` helpers\n\n```js\nimport { paginationGenerator, assignPaginationDefaults } from 'nebenan-redux-tools/lib/network/pagination';\n\nconst getDefaultState = () => assignPaginationDefaults({ entities: {} });\nconst getPaginationUpdates = paginationGenerator(types.BOOKMARKS_FETCH);\n\nexport const reducer = (state = getDefaultState(), action) => {\n  let newState = state;\n  \n  const update = getPaginationUpdates(newState, action);\n  if (update) newState = updeep(update, newState);\n  \n  switch (action.type) {\n    case resolved(types.BOOKMARKS_FETCH): {\n      const { result, entities } = parse(action.payload);\n\n      const collection = newState.collection.concat(result.bookmarks);\n\n      return updeep({ collection, entities }, newState);\n    }\n    \n    default: {\n      return newState;\n    }\n  }\n}\n```\n\nThe state now holds the following information\n```js\n{\n  // (managed by paginationGenerator)\n  currentPage: 0, \n  // datetime of last fetch (managed by paginationGenerator)\n  lastFetched: 0,\n  // request in progress (managed by paginationGenerator)\n  isFetching: false,\n  // request failed (managed by paginationGenerator) \n  isFailed: false,  \n  // total amount of items over all pages (managed by paginationGenerator)\n  total: null,\n  // item ids for current page  \n  collection: [],\n}\n```\n\n### Actions\n\nPagination query params will be added for `query` requests with either `request.pagination.first` or `request.pagination.last` set.\n\n*Only works for endpoints supporting `lower`/`higher` params.*\n\n```js\ndispatch({\n  type: types.GET_USERS,\n  request: {\n    url: \"/users\",\n    type: 'query',\n    pagination: {\n      per_page: 10, // optional\n      first: firstUserId, // optional\n      last: lastUserId // optional\n    }\n  }\n})\n```\n\n## Mock Response\n\nResponses can be mocked by using the [promise middleware](#promise-middleware). You can keep all of your request options in the action and don't need to modify reducers. Quite useful during development if you are waiting for backend to support new endpoints.\n\n\n```js\ndispatch({\n  type: types.GET_USERS,\n  promise: Promise.resolve([\n    {\n      id: 1,\n      name: \"Peter\"\n    },\n    {\n      id: 2,\n      name: \"Christina\"\n    }\n  ]),\n  request: {\n    url: \"/users\",\n    type: 'query'\n  }\n})\n```\n\n```js\n// reducer\nimport { resolved } from 'nebenan-redux-tools/lib/network/types';\n\nexport default (state = getDefaultState(), action) => {\n  switch(action.type) {\n    case resolved(types.GET_USERS): {\n      const usersFromResponse = action.payload;\n      \n      return { ...state, users: usersFromResponse };\n    }\n    \n    default: {\n      return state;\n    }\n  }\n} \n```\n\n## Standalone Request\n\nRequests can be created programmatically too.\n\n```js\nimport { createRequest } from 'nebenan-redux-tools/lib/network';\n\nconst sendFile = (file, token) => (\n  createRequest({\n    token,\n    payload: { file },\n    url: '/file-upload',\n    type: 'post',\n    multipart: true,\n  }) \n)\n\nconst handleSuccess = (payload) => {\n  // same as action.payload\n  console.log(payload);\n}\n\nsendFile(newFile, token).then(handleSuccess);\n```\n\n## Customize\n\nThe network layer uses [axios](https://github.com/axios/axios) under the hood. To access axios specific features or extend functionality you can hook into request / response generation on a global or local scale.\n\nHooks:\n- `requestHook(requestConfig, requestOptions)`\n  - `requestConfig` the [axios request config](https://github.com/axios/axios#request-config) to be mutated\n  - `requestOptions` the `request` object provided inside the action\n- `responseHook(body, requestConfig, requestOptions)`\n  - `body` response data to be mutated\n  - `requestConfig` the [axios request config](https://github.com/axios/axios#request-config)\n  - `requestOptions` the `request` object provided inside the action\n  \n### Setup global hooks\n\n```js\nimport { configureNetwork } from 'nebenan-redux-tools/lib/network';\n\nconfigureNetwork({\n  requestHook: (requestConfig, requestOptions) => {\n    // ...\n  },\n  responseHook: (body, requestConfig, requestOptions) => {\n    // ...\n  },\n  ...networkSettings\n})\n```\n\n### Action level request hook\n\n```js\nimport { createRequest } from 'nebenan-redux-tools/lib/network';\n\nconst sendFile = (file, token, onProgress) => (\n  createRequest({\n    token,\n    payload: { file },\n    url: '/file-upload',\n    type: 'post',\n    multipart: true,\n    // same as requestHook\n    customize: (requestConfig) => {\n      requestConfig.onUploadProgress = onProgress;\n    }\n  })\n)\n```\n\n","gitHead":"31540d45f757d70cc2332e33745feacff093cf74","scripts":{"lint":"eslint --ext .es,.js ./","test":"npm run compile && TZ='GMT' mocha \"test/**/*.js\"","build":"npm run compile","check":"npm test && npm run lint && echo \"\\033[0;32mReady to publish\\033[0m\"","clean":"rm -rf ./lib/ || exit 1","compile":"NODE_ENV=production babel src --out-dir lib --copy-files","reinstall":"rm -rf node_modules package-lock.json && npm install","lint:tofile":"eslint --ext .es,.js --no-color -o ./eslint-report.log ./","test:tofile":"npm run compile && TZ='GMT' mocha --no-colors -R spec \"test/**/*.js\" 2>&1 | tee test-report.log","prepublishOnly":"npm run check && npm run clean && npm run build"},"_npmUser":{"name":"ozerovs","email":"ozerovsa@gmail.com"},"deprecated":"Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.","repository":{"url":"git+https://github.com/good-hood-gmbh/nebenan-redux-tools.git","type":"git"},"_npmVersion":"8.5.5","description":"A set of redux helpers","directories":{},"_nodeVersion":"16.15.0","dependencies":{"qs":"^6.10.3","axios":"^0.21.0","lodash":"^4.17.21","updeep":"^1.2.1","js-cookie":"^3.0.1","escape-string-regexp-browser":"^1.1.0"},"_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"chai":"^4.3.6","mocha":"^9.2.0","react":"^17.0.2","redux":"^4.1.2","sinon":"^13.0.1","eslint":"^8.8.0","react-dom":"^17.0.2","@babel/cli":"^7.17.0","proxyquire":"^2.1.3","@babel/core":"^7.17.0","react-redux":"^7.2.6","@babel/runtime":"^7.12.5","@babel/preset-env":"^7.16.11","local-storage-adapter":"^2.0.0","eslint-config-nebenan-base":"^2.0.1","browserslist-config-nebenan":"^1.0.0","@babel/plugin-transform-runtime":"^7.17.0","babel-plugin-add-module-exports":"^1.0.4","@babel/plugin-proposal-json-strings":"^7.16.7","@babel/plugin-transform-strict-mode":"^7.16.7"},"peerDependencies":{"react":"^16.14.0 || ^17.0.1","react-redux":"^7.2.1","@babel/runtime":"^7.12.5","local-storage-adapter":"^2.0.0"},"_npmOperationalInternal":{"tmp":"tmp/nebenan-redux-tools_6.1.0-beta.0_1654178574185_0.022688421294531746","host":"s3://npm-registry-packages"}},"6.1.0-beta.1":{"name":"nebenan-redux-tools","version":"6.1.0-beta.1","author":{"name":"Nebenan.de","email":"max@nebenan.de"},"license":"SEE LICENSE IN LICENSE FILE","_id":"nebenan-redux-tools@6.1.0-beta.1","maintainers":[{"name":"johip-m","email":"josip.maric@nebenan.de"},{"name":"iamuchejude","email":"iamuchejude@gmail.com"},{"name":"eliasbraun","email":"elias.braun@nebenan.de"},{"name":"peterhassler","email":"peter.h@nebenan.de"},{"name":"ozerovs","email":"ozerovsa@gmail.com"},{"name":"nomn","email":"i.m.nomn@gmail.com"},{"name":"suprmax","email":"max@degterev.me"}],"homepage":"https://nebenan.de/","bugs":{"url":"https://github.com/good-hood-gmbh/nebenan-redux-tools/issues"},"dist":{"shasum":"790a3190b88b0cc3eb21edaf637df51ab8288892","tarball":"https://registry.npmjs.org/nebenan-redux-tools/-/nebenan-redux-tools-6.1.0-beta.1.tgz","fileCount":26,"integrity":"sha512-n2FRQAv7UDObKfdfXwiNNR7zy9B4RzmUs1nIMzFbnNUiE2RYiiHP8zZOhyrLHtPfNHbfm57DUyaJEVaAmukf7g==","signatures":[{"sig":"MEYCIQChpkFb5wZ6KC1/jKpi8wTi+vi3RFue2u4zOSnrHsk+QQIhAIlLkoP4viWDUpK2XLuhr/0Vxg9TE5/AcUG7L/eKtSos","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":40433,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJimMTmACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmpc9A//Szz7QNT6kQGzD2G3SCxQZxk/MZeo0Y+48uAUdAnkjigfqMeT\r\n7FSYSbyQB9IUVLQ9Hhej5nSdcS3v4vgRwXqQ77glvJuoBPdsZj6ULT8x+G0V\r\ndg4qJ70OFG1V3njQeJaEbY00TpaBAScD0UrFHW4b25VkgQaILsAAsxndJloF\r\nt8zn8qQ23SCgtS9LLKL++R1Mrpw9PqDOuueYjG1nmIZgrljAls8DKfsg/Ddv\r\nIi0odEjG+UgZF782IgUZhAg9q4qXn0xA/D0XxxdbAEm0CJpe2bsaKgzMCEtv\r\nbIhtgYaIh9xY2/HlyP7oOqzjGk+rj1QcQaP+ElGJHH7NSDe6nqVV2O3V4LJF\r\nRvweVtNlqi5hAjLhx9m5tub9Bgo1DiS6W3eJHw7HT7EMjALw02mrpRQKA7Wx\r\nehRF968XetFOT64KGMp1ykX1UA3XaP2nxDWsmLGaHpi80/o0obiTnSjQHhLt\r\nkiBj8lmDA0PwZES47uIIl0zuPfh+DxDzy3DoZp9dYht/t7f+1nXp6U7q99yI\r\nf/hCQ+E4vW7EzotSESSNmHWHHPcqv6MJLcoEQVIE58DtoQoX1AjGJKUreGce\r\nyho7xihbyR+Oh5hXW/ml7hAcg0f9jD02PlhKFpfeQS+/QUJrvtABn0bLCk+d\r\nq8/YFMAL5hxH9ws1L61K/IoIYkAuWnLFrEE=\r\n=eCp2\r\n-----END PGP SIGNATURE-----\r\n"},"readme":"nebenan-redux-tools\n====================\n\nA set of redux helpers.\n\n- [Experiments Middleware](#experiments-middleware)\n- [Token Middleware](#token-middleware)\n- [Promise Middleware](#promise-middleware)\n- [Network Middleware](#network-middleware)\n  - [Trustworthy Endpoints](#trustworthy-endpoints)\n  - [API Token](#api-token)\n  - [X-Translations-Lang Header](#x-translations-lang-header)\n  - [Should Request](#should-request)\n  - [Abort Callback](#abort-callback)\n  - [Request Types](#request-types)\n  - [Pagination](#pagination)\n  - [Mock Responses](#mock-response)\n  - [Standalone Request](#standalone-request)\n  - [Customize](#customize)\n  \n# Experiments Middleware\n## Setup\n\n**NOT COMPLETE**\n```js\nimport { reducer as experiments } from 'nebenan-redux-tools/lib/experiments/state';\n\nconst reducers = { \n  // It is assumed that the experiment reducer's state\n  // is available under `state.experiments`\n  experiments \n};\n\n// ...\n\nconst createFromState = (initialState) => (\n  createStore(\n    combineReducers(reducers),\n    initialState,\n    composeEnhancers(applyMiddleware(...middleware)),\n  )\n);\n\nexport default createFromState\n```\n\n# Token Middleware\n## Setup\n**NOT COMPLETE**\n```js\nimport { reducer as token } from 'nebenan-redux-tools/lib/token';\n\nconst reducers = {\n  // It is assumed that the experiment reducer's state\n  // is available under `state.token`\n  token\n};\n\n// ...\n\nconst createFromState = (initialState) => (\n  createStore(\n    combineReducers(reducers),\n    initialState,\n    composeEnhancers(applyMiddleware(...middleware)),\n  )\n);\n\nexport default createFromState\n```\n  \n# Promise Middleware\nThe promise middleware gets triggered by dispatching actions with `promise` in payload. The middleware will dispatch resolved or rejected actions when the promise is fulfilled.\n\n```js\ndispatch({\n  type: types.GET_USERS,\n  promise: getUsersFromStorageAsync()\n})\n```\n\n```js\n// reducer\nimport { resolved, rejected } from 'nebenan-redux-tools/lib/promise';\n\nexport default (state = getDefaultState(), action) => {\n  switch(action.type) {\n    case resolved(types.GET_USERS): {\n      const usersFromStorage = action.payload;\n\n      return { ...state, users: usersFromStorage };\n    }\n\n    case rejected(types.GET_USERS): {\n      const usersFromStorage = [];\n\n      return { ...state, users: usersFromStorage };\n    }\n\n    default: {\n      return state;\n    }\n  }\n} \n```\n\n# Network Middleware\n\nThe network middleware gets triggered by dispatching actions with `request` in payload. The middleware will fire the request and dispatches resolved or rejected actions when the request is finished.\n\nExample:\n\n```js\ndispatch({\n  type: types.GET_USERS,\n  request: {\n    url: \"/users\"\n  }\n})\n```\n\n```js\nimport { resolved, rejected } from 'nebenan-redux-tools/lib/network/types';\n\nexport default (state = getDefaultState(), action) => {\n  switch(action.type) {\n    case resolved(types.GET_USERS): {\n      const usersFromResponse = action.payload;\n      \n      return { ...state, users: usersFromResponse };\n    }\n    \n    case rejected(types.GET_USERS): {\n      const usersFromResponse = [];\n      \n      return { ...state, users: usersFromResponse };\n    }\n    \n    default: {\n      return state;\n    }\n  }\n} \n```\n\n## Trustworthy Endpoints\n\nRequests to trustworthy endpoints will enable the [X-Translations-Lang Header](#x-translations-lang-header) and [API Token](#api-token) features.\n\nSet trusted domain via global config:\n```js\nimport { configureNetwork } from 'nebenan-redux-tools/lib/network';\n\nconfigureNetwork({\n  trustedDomain: \"nebenan.de\",\n  ...otherSettings\n})\n```\n\n## API Token\n\nRequests to [trustworthy endpoints](#trustworthy-endpoints) will have the `X-AUTH-TOKEN` header set, containing the api token configured in request options or through token middleware. \n\nDefault: `state.token` (see token middleware)\n\nOverwrite:\n```js\ndispatch({\n  type: \"some-type\", \n  request: {\n    url: \"/some/endpoint\",\n    token: \"special-api-token\"\n  }\n})\n```\n\n## X-Translations-Lang Header\n\nRequests to [trustworthy endpoints](#trustworthy-endpoints) will have the `X-Translations-Lang` header set, containing the locale configured in request options or through global config.\n\nDefault via global config: \n```js\nimport { configureNetwork } from 'nebenan-redux-tools/lib/network';\n\nconfigureNetwork({\n  locale: 'de-DE',\n  ...otherSettings\n})\n```\n\nOverwrite:\n```js\ndispatch({\n  type: \"some-type\",\n  request: {\n    url: \"/some/endpoint\",\n    locale: \"en-US\"  \n  }\n})\n```\n\n## Should Request\n\nPrevents unnecessary requests by checking state beforehand. \n\n```js\ndispatch({\n  type: \"some-type\",\n  request: {\n    url: \"/some/endpoint\",\n    shouldRequest(state) {\n     return !state.isFetched;\n    }\n  }\n})\n```\n\n## Abort Callback\n\nAllows to cancel running requests. You receive the cancel function by providing `getAbortCallback` in request options.\n\n```js\nlet cancelRequest;\n\ndispatch({\n  type: \"some-type\",\n  request: {\n    url: \"/some/endpoint\",\n    getAbortCallback: (callback) => {\n      cancelRequest = callback;\n    }\n  }\n})\n\n\n// later in app\ncancelRequest();\n\n```\n\n## Request Types\n\n`request.type` determines used HTTP method\n\n### `query`\n\nSends out GET request. Collects parameters from `request.query` and applies [pagination](#pagination) query options if there are any.\n\n```js\ndispatch({\n  type: \"some-type\",\n  request: {\n     url: \"/users\",\n     type: 'query',\n     query: { q: 'Peter' } \n  }\n})\n```\n\n\n### `delete` / `post` / `put`\n\n```js\ndispatch({\n  type: \"some-type\",\n  request: {\n    url: \"/some/endpoint/123\",\n    type: 'put',\n    payload: { user: { email, password }}\n  }  \n})\n```\n\n\n## Pagination\n\nThere is some boilerplate needed to fully support paginated lists loaded over the network. These helpers help with managing state and sending pagination params over the network.\n\nThe endpoint you are accessing needs to fulfill following requirements:\n- Parameters\n  - `per_page`\n  - `lower` / `higher`\n- Response\n  - `total_count` (`state.total` needs to be updated manually if field does not exist)\n\n### `assignPaginationDefaults` / `paginationGenerator` helpers\n\n```js\nimport { paginationGenerator, assignPaginationDefaults } from 'nebenan-redux-tools/lib/network/pagination';\n\nconst getDefaultState = () => assignPaginationDefaults({ entities: {} });\nconst getPaginationUpdates = paginationGenerator(types.BOOKMARKS_FETCH);\n\nexport const reducer = (state = getDefaultState(), action) => {\n  let newState = state;\n  \n  const update = getPaginationUpdates(newState, action);\n  if (update) newState = updeep(update, newState);\n  \n  switch (action.type) {\n    case resolved(types.BOOKMARKS_FETCH): {\n      const { result, entities } = parse(action.payload);\n\n      const collection = newState.collection.concat(result.bookmarks);\n\n      return updeep({ collection, entities }, newState);\n    }\n    \n    default: {\n      return newState;\n    }\n  }\n}\n```\n\nThe state now holds the following information\n```js\n{\n  // (managed by paginationGenerator)\n  currentPage: 0, \n  // datetime of last fetch (managed by paginationGenerator)\n  lastFetched: 0,\n  // request in progress (managed by paginationGenerator)\n  isFetching: false,\n  // request failed (managed by paginationGenerator) \n  isFailed: false,  \n  // total amount of items over all pages (managed by paginationGenerator)\n  total: null,\n  // item ids for current page  \n  collection: [],\n}\n```\n\n### Actions\n\nPagination query params will be added for `query` requests with either `request.pagination.first` or `request.pagination.last` set.\n\n*Only works for endpoints supporting `lower`/`higher` params.*\n\n```js\ndispatch({\n  type: types.GET_USERS,\n  request: {\n    url: \"/users\",\n    type: 'query',\n    pagination: {\n      per_page: 10, // optional\n      first: firstUserId, // optional\n      last: lastUserId // optional\n    }\n  }\n})\n```\n\n## Mock Response\n\nResponses can be mocked by using the [promise middleware](#promise-middleware). You can keep all of your request options in the action and don't need to modify reducers. Quite useful during development if you are waiting for backend to support new endpoints.\n\n\n```js\ndispatch({\n  type: types.GET_USERS,\n  promise: Promise.resolve([\n    {\n      id: 1,\n      name: \"Peter\"\n    },\n    {\n      id: 2,\n      name: \"Christina\"\n    }\n  ]),\n  request: {\n    url: \"/users\",\n    type: 'query'\n  }\n})\n```\n\n```js\n// reducer\nimport { resolved } from 'nebenan-redux-tools/lib/network/types';\n\nexport default (state = getDefaultState(), action) => {\n  switch(action.type) {\n    case resolved(types.GET_USERS): {\n      const usersFromResponse = action.payload;\n      \n      return { ...state, users: usersFromResponse };\n    }\n    \n    default: {\n      return state;\n    }\n  }\n} \n```\n\n## Standalone Request\n\nRequests can be created programmatically too.\n\n```js\nimport { createRequest } from 'nebenan-redux-tools/lib/network';\n\nconst sendFile = (file, token) => (\n  createRequest({\n    token,\n    payload: { file },\n    url: '/file-upload',\n    type: 'post',\n    multipart: true,\n  }) \n)\n\nconst handleSuccess = (payload) => {\n  // same as action.payload\n  console.log(payload);\n}\n\nsendFile(newFile, token).then(handleSuccess);\n```\n\n## Customize\n\nThe network layer uses [axios](https://github.com/axios/axios) under the hood. To access axios specific features or extend functionality you can hook into request / response generation on a global or local scale.\n\nHooks:\n- `requestHook(requestConfig, requestOptions)`\n  - `requestConfig` the [axios request config](https://github.com/axios/axios#request-config) to be mutated\n  - `requestOptions` the `request` object provided inside the action\n- `responseHook(body, requestConfig, requestOptions)`\n  - `body` response data to be mutated\n  - `requestConfig` the [axios request config](https://github.com/axios/axios#request-config)\n  - `requestOptions` the `request` object provided inside the action\n  \n### Setup global hooks\n\n```js\nimport { configureNetwork } from 'nebenan-redux-tools/lib/network';\n\nconfigureNetwork({\n  requestHook: (requestConfig, requestOptions) => {\n    // ...\n  },\n  responseHook: (body, requestConfig, requestOptions) => {\n    // ...\n  },\n  ...networkSettings\n})\n```\n\n### Action level request hook\n\n```js\nimport { createRequest } from 'nebenan-redux-tools/lib/network';\n\nconst sendFile = (file, token, onProgress) => (\n  createRequest({\n    token,\n    payload: { file },\n    url: '/file-upload',\n    type: 'post',\n    multipart: true,\n    // same as requestHook\n    customize: (requestConfig) => {\n      requestConfig.onUploadProgress = onProgress;\n    }\n  })\n)\n```\n\n","gitHead":"31540d45f757d70cc2332e33745feacff093cf74","scripts":{"lint":"eslint --ext .es,.js ./","test":"npm run compile && TZ='GMT' mocha \"test/**/*.js\"","build":"npm run compile","check":"npm test && npm run lint && echo \"\\033[0;32mReady to publish\\033[0m\"","clean":"rm -rf ./lib/ || exit 1","compile":"NODE_ENV=production babel src --out-dir lib --copy-files","reinstall":"rm -rf node_modules package-lock.json && npm install","lint:tofile":"eslint --ext .es,.js --no-color -o ./eslint-report.log ./","test:tofile":"npm run compile && TZ='GMT' mocha --no-colors -R spec \"test/**/*.js\" 2>&1 | tee test-report.log","prepublishOnly":"npm run check && npm run clean && npm run build"},"_npmUser":{"name":"ozerovs","email":"ozerovsa@gmail.com"},"deprecated":"Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.","repository":{"url":"git+https://github.com/good-hood-gmbh/nebenan-redux-tools.git","type":"git"},"_npmVersion":"8.5.5","description":"A set of redux helpers","directories":{},"_nodeVersion":"16.15.0","dependencies":{"qs":"^6.10.3","axios":"^0.21.0","lodash":"^4.17.21","updeep":"^1.2.1","js-cookie":"^3.0.1","escape-string-regexp-browser":"^1.1.0"},"_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"chai":"^4.3.6","mocha":"^9.2.0","react":"^17.0.2","redux":"^4.1.2","sinon":"^13.0.1","eslint":"^8.8.0","react-dom":"^17.0.2","@babel/cli":"^7.17.0","proxyquire":"^2.1.3","@babel/core":"^7.17.0","react-redux":"^7.2.6","@babel/runtime":"^7.12.5","@babel/preset-env":"^7.16.11","local-storage-adapter":"^2.0.0","eslint-config-nebenan-base":"^2.0.1","browserslist-config-nebenan":"^1.0.0","@babel/plugin-transform-runtime":"^7.17.0","babel-plugin-add-module-exports":"^1.0.4","@babel/plugin-proposal-json-strings":"^7.16.7","@babel/plugin-transform-strict-mode":"^7.16.7"},"peerDependencies":{"react":"^16.14.0 || ^17.0.1","react-redux":"^7.2.1","@babel/runtime":"^7.12.5","local-storage-adapter":"^2.0.0"},"_npmOperationalInternal":{"tmp":"tmp/nebenan-redux-tools_6.1.0-beta.1_1654179045815_0.43741974627352564","host":"s3://npm-registry-packages"}},"6.1.0-beta.2":{"name":"nebenan-redux-tools","version":"6.1.0-beta.2","author":{"name":"Nebenan.de","email":"max@nebenan.de"},"license":"SEE LICENSE IN LICENSE FILE","_id":"nebenan-redux-tools@6.1.0-beta.2","maintainers":[{"name":"johip-m","email":"josip.maric@nebenan.de"},{"name":"iamuchejude","email":"iamuchejude@gmail.com"},{"name":"eliasbraun","email":"elias.braun@nebenan.de"},{"name":"peterhassler","email":"peter.h@nebenan.de"},{"name":"ozerovs","email":"ozerovsa@gmail.com"},{"name":"nomn","email":"i.m.nomn@gmail.com"},{"name":"suprmax","email":"max@degterev.me"}],"homepage":"https://nebenan.de/","bugs":{"url":"https://github.com/good-hood-gmbh/nebenan-redux-tools/issues"},"dist":{"shasum":"9d96a6376626de98ae52bb021217a858e597e858","tarball":"https://registry.npmjs.org/nebenan-redux-tools/-/nebenan-redux-tools-6.1.0-beta.2.tgz","fileCount":26,"integrity":"sha512-4OWQQl6lVkRa1IOpmO7xv3xQkagNzUJA6ev3b5pHYCcvTCARMX3ftYL+A2B8fIGn9vSZveTA3brj4jgJM+m5hQ==","signatures":[{"sig":"MEYCIQCqZ2DCSF2sEKeLo/lh69MG2X8u1mmO6YukHTgwKPTJagIhAIYQXzT/PwNGlK3G2SlYSMXo/L6rHU93jdn0cWnmNtoG","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":40447,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJimMXzACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmoklA/+PC3RhkD517nYMNlbbdrV/9EbyonCz3uvy2X+qhv2BPQIaAPF\r\n/f6Xa4he3cKYsXBoLgYIn8c5b98BwzgUM5VBdrZHmImrz8hTpMMtuyXrcl6R\r\nBbpI9SFTm/ryAvG8hM9WGRZdrsZAOZKuEvCZ5sUJYzQn87eT/zZjaDl4fs5u\r\nVOIq8FTw3t5DG6kMu8X04VV+qJPdvFb/jfkTHM56q0LCOrZUnb/R8rIUPSkD\r\nNtBGTsY6ueaF6/UlmycQQ6oV+UCVIWWdyZ7vWeeZBmdbBtU/xmstwhERA/CI\r\n9Ylh7m7WuAnM6X3Af5FFnw8+tSKmBuIT8MY0ji/IR5vzwuWuaKKG9sGl6kVI\r\nWTb+jfustYHJMPiVmWVM5ceqx8Efd3hntmdQnugpMGPB3gdlhW2ROyp/mlEF\r\nDaCTaP8XG7Tlg27mqJr2a3LiNMimAHHxV4rp/6+ZWY8a6JzbDyO/iedUxHiP\r\noZ94ixXCvr5EFbyzJOLPSsYQ9AsfBqPHeDgET1+sQwhhTLAfqzeQLLpjnc3r\r\ncXdLX6hTIeLQaU2W/d0FDg3gwq3hH91Xn2HMMuDZHaihj2qBgSE9ftvhk4lB\r\n/Q277k7dQwKHp7Wny4DJINT2+u5UhVOBKAp0wb9kt2ZhFCkvoNwN/edkpyN+\r\ncoc/XEDj006iCmfYt512OkF5BZ18u+tchYg=\r\n=Kn75\r\n-----END PGP SIGNATURE-----\r\n"},"readme":"nebenan-redux-tools\n====================\n\nA set of redux helpers.\n\n- [Experiments Middleware](#experiments-middleware)\n- [Token Middleware](#token-middleware)\n- [Promise Middleware](#promise-middleware)\n- [Network Middleware](#network-middleware)\n  - [Trustworthy Endpoints](#trustworthy-endpoints)\n  - [API Token](#api-token)\n  - [X-Translations-Lang Header](#x-translations-lang-header)\n  - [Should Request](#should-request)\n  - [Abort Callback](#abort-callback)\n  - [Request Types](#request-types)\n  - [Pagination](#pagination)\n  - [Mock Responses](#mock-response)\n  - [Standalone Request](#standalone-request)\n  - [Customize](#customize)\n  \n# Experiments Middleware\n## Setup\n\n**NOT COMPLETE**\n```js\nimport { reducer as experiments } from 'nebenan-redux-tools/lib/experiments/state';\n\nconst reducers = { \n  // It is assumed that the experiment reducer's state\n  // is available under `state.experiments`\n  experiments \n};\n\n// ...\n\nconst createFromState = (initialState) => (\n  createStore(\n    combineReducers(reducers),\n    initialState,\n    composeEnhancers(applyMiddleware(...middleware)),\n  )\n);\n\nexport default createFromState\n```\n\n# Token Middleware\n## Setup\n**NOT COMPLETE**\n```js\nimport { reducer as token } from 'nebenan-redux-tools/lib/token';\n\nconst reducers = {\n  // It is assumed that the experiment reducer's state\n  // is available under `state.token`\n  token\n};\n\n// ...\n\nconst createFromState = (initialState) => (\n  createStore(\n    combineReducers(reducers),\n    initialState,\n    composeEnhancers(applyMiddleware(...middleware)),\n  )\n);\n\nexport default createFromState\n```\n  \n# Promise Middleware\nThe promise middleware gets triggered by dispatching actions with `promise` in payload. The middleware will dispatch resolved or rejected actions when the promise is fulfilled.\n\n```js\ndispatch({\n  type: types.GET_USERS,\n  promise: getUsersFromStorageAsync()\n})\n```\n\n```js\n// reducer\nimport { resolved, rejected } from 'nebenan-redux-tools/lib/promise';\n\nexport default (state = getDefaultState(), action) => {\n  switch(action.type) {\n    case resolved(types.GET_USERS): {\n      const usersFromStorage = action.payload;\n\n      return { ...state, users: usersFromStorage };\n    }\n\n    case rejected(types.GET_USERS): {\n      const usersFromStorage = [];\n\n      return { ...state, users: usersFromStorage };\n    }\n\n    default: {\n      return state;\n    }\n  }\n} \n```\n\n# Network Middleware\n\nThe network middleware gets triggered by dispatching actions with `request` in payload. The middleware will fire the request and dispatches resolved or rejected actions when the request is finished.\n\nExample:\n\n```js\ndispatch({\n  type: types.GET_USERS,\n  request: {\n    url: \"/users\"\n  }\n})\n```\n\n```js\nimport { resolved, rejected } from 'nebenan-redux-tools/lib/network/types';\n\nexport default (state = getDefaultState(), action) => {\n  switch(action.type) {\n    case resolved(types.GET_USERS): {\n      const usersFromResponse = action.payload;\n      \n      return { ...state, users: usersFromResponse };\n    }\n    \n    case rejected(types.GET_USERS): {\n      const usersFromResponse = [];\n      \n      return { ...state, users: usersFromResponse };\n    }\n    \n    default: {\n      return state;\n    }\n  }\n} \n```\n\n## Trustworthy Endpoints\n\nRequests to trustworthy endpoints will enable the [X-Translations-Lang Header](#x-translations-lang-header) and [API Token](#api-token) features.\n\nSet trusted domain via global config:\n```js\nimport { configureNetwork } from 'nebenan-redux-tools/lib/network';\n\nconfigureNetwork({\n  trustedDomain: \"nebenan.de\",\n  ...otherSettings\n})\n```\n\n## API Token\n\nRequests to [trustworthy endpoints](#trustworthy-endpoints) will have the `X-AUTH-TOKEN` header set, containing the api token configured in request options or through token middleware. \n\nDefault: `state.token` (see token middleware)\n\nOverwrite:\n```js\ndispatch({\n  type: \"some-type\", \n  request: {\n    url: \"/some/endpoint\",\n    token: \"special-api-token\"\n  }\n})\n```\n\n## X-Translations-Lang Header\n\nRequests to [trustworthy endpoints](#trustworthy-endpoints) will have the `X-Translations-Lang` header set, containing the locale configured in request options or through global config.\n\nDefault via global config: \n```js\nimport { configureNetwork } from 'nebenan-redux-tools/lib/network';\n\nconfigureNetwork({\n  locale: 'de-DE',\n  ...otherSettings\n})\n```\n\nOverwrite:\n```js\ndispatch({\n  type: \"some-type\",\n  request: {\n    url: \"/some/endpoint\",\n    locale: \"en-US\"  \n  }\n})\n```\n\n## Should Request\n\nPrevents unnecessary requests by checking state beforehand. \n\n```js\ndispatch({\n  type: \"some-type\",\n  request: {\n    url: \"/some/endpoint\",\n    shouldRequest(state) {\n     return !state.isFetched;\n    }\n  }\n})\n```\n\n## Abort Callback\n\nAllows to cancel running requests. You receive the cancel function by providing `getAbortCallback` in request options.\n\n```js\nlet cancelRequest;\n\ndispatch({\n  type: \"some-type\",\n  request: {\n    url: \"/some/endpoint\",\n    getAbortCallback: (callback) => {\n      cancelRequest = callback;\n    }\n  }\n})\n\n\n// later in app\ncancelRequest();\n\n```\n\n## Request Types\n\n`request.type` determines used HTTP method\n\n### `query`\n\nSends out GET request. Collects parameters from `request.query` and applies [pagination](#pagination) query options if there are any.\n\n```js\ndispatch({\n  type: \"some-type\",\n  request: {\n     url: \"/users\",\n     type: 'query',\n     query: { q: 'Peter' } \n  }\n})\n```\n\n\n### `delete` / `post` / `put`\n\n```js\ndispatch({\n  type: \"some-type\",\n  request: {\n    url: \"/some/endpoint/123\",\n    type: 'put',\n    payload: { user: { email, password }}\n  }  \n})\n```\n\n\n## Pagination\n\nThere is some boilerplate needed to fully support paginated lists loaded over the network. These helpers help with managing state and sending pagination params over the network.\n\nThe endpoint you are accessing needs to fulfill following requirements:\n- Parameters\n  - `per_page`\n  - `lower` / `higher`\n- Response\n  - `total_count` (`state.total` needs to be updated manually if field does not exist)\n\n### `assignPaginationDefaults` / `paginationGenerator` helpers\n\n```js\nimport { paginationGenerator, assignPaginationDefaults } from 'nebenan-redux-tools/lib/network/pagination';\n\nconst getDefaultState = () => assignPaginationDefaults({ entities: {} });\nconst getPaginationUpdates = paginationGenerator(types.BOOKMARKS_FETCH);\n\nexport const reducer = (state = getDefaultState(), action) => {\n  let newState = state;\n  \n  const update = getPaginationUpdates(newState, action);\n  if (update) newState = updeep(update, newState);\n  \n  switch (action.type) {\n    case resolved(types.BOOKMARKS_FETCH): {\n      const { result, entities } = parse(action.payload);\n\n      const collection = newState.collection.concat(result.bookmarks);\n\n      return updeep({ collection, entities }, newState);\n    }\n    \n    default: {\n      return newState;\n    }\n  }\n}\n```\n\nThe state now holds the following information\n```js\n{\n  // (managed by paginationGenerator)\n  currentPage: 0, \n  // datetime of last fetch (managed by paginationGenerator)\n  lastFetched: 0,\n  // request in progress (managed by paginationGenerator)\n  isFetching: false,\n  // request failed (managed by paginationGenerator) \n  isFailed: false,  \n  // total amount of items over all pages (managed by paginationGenerator)\n  total: null,\n  // item ids for current page  \n  collection: [],\n}\n```\n\n### Actions\n\nPagination query params will be added for `query` requests with either `request.pagination.first` or `request.pagination.last` set.\n\n*Only works for endpoints supporting `lower`/`higher` params.*\n\n```js\ndispatch({\n  type: types.GET_USERS,\n  request: {\n    url: \"/users\",\n    type: 'query',\n    pagination: {\n      per_page: 10, // optional\n      first: firstUserId, // optional\n      last: lastUserId // optional\n    }\n  }\n})\n```\n\n## Mock Response\n\nResponses can be mocked by using the [promise middleware](#promise-middleware). You can keep all of your request options in the action and don't need to modify reducers. Quite useful during development if you are waiting for backend to support new endpoints.\n\n\n```js\ndispatch({\n  type: types.GET_USERS,\n  promise: Promise.resolve([\n    {\n      id: 1,\n      name: \"Peter\"\n    },\n    {\n      id: 2,\n      name: \"Christina\"\n    }\n  ]),\n  request: {\n    url: \"/users\",\n    type: 'query'\n  }\n})\n```\n\n```js\n// reducer\nimport { resolved } from 'nebenan-redux-tools/lib/network/types';\n\nexport default (state = getDefaultState(), action) => {\n  switch(action.type) {\n    case resolved(types.GET_USERS): {\n      const usersFromResponse = action.payload;\n      \n      return { ...state, users: usersFromResponse };\n    }\n    \n    default: {\n      return state;\n    }\n  }\n} \n```\n\n## Standalone Request\n\nRequests can be created programmatically too.\n\n```js\nimport { createRequest } from 'nebenan-redux-tools/lib/network';\n\nconst sendFile = (file, token) => (\n  createRequest({\n    token,\n    payload: { file },\n    url: '/file-upload',\n    type: 'post',\n    multipart: true,\n  }) \n)\n\nconst handleSuccess = (payload) => {\n  // same as action.payload\n  console.log(payload);\n}\n\nsendFile(newFile, token).then(handleSuccess);\n```\n\n## Customize\n\nThe network layer uses [axios](https://github.com/axios/axios) under the hood. To access axios specific features or extend functionality you can hook into request / response generation on a global or local scale.\n\nHooks:\n- `requestHook(requestConfig, requestOptions)`\n  - `requestConfig` the [axios request config](https://github.com/axios/axios#request-config) to be mutated\n  - `requestOptions` the `request` object provided inside the action\n- `responseHook(body, requestConfig, requestOptions)`\n  - `body` response data to be mutated\n  - `requestConfig` the [axios request config](https://github.com/axios/axios#request-config)\n  - `requestOptions` the `request` object provided inside the action\n  \n### Setup global hooks\n\n```js\nimport { configureNetwork } from 'nebenan-redux-tools/lib/network';\n\nconfigureNetwork({\n  requestHook: (requestConfig, requestOptions) => {\n    // ...\n  },\n  responseHook: (body, requestConfig, requestOptions) => {\n    // ...\n  },\n  ...networkSettings\n})\n```\n\n### Action level request hook\n\n```js\nimport { createRequest } from 'nebenan-redux-tools/lib/network';\n\nconst sendFile = (file, token, onProgress) => (\n  createRequest({\n    token,\n    payload: { file },\n    url: '/file-upload',\n    type: 'post',\n    multipart: true,\n    // same as requestHook\n    customize: (requestConfig) => {\n      requestConfig.onUploadProgress = onProgress;\n    }\n  })\n)\n```\n\n","gitHead":"31540d45f757d70cc2332e33745feacff093cf74","scripts":{"lint":"eslint --ext .es,.js ./","test":"npm run compile && TZ='GMT' mocha \"test/**/*.js\"","build":"npm run compile","check":"npm test && npm run lint && echo \"\\033[0;32mReady to publish\\033[0m\"","clean":"rm -rf ./lib/ || exit 1","compile":"NODE_ENV=production babel src --out-dir lib --copy-files","reinstall":"rm -rf node_modules package-lock.json && npm install","lint:tofile":"eslint --ext .es,.js --no-color -o ./eslint-report.log ./","test:tofile":"npm run compile && TZ='GMT' mocha --no-colors -R spec \"test/**/*.js\" 2>&1 | tee test-report.log","prepublishOnly":"npm run check && npm run clean && npm run build"},"_npmUser":{"name":"ozerovs","email":"ozerovsa@gmail.com"},"deprecated":"Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.","repository":{"url":"git+https://github.com/good-hood-gmbh/nebenan-redux-tools.git","type":"git"},"_npmVersion":"8.5.5","description":"A set of redux helpers","directories":{},"_nodeVersion":"16.15.0","dependencies":{"qs":"^6.10.3","axios":"^0.21.0","lodash":"^4.17.21","updeep":"^1.2.1","js-cookie":"^3.0.1","escape-string-regexp-browser":"^1.1.0"},"_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"chai":"^4.3.6","mocha":"^9.2.0","react":"^17.0.2","redux":"^4.1.2","sinon":"^13.0.1","eslint":"^8.8.0","react-dom":"^17.0.2","@babel/cli":"^7.17.0","proxyquire":"^2.1.3","@babel/core":"^7.17.0","react-redux":"^7.2.6","@babel/runtime":"^7.12.5","@babel/preset-env":"^7.16.11","local-storage-adapter":"^2.0.0","eslint-config-nebenan-base":"^2.0.1","browserslist-config-nebenan":"^1.0.0","@babel/plugin-transform-runtime":"^7.17.0","babel-plugin-add-module-exports":"^1.0.4","@babel/plugin-proposal-json-strings":"^7.16.7","@babel/plugin-transform-strict-mode":"^7.16.7"},"peerDependencies":{"react":"^16.14.0 || ^17.0.1","react-redux":"^7.2.1","@babel/runtime":"^7.12.5","local-storage-adapter":"^2.0.0"},"_npmOperationalInternal":{"tmp":"tmp/nebenan-redux-tools_6.1.0-beta.2_1654179315408_0.20803785214931336","host":"s3://npm-registry-packages"}},"6.1.0-beta.3":{"name":"nebenan-redux-tools","version":"6.1.0-beta.3","author":{"name":"Nebenan.de","email":"max@nebenan.de"},"license":"SEE LICENSE IN LICENSE FILE","_id":"nebenan-redux-tools@6.1.0-beta.3","maintainers":[{"name":"johip-m","email":"josip.maric@nebenan.de"},{"name":"iamuchejude","email":"iamuchejude@gmail.com"},{"name":"eliasbraun","email":"elias.braun@nebenan.de"},{"name":"peterhassler","email":"peter.h@nebenan.de"},{"name":"ozerovs","email":"ozerovsa@gmail.com"},{"name":"nomn","email":"i.m.nomn@gmail.com"},{"name":"suprmax","email":"max@degterev.me"}],"homepage":"https://nebenan.de/","bugs":{"url":"https://github.com/good-hood-gmbh/nebenan-redux-tools/issues"},"dist":{"shasum":"32cb6147966d797b8b1e6a6da7677a6aa0014c9c","tarball":"https://registry.npmjs.org/nebenan-redux-tools/-/nebenan-redux-tools-6.1.0-beta.3.tgz","fileCount":26,"integrity":"sha512-SkT6gw6WzwfQHp5N4TzudHSuZtYYnI/B6FpwXi74f6Vz72EHyNLb0SVLSAe2xTUW7+IRtBN6RbIlAYBm4BMn+Q==","signatures":[{"sig":"MEQCIH2bPkKJdSnGoxkTIb2pawCNmPU5TxNXAd55eGnuO24qAiA5ZxvJESb97xwyGCICAhVnqZs9TNx7nY/mh1cIor5nyg==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":40478,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJimMbeACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmp1Mw//deQK1wsAZxXObx1a06/FKntBJ3lWWqJQ5+C3gh7val/faw34\r\nzHHCqlf/waLVLKZNOuhBRJlIbMp1GEiWqFLozYcCVntAJY7H2hAeOhsgcPns\r\n2T5Es1SnEBPWwlzG1hamQ+KZIHGjbJBjTXT5qDHwk6fM7iP0Z1/1xmCISunJ\r\n3RH8U2R7VGf0QwfTqJavPgMbJGLiwEae0lB74CA08o+tpwfJX1nP4+6Ll62r\r\ndjZy/2Eyy4Jl3FU3UQz04+eh3JCia9lOWELv0xppNdsjl3f67D0vyVra0zGx\r\ni9yTK6xbfv593RewxcVw7wXQyXXBYPCHrmjr/tj7Rm6UJWEZSXpFMTJqPLR4\r\nQmv2H204UEbUlXObRB1Hw7ggoyEte05amg0kuRHs0+L5mWA4v6NwRjNJo4ap\r\nI2HgFHJNOv/xcVmPk5MSF5FP/3gY2Q0khFT5O1F7P7raKhFI14nWezdVvIGh\r\nYOnWUGaBPcUIYv7cK6bHnzH/nQnFsQw/9pYNqxysIReC49bfaXIhtCCZZIr7\r\n8efETSzGd3ywCBB1JaH0HU5qA1e8k/FknhgRm1Cf8ltyDg29MGV/p+jh9Lp2\r\nOfL0CTsSEYmSZx0gOunEqZ+QmAFY6+dUcvyXjUkqd/saeNd2zVNxT1VewjfO\r\nHfqFUO7oNvdU9aVV0bmkBvvfZJ1/OfoIDh0=\r\n=ye02\r\n-----END PGP SIGNATURE-----\r\n"},"readme":"nebenan-redux-tools\n====================\n\nA set of redux helpers.\n\n- [Experiments Middleware](#experiments-middleware)\n- [Token Middleware](#token-middleware)\n- [Promise Middleware](#promise-middleware)\n- [Network Middleware](#network-middleware)\n  - [Trustworthy Endpoints](#trustworthy-endpoints)\n  - [API Token](#api-token)\n  - [X-Translations-Lang Header](#x-translations-lang-header)\n  - [Should Request](#should-request)\n  - [Abort Callback](#abort-callback)\n  - [Request Types](#request-types)\n  - [Pagination](#pagination)\n  - [Mock Responses](#mock-response)\n  - [Standalone Request](#standalone-request)\n  - [Customize](#customize)\n  \n# Experiments Middleware\n## Setup\n\n**NOT COMPLETE**\n```js\nimport { reducer as experiments } from 'nebenan-redux-tools/lib/experiments/state';\n\nconst reducers = { \n  // It is assumed that the experiment reducer's state\n  // is available under `state.experiments`\n  experiments \n};\n\n// ...\n\nconst createFromState = (initialState) => (\n  createStore(\n    combineReducers(reducers),\n    initialState,\n    composeEnhancers(applyMiddleware(...middleware)),\n  )\n);\n\nexport default createFromState\n```\n\n# Token Middleware\n## Setup\n**NOT COMPLETE**\n```js\nimport { reducer as token } from 'nebenan-redux-tools/lib/token';\n\nconst reducers = {\n  // It is assumed that the experiment reducer's state\n  // is available under `state.token`\n  token\n};\n\n// ...\n\nconst createFromState = (initialState) => (\n  createStore(\n    combineReducers(reducers),\n    initialState,\n    composeEnhancers(applyMiddleware(...middleware)),\n  )\n);\n\nexport default createFromState\n```\n  \n# Promise Middleware\nThe promise middleware gets triggered by dispatching actions with `promise` in payload. The middleware will dispatch resolved or rejected actions when the promise is fulfilled.\n\n```js\ndispatch({\n  type: types.GET_USERS,\n  promise: getUsersFromStorageAsync()\n})\n```\n\n```js\n// reducer\nimport { resolved, rejected } from 'nebenan-redux-tools/lib/promise';\n\nexport default (state = getDefaultState(), action) => {\n  switch(action.type) {\n    case resolved(types.GET_USERS): {\n      const usersFromStorage = action.payload;\n\n      return { ...state, users: usersFromStorage };\n    }\n\n    case rejected(types.GET_USERS): {\n      const usersFromStorage = [];\n\n      return { ...state, users: usersFromStorage };\n    }\n\n    default: {\n      return state;\n    }\n  }\n} \n```\n\n# Network Middleware\n\nThe network middleware gets triggered by dispatching actions with `request` in payload. The middleware will fire the request and dispatches resolved or rejected actions when the request is finished.\n\nExample:\n\n```js\ndispatch({\n  type: types.GET_USERS,\n  request: {\n    url: \"/users\"\n  }\n})\n```\n\n```js\nimport { resolved, rejected } from 'nebenan-redux-tools/lib/network/types';\n\nexport default (state = getDefaultState(), action) => {\n  switch(action.type) {\n    case resolved(types.GET_USERS): {\n      const usersFromResponse = action.payload;\n      \n      return { ...state, users: usersFromResponse };\n    }\n    \n    case rejected(types.GET_USERS): {\n      const usersFromResponse = [];\n      \n      return { ...state, users: usersFromResponse };\n    }\n    \n    default: {\n      return state;\n    }\n  }\n} \n```\n\n## Trustworthy Endpoints\n\nRequests to trustworthy endpoints will enable the [X-Translations-Lang Header](#x-translations-lang-header) and [API Token](#api-token) features.\n\nSet trusted domain via global config:\n```js\nimport { configureNetwork } from 'nebenan-redux-tools/lib/network';\n\nconfigureNetwork({\n  trustedDomain: \"nebenan.de\",\n  ...otherSettings\n})\n```\n\n## API Token\n\nRequests to [trustworthy endpoints](#trustworthy-endpoints) will have the `X-AUTH-TOKEN` header set, containing the api token configured in request options or through token middleware. \n\nDefault: `state.token` (see token middleware)\n\nOverwrite:\n```js\ndispatch({\n  type: \"some-type\", \n  request: {\n    url: \"/some/endpoint\",\n    token: \"special-api-token\"\n  }\n})\n```\n\n## X-Translations-Lang Header\n\nRequests to [trustworthy endpoints](#trustworthy-endpoints) will have the `X-Translations-Lang` header set, containing the locale configured in request options or through global config.\n\nDefault via global config: \n```js\nimport { configureNetwork } from 'nebenan-redux-tools/lib/network';\n\nconfigureNetwork({\n  locale: 'de-DE',\n  ...otherSettings\n})\n```\n\nOverwrite:\n```js\ndispatch({\n  type: \"some-type\",\n  request: {\n    url: \"/some/endpoint\",\n    locale: \"en-US\"  \n  }\n})\n```\n\n## Should Request\n\nPrevents unnecessary requests by checking state beforehand. \n\n```js\ndispatch({\n  type: \"some-type\",\n  request: {\n    url: \"/some/endpoint\",\n    shouldRequest(state) {\n     return !state.isFetched;\n    }\n  }\n})\n```\n\n## Abort Callback\n\nAllows to cancel running requests. You receive the cancel function by providing `getAbortCallback` in request options.\n\n```js\nlet cancelRequest;\n\ndispatch({\n  type: \"some-type\",\n  request: {\n    url: \"/some/endpoint\",\n    getAbortCallback: (callback) => {\n      cancelRequest = callback;\n    }\n  }\n})\n\n\n// later in app\ncancelRequest();\n\n```\n\n## Request Types\n\n`request.type` determines used HTTP method\n\n### `query`\n\nSends out GET request. Collects parameters from `request.query` and applies [pagination](#pagination) query options if there are any.\n\n```js\ndispatch({\n  type: \"some-type\",\n  request: {\n     url: \"/users\",\n     type: 'query',\n     query: { q: 'Peter' } \n  }\n})\n```\n\n\n### `delete` / `post` / `put`\n\n```js\ndispatch({\n  type: \"some-type\",\n  request: {\n    url: \"/some/endpoint/123\",\n    type: 'put',\n    payload: { user: { email, password }}\n  }  \n})\n```\n\n\n## Pagination\n\nThere is some boilerplate needed to fully support paginated lists loaded over the network. These helpers help with managing state and sending pagination params over the network.\n\nThe endpoint you are accessing needs to fulfill following requirements:\n- Parameters\n  - `per_page`\n  - `lower` / `higher`\n- Response\n  - `total_count` (`state.total` needs to be updated manually if field does not exist)\n\n### `assignPaginationDefaults` / `paginationGenerator` helpers\n\n```js\nimport { paginationGenerator, assignPaginationDefaults } from 'nebenan-redux-tools/lib/network/pagination';\n\nconst getDefaultState = () => assignPaginationDefaults({ entities: {} });\nconst getPaginationUpdates = paginationGenerator(types.BOOKMARKS_FETCH);\n\nexport const reducer = (state = getDefaultState(), action) => {\n  let newState = state;\n  \n  const update = getPaginationUpdates(newState, action);\n  if (update) newState = updeep(update, newState);\n  \n  switch (action.type) {\n    case resolved(types.BOOKMARKS_FETCH): {\n      const { result, entities } = parse(action.payload);\n\n      const collection = newState.collection.concat(result.bookmarks);\n\n      return updeep({ collection, entities }, newState);\n    }\n    \n    default: {\n      return newState;\n    }\n  }\n}\n```\n\nThe state now holds the following information\n```js\n{\n  // (managed by paginationGenerator)\n  currentPage: 0, \n  // datetime of last fetch (managed by paginationGenerator)\n  lastFetched: 0,\n  // request in progress (managed by paginationGenerator)\n  isFetching: false,\n  // request failed (managed by paginationGenerator) \n  isFailed: false,  \n  // total amount of items over all pages (managed by paginationGenerator)\n  total: null,\n  // item ids for current page  \n  collection: [],\n}\n```\n\n### Actions\n\nPagination query params will be added for `query` requests with either `request.pagination.first` or `request.pagination.last` set.\n\n*Only works for endpoints supporting `lower`/`higher` params.*\n\n```js\ndispatch({\n  type: types.GET_USERS,\n  request: {\n    url: \"/users\",\n    type: 'query',\n    pagination: {\n      per_page: 10, // optional\n      first: firstUserId, // optional\n      last: lastUserId // optional\n    }\n  }\n})\n```\n\n## Mock Response\n\nResponses can be mocked by using the [promise middleware](#promise-middleware). You can keep all of your request options in the action and don't need to modify reducers. Quite useful during development if you are waiting for backend to support new endpoints.\n\n\n```js\ndispatch({\n  type: types.GET_USERS,\n  promise: Promise.resolve([\n    {\n      id: 1,\n      name: \"Peter\"\n    },\n    {\n      id: 2,\n      name: \"Christina\"\n    }\n  ]),\n  request: {\n    url: \"/users\",\n    type: 'query'\n  }\n})\n```\n\n```js\n// reducer\nimport { resolved } from 'nebenan-redux-tools/lib/network/types';\n\nexport default (state = getDefaultState(), action) => {\n  switch(action.type) {\n    case resolved(types.GET_USERS): {\n      const usersFromResponse = action.payload;\n      \n      return { ...state, users: usersFromResponse };\n    }\n    \n    default: {\n      return state;\n    }\n  }\n} \n```\n\n## Standalone Request\n\nRequests can be created programmatically too.\n\n```js\nimport { createRequest } from 'nebenan-redux-tools/lib/network';\n\nconst sendFile = (file, token) => (\n  createRequest({\n    token,\n    payload: { file },\n    url: '/file-upload',\n    type: 'post',\n    multipart: true,\n  }) \n)\n\nconst handleSuccess = (payload) => {\n  // same as action.payload\n  console.log(payload);\n}\n\nsendFile(newFile, token).then(handleSuccess);\n```\n\n## Customize\n\nThe network layer uses [axios](https://github.com/axios/axios) under the hood. To access axios specific features or extend functionality you can hook into request / response generation on a global or local scale.\n\nHooks:\n- `requestHook(requestConfig, requestOptions)`\n  - `requestConfig` the [axios request config](https://github.com/axios/axios#request-config) to be mutated\n  - `requestOptions` the `request` object provided inside the action\n- `responseHook(body, requestConfig, requestOptions)`\n  - `body` response data to be mutated\n  - `requestConfig` the [axios request config](https://github.com/axios/axios#request-config)\n  - `requestOptions` the `request` object provided inside the action\n  \n### Setup global hooks\n\n```js\nimport { configureNetwork } from 'nebenan-redux-tools/lib/network';\n\nconfigureNetwork({\n  requestHook: (requestConfig, requestOptions) => {\n    // ...\n  },\n  responseHook: (body, requestConfig, requestOptions) => {\n    // ...\n  },\n  ...networkSettings\n})\n```\n\n### Action level request hook\n\n```js\nimport { createRequest } from 'nebenan-redux-tools/lib/network';\n\nconst sendFile = (file, token, onProgress) => (\n  createRequest({\n    token,\n    payload: { file },\n    url: '/file-upload',\n    type: 'post',\n    multipart: true,\n    // same as requestHook\n    customize: (requestConfig) => {\n      requestConfig.onUploadProgress = onProgress;\n    }\n  })\n)\n```\n\n","gitHead":"31540d45f757d70cc2332e33745feacff093cf74","scripts":{"lint":"eslint --ext .es,.js ./","test":"npm run compile && TZ='GMT' mocha \"test/**/*.js\"","build":"npm run compile","check":"npm test && npm run lint && echo \"\\033[0;32mReady to publish\\033[0m\"","clean":"rm -rf ./lib/ || exit 1","compile":"NODE_ENV=production babel src --out-dir lib --copy-files","reinstall":"rm -rf node_modules package-lock.json && npm install","lint:tofile":"eslint --ext .es,.js --no-color -o ./eslint-report.log ./","test:tofile":"npm run compile && TZ='GMT' mocha --no-colors -R spec \"test/**/*.js\" 2>&1 | tee test-report.log","prepublishOnly":"npm run check && npm run clean && npm run build"},"_npmUser":{"name":"ozerovs","email":"ozerovsa@gmail.com"},"deprecated":"Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.","repository":{"url":"git+https://github.com/good-hood-gmbh/nebenan-redux-tools.git","type":"git"},"_npmVersion":"8.5.5","description":"A set of redux helpers","directories":{},"_nodeVersion":"16.15.0","dependencies":{"qs":"^6.10.3","axios":"^0.21.0","lodash":"^4.17.21","updeep":"^1.2.1","js-cookie":"^3.0.1","escape-string-regexp-browser":"^1.1.0"},"_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"chai":"^4.3.6","mocha":"^9.2.0","react":"^17.0.2","redux":"^4.1.2","sinon":"^13.0.1","eslint":"^8.8.0","react-dom":"^17.0.2","@babel/cli":"^7.17.0","proxyquire":"^2.1.3","@babel/core":"^7.17.0","react-redux":"^7.2.6","@babel/runtime":"^7.12.5","@babel/preset-env":"^7.16.11","local-storage-adapter":"^2.0.0","eslint-config-nebenan-base":"^2.0.1","browserslist-config-nebenan":"^1.0.0","@babel/plugin-transform-runtime":"^7.17.0","babel-plugin-add-module-exports":"^1.0.4","@babel/plugin-proposal-json-strings":"^7.16.7","@babel/plugin-transform-strict-mode":"^7.16.7"},"peerDependencies":{"react":"^16.14.0 || ^17.0.1","react-redux":"^7.2.1","@babel/runtime":"^7.12.5","local-storage-adapter":"^2.0.0"},"_npmOperationalInternal":{"tmp":"tmp/nebenan-redux-tools_6.1.0-beta.3_1654179550692_0.12520938397996506","host":"s3://npm-registry-packages"}},"6.1.0-beta.4":{"name":"nebenan-redux-tools","version":"6.1.0-beta.4","author":{"name":"Nebenan.de","email":"max@nebenan.de"},"license":"SEE LICENSE IN LICENSE FILE","_id":"nebenan-redux-tools@6.1.0-beta.4","maintainers":[{"name":"johip-m","email":"josip.maric@nebenan.de"},{"name":"iamuchejude","email":"iamuchejude@gmail.com"},{"name":"eliasbraun","email":"elias.braun@nebenan.de"},{"name":"peterhassler","email":"peter.h@nebenan.de"},{"name":"ozerovs","email":"ozerovsa@gmail.com"},{"name":"nomn","email":"i.m.nomn@gmail.com"},{"name":"suprmax","email":"max@degterev.me"}],"homepage":"https://nebenan.de/","bugs":{"url":"https://github.com/good-hood-gmbh/nebenan-redux-tools/issues"},"dist":{"shasum":"b713d233fd275f05bc68f9abb04f163ff7f47933","tarball":"https://registry.npmjs.org/nebenan-redux-tools/-/nebenan-redux-tools-6.1.0-beta.4.tgz","fileCount":26,"integrity":"sha512-ktSXPBp33ACs2Yc1ufGILL9n1FjN0dC2xA191dm88UMQsS8VUKsAPdbGJ+3SLujjLW9QkTS+g3geT+b2F9NVaA==","signatures":[{"sig":"MEUCIQC2Q22eFROBh+K8rQpvCt79xLS+UWYnEYGpT469kpDsAgIgAIzTgDYKKKMNY94YkNbcnfn5ZByU7wRTTq9SD/eRnpE=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":40533,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJimMs+ACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmrkrg//dhQmrBA01wBnOj+Nfj6cCE7J84cmuV/tER0Dc8awfoV9/oCh\r\nTMEVCmlTXVUqvuMS1vDXdndYgYS14CWiTWoWlvExxymiuRpCY4MPSCS4YYRR\r\nDOBu1Ea0hVCi8Ne0tvtKwW/1/S86dSKa0uVGZzru+3PM34lVOMmpVUkKy1p5\r\nOkJUlz+SpHo7SfqClzQ99ftA1t8aNLmysDq830LG7zkRoSjya6GG8TGfNxiC\r\nCdmX1f444wMb/Wn/AwDrugNsy7N5XW/O0zy5taQuMuhvwKTkSPbrxItvyAfZ\r\nNBo31FW90jPQfEPH4/gjahsVPAhopywB6dj/acg1tREL/h07SXqARUPajZTM\r\nkiwkefcJcdOOwqFr+hA/tmqk5Z+BvqXh7Lm0wKvvzy/bfKZ4sf7yGhmAt7Dy\r\nA0wWDMKLtqqbTCyK/EL8NdcUrmHCYDe70mmN2P4MKZOIUAUW5SDWd46wXYlw\r\nvwrB5A4m7n6tS9CAayldOxd0szTXTQPln4r+fdOOSCYPpHk2/NoyUvQanLc6\r\ngUSRSakWhDedPiO7W+nRJCd6V8SKvj/WdwHYCjK6driJnYJBo3+klEbb2Pst\r\n/M669peTOEFmZ2xVWteck8cxVXoiymGc8FRyZXpAmCpSrQr8yPQ1nysSHsDz\r\nossNNmTt24is33cqeKcBo50aLTaTFU077Rw=\r\n=AUx2\r\n-----END PGP SIGNATURE-----\r\n"},"readme":"nebenan-redux-tools\n====================\n\nA set of redux helpers.\n\n- [Experiments Middleware](#experiments-middleware)\n- [Token Middleware](#token-middleware)\n- [Promise Middleware](#promise-middleware)\n- [Network Middleware](#network-middleware)\n  - [Trustworthy Endpoints](#trustworthy-endpoints)\n  - [API Token](#api-token)\n  - [X-Translations-Lang Header](#x-translations-lang-header)\n  - [Should Request](#should-request)\n  - [Abort Callback](#abort-callback)\n  - [Request Types](#request-types)\n  - [Pagination](#pagination)\n  - [Mock Responses](#mock-response)\n  - [Standalone Request](#standalone-request)\n  - [Customize](#customize)\n  \n# Experiments Middleware\n## Setup\n\n**NOT COMPLETE**\n```js\nimport { reducer as experiments } from 'nebenan-redux-tools/lib/experiments/state';\n\nconst reducers = { \n  // It is assumed that the experiment reducer's state\n  // is available under `state.experiments`\n  experiments \n};\n\n// ...\n\nconst createFromState = (initialState) => (\n  createStore(\n    combineReducers(reducers),\n    initialState,\n    composeEnhancers(applyMiddleware(...middleware)),\n  )\n);\n\nexport default createFromState\n```\n\n# Token Middleware\n## Setup\n**NOT COMPLETE**\n```js\nimport { reducer as token } from 'nebenan-redux-tools/lib/token';\n\nconst reducers = {\n  // It is assumed that the experiment reducer's state\n  // is available under `state.token`\n  token\n};\n\n// ...\n\nconst createFromState = (initialState) => (\n  createStore(\n    combineReducers(reducers),\n    initialState,\n    composeEnhancers(applyMiddleware(...middleware)),\n  )\n);\n\nexport default createFromState\n```\n  \n# Promise Middleware\nThe promise middleware gets triggered by dispatching actions with `promise` in payload. The middleware will dispatch resolved or rejected actions when the promise is fulfilled.\n\n```js\ndispatch({\n  type: types.GET_USERS,\n  promise: getUsersFromStorageAsync()\n})\n```\n\n```js\n// reducer\nimport { resolved, rejected } from 'nebenan-redux-tools/lib/promise';\n\nexport default (state = getDefaultState(), action) => {\n  switch(action.type) {\n    case resolved(types.GET_USERS): {\n      const usersFromStorage = action.payload;\n\n      return { ...state, users: usersFromStorage };\n    }\n\n    case rejected(types.GET_USERS): {\n      const usersFromStorage = [];\n\n      return { ...state, users: usersFromStorage };\n    }\n\n    default: {\n      return state;\n    }\n  }\n} \n```\n\n# Network Middleware\n\nThe network middleware gets triggered by dispatching actions with `request` in payload. The middleware will fire the request and dispatches resolved or rejected actions when the request is finished.\n\nExample:\n\n```js\ndispatch({\n  type: types.GET_USERS,\n  request: {\n    url: \"/users\"\n  }\n})\n```\n\n```js\nimport { resolved, rejected } from 'nebenan-redux-tools/lib/network/types';\n\nexport default (state = getDefaultState(), action) => {\n  switch(action.type) {\n    case resolved(types.GET_USERS): {\n      const usersFromResponse = action.payload;\n      \n      return { ...state, users: usersFromResponse };\n    }\n    \n    case rejected(types.GET_USERS): {\n      const usersFromResponse = [];\n      \n      return { ...state, users: usersFromResponse };\n    }\n    \n    default: {\n      return state;\n    }\n  }\n} \n```\n\n## Trustworthy Endpoints\n\nRequests to trustworthy endpoints will enable the [X-Translations-Lang Header](#x-translations-lang-header) and [API Token](#api-token) features.\n\nSet trusted domain via global config:\n```js\nimport { configureNetwork } from 'nebenan-redux-tools/lib/network';\n\nconfigureNetwork({\n  trustedDomain: \"nebenan.de\",\n  ...otherSettings\n})\n```\n\n## API Token\n\nRequests to [trustworthy endpoints](#trustworthy-endpoints) will have the `X-AUTH-TOKEN` header set, containing the api token configured in request options or through token middleware. \n\nDefault: `state.token` (see token middleware)\n\nOverwrite:\n```js\ndispatch({\n  type: \"some-type\", \n  request: {\n    url: \"/some/endpoint\",\n    token: \"special-api-token\"\n  }\n})\n```\n\n## X-Translations-Lang Header\n\nRequests to [trustworthy endpoints](#trustworthy-endpoints) will have the `X-Translations-Lang` header set, containing the locale configured in request options or through global config.\n\nDefault via global config: \n```js\nimport { configureNetwork } from 'nebenan-redux-tools/lib/network';\n\nconfigureNetwork({\n  locale: 'de-DE',\n  ...otherSettings\n})\n```\n\nOverwrite:\n```js\ndispatch({\n  type: \"some-type\",\n  request: {\n    url: \"/some/endpoint\",\n    locale: \"en-US\"  \n  }\n})\n```\n\n## Should Request\n\nPrevents unnecessary requests by checking state beforehand. \n\n```js\ndispatch({\n  type: \"some-type\",\n  request: {\n    url: \"/some/endpoint\",\n    shouldRequest(state) {\n     return !state.isFetched;\n    }\n  }\n})\n```\n\n## Abort Callback\n\nAllows to cancel running requests. You receive the cancel function by providing `getAbortCallback` in request options.\n\n```js\nlet cancelRequest;\n\ndispatch({\n  type: \"some-type\",\n  request: {\n    url: \"/some/endpoint\",\n    getAbortCallback: (callback) => {\n      cancelRequest = callback;\n    }\n  }\n})\n\n\n// later in app\ncancelRequest();\n\n```\n\n## Request Types\n\n`request.type` determines used HTTP method\n\n### `query`\n\nSends out GET request. Collects parameters from `request.query` and applies [pagination](#pagination) query options if there are any.\n\n```js\ndispatch({\n  type: \"some-type\",\n  request: {\n     url: \"/users\",\n     type: 'query',\n     query: { q: 'Peter' } \n  }\n})\n```\n\n\n### `delete` / `post` / `put`\n\n```js\ndispatch({\n  type: \"some-type\",\n  request: {\n    url: \"/some/endpoint/123\",\n    type: 'put',\n    payload: { user: { email, password }}\n  }  \n})\n```\n\n\n## Pagination\n\nThere is some boilerplate needed to fully support paginated lists loaded over the network. These helpers help with managing state and sending pagination params over the network.\n\nThe endpoint you are accessing needs to fulfill following requirements:\n- Parameters\n  - `per_page`\n  - `lower` / `higher`\n- Response\n  - `total_count` (`state.total` needs to be updated manually if field does not exist)\n\n### `assignPaginationDefaults` / `paginationGenerator` helpers\n\n```js\nimport { paginationGenerator, assignPaginationDefaults } from 'nebenan-redux-tools/lib/network/pagination';\n\nconst getDefaultState = () => assignPaginationDefaults({ entities: {} });\nconst getPaginationUpdates = paginationGenerator(types.BOOKMARKS_FETCH);\n\nexport const reducer = (state = getDefaultState(), action) => {\n  let newState = state;\n  \n  const update = getPaginationUpdates(newState, action);\n  if (update) newState = updeep(update, newState);\n  \n  switch (action.type) {\n    case resolved(types.BOOKMARKS_FETCH): {\n      const { result, entities } = parse(action.payload);\n\n      const collection = newState.collection.concat(result.bookmarks);\n\n      return updeep({ collection, entities }, newState);\n    }\n    \n    default: {\n      return newState;\n    }\n  }\n}\n```\n\nThe state now holds the following information\n```js\n{\n  // (managed by paginationGenerator)\n  currentPage: 0, \n  // datetime of last fetch (managed by paginationGenerator)\n  lastFetched: 0,\n  // request in progress (managed by paginationGenerator)\n  isFetching: false,\n  // request failed (managed by paginationGenerator) \n  isFailed: false,  \n  // total amount of items over all pages (managed by paginationGenerator)\n  total: null,\n  // item ids for current page  \n  collection: [],\n}\n```\n\n### Actions\n\nPagination query params will be added for `query` requests with either `request.pagination.first` or `request.pagination.last` set.\n\n*Only works for endpoints supporting `lower`/`higher` params.*\n\n```js\ndispatch({\n  type: types.GET_USERS,\n  request: {\n    url: \"/users\",\n    type: 'query',\n    pagination: {\n      per_page: 10, // optional\n      first: firstUserId, // optional\n      last: lastUserId // optional\n    }\n  }\n})\n```\n\n## Mock Response\n\nResponses can be mocked by using the [promise middleware](#promise-middleware). You can keep all of your request options in the action and don't need to modify reducers. Quite useful during development if you are waiting for backend to support new endpoints.\n\n\n```js\ndispatch({\n  type: types.GET_USERS,\n  promise: Promise.resolve([\n    {\n      id: 1,\n      name: \"Peter\"\n    },\n    {\n      id: 2,\n      name: \"Christina\"\n    }\n  ]),\n  request: {\n    url: \"/users\",\n    type: 'query'\n  }\n})\n```\n\n```js\n// reducer\nimport { resolved } from 'nebenan-redux-tools/lib/network/types';\n\nexport default (state = getDefaultState(), action) => {\n  switch(action.type) {\n    case resolved(types.GET_USERS): {\n      const usersFromResponse = action.payload;\n      \n      return { ...state, users: usersFromResponse };\n    }\n    \n    default: {\n      return state;\n    }\n  }\n} \n```\n\n## Standalone Request\n\nRequests can be created programmatically too.\n\n```js\nimport { createRequest } from 'nebenan-redux-tools/lib/network';\n\nconst sendFile = (file, token) => (\n  createRequest({\n    token,\n    payload: { file },\n    url: '/file-upload',\n    type: 'post',\n    multipart: true,\n  }) \n)\n\nconst handleSuccess = (payload) => {\n  // same as action.payload\n  console.log(payload);\n}\n\nsendFile(newFile, token).then(handleSuccess);\n```\n\n## Customize\n\nThe network layer uses [axios](https://github.com/axios/axios) under the hood. To access axios specific features or extend functionality you can hook into request / response generation on a global or local scale.\n\nHooks:\n- `requestHook(requestConfig, requestOptions)`\n  - `requestConfig` the [axios request config](https://github.com/axios/axios#request-config) to be mutated\n  - `requestOptions` the `request` object provided inside the action\n- `responseHook(body, requestConfig, requestOptions)`\n  - `body` response data to be mutated\n  - `requestConfig` the [axios request config](https://github.com/axios/axios#request-config)\n  - `requestOptions` the `request` object provided inside the action\n  \n### Setup global hooks\n\n```js\nimport { configureNetwork } from 'nebenan-redux-tools/lib/network';\n\nconfigureNetwork({\n  requestHook: (requestConfig, requestOptions) => {\n    // ...\n  },\n  responseHook: (body, requestConfig, requestOptions) => {\n    // ...\n  },\n  ...networkSettings\n})\n```\n\n### Action level request hook\n\n```js\nimport { createRequest } from 'nebenan-redux-tools/lib/network';\n\nconst sendFile = (file, token, onProgress) => (\n  createRequest({\n    token,\n    payload: { file },\n    url: '/file-upload',\n    type: 'post',\n    multipart: true,\n    // same as requestHook\n    customize: (requestConfig) => {\n      requestConfig.onUploadProgress = onProgress;\n    }\n  })\n)\n```\n\n","gitHead":"31540d45f757d70cc2332e33745feacff093cf74","scripts":{"lint":"eslint --ext .es,.js ./","test":"npm run compile && TZ='GMT' mocha \"test/**/*.js\"","build":"npm run compile","check":"npm test && npm run lint && echo \"\\033[0;32mReady to publish\\033[0m\"","clean":"rm -rf ./lib/ || exit 1","compile":"NODE_ENV=production babel src --out-dir lib --copy-files","reinstall":"rm -rf node_modules package-lock.json && npm install","lint:tofile":"eslint --ext .es,.js --no-color -o ./eslint-report.log ./","test:tofile":"npm run compile && TZ='GMT' mocha --no-colors -R spec \"test/**/*.js\" 2>&1 | tee test-report.log","prepublishOnly":"npm run check && npm run clean && npm run build"},"_npmUser":{"name":"ozerovs","email":"ozerovsa@gmail.com"},"deprecated":"Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.","repository":{"url":"git+https://github.com/good-hood-gmbh/nebenan-redux-tools.git","type":"git"},"_npmVersion":"8.5.5","description":"A set of redux helpers","directories":{},"_nodeVersion":"16.15.0","dependencies":{"qs":"^6.10.3","axios":"^0.21.0","lodash":"^4.17.21","updeep":"^1.2.1","js-cookie":"^3.0.1","escape-string-regexp-browser":"^1.1.0"},"_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"chai":"^4.3.6","mocha":"^9.2.0","react":"^17.0.2","redux":"^4.1.2","sinon":"^13.0.1","eslint":"^8.8.0","react-dom":"^17.0.2","@babel/cli":"^7.17.0","proxyquire":"^2.1.3","@babel/core":"^7.17.0","react-redux":"^7.2.6","@babel/runtime":"^7.12.5","@babel/preset-env":"^7.16.11","local-storage-adapter":"^2.0.0","eslint-config-nebenan-base":"^2.0.1","browserslist-config-nebenan":"^1.0.0","@babel/plugin-transform-runtime":"^7.17.0","babel-plugin-add-module-exports":"^1.0.4","@babel/plugin-proposal-json-strings":"^7.16.7","@babel/plugin-transform-strict-mode":"^7.16.7"},"peerDependencies":{"react":"^16.14.0 || ^17.0.1","react-redux":"^7.2.1","@babel/runtime":"^7.12.5","local-storage-adapter":"^2.0.0"},"_npmOperationalInternal":{"tmp":"tmp/nebenan-redux-tools_6.1.0-beta.4_1654180670383_0.4660014461271722","host":"s3://npm-registry-packages"}},"6.1.0-beta.5":{"name":"nebenan-redux-tools","version":"6.1.0-beta.5","author":{"name":"Nebenan.de","email":"max@nebenan.de"},"license":"SEE LICENSE IN LICENSE FILE","_id":"nebenan-redux-tools@6.1.0-beta.5","maintainers":[{"name":"johip-m","email":"josip.maric@nebenan.de"},{"name":"iamuchejude","email":"iamuchejude@gmail.com"},{"name":"eliasbraun","email":"elias.braun@nebenan.de"},{"name":"peterhassler","email":"peter.h@nebenan.de"},{"name":"ozerovs","email":"ozerovsa@gmail.com"},{"name":"nomn","email":"i.m.nomn@gmail.com"},{"name":"suprmax","email":"max@degterev.me"}],"homepage":"https://nebenan.de/","bugs":{"url":"https://github.com/good-hood-gmbh/nebenan-redux-tools/issues"},"dist":{"shasum":"c484a103c5afa3d7b627df45c164a166a8e66412","tarball":"https://registry.npmjs.org/nebenan-redux-tools/-/nebenan-redux-tools-6.1.0-beta.5.tgz","fileCount":26,"integrity":"sha512-hs668PfMiKKiyhm1TJCgbktOqGuyEy1KsQ6bJN+aigK7trF8G/af9hLZ9QVPHOAFZJgNZyiI5uu3DNKhP9kOBQ==","signatures":[{"sig":"MEYCIQCTM7en+51oTB3S4LlvzRZTPg1HZb9OhjLqHv+98GGVWgIhANTg2nzWAuRcYIsFg/mIgdYmF6UwjpWoKT4/Ene/fwzG","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":40553,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJioLt5ACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmogJQ/+MxV1tSebF0yh8I/XPThJmVO7q5c5dXrx82uCoI2IizWN7eiG\r\nuZ5ScpDwIKXNVNvgb7iIQDKz9YVqIHruoXkjGyQWX9O18oDkr53OpDkTckmd\r\nZIJDoWJfY0Ig9q6ZZy8g6KV91uTQqbqwpP9n3nz+TSx83qwT6S5vvSRJDOmo\r\nNQ8HHdFpetBOLNQXQt2EbbY2MXbtOxd5UrFArzl5xOzc4dEjWeyncXH+wODN\r\nBV1tyoTVSI6szhFOSCfRQsdopNKVAcA66URi6/UCnEcgVpS1Wvv3tcb/piN+\r\no7ZNHVJZZDmG6qY28goG2CAfDNYTC3g3jP673T4/g3BFdIcfA4JAizWETLfS\r\nW9XW7IjbgTHcOeS4FTNvUErMV83hnXqm7uhZpC94cHE9PGdmIuCOxAD0QNYB\r\n+3Ez6zgHGV+FuiExcl+ZPAMMTNDomCJQHXz8pENbp0xifRq1c1vEBeHUfBdl\r\nQNcRRbtFgNssFquapt2nve1cj+jCZ8u/u9o4yosBQW2QNmZb99dkqe1Sq30j\r\nUQD0mA15tkcLdaPtaCj3BDA92WSqaz9K09K7oyuCNWv7h3Y2Py/eTlhTyNpX\r\nbXaMTeJNJx4WFra8GStG8JXGDr6cIkIIV94gT+kVOH+4ZEUUR3cqTvQEL4JB\r\ngAIJAEbWST68VsJp3miYWGspBmMNksbKlxM=\r\n=Ji//\r\n-----END PGP SIGNATURE-----\r\n"},"readme":"nebenan-redux-tools\n====================\n\nA set of redux helpers.\n\n- [Experiments Middleware](#experiments-middleware)\n- [Token Middleware](#token-middleware)\n- [Promise Middleware](#promise-middleware)\n- [Network Middleware](#network-middleware)\n  - [Trustworthy Endpoints](#trustworthy-endpoints)\n  - [API Token](#api-token)\n  - [X-Translations-Lang Header](#x-translations-lang-header)\n  - [Should Request](#should-request)\n  - [Abort Callback](#abort-callback)\n  - [Request Types](#request-types)\n  - [Pagination](#pagination)\n  - [Mock Responses](#mock-response)\n  - [Standalone Request](#standalone-request)\n  - [Customize](#customize)\n  \n# Experiments Middleware\n## Setup\n\n**NOT COMPLETE**\n```js\nimport { reducer as experiments } from 'nebenan-redux-tools/lib/experiments/state';\n\nconst reducers = { \n  // It is assumed that the experiment reducer's state\n  // is available under `state.experiments`\n  experiments \n};\n\n// ...\n\nconst createFromState = (initialState) => (\n  createStore(\n    combineReducers(reducers),\n    initialState,\n    composeEnhancers(applyMiddleware(...middleware)),\n  )\n);\n\nexport default createFromState\n```\n\n# Token Middleware\n## Setup\n**NOT COMPLETE**\n```js\nimport { reducer as token } from 'nebenan-redux-tools/lib/token';\n\nconst reducers = {\n  // It is assumed that the experiment reducer's state\n  // is available under `state.token`\n  token\n};\n\n// ...\n\nconst createFromState = (initialState) => (\n  createStore(\n    combineReducers(reducers),\n    initialState,\n    composeEnhancers(applyMiddleware(...middleware)),\n  )\n);\n\nexport default createFromState\n```\n  \n# Promise Middleware\nThe promise middleware gets triggered by dispatching actions with `promise` in payload. The middleware will dispatch resolved or rejected actions when the promise is fulfilled.\n\n```js\ndispatch({\n  type: types.GET_USERS,\n  promise: getUsersFromStorageAsync()\n})\n```\n\n```js\n// reducer\nimport { resolved, rejected } from 'nebenan-redux-tools/lib/promise';\n\nexport default (state = getDefaultState(), action) => {\n  switch(action.type) {\n    case resolved(types.GET_USERS): {\n      const usersFromStorage = action.payload;\n\n      return { ...state, users: usersFromStorage };\n    }\n\n    case rejected(types.GET_USERS): {\n      const usersFromStorage = [];\n\n      return { ...state, users: usersFromStorage };\n    }\n\n    default: {\n      return state;\n    }\n  }\n} \n```\n\n# Network Middleware\n\nThe network middleware gets triggered by dispatching actions with `request` in payload. The middleware will fire the request and dispatches resolved or rejected actions when the request is finished.\n\nExample:\n\n```js\ndispatch({\n  type: types.GET_USERS,\n  request: {\n    url: \"/users\"\n  }\n})\n```\n\n```js\nimport { resolved, rejected } from 'nebenan-redux-tools/lib/network/types';\n\nexport default (state = getDefaultState(), action) => {\n  switch(action.type) {\n    case resolved(types.GET_USERS): {\n      const usersFromResponse = action.payload;\n      \n      return { ...state, users: usersFromResponse };\n    }\n    \n    case rejected(types.GET_USERS): {\n      const usersFromResponse = [];\n      \n      return { ...state, users: usersFromResponse };\n    }\n    \n    default: {\n      return state;\n    }\n  }\n} \n```\n\n## Trustworthy Endpoints\n\nRequests to trustworthy endpoints will enable the [X-Translations-Lang Header](#x-translations-lang-header) and [API Token](#api-token) features.\n\nSet trusted domain via global config:\n```js\nimport { configureNetwork } from 'nebenan-redux-tools/lib/network';\n\nconfigureNetwork({\n  trustedDomain: \"nebenan.de\",\n  ...otherSettings\n})\n```\n\n## API Token\n\nRequests to [trustworthy endpoints](#trustworthy-endpoints) will have the `X-AUTH-TOKEN` header set, containing the api token configured in request options or through token middleware. \n\nDefault: `state.token` (see token middleware)\n\nOverwrite:\n```js\ndispatch({\n  type: \"some-type\", \n  request: {\n    url: \"/some/endpoint\",\n    token: \"special-api-token\"\n  }\n})\n```\n\n## X-Translations-Lang Header\n\nRequests to [trustworthy endpoints](#trustworthy-endpoints) will have the `X-Translations-Lang` header set, containing the locale configured in request options or through global config.\n\nDefault via global config: \n```js\nimport { configureNetwork } from 'nebenan-redux-tools/lib/network';\n\nconfigureNetwork({\n  locale: 'de-DE',\n  ...otherSettings\n})\n```\n\nOverwrite:\n```js\ndispatch({\n  type: \"some-type\",\n  request: {\n    url: \"/some/endpoint\",\n    locale: \"en-US\"  \n  }\n})\n```\n\n## Should Request\n\nPrevents unnecessary requests by checking state beforehand. \n\n```js\ndispatch({\n  type: \"some-type\",\n  request: {\n    url: \"/some/endpoint\",\n    shouldRequest(state) {\n     return !state.isFetched;\n    }\n  }\n})\n```\n\n## Abort Callback\n\nAllows to cancel running requests. You receive the cancel function by providing `getAbortCallback` in request options.\n\n```js\nlet cancelRequest;\n\ndispatch({\n  type: \"some-type\",\n  request: {\n    url: \"/some/endpoint\",\n    getAbortCallback: (callback) => {\n      cancelRequest = callback;\n    }\n  }\n})\n\n\n// later in app\ncancelRequest();\n\n```\n\n## Request Types\n\n`request.type` determines used HTTP method\n\n### `query`\n\nSends out GET request. Collects parameters from `request.query` and applies [pagination](#pagination) query options if there are any.\n\n```js\ndispatch({\n  type: \"some-type\",\n  request: {\n     url: \"/users\",\n     type: 'query',\n     query: { q: 'Peter' } \n  }\n})\n```\n\n\n### `delete` / `post` / `put`\n\n```js\ndispatch({\n  type: \"some-type\",\n  request: {\n    url: \"/some/endpoint/123\",\n    type: 'put',\n    payload: { user: { email, password }}\n  }  \n})\n```\n\n\n## Pagination\n\nThere is some boilerplate needed to fully support paginated lists loaded over the network. These helpers help with managing state and sending pagination params over the network.\n\nThe endpoint you are accessing needs to fulfill following requirements:\n- Parameters\n  - `per_page`\n  - `lower` / `higher`\n- Response\n  - `total_count` (`state.total` needs to be updated manually if field does not exist)\n\n### `assignPaginationDefaults` / `paginationGenerator` helpers\n\n```js\nimport { paginationGenerator, assignPaginationDefaults } from 'nebenan-redux-tools/lib/network/pagination';\n\nconst getDefaultState = () => assignPaginationDefaults({ entities: {} });\nconst getPaginationUpdates = paginationGenerator(types.BOOKMARKS_FETCH);\n\nexport const reducer = (state = getDefaultState(), action) => {\n  let newState = state;\n  \n  const update = getPaginationUpdates(newState, action);\n  if (update) newState = updeep(update, newState);\n  \n  switch (action.type) {\n    case resolved(types.BOOKMARKS_FETCH): {\n      const { result, entities } = parse(action.payload);\n\n      const collection = newState.collection.concat(result.bookmarks);\n\n      return updeep({ collection, entities }, newState);\n    }\n    \n    default: {\n      return newState;\n    }\n  }\n}\n```\n\nThe state now holds the following information\n```js\n{\n  // (managed by paginationGenerator)\n  currentPage: 0, \n  // datetime of last fetch (managed by paginationGenerator)\n  lastFetched: 0,\n  // request in progress (managed by paginationGenerator)\n  isFetching: false,\n  // request failed (managed by paginationGenerator) \n  isFailed: false,  \n  // total amount of items over all pages (managed by paginationGenerator)\n  total: null,\n  // item ids for current page  \n  collection: [],\n}\n```\n\n### Actions\n\nPagination query params will be added for `query` requests with either `request.pagination.first` or `request.pagination.last` set.\n\n*Only works for endpoints supporting `lower`/`higher` params.*\n\n```js\ndispatch({\n  type: types.GET_USERS,\n  request: {\n    url: \"/users\",\n    type: 'query',\n    pagination: {\n      per_page: 10, // optional\n      first: firstUserId, // optional\n      last: lastUserId // optional\n    }\n  }\n})\n```\n\n## Mock Response\n\nResponses can be mocked by using the [promise middleware](#promise-middleware). You can keep all of your request options in the action and don't need to modify reducers. Quite useful during development if you are waiting for backend to support new endpoints.\n\n\n```js\ndispatch({\n  type: types.GET_USERS,\n  promise: Promise.resolve([\n    {\n      id: 1,\n      name: \"Peter\"\n    },\n    {\n      id: 2,\n      name: \"Christina\"\n    }\n  ]),\n  request: {\n    url: \"/users\",\n    type: 'query'\n  }\n})\n```\n\n```js\n// reducer\nimport { resolved } from 'nebenan-redux-tools/lib/network/types';\n\nexport default (state = getDefaultState(), action) => {\n  switch(action.type) {\n    case resolved(types.GET_USERS): {\n      const usersFromResponse = action.payload;\n      \n      return { ...state, users: usersFromResponse };\n    }\n    \n    default: {\n      return state;\n    }\n  }\n} \n```\n\n## Standalone Request\n\nRequests can be created programmatically too.\n\n```js\nimport { createRequest } from 'nebenan-redux-tools/lib/network';\n\nconst sendFile = (file, token) => (\n  createRequest({\n    token,\n    payload: { file },\n    url: '/file-upload',\n    type: 'post',\n    multipart: true,\n  }) \n)\n\nconst handleSuccess = (payload) => {\n  // same as action.payload\n  console.log(payload);\n}\n\nsendFile(newFile, token).then(handleSuccess);\n```\n\n## Customize\n\nThe network layer uses [axios](https://github.com/axios/axios) under the hood. To access axios specific features or extend functionality you can hook into request / response generation on a global or local scale.\n\nHooks:\n- `requestHook(requestConfig, requestOptions)`\n  - `requestConfig` the [axios request config](https://github.com/axios/axios#request-config) to be mutated\n  - `requestOptions` the `request` object provided inside the action\n- `responseHook(body, requestConfig, requestOptions)`\n  - `body` response data to be mutated\n  - `requestConfig` the [axios request config](https://github.com/axios/axios#request-config)\n  - `requestOptions` the `request` object provided inside the action\n  \n### Setup global hooks\n\n```js\nimport { configureNetwork } from 'nebenan-redux-tools/lib/network';\n\nconfigureNetwork({\n  requestHook: (requestConfig, requestOptions) => {\n    // ...\n  },\n  responseHook: (body, requestConfig, requestOptions) => {\n    // ...\n  },\n  ...networkSettings\n})\n```\n\n### Action level request hook\n\n```js\nimport { createRequest } from 'nebenan-redux-tools/lib/network';\n\nconst sendFile = (file, token, onProgress) => (\n  createRequest({\n    token,\n    payload: { file },\n    url: '/file-upload',\n    type: 'post',\n    multipart: true,\n    // same as requestHook\n    customize: (requestConfig) => {\n      requestConfig.onUploadProgress = onProgress;\n    }\n  })\n)\n```\n\n","gitHead":"31540d45f757d70cc2332e33745feacff093cf74","scripts":{"lint":"eslint --ext .es,.js ./","test":"npm run compile && TZ='GMT' mocha \"test/**/*.js\"","build":"npm run compile","check":"npm test && npm run lint && echo \"\\033[0;32mReady to publish\\033[0m\"","clean":"rm -rf ./lib/ || exit 1","compile":"NODE_ENV=production babel src --out-dir lib --copy-files","reinstall":"rm -rf node_modules package-lock.json && npm install","lint:tofile":"eslint --ext .es,.js --no-color -o ./eslint-report.log ./","test:tofile":"npm run compile && TZ='GMT' mocha --no-colors -R spec \"test/**/*.js\" 2>&1 | tee test-report.log","prepublishOnly":"npm run check && npm run clean && npm run build"},"_npmUser":{"name":"ozerovs","email":"ozerovsa@gmail.com"},"deprecated":"Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.","repository":{"url":"git+https://github.com/good-hood-gmbh/nebenan-redux-tools.git","type":"git"},"_npmVersion":"8.5.5","description":"A set of redux helpers","directories":{},"_nodeVersion":"16.15.0","dependencies":{"qs":"^6.10.3","axios":"^0.21.0","lodash":"^4.17.21","updeep":"^1.2.1","js-cookie":"^3.0.1","escape-string-regexp-browser":"^1.1.0"},"_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"chai":"^4.3.6","mocha":"^9.2.0","react":"^17.0.2","redux":"^4.1.2","sinon":"^13.0.1","eslint":"^8.8.0","react-dom":"^17.0.2","@babel/cli":"^7.17.0","proxyquire":"^2.1.3","@babel/core":"^7.17.0","react-redux":"^7.2.6","@babel/runtime":"^7.12.5","@babel/preset-env":"^7.16.11","local-storage-adapter":"^2.0.0","eslint-config-nebenan-base":"^2.0.1","browserslist-config-nebenan":"^1.0.0","@babel/plugin-transform-runtime":"^7.17.0","babel-plugin-add-module-exports":"^1.0.4","@babel/plugin-proposal-json-strings":"^7.16.7","@babel/plugin-transform-strict-mode":"^7.16.7"},"peerDependencies":{"react":"^16.14.0 || ^17.0.1","react-redux":"^7.2.1","@babel/runtime":"^7.12.5","local-storage-adapter":"^2.0.0"},"_npmOperationalInternal":{"tmp":"tmp/nebenan-redux-tools_6.1.0-beta.5_1654700920855_0.5331827179056385","host":"s3://npm-registry-packages"}},"6.1.0-alpha.0":{"name":"nebenan-redux-tools","version":"6.1.0-alpha.0","author":{"name":"Nebenan.de","email":"max@nebenan.de"},"license":"SEE LICENSE IN LICENSE FILE","_id":"nebenan-redux-tools@6.1.0-alpha.0","maintainers":[{"name":"rejas","email":"npm@veeck.de"},{"name":"zeitwidrig","email":"npm@zeitwidrig.de"},{"name":"iamuchejude","email":"iamuchejude@gmail.com"},{"name":"eliasbraun","email":"elias.braun@nebenan.de"},{"name":"peterhassler","email":"peter.h@nebenan.de"},{"name":"ozerovs","email":"ozerovsa@gmail.com"},{"name":"suprmax","email":"max@degterev.me"}],"homepage":"https://nebenan.de/","bugs":{"url":"https://github.com/good-hood-gmbh/nebenan-redux-tools/issues"},"dist":{"shasum":"b2815613a8430029f08c5c4b02be08704ee7e102","tarball":"https://registry.npmjs.org/nebenan-redux-tools/-/nebenan-redux-tools-6.1.0-alpha.0.tgz","fileCount":26,"integrity":"sha512-6hEJuPTZrJtERgYGrQ8pth9VFZ1j0ObRJUpT5DzH3ENSBrBPyPxxPGafOoMzFaCgb43t5dovPxPbIWcAP00r0w==","signatures":[{"sig":"MEUCIE1a/8dz7gk5TywC1LTUBQJ+quXA4oJelQ7l5RXea6TxAiEAtUJk2lTEGZ6321sc7MrFqigysuTUzsdVqzwuM0dyHlA=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":46013,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjEgWgACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmr+vw//RLyqpVlK6yctc57B+IQxlJ0px9VNSq1ZdHz+2PiI1NJ+F1qn\r\nar4idCvsPVjqcSdIh+njNfHspU3VS7sUCylWRT+oBLt963qjTcbxy6qqdu7l\r\nxRtoRtRnhySh99EAZzzRkaVqYTFebdhHyAZIt1zfjY6J4nZVIkDIkaQmrO6y\r\nZnY2m06TXdOzDjzat//XwnoMX7iM0ZJGwDpX1QusIAJegIk6zu/XIyYMoUQR\r\nh+baiAPh0MzzEVhFTZQw1A+dYvmw/phhg8GmtFCrz/LiRAQHArZcRoRaotb+\r\nsjUCPvzUk6xQQUgpKEjZSqSQOjnPT4SrQK9K5bj8K93SabcIP+PoBKVz/ZSu\r\nay4YXzYkJmTTiI+IAeMpCHSKsdIZrdjhtoaQf1asIakXEQ31cn5E7bQ2r6jo\r\n2ymx5iNMKDiWY9tN+AulN1v0Rxn3lmWhNURPgOUWVDiMNafUAyTajA583718\r\n0rUZ4FESRZlnodCLbgCJc4+F5Zp3SAgo6SilPwXeu3ZsMkpjR1ITe02LEfFJ\r\nDJwyaX1E3Vq0INf81ggM3kWjfukFIaT0Fd43fBuyLyC04Tf9LcUeNKDaTxEe\r\nenbdurPA9QHT80O7fjW+fll6UM+HWEcXY1cHeyEtxnXWxH6eovHp5/I3syOc\r\n6xcZGMnTOmK7VaTGFtWBNwYugB0HUpGlkEY=\r\n=LcRz\r\n-----END PGP SIGNATURE-----\r\n"},"gitHead":"31540d45f757d70cc2332e33745feacff093cf74","scripts":{"lint":"eslint --ext .es,.js ./","test":"npm run compile && TZ='GMT' mocha \"test/**/*.js\"","build":"npm run compile","check":"npm test && npm run lint && echo \"\\033[0;32mReady to publish\\033[0m\"","clean":"rm -rf ./lib/ || exit 1","compile":"NODE_ENV=production babel src --out-dir lib --copy-files","reinstall":"rm -rf node_modules package-lock.json && npm install","lint:tofile":"eslint --ext .es,.js --no-color -o ./eslint-report.log ./","test:tofile":"npm run compile && TZ='GMT' mocha --no-colors -R spec \"test/**/*.js\" 2>&1 | tee test-report.log","prepublishOnly":"npm run check && npm run clean && npm run build"},"_npmUser":{"name":"iamuchejude","email":"iamuchejude@gmail.com"},"deprecated":"Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.","repository":{"url":"git+https://github.com/good-hood-gmbh/nebenan-redux-tools.git","type":"git"},"_npmVersion":"8.15.1","description":"A set of redux helpers","directories":{},"_nodeVersion":"16.13.0","dependencies":{"qs":"^6.10.3","axios":"^0.21.0","lodash":"^4.17.21","updeep":"^1.2.1","js-cookie":"^3.0.1","escape-string-regexp-browser":"^1.1.0"},"_hasShrinkwrap":false,"devDependencies":{"chai":"^4.3.6","mocha":"^9.2.0","react":"^17.0.2","redux":"^4.1.2","sinon":"^13.0.1","eslint":"^8.8.0","react-dom":"^17.0.2","@babel/cli":"^7.17.0","proxyquire":"^2.1.3","@babel/core":"^7.17.0","react-redux":"^7.2.6","@babel/runtime":"^7.12.5","@babel/preset-env":"^7.16.11","local-storage-adapter":"^2.0.0","eslint-config-nebenan-base":"^2.0.1","browserslist-config-nebenan":"^1.0.0","@babel/plugin-transform-runtime":"^7.17.0","babel-plugin-add-module-exports":"^1.0.4","@babel/plugin-proposal-json-strings":"^7.16.7","@babel/plugin-transform-strict-mode":"^7.16.7"},"peerDependencies":{"react":"^16.14.0 || ^17.0.1","react-redux":"^7.2.1","@babel/runtime":"^7.12.5","local-storage-adapter":"^2.0.0"},"_npmOperationalInternal":{"tmp":"tmp/nebenan-redux-tools_6.1.0-alpha.0_1662125472235_0.05126745118422327","host":"s3://npm-registry-packages"}},"6.1.0-alpha.1":{"name":"nebenan-redux-tools","version":"6.1.0-alpha.1","author":{"name":"Nebenan.de","email":"max@nebenan.de"},"license":"SEE LICENSE IN LICENSE FILE","_id":"nebenan-redux-tools@6.1.0-alpha.1","maintainers":[{"name":"rejas","email":"npm@veeck.de"},{"name":"zeitwidrig","email":"npm@zeitwidrig.de"},{"name":"iamuchejude","email":"iamuchejude@gmail.com"},{"name":"eliasbraun","email":"elias.braun@nebenan.de"},{"name":"peterhassler","email":"peter.h@nebenan.de"},{"name":"ozerovs","email":"ozerovsa@gmail.com"},{"name":"suprmax","email":"max@degterev.me"}],"homepage":"https://nebenan.de/","bugs":{"url":"https://github.com/good-hood-gmbh/nebenan-redux-tools/issues"},"dist":{"shasum":"824e84226651cd53c2c0f53854a5407b55bfee86","tarball":"https://registry.npmjs.org/nebenan-redux-tools/-/nebenan-redux-tools-6.1.0-alpha.1.tgz","fileCount":26,"integrity":"sha512-mGuxkwWxca7qaIkJ/2YX9LL8ekQ46JU6CX+V7ac4n/UoQaSol2BMlk4IDQfTu3jlqiqPyNr+xKXwaYRHRPiN/w==","signatures":[{"sig":"MEUCIF1HlLhgK7NbOEnb9/k7pWT2JoHBPQuAqPTxLf2s9mrkAiEAmrjaLmEFEwRjs7E/A584QpMwsw7oENiVCDYoM0ohHF0=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":46048,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjEgjiACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmp5tRAAjYaR5lHsurcXHWVuUT9DqH6gU4hfOEivrWlgJnbpvaznzmgC\r\nGhxAaoV8S90MVZHsiYIK2LQPxLg8Zr5dtUvujexkdrTGFCeEHgTzmL3F+KyK\r\ndhk97hqUb6Kc3w5xEdNjrikj+TVgUtjKjwAiaMxCGgpmbii3JPx7OGY87Nx5\r\n6OWJYRdMIWVlVGzC6JIGR1q9LFeJ/NQsfEtC2WqYYPtbAwKZNyXmanBknqxP\r\nbiTcypLb3O0gt9PJZfgWDS6Avw9XcJFFmsfX0DuhjupeVA1vfx/ZvyB2EjcU\r\nS/pMbjlt7IEjXbI1ZVFtqX7zKXylprdvA+ar+T6dJlNs/s/1RH9o8+2W5dB4\r\nkrS5fqRbAcLLnzLtsEFC9fzrz12oQHzsnRijjTbkpl/dv6PzjGdFWfyS8/MO\r\nyd6p9gx6AH1hzZGoYmdMFmBxAFdWAK/0tntzpqjLWhhjSNU9fNsZlwDyMkQj\r\nNmVKUs4QiH+UHx87bC8ALR+WQ+PZlvsrePlpR3PGqPLTSkM6ZstRwZFyrRgt\r\nMmRxzmL9ddSFfjLueLeKR3ggKKJ0AwEkZYckZzLHIIe5XS9nNXIJGD5r914f\r\nH/cy6fb1gWZNRK53SGgVqN6VRsT3mqgsOB+B/ii/G6QICDUQqoCz5Fd/hYtk\r\ni2kgAGk55ZSpuBlLmAWpoDgWSlyZc77BdEU=\r\n=+ZWR\r\n-----END PGP SIGNATURE-----\r\n"},"gitHead":"31540d45f757d70cc2332e33745feacff093cf74","scripts":{"lint":"eslint --ext .es,.js ./","test":"npm run compile && TZ='GMT' mocha \"test/**/*.js\"","build":"npm run compile","check":"npm test && npm run lint && echo \"\\033[0;32mReady to publish\\033[0m\"","clean":"rm -rf ./lib/ || exit 1","compile":"NODE_ENV=production babel src --out-dir lib --copy-files","reinstall":"rm -rf node_modules package-lock.json && npm install","lint:tofile":"eslint --ext .es,.js --no-color -o ./eslint-report.log ./","test:tofile":"npm run compile && TZ='GMT' mocha --no-colors -R spec \"test/**/*.js\" 2>&1 | tee test-report.log","prepublishOnly":"npm run check && npm run clean && npm run build"},"_npmUser":{"name":"iamuchejude","email":"iamuchejude@gmail.com"},"deprecated":"Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.","repository":{"url":"git+https://github.com/good-hood-gmbh/nebenan-redux-tools.git","type":"git"},"_npmVersion":"8.15.1","description":"A set of redux helpers","directories":{},"_nodeVersion":"16.13.0","dependencies":{"qs":"^6.10.3","axios":"^0.21.0","lodash":"^4.17.21","updeep":"^1.2.1","js-cookie":"^3.0.1","escape-string-regexp-browser":"^1.1.0"},"_hasShrinkwrap":false,"devDependencies":{"chai":"^4.3.6","mocha":"^9.2.0","react":"^17.0.2","redux":"^4.1.2","sinon":"^13.0.1","eslint":"^8.8.0","react-dom":"^17.0.2","@babel/cli":"^7.17.0","proxyquire":"^2.1.3","@babel/core":"^7.17.0","react-redux":"^7.2.6","@babel/runtime":"^7.12.5","@babel/preset-env":"^7.16.11","local-storage-adapter":"^2.0.0","eslint-config-nebenan-base":"^2.0.1","browserslist-config-nebenan":"^1.0.0","@babel/plugin-transform-runtime":"^7.17.0","babel-plugin-add-module-exports":"^1.0.4","@babel/plugin-proposal-json-strings":"^7.16.7","@babel/plugin-transform-strict-mode":"^7.16.7"},"peerDependencies":{"react":"^16.14.0 || ^17.0.1","react-redux":"^7.2.1","@babel/runtime":"^7.12.5","local-storage-adapter":"^2.0.0"},"_npmOperationalInternal":{"tmp":"tmp/nebenan-redux-tools_6.1.0-alpha.1_1662126306343_0.5416997649927937","host":"s3://npm-registry-packages"}},"6.1.0-alpha.2":{"name":"nebenan-redux-tools","version":"6.1.0-alpha.2","author":{"name":"Nebenan.de","email":"max@nebenan.de"},"license":"SEE LICENSE IN LICENSE FILE","_id":"nebenan-redux-tools@6.1.0-alpha.2","maintainers":[{"name":"rejas","email":"npm@veeck.de"},{"name":"zeitwidrig","email":"npm@zeitwidrig.de"},{"name":"iamuchejude","email":"iamuchejude@gmail.com"},{"name":"eliasbraun","email":"elias.braun@nebenan.de"},{"name":"peterhassler","email":"peter.h@nebenan.de"},{"name":"ozerovs","email":"ozerovsa@gmail.com"},{"name":"suprmax","email":"max@degterev.me"}],"homepage":"https://nebenan.de/","bugs":{"url":"https://github.com/good-hood-gmbh/nebenan-redux-tools/issues"},"dist":{"shasum":"7555e2edd1d00a0c19233a5e19abcae667b3f9c8","tarball":"https://registry.npmjs.org/nebenan-redux-tools/-/nebenan-redux-tools-6.1.0-alpha.2.tgz","fileCount":26,"integrity":"sha512-G8I/Jdk+ieb84auuD0KoLp2yvayh3iQ1dytmUzbznXpl6PT66Z5QgM+B5tIHCANcKB/EjkeaPyRGzyZHlX2TGA==","signatures":[{"sig":"MEUCIEooVrtV/sgISC7WkLos0p+G+ZddfkdKQqzIB95GG7hJAiEA8raNBEE1dpq3ZLzgUEXdyYVZ+Hqtbl1ehgXuJrM8sUU=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":46272,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjIYVYACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmrdLA//dUr1NETXGT+Q9Q6jtMOJ4KzqzwB3H0DZEBEFgz92K4ZVmjek\r\nbtNN+/YeXsBx47qCRGdQmFDyATpMa3SiHpc9TBUpZh+I+dSPBosw2HkarJY5\r\njgcDKMnQWX58y7ZryTQlx56nVTJE/Bo3ElZXM0G/TYdwgC+WpV153H7Ao0SU\r\nwG/Lw07snE11AplmhKF1IUdANbzc/kSeFxi3eVhT/7xiD4ni0ZOPrklb7FoG\r\necoC3JmEwnRl0baeGTVB1gzRHJlo9N/wFi07zAYE3oHGrlv/kT4uuG+S8/Y5\r\ns0shLe2tQRnDqF+LMt+w1bLnRp/pdKqILjzk7GLOwxeT1OLUDBl0MDPAKHfY\r\n+Qk1JX3klRE0kNdRkunH2Qq/cHFIqe56uBZcs1IOtU69VNgWuN0rImY3m4fx\r\ncIJG4ZyhWTmy1AFlA0/GDUgfSOXfa4hbWom9fN+Zl1NE1bNNRveVc3Yoi46W\r\ngJKzujHrzSRzAmpBMUojzHrQdtgpAAs8odqM/wgU7xUCtiZ0PN/cL2jDarCC\r\n8i5gfMyO+Tqamv/aEubzcFKNnvy/HIEMcdvw3MMBEWQyHr+Kj9/5Cq6bbmtN\r\nIzBOgO2ewoo6lYmxXfyIuT12e2/bn94Al2R500mjzVe64H26YuAJXEHANHHh\r\nmrRjfJ0/IRFMSdDvUq2YjWMdwpG+TNrPqFM=\r\n=KjHA\r\n-----END PGP SIGNATURE-----\r\n"},"gitHead":"31540d45f757d70cc2332e33745feacff093cf74","scripts":{"lint":"eslint --ext .es,.js ./","test":"npm run compile && TZ='GMT' mocha \"test/**/*.js\"","build":"npm run compile","check":"npm test && npm run lint && echo \"\\033[0;32mReady to publish\\033[0m\"","clean":"rm -rf ./lib/ || exit 1","compile":"NODE_ENV=production babel src --out-dir lib --copy-files","reinstall":"rm -rf node_modules package-lock.json && npm install","lint:tofile":"eslint --ext .es,.js --no-color -o ./eslint-report.log ./","test:tofile":"npm run compile && TZ='GMT' mocha --no-colors -R spec \"test/**/*.js\" 2>&1 | tee test-report.log","prepublishOnly":"npm run check && npm run clean && npm run build"},"_npmUser":{"name":"iamuchejude","email":"iamuchejude@gmail.com"},"deprecated":"Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.","repository":{"url":"git+https://github.com/good-hood-gmbh/nebenan-redux-tools.git","type":"git"},"_npmVersion":"8.15.1","description":"A set of redux helpers","directories":{},"_nodeVersion":"16.13.0","dependencies":{"qs":"^6.10.3","axios":"^0.21.0","lodash":"^4.17.21","updeep":"^1.2.1","js-cookie":"^3.0.1","escape-string-regexp-browser":"^1.1.0"},"_hasShrinkwrap":false,"devDependencies":{"chai":"^4.3.6","mocha":"^9.2.0","react":"^17.0.2","redux":"^4.1.2","sinon":"^13.0.1","eslint":"^8.8.0","react-dom":"^17.0.2","@babel/cli":"^7.17.0","proxyquire":"^2.1.3","@babel/core":"^7.17.0","react-redux":"^7.2.6","@babel/runtime":"^7.12.5","@babel/preset-env":"^7.16.11","local-storage-adapter":"^2.0.0","eslint-config-nebenan-base":"^2.0.1","browserslist-config-nebenan":"^1.0.0","@babel/plugin-transform-runtime":"^7.17.0","babel-plugin-add-module-exports":"^1.0.4","@babel/plugin-proposal-json-strings":"^7.16.7","@babel/plugin-transform-strict-mode":"^7.16.7"},"peerDependencies":{"react":"^16.14.0 || ^17.0.1","react-redux":"^7.2.1","@babel/runtime":"^7.12.5","local-storage-adapter":"^2.0.0"},"_npmOperationalInternal":{"tmp":"tmp/nebenan-redux-tools_6.1.0-alpha.2_1663141208003_0.848358885119525","host":"s3://npm-registry-packages"}},"6.1.0-alpha.3":{"name":"nebenan-redux-tools","version":"6.1.0-alpha.3","author":{"name":"Nebenan.de","email":"max@nebenan.de"},"license":"SEE LICENSE IN LICENSE FILE","_id":"nebenan-redux-tools@6.1.0-alpha.3","maintainers":[{"name":"rejas","email":"npm@veeck.de"},{"name":"zeitwidrig","email":"npm@zeitwidrig.de"},{"name":"iamuchejude","email":"iamuchejude@gmail.com"},{"name":"eliasbraun","email":"elias.braun@nebenan.de"},{"name":"peterhassler","email":"peter.h@nebenan.de"},{"name":"ozerovs","email":"ozerovsa@gmail.com"},{"name":"suprmax","email":"max@degterev.me"}],"homepage":"https://nebenan.de/","bugs":{"url":"https://github.com/good-hood-gmbh/nebenan-redux-tools/issues"},"dist":{"shasum":"1e860eb70ad617a1efd5b959a58be36840d13f7b","tarball":"https://registry.npmjs.org/nebenan-redux-tools/-/nebenan-redux-tools-6.1.0-alpha.3.tgz","fileCount":26,"integrity":"sha512-M0WL0HSkZOAUFkrFOyxTmh6ikZE0c1Y1K0M05z4JKWaJ8iqc+ZsYfsJz0rzM2G0+gE0wVq5HCuDTpx8Wha47aQ==","signatures":[{"sig":"MEUCIQDqz+rZ0W9GWhZeZUtZna3S0f6ZPb7agrO6cJrHRRhwlgIgTqiykpebc3r0EUIzqwfr3zP855wv9C2QKU8tBkFihLk=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":46467,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjIco6ACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmpd+Q/9FlNpYAOKpmQJOqrlgIhlXRpCMlGj9JF5az6ijJLXMvMIP/Uk\r\nuf72tJtyU/l4SHjOoNGlfhNbgmdM31mdArVnYXlHIcv/pG2E/xF2CAoPgQuF\r\nFWc8+PS7SIirI7sUFAvOeqAEv4mzUds9yT8o4QvEYuCHyyrTXa6nruXm3KlH\r\n+KBukutdoSbIqcCVroRiC2ryIsULX1STN3NQBLpRbEyaJXamTCD4SyaQHvPp\r\nMyxmARgvFcCZdw8z6Qll2jqglSb/qoMAqED7WQJEg84r6fQJ8ycY02AAjLef\r\nH11MQA3jVw9MjGNEI3fmLEmAHnlQo+WbAZyGNFOQ/ycRBxGJn6/moYL3i60n\r\nkihXY/vqluJn0nuV90OZaO+QPwwSYWrPUVXOVgwzvWLoN4A5//V2FTMaGjYJ\r\nkSAXqSyJUMmSglnGXR5zlIZmJRQiQiOZEhAdU33d5rcBY5nHxXEhefmgjS6A\r\nE1RgT1S1CvPiOzydUjpxPmnv9C5XjXdm0QGtnaMRi1yjvPo5Q0hnAoShObtu\r\nioiApnLRCPTu/WQsnQFmqTNvkXMCLbnFpI/2wzDloLL2tCOG/U3GPn33IbeF\r\neq3Tas3KoOxo/NOnlJDoNCqSj5IHPJva2LGEuW1HR3kevvPwKY0e44X+Ll0a\r\nvAv8RNQkiD8fwBOd86Jns/S8Lv6vE9gCu9c=\r\n=lnqx\r\n-----END PGP SIGNATURE-----\r\n"},"gitHead":"0e7a3c2fc7736f230b0131d1b9eb31acaa7f0fea","scripts":{"lint":"eslint --ext .es,.js ./","test":"npm run compile && TZ='GMT' mocha \"test/**/*.js\"","build":"npm run compile","check":"npm test && npm run lint && echo \"\\033[0;32mReady to publish\\033[0m\"","clean":"rm -rf ./lib/ || exit 1","compile":"NODE_ENV=production babel src --out-dir lib --copy-files","reinstall":"rm -rf node_modules package-lock.json && npm install","lint:tofile":"eslint --ext .es,.js --no-color -o ./eslint-report.log ./","test:tofile":"npm run compile && TZ='GMT' mocha --no-colors -R spec \"test/**/*.js\" 2>&1 | tee test-report.log","prepublishOnly":"npm run check && npm run clean && npm run build"},"_npmUser":{"name":"iamuchejude","email":"iamuchejude@gmail.com"},"deprecated":"Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.","repository":{"url":"git+https://github.com/good-hood-gmbh/nebenan-redux-tools.git","type":"git"},"_npmVersion":"8.15.1","description":"A set of redux helpers","directories":{},"_nodeVersion":"16.13.0","dependencies":{"qs":"^6.10.3","axios":"^0.21.0","lodash":"^4.17.21","updeep":"^1.2.1","js-cookie":"^3.0.1","escape-string-regexp-browser":"^1.1.0"},"_hasShrinkwrap":false,"devDependencies":{"chai":"^4.3.6","mocha":"^9.2.0","react":"^17.0.2","redux":"^4.1.2","sinon":"^13.0.1","eslint":"^8.8.0","react-dom":"^17.0.2","@babel/cli":"^7.17.0","proxyquire":"^2.1.3","@babel/core":"^7.17.0","react-redux":"^7.2.6","@babel/runtime":"^7.12.5","@babel/preset-env":"^7.16.11","local-storage-adapter":"^2.0.0","eslint-config-nebenan-base":"^2.0.1","browserslist-config-nebenan":"^1.0.0","@babel/plugin-transform-runtime":"^7.17.0","babel-plugin-add-module-exports":"^1.0.4","@babel/plugin-proposal-json-strings":"^7.16.7","@babel/plugin-transform-strict-mode":"^7.16.7"},"peerDependencies":{"react":"^16.14.0 || ^17.0.1","react-redux":"^7.2.1","@babel/runtime":"^7.12.5","local-storage-adapter":"^2.0.0"},"_npmOperationalInternal":{"tmp":"tmp/nebenan-redux-tools_6.1.0-alpha.3_1663158841774_0.373433789940151","host":"s3://npm-registry-packages"}},"6.1.0-alpha.4":{"name":"nebenan-redux-tools","version":"6.1.0-alpha.4","author":{"name":"Nebenan.de","email":"max@nebenan.de"},"license":"SEE LICENSE IN LICENSE FILE","_id":"nebenan-redux-tools@6.1.0-alpha.4","maintainers":[{"name":"rejas","email":"npm@veeck.de"},{"name":"zeitwidrig","email":"npm@zeitwidrig.de"},{"name":"iamuchejude","email":"iamuchejude@gmail.com"},{"name":"eliasbraun","email":"elias.braun@nebenan.de"},{"name":"peterhassler","email":"peter.h@nebenan.de"},{"name":"ozerovs","email":"ozerovsa@gmail.com"},{"name":"suprmax","email":"max@degterev.me"}],"homepage":"https://nebenan.de/","bugs":{"url":"https://github.com/good-hood-gmbh/nebenan-redux-tools/issues"},"dist":{"shasum":"a557da154bb3bf7523a0c9a1dce334f258381cd7","tarball":"https://registry.npmjs.org/nebenan-redux-tools/-/nebenan-redux-tools-6.1.0-alpha.4.tgz","fileCount":26,"integrity":"sha512-jGYE/aFbiefM8sadn7xVA0CA8Rms6FgEUD5N19W13IucjWNdArgGECrPNXQw7D420QxPY4RMWoeAVGNIp/wuKA==","signatures":[{"sig":"MEUCID5gqStqCqIWBQrdm7DyOUBXD5g+9LxxThwrAJuPVfn0AiEA3ENMhvWRor3jpy0glcqPCsFy498AaYfvB+yQSj+2TqU=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":46467,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjIdd9ACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmqvdRAAn6XMzn/HY44LCOh2CyN39OEROjiB3NKkoa/p7JImyDP2J1ni\r\nbVqMUBtqnu0JsMNXG8xZu3h2hGridIpx7kiG9ELx9PwKre3qlPRS42eqQaGr\r\n+9sr5tTbpVDbR0nRflKzYzU6sMyhy8GuxK6fzLRA5oRQn5/QBxLBWZYkQvgm\r\nvdkJ2o9CQimOALjN84nziqDUIahC69rkbM1QEQKdz+osigV5NkMV0aCBfEqo\r\noJi0qsQ8dVUzDTyiqNfTG200QFB/XKNkuU07+upopqZ7woUcgJLzRk8XybkW\r\nevhRKs4jr8bwBi1pg2v5Ym7k2GNjdivB5qkQEEN8brNEbsryhvkbT9XsTC0z\r\npBXm8A7i8Zws+1RDWSxq0wLGQC/MC9ZwD3LGO6kZbt1rpXnmwXRPMuqCozju\r\nm7glfTpJSO36CkRTfjHIB4W6exDjkq0NgsE8r8AfQoDTS2BltUOR9PbWo45f\r\nYXB85lXgQaVxV7mpnVXs/wWDtEb6wP5/XheYxhFgCDQ1Dv3T7qBjKPgPnPgT\r\npln9vFz5X51Sk/1a6ogEgtDVuexMMf0o60IVVplP1R/9QqAlxei0JbAMfOb+\r\nsga/Rdh5wS8IgR5kQaBshgFoZg3ptY41t5TWnvwpPRA58jC2OTSgfyqlSa1D\r\nsfz+bnbworbYQiGx1slbdnNJaKC8ZygaReQ=\r\n=OCDY\r\n-----END PGP SIGNATURE-----\r\n"},"gitHead":"0e7a3c2fc7736f230b0131d1b9eb31acaa7f0fea","scripts":{"lint":"eslint --ext .es,.js ./","test":"npm run compile && TZ='GMT' mocha \"test/**/*.js\"","build":"npm run compile","check":"npm test && npm run lint && echo \"\\033[0;32mReady to publish\\033[0m\"","clean":"rm -rf ./lib/ || exit 1","compile":"NODE_ENV=production babel src --out-dir lib --copy-files","reinstall":"rm -rf node_modules package-lock.json && npm install","lint:tofile":"eslint --ext .es,.js --no-color -o ./eslint-report.log ./","test:tofile":"npm run compile && TZ='GMT' mocha --no-colors -R spec \"test/**/*.js\" 2>&1 | tee test-report.log","prepublishOnly":"npm run check && npm run clean && npm run build"},"_npmUser":{"name":"iamuchejude","email":"iamuchejude@gmail.com"},"deprecated":"Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.","repository":{"url":"git+https://github.com/good-hood-gmbh/nebenan-redux-tools.git","type":"git"},"_npmVersion":"8.15.1","description":"A set of redux helpers","directories":{},"_nodeVersion":"16.13.0","dependencies":{"qs":"^6.10.3","axios":"^0.21.0","lodash":"^4.17.21","updeep":"^1.2.1","js-cookie":"^3.0.1","escape-string-regexp-browser":"^1.1.0"},"_hasShrinkwrap":false,"devDependencies":{"chai":"^4.3.6","mocha":"^9.2.0","react":"^17.0.2","redux":"^4.1.2","sinon":"^13.0.1","eslint":"^8.8.0","react-dom":"^17.0.2","@babel/cli":"^7.17.0","proxyquire":"^2.1.3","@babel/core":"^7.17.0","react-redux":"^7.2.6","@babel/runtime":"^7.12.5","@babel/preset-env":"^7.16.11","local-storage-adapter":"^2.0.0","eslint-config-nebenan-base":"^2.0.1","browserslist-config-nebenan":"^1.0.0","@babel/plugin-transform-runtime":"^7.17.0","babel-plugin-add-module-exports":"^1.0.4","@babel/plugin-proposal-json-strings":"^7.16.7","@babel/plugin-transform-strict-mode":"^7.16.7"},"peerDependencies":{"react":"^16.14.0 || ^17.0.1","react-redux":"^7.2.1","@babel/runtime":"^7.12.5","local-storage-adapter":"^2.0.0"},"_npmOperationalInternal":{"tmp":"tmp/nebenan-redux-tools_6.1.0-alpha.4_1663162237200_0.08307695245105995","host":"s3://npm-registry-packages"}},"6.1.0-alpha.5":{"name":"nebenan-redux-tools","version":"6.1.0-alpha.5","author":{"name":"Nebenan.de","email":"max@nebenan.de"},"license":"SEE LICENSE IN LICENSE FILE","_id":"nebenan-redux-tools@6.1.0-alpha.5","maintainers":[{"name":"rejas","email":"npm@veeck.de"},{"name":"zeitwidrig","email":"npm@zeitwidrig.de"},{"name":"iamuchejude","email":"iamuchejude@gmail.com"},{"name":"eliasbraun","email":"elias.braun@nebenan.de"},{"name":"peterhassler","email":"peter.h@nebenan.de"},{"name":"ozerovs","email":"ozerovsa@gmail.com"},{"name":"suprmax","email":"max@degterev.me"}],"homepage":"https://nebenan.de/","bugs":{"url":"https://github.com/good-hood-gmbh/nebenan-redux-tools/issues"},"dist":{"shasum":"e85832f3692f80980c6da0008272007091cf3d55","tarball":"https://registry.npmjs.org/nebenan-redux-tools/-/nebenan-redux-tools-6.1.0-alpha.5.tgz","fileCount":26,"integrity":"sha512-5zbVQYLZzHSl090cDlU+IPXm3vcmJnuilm7Xx31d1A2LENoeGBqf/b+Mbjz108Dvs62k9DGiSTutLJMB5HHzvw==","signatures":[{"sig":"MEQCIDVQu09l8e/28PE8z0fbVYtAx64YzDVAhfbLXexpU373AiB6IJDZ+gv4ErnWnyqb1FQW07pHSfe3B1xzjFgA6O1SmA==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":46237,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjIjiQACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmpP5w/8C9bB1Wz4pMo/uloafvdRXsyUjWwnhappkAwnzww9c7ZXXwy+\r\nLKEQUL7CLNaW5izKoLsyDDwNSSRgv0f+SKbI+x9kB7NVFrCYHr4DdQJHWPCU\r\nBPg49e+ZcMCme/XsqvqJ8x2Sexq/9brvZtZZ/6fAh6AAqAXcyLY3R0slkirV\r\nZeU4sg9W5I65vijrnWiJjtgoLRTaGS5zgFykJ8X9jPqzxT5G1hUMoaGTnwJU\r\nC/NfiRqnd/Ba/bLR8a45pxB7FuYuL9C6WnsxWiGBiOehym48y9DvgYzpZDGz\r\nQIjgBFIh6QrrGW1yghKmcaQCtPBHvCPSshYhoQeW5+ly5m8JRWRty8LDReYL\r\nMHoIEK9DRc3trN3gIA1ZQpUDZf7jXlrtkbrCOe609XUA1I+HRppDpYbuvXXp\r\nGDkybmMLp8ZvN5jw/r9CJLbjTXlk9lozOaC6vy79f/p6siWErDGchqeYKJ2m\r\nIx14dgWzvvnr4t9g/n7gC1Mgzyfd7h8JqGzFbjhGUV6oxwR/Dg+pUu26iMw8\r\nTowFLC1fZP9E7U1nSZ/BhhZMvOLfp5WCgdwHXmuAZUuXRVPf/vD3Ef2M/j28\r\nQC7w8NKNk7RxGLr41BPdK2csPjmZKEP+sWsuJ21m2an8aMlqRD5AH2kr+fsq\r\nZ40MFOFTnXSK8WrLQb4Bun7Gc6zzaTepp78=\r\n=LLtO\r\n-----END PGP SIGNATURE-----\r\n"},"gitHead":"0e7a3c2fc7736f230b0131d1b9eb31acaa7f0fea","scripts":{"lint":"eslint --ext .es,.js ./","test":"npm run compile && TZ='GMT' mocha \"test/**/*.js\"","build":"npm run compile","check":"npm test && npm run lint && echo \"\\033[0;32mReady to publish\\033[0m\"","clean":"rm -rf ./lib/ || exit 1","compile":"NODE_ENV=production babel src --out-dir lib --copy-files","reinstall":"rm -rf node_modules package-lock.json && npm install","lint:tofile":"eslint --ext .es,.js --no-color -o ./eslint-report.log ./","test:tofile":"npm run compile && TZ='GMT' mocha --no-colors -R spec \"test/**/*.js\" 2>&1 | tee test-report.log","prepublishOnly":"npm run check && npm run clean && npm run build"},"_npmUser":{"name":"iamuchejude","email":"iamuchejude@gmail.com"},"deprecated":"Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.","repository":{"url":"git+https://github.com/good-hood-gmbh/nebenan-redux-tools.git","type":"git"},"_npmVersion":"8.15.1","description":"A set of redux helpers","directories":{},"_nodeVersion":"16.13.0","dependencies":{"qs":"^6.10.3","axios":"^0.21.0","lodash":"^4.17.21","updeep":"^1.2.1","js-cookie":"^3.0.1","escape-string-regexp-browser":"^1.1.0"},"_hasShrinkwrap":false,"devDependencies":{"chai":"^4.3.6","mocha":"^9.2.0","react":"^17.0.2","redux":"^4.1.2","sinon":"^13.0.1","eslint":"^8.8.0","react-dom":"^17.0.2","@babel/cli":"^7.17.0","proxyquire":"^2.1.3","@babel/core":"^7.17.0","react-redux":"^7.2.6","@babel/runtime":"^7.12.5","@babel/preset-env":"^7.16.11","local-storage-adapter":"^2.0.0","eslint-config-nebenan-base":"^2.0.1","browserslist-config-nebenan":"^1.0.0","@babel/plugin-transform-runtime":"^7.17.0","babel-plugin-add-module-exports":"^1.0.4","@babel/plugin-proposal-json-strings":"^7.16.7","@babel/plugin-transform-strict-mode":"^7.16.7"},"peerDependencies":{"react":"^16.14.0 || ^17.0.1","react-redux":"^7.2.1","@babel/runtime":"^7.12.5","local-storage-adapter":"^2.0.0"},"_npmOperationalInternal":{"tmp":"tmp/nebenan-redux-tools_6.1.0-alpha.5_1663187088532_0.5731810525329133","host":"s3://npm-registry-packages"}},"6.1.0-alpha.6":{"name":"nebenan-redux-tools","version":"6.1.0-alpha.6","author":{"name":"Nebenan.de","email":"max@nebenan.de"},"license":"SEE LICENSE IN LICENSE FILE","_id":"nebenan-redux-tools@6.1.0-alpha.6","maintainers":[{"name":"rejas","email":"npm@veeck.de"},{"name":"zeitwidrig","email":"npm@zeitwidrig.de"},{"name":"iamuchejude","email":"iamuchejude@gmail.com"},{"name":"eliasbraun","email":"elias.braun@nebenan.de"},{"name":"peterhassler","email":"peter.h@nebenan.de"},{"name":"ozerovs","email":"ozerovsa@gmail.com"},{"name":"suprmax","email":"max@degterev.me"}],"homepage":"https://nebenan.de/","bugs":{"url":"https://github.com/good-hood-gmbh/nebenan-redux-tools/issues"},"dist":{"shasum":"b8943c091ff315e344ebfa1cc64bf668e23f9e43","tarball":"https://registry.npmjs.org/nebenan-redux-tools/-/nebenan-redux-tools-6.1.0-alpha.6.tgz","fileCount":26,"integrity":"sha512-nbyqRzabSkIcu1o37KG2Lfx+b5H2t6y8zkGNJknFKdnxg5ZwzjHAppKjiO5u5nNYu/laPY02jkaiWML/YGfd1g==","signatures":[{"sig":"MEQCIHffYCp3bUebRUEFEBM2GJ5LgMtnKNIe4C+gg73ncA4tAiBsTe8vYhnehmrWicvWRoN067z9oeGDXizXUifV3haKKg==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":46276,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjIkFjACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmqVrQ/9GPAe6U4ktVfCOMHHLspm9os4spA2pu3f6K0knYej9E32m9Yg\r\nukqW7IIdNUc/AIftClJ6rNhduBOB8lJ5CLzY93+MYFdhhpQ0FO55KQL/+Chp\r\nrNzbYCigr6UHj40t1M3QF4izfrmxjv9rHNx9rd9En9MqKDY+RLph0JjXQ4i3\r\nq9vXgoh2kyvvbiFl5UZXKG7qSsqepbrbiHbVIhpucF9LFyu8fX2VPZCsL5E6\r\nWQazNXcmaqaHoT0OIcR8HL3Taaqtd29ZaUWj+jBLzUo3F2nlz53t5X/mqlc4\r\n3xzsM4IY2wgO34u9I89fDn6JbonfsC3W5aCNXOf46pwq+LFDQTr/GiFJkckz\r\nj1Bz5pOYXPlEf3CHzx6/l/9+7URdYJf/QkV3Tvmg5ki8sRgl0pesqXz4lYMf\r\n9hRi+xYL252ahq1m8wBdL5hcI17thSk2GIXj/1YvQlC+Rgp62LZ+I4+d7nd7\r\nxubSSc3AlBGetv08bIOXY5rVu7dKbxdXqaWFpq8R27WN2MYZNPNvOyOt4Oru\r\nOvnKPZnyYKYFc3jYIT7RvnNT4Qg0Pdx0cKyo9T2lJL1z4QgElq3JXutjMNMg\r\nzyf0nYRd4/+U8EK9CBfGez4e/Xdxco1ZMe99lgIyC2+CyG+8CzAp2jfLTlSV\r\nSHOs7Sj08HrElcdlOuP4oOp9kwu5IywR/KM=\r\n=1U3N\r\n-----END PGP SIGNATURE-----\r\n"},"gitHead":"0e7a3c2fc7736f230b0131d1b9eb31acaa7f0fea","scripts":{"lint":"eslint --ext .es,.js ./","test":"npm run compile && TZ='GMT' mocha \"test/**/*.js\"","build":"npm run compile","check":"npm test && npm run lint && echo \"\\033[0;32mReady to publish\\033[0m\"","clean":"rm -rf ./lib/ || exit 1","compile":"NODE_ENV=production babel src --out-dir lib --copy-files","reinstall":"rm -rf node_modules package-lock.json && npm install","lint:tofile":"eslint --ext .es,.js --no-color -o ./eslint-report.log ./","test:tofile":"npm run compile && TZ='GMT' mocha --no-colors -R spec \"test/**/*.js\" 2>&1 | tee test-report.log","prepublishOnly":"npm run check && npm run clean && npm run build"},"_npmUser":{"name":"iamuchejude","email":"iamuchejude@gmail.com"},"deprecated":"Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.","repository":{"url":"git+https://github.com/good-hood-gmbh/nebenan-redux-tools.git","type":"git"},"_npmVersion":"8.15.1","description":"A set of redux helpers","directories":{},"_nodeVersion":"16.13.0","dependencies":{"qs":"^6.10.3","axios":"^0.21.0","lodash":"^4.17.21","updeep":"^1.2.1","js-cookie":"^3.0.1","escape-string-regexp-browser":"^1.1.0"},"_hasShrinkwrap":false,"devDependencies":{"chai":"^4.3.6","mocha":"^9.2.0","react":"^17.0.2","redux":"^4.1.2","sinon":"^13.0.1","eslint":"^8.8.0","react-dom":"^17.0.2","@babel/cli":"^7.17.0","proxyquire":"^2.1.3","@babel/core":"^7.17.0","react-redux":"^7.2.6","@babel/runtime":"^7.12.5","@babel/preset-env":"^7.16.11","local-storage-adapter":"^2.0.0","eslint-config-nebenan-base":"^2.0.1","browserslist-config-nebenan":"^1.0.0","@babel/plugin-transform-runtime":"^7.17.0","babel-plugin-add-module-exports":"^1.0.4","@babel/plugin-proposal-json-strings":"^7.16.7","@babel/plugin-transform-strict-mode":"^7.16.7"},"peerDependencies":{"react":"^16.14.0 || ^17.0.1","react-redux":"^7.2.1","@babel/runtime":"^7.12.5","local-storage-adapter":"^2.0.0"},"_npmOperationalInternal":{"tmp":"tmp/nebenan-redux-tools_6.1.0-alpha.6_1663189347329_0.6395062065232353","host":"s3://npm-registry-packages"}},"6.1.0-alpha.7":{"name":"nebenan-redux-tools","version":"6.1.0-alpha.7","author":{"name":"Nebenan.de","email":"max@nebenan.de"},"license":"SEE LICENSE IN LICENSE FILE","_id":"nebenan-redux-tools@6.1.0-alpha.7","maintainers":[{"name":"rejas","email":"npm@veeck.de"},{"name":"zeitwidrig","email":"npm@zeitwidrig.de"},{"name":"iamuchejude","email":"iamuchejude@gmail.com"},{"name":"eliasbraun","email":"elias.braun@nebenan.de"},{"name":"peterhassler","email":"peter.h@nebenan.de"},{"name":"ozerovs","email":"ozerovsa@gmail.com"},{"name":"suprmax","email":"max@degterev.me"}],"homepage":"https://nebenan.de/","bugs":{"url":"https://github.com/good-hood-gmbh/nebenan-redux-tools/issues"},"dist":{"shasum":"ba2b0f1cd8e921b014571546801a07747e639b03","tarball":"https://registry.npmjs.org/nebenan-redux-tools/-/nebenan-redux-tools-6.1.0-alpha.7.tgz","fileCount":26,"integrity":"sha512-ULYFNUkcbn40NpCRPaMrx1BxeAB9d2ur5dCdBstDsb9cL4sRoXJjnLlKyHZd/T8We0kuGckAUTAjShX4ZIICbA==","signatures":[{"sig":"MEUCIEquBoWV421HydLLtNYuVSaZwMj+UzunmZWh5HSXpGkqAiEAxn7C0/r+SSN9dbi3IQHr9Up486I3MoCxsmc/OkvFGsQ=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":46284,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjIkLgACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmpCMw/+JQlpWwc33QU1Eq+JdlT8pnz+zxiAo5imCA0YYzPEXRK8TmzW\r\nE+sm1f8sd3f4u6UdvNQ1dj4qdXyyjMnIV7btPRZ+zvHb5wu1AdTXT2qHRs6B\r\n3/BMlOih/p6jXDXIhlg+2u+UzFs3ztSgPqjIyeQa8kY9O3YvJIOd5pDlFwmL\r\nOCwFQZVDV2lerrdQ3QZD08RxUMm8okUvf13nUPhA4gb2vFHyUnvNfMtthxcp\r\nPpQfvw9L2W6jsMqTkyctoQZNr6/5p50PIuQQf1wSvIuku1JjpQXuZTPpgm8a\r\nRmUdSwPouxgIapS1G2yLPbQIZ4m0cnr9HZJIuGpNOUtdT4iLi62Td5ONoq2G\r\nPA3xWHP6XY2Ba+zRa2sSPcnyp2hWhQ85a6yvy1qg1ODtxY/88shIqi373w4q\r\nM6hcxbRo043ujVHGA4CL6qX9ytfRVMwT7dXxqFGNoeMTYQx0nMt2+PMz4Jiz\r\nmwPJh2xfIBFJ52KfZP72xZf+FJVDe+XuSOzRVKv7mUFGnxT+DDG13qJYELV/\r\nSZjl+xw/0AG1ueGpFG9mYyo/0Vtgvk7WPyeXbDzLqp8KaW8QS+4OAbx3KGL4\r\nu+Helyf39y5XFqovHnCQ1AwKNPxnSpxQJ9al+4qeL6EZWPiLWho5DBnURWre\r\nJyPdZmJ1LsJNxpTKvx/w1pS8b8uq87Dey4Q=\r\n=HSxt\r\n-----END PGP SIGNATURE-----\r\n"},"gitHead":"0e7a3c2fc7736f230b0131d1b9eb31acaa7f0fea","scripts":{"lint":"eslint --ext .es,.js ./","test":"npm run compile && TZ='GMT' mocha \"test/**/*.js\"","build":"npm run compile","check":"npm test && npm run lint && echo \"\\033[0;32mReady to publish\\033[0m\"","clean":"rm -rf ./lib/ || exit 1","compile":"NODE_ENV=production babel src --out-dir lib --copy-files","reinstall":"rm -rf node_modules package-lock.json && npm install","lint:tofile":"eslint --ext .es,.js --no-color -o ./eslint-report.log ./","test:tofile":"npm run compile && TZ='GMT' mocha --no-colors -R spec \"test/**/*.js\" 2>&1 | tee test-report.log","prepublishOnly":"npm run check && npm run clean && npm run build"},"_npmUser":{"name":"iamuchejude","email":"iamuchejude@gmail.com"},"deprecated":"Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.","repository":{"url":"git+https://github.com/good-hood-gmbh/nebenan-redux-tools.git","type":"git"},"_npmVersion":"8.15.1","description":"A set of redux helpers","directories":{},"_nodeVersion":"16.13.0","dependencies":{"qs":"^6.10.3","axios":"^0.21.0","lodash":"^4.17.21","updeep":"^1.2.1","js-cookie":"^3.0.1","escape-string-regexp-browser":"^1.1.0"},"_hasShrinkwrap":false,"devDependencies":{"chai":"^4.3.6","mocha":"^9.2.0","react":"^17.0.2","redux":"^4.1.2","sinon":"^13.0.1","eslint":"^8.8.0","react-dom":"^17.0.2","@babel/cli":"^7.17.0","proxyquire":"^2.1.3","@babel/core":"^7.17.0","react-redux":"^7.2.6","@babel/runtime":"^7.12.5","@babel/preset-env":"^7.16.11","local-storage-adapter":"^2.0.0","eslint-config-nebenan-base":"^2.0.1","browserslist-config-nebenan":"^1.0.0","@babel/plugin-transform-runtime":"^7.17.0","babel-plugin-add-module-exports":"^1.0.4","@babel/plugin-proposal-json-strings":"^7.16.7","@babel/plugin-transform-strict-mode":"^7.16.7"},"peerDependencies":{"react":"^16.14.0 || ^17.0.1","react-redux":"^7.2.1","@babel/runtime":"^7.12.5","local-storage-adapter":"^2.0.0"},"_npmOperationalInternal":{"tmp":"tmp/nebenan-redux-tools_6.1.0-alpha.7_1663189728505_0.9568513435228161","host":"s3://npm-registry-packages"}},"6.1.0-alpha.8":{"name":"nebenan-redux-tools","version":"6.1.0-alpha.8","author":{"name":"Nebenan.de","email":"max@nebenan.de"},"license":"SEE LICENSE IN LICENSE FILE","_id":"nebenan-redux-tools@6.1.0-alpha.8","maintainers":[{"name":"rejas","email":"npm@veeck.de"},{"name":"zeitwidrig","email":"npm@zeitwidrig.de"},{"name":"iamuchejude","email":"iamuchejude@gmail.com"},{"name":"eliasbraun","email":"elias.braun@nebenan.de"},{"name":"peterhassler","email":"peter.h@nebenan.de"},{"name":"ozerovs","email":"ozerovsa@gmail.com"},{"name":"suprmax","email":"max@degterev.me"}],"homepage":"https://nebenan.de/","bugs":{"url":"https://github.com/good-hood-gmbh/nebenan-redux-tools/issues"},"dist":{"shasum":"4bde51b8b18abb41b62def4c2afc0828fd3e2287","tarball":"https://registry.npmjs.org/nebenan-redux-tools/-/nebenan-redux-tools-6.1.0-alpha.8.tgz","fileCount":26,"integrity":"sha512-2V+OdC+HoA66jA3RHg6VE6z0nAqhHxAhpfaWLAS5++Pb08fvWcA2b14oaIKn5CyicozkRAWJmHHbN8PO+hz7XA==","signatures":[{"sig":"MEYCIQCfVvm9UoaDuh6iHPxwvKuIibXe0yZK7AbAXZVmXrQ1xwIhALLbWtp33kvTfNltCBn/0k0GtecvScxJmIqTOELNcESa","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":46458,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjIksvACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmpMvw//aiMhIAkgsWoDwwpSINonY25GJAtHq+XYhDvMYUXLqUo3ptkW\r\ncueg5S3zKhxpyBDxSjvxsMpTCpoHv7USf6r4VhUT4hFx3JxbtleybfQl3ZKU\r\np0p1WKhoU7w8gezrbVm9hpv3w+pbl6tucd3FIL6AIDrO/1EY60mGIE4u59Oz\r\n09mO9+F5q+nzZV8yqHMO6dphIe/hubkCloi/ST3eTuB/kmYbI6DeG6z0p0xZ\r\nWhakqJ5jyl6FYLj5S/aqd5Rljj0GMrNft1tXAovWp2S6T2dkk9+Lr9D89D1g\r\nF3ZE+Id9g0ouhlbEVN+mIm9xFopkArk1a5QtgdjVxe9lrKG2M4V6WWyTB0OK\r\n0NB/6XDzATEzS7mc75Y0BWoeuj43NGwxbxfovchWStqJezMfxnud+ITMrCjI\r\nQmXeQiwk5QAUERo4zX09gQ4FKktTOMXBW/K11SsiTk9nTsyMhdnUU32K986U\r\njrlvyzeUJSqBx0BkEFOjWr2Vmg1MNpDC8USB4MEgq+latYmHfax6x7fd40rh\r\nlvSJwAYZx+ZlBWvIbjcyxbeJYH3JGStVC1e8VWPaPyUXZcF72sQKqNXVVQtS\r\nZBkRE7Q8Dw8/QIGmxuM1WbMXDYRUnb/GkgVMQE/CqeFdoti2lhFZkSgmWCsE\r\nhTPVFMKnT4SseNPBmoid5GhH2sdVvXmwsv8=\r\n=/6TE\r\n-----END PGP SIGNATURE-----\r\n"},"gitHead":"0e7a3c2fc7736f230b0131d1b9eb31acaa7f0fea","scripts":{"lint":"eslint --ext .es,.js ./","test":"npm run compile && TZ='GMT' mocha \"test/**/*.js\"","build":"npm run compile","check":"npm test && npm run lint && echo \"\\033[0;32mReady to publish\\033[0m\"","clean":"rm -rf ./lib/ || exit 1","compile":"NODE_ENV=production babel src --out-dir lib --copy-files","reinstall":"rm -rf node_modules package-lock.json && npm install","lint:tofile":"eslint --ext .es,.js --no-color -o ./eslint-report.log ./","test:tofile":"npm run compile && TZ='GMT' mocha --no-colors -R spec \"test/**/*.js\" 2>&1 | tee test-report.log","prepublishOnly":"npm run check && npm run clean && npm run build"},"_npmUser":{"name":"iamuchejude","email":"iamuchejude@gmail.com"},"deprecated":"Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.","repository":{"url":"git+https://github.com/good-hood-gmbh/nebenan-redux-tools.git","type":"git"},"_npmVersion":"8.15.1","description":"A set of redux helpers","directories":{},"_nodeVersion":"16.13.0","dependencies":{"qs":"^6.10.3","axios":"^0.21.0","lodash":"^4.17.21","updeep":"^1.2.1","js-cookie":"^3.0.1","escape-string-regexp-browser":"^1.1.0"},"_hasShrinkwrap":false,"devDependencies":{"chai":"^4.3.6","mocha":"^9.2.0","react":"^17.0.2","redux":"^4.1.2","sinon":"^13.0.1","eslint":"^8.8.0","react-dom":"^17.0.2","@babel/cli":"^7.17.0","proxyquire":"^2.1.3","@babel/core":"^7.17.0","react-redux":"^7.2.6","@babel/runtime":"^7.12.5","@babel/preset-env":"^7.16.11","local-storage-adapter":"^2.0.0","eslint-config-nebenan-base":"^2.0.1","browserslist-config-nebenan":"^1.0.0","@babel/plugin-transform-runtime":"^7.17.0","babel-plugin-add-module-exports":"^1.0.4","@babel/plugin-proposal-json-strings":"^7.16.7","@babel/plugin-transform-strict-mode":"^7.16.7"},"peerDependencies":{"react":"^16.14.0 || ^17.0.1","react-redux":"^7.2.1","@babel/runtime":"^7.12.5","local-storage-adapter":"^2.0.0"},"_npmOperationalInternal":{"tmp":"tmp/nebenan-redux-tools_6.1.0-alpha.8_1663191854929_0.2429656713751982","host":"s3://npm-registry-packages"}},"6.1.0-alpha.9":{"name":"nebenan-redux-tools","version":"6.1.0-alpha.9","author":{"name":"Nebenan.de","email":"max@nebenan.de"},"license":"SEE LICENSE IN LICENSE FILE","_id":"nebenan-redux-tools@6.1.0-alpha.9","maintainers":[{"name":"rejas","email":"npm@veeck.de"},{"name":"zeitwidrig","email":"npm@zeitwidrig.de"},{"name":"iamuchejude","email":"iamuchejude@gmail.com"},{"name":"eliasbraun","email":"elias.braun@nebenan.de"},{"name":"peterhassler","email":"peter.h@nebenan.de"},{"name":"ozerovs","email":"ozerovsa@gmail.com"},{"name":"suprmax","email":"max@degterev.me"}],"homepage":"https://nebenan.de/","bugs":{"url":"https://github.com/good-hood-gmbh/nebenan-redux-tools/issues"},"dist":{"shasum":"a6503fdabafa0b4ae8fdbf5ecc0a2f3e74e23444","tarball":"https://registry.npmjs.org/nebenan-redux-tools/-/nebenan-redux-tools-6.1.0-alpha.9.tgz","fileCount":26,"integrity":"sha512-2AYHnih88GuTHruRcQG15oRVgbTEcn44fUUfNaKK3u3zcA94jHjyo93pkUNCq1XZLMGDMBBD4CEfbF7m6K76aA==","signatures":[{"sig":"MEUCIEi8uAd0pKPDhgsTjXk05lgiOhMC2kgwqVngWlDF4Z6jAiEAg9x7xPfD0w/WhGjc81VaTH6sXBr+JQlAKli2FKkzcGY=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":46486,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjIkzeACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmrIuQ//Ri7cS1IcBVee9e7UEocjoUmWHD8c9CPE5ssVjyNJf9DBokB8\r\nA5tBwgsJdT9XNNIu/n2atLpRFDZumZvmrPd+hpV86heOjPs4VslAh+8Xll1s\r\nK/ZTGcQ5KhUTgfQoC8f3eEAcrF9NQixSBzMDJG//+zLxId4n/KULUKaG4e5o\r\nGe8ifBS2Hy6gXp1v4LXaKskfwZ7f+8uCwKCS7dHXVIT5x0JhgIcviY104S8A\r\nqGP/6xBOLsmTgcZcqJMtWvB+lr4LFEcciVZG+NBrkL7bA2zhhhg4EHKmoi7M\r\nMIu7lTnTNAwtIO7Tg/eHhUtSOvJUY80g/PNqnTlwFWNfV2qc+OHE2dS18Z3O\r\npvq+w4mJIpxozfp4tj0ldNhJbA60MkWieiGPn2ODLqm3Ty+XmICY1HhrkPsG\r\ngcF33wc0W4Swz6Lurv2TIrbj1e6QPaO7DNMA3UOZ3HMPHuLGTKYx3GinaaYV\r\nSlZfSoANxHt5oFMwZjsmphnlLkY1WiMCCX8nh3Ekf76Mq246RZw6m12EzZAD\r\nWyB1tLuVNe7LFMlByKdPI9McH0+JGDDlG4IvUObJJIpHdNxH3xc4hmANaSQf\r\ncKA+aqHrDO3YaQPFFFnIfe6T+DWEeab83NLSohLCmUOIo6OTJgXx6fnocUsG\r\nby8/gwwwPGX5OtPJQTlrdklNbfaPBGQl3mw=\r\n=9qUL\r\n-----END PGP SIGNATURE-----\r\n"},"gitHead":"0e7a3c2fc7736f230b0131d1b9eb31acaa7f0fea","scripts":{"lint":"eslint --ext .es,.js ./","test":"npm run compile && TZ='GMT' mocha \"test/**/*.js\"","build":"npm run compile","check":"npm test && npm run lint && echo \"\\033[0;32mReady to publish\\033[0m\"","clean":"rm -rf ./lib/ || exit 1","compile":"NODE_ENV=production babel src --out-dir lib --copy-files","reinstall":"rm -rf node_modules package-lock.json && npm install","lint:tofile":"eslint --ext .es,.js --no-color -o ./eslint-report.log ./","test:tofile":"npm run compile && TZ='GMT' mocha --no-colors -R spec \"test/**/*.js\" 2>&1 | tee test-report.log","prepublishOnly":"npm run check && npm run clean && npm run build"},"_npmUser":{"name":"iamuchejude","email":"iamuchejude@gmail.com"},"deprecated":"Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.","repository":{"url":"git+https://github.com/good-hood-gmbh/nebenan-redux-tools.git","type":"git"},"_npmVersion":"8.15.1","description":"A set of redux helpers","directories":{},"_nodeVersion":"16.13.0","dependencies":{"qs":"^6.10.3","axios":"^0.21.0","lodash":"^4.17.21","updeep":"^1.2.1","js-cookie":"^3.0.1","escape-string-regexp-browser":"^1.1.0"},"_hasShrinkwrap":false,"devDependencies":{"chai":"^4.3.6","mocha":"^9.2.0","react":"^17.0.2","redux":"^4.1.2","sinon":"^13.0.1","eslint":"^8.8.0","react-dom":"^17.0.2","@babel/cli":"^7.17.0","proxyquire":"^2.1.3","@babel/core":"^7.17.0","react-redux":"^7.2.6","@babel/runtime":"^7.12.5","@babel/preset-env":"^7.16.11","local-storage-adapter":"^2.0.0","eslint-config-nebenan-base":"^2.0.1","browserslist-config-nebenan":"^1.0.0","@babel/plugin-transform-runtime":"^7.17.0","babel-plugin-add-module-exports":"^1.0.4","@babel/plugin-proposal-json-strings":"^7.16.7","@babel/plugin-transform-strict-mode":"^7.16.7"},"peerDependencies":{"react":"^16.14.0 || ^17.0.1","react-redux":"^7.2.1","@babel/runtime":"^7.12.5","local-storage-adapter":"^2.0.0"},"_npmOperationalInternal":{"tmp":"tmp/nebenan-redux-tools_6.1.0-alpha.9_1663192286422_0.517283409821875","host":"s3://npm-registry-packages"}},"6.1.0-alpha.10":{"name":"nebenan-redux-tools","version":"6.1.0-alpha.10","author":{"name":"Nebenan.de","email":"max@nebenan.de"},"license":"SEE LICENSE IN LICENSE FILE","_id":"nebenan-redux-tools@6.1.0-alpha.10","maintainers":[{"name":"rejas","email":"npm@veeck.de"},{"name":"zeitwidrig","email":"npm@zeitwidrig.de"},{"name":"iamuchejude","email":"iamuchejude@gmail.com"},{"name":"eliasbraun","email":"elias.braun@nebenan.de"},{"name":"peterhassler","email":"peter.h@nebenan.de"},{"name":"ozerovs","email":"ozerovsa@gmail.com"},{"name":"suprmax","email":"max@degterev.me"}],"homepage":"https://nebenan.de/","bugs":{"url":"https://github.com/good-hood-gmbh/nebenan-redux-tools/issues"},"dist":{"shasum":"105be0326265642f3161a6a8aef47173540cc9b6","tarball":"https://registry.npmjs.org/nebenan-redux-tools/-/nebenan-redux-tools-6.1.0-alpha.10.tgz","fileCount":26,"integrity":"sha512-USxOQFfPNT01aUUSN2srMIea43vwe28qKt+YKOlOVKL92TMqGbhvq6pchqYaNYXH7B51SlMB/tvhP8NEIaIfCg==","signatures":[{"sig":"MEQCIECPmqGkFvH1Jm9HCG3bPWhXh1mLnLS2ckFHsqslVirkAiBq7h5v19brG+uRWojt5mClK8z8Var2UPsmLQYakVwAYQ==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":46322,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjIl0YACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmqCBhAAil8R2M2eox3c/S5NqIMV6oJqNOD8WFehwDOO4MasNgUje5GA\r\nFqfhvyo5EtNinS2LZVPpkhphDpPyQyMkPBxScAx3iANFHnpYuI0vDd2Bk9ut\r\nUZjBDVOETL6I/nlkMvoefoSMEiovc3DVcdYgySiEUTmddNx7b93zzg5ldBlW\r\nKiU1dKzzDVe5BWCvuHwD61RgpYNohkzP/pt0XWB7BvT4FAgMwvM+VVgHKJzy\r\nW4VpCIFDNiRp9wdbLdqpbzKdLDQa51jSNuuP2+NfrjqoswxoPWATIZ3gSKsn\r\nqellOOSKre/nw4rtQKZZEy4CckQ1mHMKIuclxqzzjHu/fxFfrTZuary7ESkU\r\nTsV3tqD5tiWUisYwEbHMacXVTpEzjLAUGzX6pNI32CUt9ztN8pz9O6+5FZDp\r\n7pMOqNYCh3oBYWq3N2nOtudGzWTevE16P2SBaxc+lP7+eDGOcWGkIHroHGX+\r\nIhe6aZX/jS1Yvfx81c2snYkY5GFnnIAYqR+q0nJvhG/L/XpWM0Oat0V0GBXP\r\nRgB39zuPK4fi2fCCGGmDSWVTqmQ5rPIbGKD5veyHzNxUWev6FfXOtOCVw+m5\r\nmCUlY/cvcw5jAdwXLpsGXtjf5qhG/fIjFIhcnAk6FeRkyOu+KAZEzH5Gqwhw\r\nrxJ8r0ZWzTVnibxN2bOt3yvr5QgJaYbEZtI=\r\n=Tf+F\r\n-----END PGP SIGNATURE-----\r\n"},"gitHead":"0e7a3c2fc7736f230b0131d1b9eb31acaa7f0fea","scripts":{"lint":"eslint --ext .es,.js ./","test":"npm run compile && TZ='GMT' mocha \"test/**/*.js\"","build":"npm run compile","check":"npm test && npm run lint && echo \"\\033[0;32mReady to publish\\033[0m\"","clean":"rm -rf ./lib/ || exit 1","compile":"NODE_ENV=production babel src --out-dir lib --copy-files","reinstall":"rm -rf node_modules package-lock.json && npm install","lint:tofile":"eslint --ext .es,.js --no-color -o ./eslint-report.log ./","test:tofile":"npm run compile && TZ='GMT' mocha --no-colors -R spec \"test/**/*.js\" 2>&1 | tee test-report.log","prepublishOnly":"npm run check && npm run clean && npm run build"},"_npmUser":{"name":"iamuchejude","email":"iamuchejude@gmail.com"},"deprecated":"Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.","repository":{"url":"git+https://github.com/good-hood-gmbh/nebenan-redux-tools.git","type":"git"},"_npmVersion":"8.15.1","description":"A set of redux helpers","directories":{},"_nodeVersion":"16.13.0","dependencies":{"qs":"^6.10.3","axios":"^0.21.0","lodash":"^4.17.21","updeep":"^1.2.1","js-cookie":"^3.0.1","escape-string-regexp-browser":"^1.1.0"},"_hasShrinkwrap":false,"devDependencies":{"chai":"^4.3.6","mocha":"^9.2.0","react":"^17.0.2","redux":"^4.1.2","sinon":"^13.0.1","eslint":"^8.8.0","react-dom":"^17.0.2","@babel/cli":"^7.17.0","proxyquire":"^2.1.3","@babel/core":"^7.17.0","react-redux":"^7.2.6","@babel/runtime":"^7.12.5","@babel/preset-env":"^7.16.11","local-storage-adapter":"^2.0.0","eslint-config-nebenan-base":"^2.0.1","browserslist-config-nebenan":"^1.0.0","@babel/plugin-transform-runtime":"^7.17.0","babel-plugin-add-module-exports":"^1.0.4","@babel/plugin-proposal-json-strings":"^7.16.7","@babel/plugin-transform-strict-mode":"^7.16.7"},"peerDependencies":{"react":"^16.14.0 || ^17.0.1","react-redux":"^7.2.1","@babel/runtime":"^7.12.5","local-storage-adapter":"^2.0.0"},"_npmOperationalInternal":{"tmp":"tmp/nebenan-redux-tools_6.1.0-alpha.10_1663196440145_0.9830752495982549","host":"s3://npm-registry-packages"}},"6.1.0-alpha.11":{"name":"nebenan-redux-tools","version":"6.1.0-alpha.11","author":{"name":"Nebenan.de","email":"max@nebenan.de"},"license":"SEE LICENSE IN LICENSE FILE","_id":"nebenan-redux-tools@6.1.0-alpha.11","maintainers":[{"name":"rejas","email":"npm@veeck.de"},{"name":"zeitwidrig","email":"npm@zeitwidrig.de"},{"name":"iamuchejude","email":"iamuchejude@gmail.com"},{"name":"eliasbraun","email":"elias.braun@nebenan.de"},{"name":"peterhassler","email":"peter.h@nebenan.de"},{"name":"ozerovs","email":"ozerovsa@gmail.com"},{"name":"suprmax","email":"max@degterev.me"}],"homepage":"https://nebenan.de/","bugs":{"url":"https://github.com/good-hood-gmbh/nebenan-redux-tools/issues"},"dist":{"shasum":"4888dbc2177ee46839848154da90778898ac9b37","tarball":"https://registry.npmjs.org/nebenan-redux-tools/-/nebenan-redux-tools-6.1.0-alpha.11.tgz","fileCount":26,"integrity":"sha512-Mle27tHU5qJ+cb08YLwH1ilIQ5dgRudLLGQ+dRz5I9yfiDjfTDJSMz8VFpX4cA05zSbB/ckCeK//Glca2L4PYQ==","signatures":[{"sig":"MEQCIBfj3xeziNvdWjJcIEJMURdrtQlxRCxTGDfvCer0+RxpAiBdFuNExjfgLndVPsqO1KoiBRmHuERvPnDqdvMlTssnxw==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":46275,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjInmAACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmoscg//anlCtOiFle6Uok7hq/0ebPBZDLw6iCU44CJr8LtvHsC3M2jq\r\nSyXZyvHp+dXRdp9rX+LHnscq/429kDaZn9nr+6AIhzPndedvAb5DTZirMUBL\r\nIVJbJU5hKRJfeQcyaa0jRsVQA9zeI+le98jabNPZM/Pp4oxUpKkxONNWyeF7\r\nHyzBehnc6EOimQ/TnF+StGxGjEHQsUVnO80rX+K/ErLMzyM8cV6KOOYfO4Dd\r\nQwkrdoEC+0+s7MbJlvKSoP7yZkq2oPmJE2sJwXc9vjYbSYVjSc2lPAmgUghS\r\nchmuLsonqwwZIXbhUgFpQ1g0R/xmuKLkjo6hfyIL5sXfEd9KLpDnlcs84CM3\r\n9ff23LPhzf363W0JAzspclbmTIyZmOk6QWOb15GfXfMA59zYRdmtneKVoTfN\r\nyh72rjnkAJ1gtDf5Gze7qtdUMbnCHsw2QXzPCjDHlUOHkGCf3Tv+Ub6E+f2a\r\nD+ti2+qTRQoHop+om2gAc08N1Lptjawi2zMMkYTJcsmhtcVKgaq5cp9dxYWi\r\nJFzB1DQth8qcbEEGLEAVwpMlB7EnZChOLQIiNwn1xmXh4PHBG1Jfa94urR6t\r\n8s8N8hVG/Zh064c69IQf5Qe1hPvRyGQwCdyOcqxPBCXGLV+5cPqh2KUnyfUe\r\n8TCwJkcF4u6bhVnBxzWsZC+c9Nnv+wAmD7c=\r\n=muTf\r\n-----END PGP SIGNATURE-----\r\n"},"gitHead":"0e7a3c2fc7736f230b0131d1b9eb31acaa7f0fea","scripts":{"lint":"eslint --ext .es,.js ./","test":"npm run compile && TZ='GMT' mocha \"test/**/*.js\"","build":"npm run compile","check":"npm test && npm run lint && echo \"\\033[0;32mReady to publish\\033[0m\"","clean":"rm -rf ./lib/ || exit 1","compile":"NODE_ENV=production babel src --out-dir lib --copy-files","reinstall":"rm -rf node_modules package-lock.json && npm install","lint:tofile":"eslint --ext .es,.js --no-color -o ./eslint-report.log ./","test:tofile":"npm run compile && TZ='GMT' mocha --no-colors -R spec \"test/**/*.js\" 2>&1 | tee test-report.log","prepublishOnly":"npm run check && npm run clean && npm run build"},"_npmUser":{"name":"iamuchejude","email":"iamuchejude@gmail.com"},"deprecated":"Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.","repository":{"url":"git+https://github.com/good-hood-gmbh/nebenan-redux-tools.git","type":"git"},"_npmVersion":"8.15.1","description":"A set of redux helpers","directories":{},"_nodeVersion":"16.13.0","dependencies":{"qs":"^6.10.3","axios":"^0.21.0","lodash":"^4.17.21","updeep":"^1.2.1","js-cookie":"^3.0.1","escape-string-regexp-browser":"^1.1.0"},"_hasShrinkwrap":false,"devDependencies":{"chai":"^4.3.6","mocha":"^9.2.0","react":"^17.0.2","redux":"^4.1.2","sinon":"^13.0.1","eslint":"^8.8.0","react-dom":"^17.0.2","@babel/cli":"^7.17.0","proxyquire":"^2.1.3","@babel/core":"^7.17.0","react-redux":"^7.2.6","@babel/runtime":"^7.12.5","@babel/preset-env":"^7.16.11","local-storage-adapter":"^2.0.0","eslint-config-nebenan-base":"^2.0.1","browserslist-config-nebenan":"^1.0.0","@babel/plugin-transform-runtime":"^7.17.0","babel-plugin-add-module-exports":"^1.0.4","@babel/plugin-proposal-json-strings":"^7.16.7","@babel/plugin-transform-strict-mode":"^7.16.7"},"peerDependencies":{"react":"^16.14.0 || ^17.0.1","react-redux":"^7.2.1","@babel/runtime":"^7.12.5","local-storage-adapter":"^2.0.0"},"_npmOperationalInternal":{"tmp":"tmp/nebenan-redux-tools_6.1.0-alpha.11_1663203712217_0.389837177280846","host":"s3://npm-registry-packages"}},"6.1.0-alpha.12":{"name":"nebenan-redux-tools","version":"6.1.0-alpha.12","author":{"name":"Nebenan.de","email":"max@nebenan.de"},"license":"SEE LICENSE IN LICENSE FILE","_id":"nebenan-redux-tools@6.1.0-alpha.12","maintainers":[{"name":"rejas","email":"npm@veeck.de"},{"name":"zeitwidrig","email":"npm@zeitwidrig.de"},{"name":"iamuchejude","email":"iamuchejude@gmail.com"},{"name":"eliasbraun","email":"elias.braun@nebenan.de"},{"name":"peterhassler","email":"peter.h@nebenan.de"},{"name":"ozerovs","email":"ozerovsa@gmail.com"},{"name":"suprmax","email":"max@degterev.me"}],"homepage":"https://nebenan.de/","bugs":{"url":"https://github.com/good-hood-gmbh/nebenan-redux-tools/issues"},"dist":{"shasum":"0ececbcfc056fcb426264f065bd006ae78b85e4f","tarball":"https://registry.npmjs.org/nebenan-redux-tools/-/nebenan-redux-tools-6.1.0-alpha.12.tgz","fileCount":26,"integrity":"sha512-awgWWJ6QwuouQW7QL3dPsta2h4RlXgUtfCkfJAfjgGlA9ghvx/mseCUVzabbWZE61fw8bmvJH8BbaCP4E9XHSw==","signatures":[{"sig":"MEUCIQCxFunzqmYVOdgyMx1uczk+RaC4BEmF5tVSvQtUV0Ep1gIgR9T6gr90URD7E58gbMsVsK9FRvl262KdeyW57ganrrw=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":46513,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjJE8YACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmqfdA//WcnRp7hUkwM8bB7SlGK0LtnRzSUz4dVJfEbWqm9REwecY3OF\r\ne0Wt8avNIk0wKvPBTIQ8V9Av9zyMwg5ZbWb//K5Pom7iBor3wD8F7O1sFVKx\r\nSDEmWO4ZiUF2ZMBR8Y01qSnxgh646W3g/yPzu2X4K+wKzxPmtxJ2kxpMPZYQ\r\nkvrlkCh/0Rn1ZOx3C45mnYbNJud4BePluLHRweKz0R698eRaY3r7fEQQq4yS\r\nwo0e47mhfY9jjn4IqMJuTbwDlJNj4jd2dmJnFInNkDM2s8VzVNhi1a2/2x2j\r\nFU9treAgS+c+VWWLLhnTpHWIp1KYDYSZ2/CfzfkidEqPtU02AJGHqAID4dox\r\nxAgd2plkhwubim9s3If/xGyxSHh306+kurhWMe4t+a3TSVvTWuhy6LQIeJ+h\r\nKxXtTRQPVo1ZQEfzFgX/t5x4LyOS3aG1u+amIllC3TyRiI4h+cnkYw5CjBBb\r\nQP1ZPb9rhBEwkJDqsHNgYT1xG5XSrngctL4dsX1ZaLTEnXt3itI5Db0pzB67\r\nqYpgVQC7/kEYamdfF5sC3n9wZJepLct/n+5WawIvd9mQCTcZU+wVIIEwDZ87\r\ncjNPRxQkMV0WENontJeffAJt6kV6ds5yzbtxrSjQmbwEbETQY0x4hhYK7Frz\r\ndBTbrjtku12+LNnD88XZhtWWAqDrXXK/HRo=\r\n=wLvn\r\n-----END PGP SIGNATURE-----\r\n"},"gitHead":"94854a319eefc7a5ae9dffa616b15a65d923cdf4","scripts":{"lint":"eslint --ext .es,.js ./","test":"npm run compile && TZ='GMT' mocha \"test/**/*.js\"","build":"npm run compile","check":"npm test && npm run lint && echo \"\\033[0;32mReady to publish\\033[0m\"","clean":"rm -rf ./lib/ || exit 1","compile":"NODE_ENV=production babel src --out-dir lib --copy-files","reinstall":"rm -rf node_modules package-lock.json && npm install","lint:tofile":"eslint --ext .es,.js --no-color -o ./eslint-report.log ./","test:tofile":"npm run compile && TZ='GMT' mocha --no-colors -R spec \"test/**/*.js\" 2>&1 | tee test-report.log","prepublishOnly":"npm run check && npm run clean && npm run build"},"_npmUser":{"name":"iamuchejude","email":"iamuchejude@gmail.com"},"deprecated":"Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.","repository":{"url":"git+https://github.com/good-hood-gmbh/nebenan-redux-tools.git","type":"git"},"_npmVersion":"8.15.1","description":"A set of redux helpers","directories":{},"_nodeVersion":"16.13.0","dependencies":{"qs":"^6.10.3","axios":"^0.21.0","lodash":"^4.17.21","updeep":"^1.2.1","js-cookie":"^3.0.1","escape-string-regexp-browser":"^1.1.0"},"_hasShrinkwrap":false,"devDependencies":{"chai":"^4.3.6","mocha":"^9.2.0","react":"^17.0.2","redux":"^4.1.2","sinon":"^13.0.1","eslint":"^8.8.0","react-dom":"^17.0.2","@babel/cli":"^7.17.0","proxyquire":"^2.1.3","@babel/core":"^7.17.0","react-redux":"^7.2.6","@babel/runtime":"^7.12.5","@babel/preset-env":"^7.16.11","local-storage-adapter":"^2.0.0","eslint-config-nebenan-base":"^2.0.1","browserslist-config-nebenan":"^1.0.0","@babel/plugin-transform-runtime":"^7.17.0","babel-plugin-add-module-exports":"^1.0.4","@babel/plugin-proposal-json-strings":"^7.16.7","@babel/plugin-transform-strict-mode":"^7.16.7"},"peerDependencies":{"react":"^16.14.0 || ^17.0.1","react-redux":"^7.2.1","@babel/runtime":"^7.12.5","local-storage-adapter":"^2.0.0"},"_npmOperationalInternal":{"tmp":"tmp/nebenan-redux-tools_6.1.0-alpha.12_1663323928479_0.4786576787484902","host":"s3://npm-registry-packages"}},"6.1.0-alpha.13":{"name":"nebenan-redux-tools","version":"6.1.0-alpha.13","author":{"name":"Nebenan.de","email":"max@nebenan.de"},"license":"SEE LICENSE IN LICENSE FILE","_id":"nebenan-redux-tools@6.1.0-alpha.13","maintainers":[{"name":"rejas","email":"npm@veeck.de"},{"name":"zeitwidrig","email":"npm@zeitwidrig.de"},{"name":"iamuchejude","email":"iamuchejude@gmail.com"},{"name":"eliasbraun","email":"elias.braun@nebenan.de"},{"name":"peterhassler","email":"peter.h@nebenan.de"},{"name":"ozerovs","email":"ozerovsa@gmail.com"},{"name":"suprmax","email":"max@degterev.me"}],"homepage":"https://nebenan.de/","bugs":{"url":"https://github.com/good-hood-gmbh/nebenan-redux-tools/issues"},"dist":{"shasum":"cb17482ff382ab4e985d211f7791cf80810c2ff1","tarball":"https://registry.npmjs.org/nebenan-redux-tools/-/nebenan-redux-tools-6.1.0-alpha.13.tgz","fileCount":26,"integrity":"sha512-81dGa+CtfLc9sI3RwLSHUzyMPkhQcZs9cK4Lgcau7/464ciDB7q1CRaOHWl9gUvN7MMKIsFi1u1SZVyTFm/5aw==","signatures":[{"sig":"MEQCIASBu1+6ZD8In0KCmFCN463+Q2tiRRLPcEddkZv8z7pjAiBYy1VpD2YtAtBbejukkkv6IGIY7mjh07Fb5cHanhnzAg==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":46242,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjJFhIACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmr1GA//fjHdNAJ4eHKbP4pDpBCKbCopq1fLvVwwIZiSEE8b8KnPCcWL\r\nTlUwD5cpbF3Lqu7bc02NLDG0f8+wuEyjyTiOkauedUBqSHsYI8fr6Khz51D1\r\nBQSx0T3Mw6mXrJJjf0GhAj081Wqjou5sZi9o07d5MoBxNU4eSL8yupJcyerk\r\nMLHveFWbtJA6bmRbE1d/niabX7mPscX7fQRygg43ieX4mIxjFW7QSvRLgYPH\r\nz7Ys9c3SYyIHD2M0uYjDxILtaLnNe7PNWAvzKI9bASQ5K58Im1/RAUMVAjjP\r\nU18bp/yQaQwu081SoYXPb2bQyMgjQGmYMWw2J5J+WTt4Gq2hHyGVkHb0DAEj\r\nlU6FoIYEQv0fX13SEEpBbptmmUAh2Z1UwCGN7SC2wr7aZYmY9YueOX7SRfoa\r\nGetFL9Wi829ubqKlb3E+mXap/WdMWf/bWvIgwMu22zpSsmxphGWTfV6blHDv\r\nOa3ElKT0xFpybo90yszO34ZxRyu8A44irTaN1ryKDZA7HtX+iRhSB3BeBax7\r\n9v/71CPeWeZBl0rysmhNRqY67sWfJM9wZ/TXcGbkjmTMUO4ZBd1U4ykUkIA3\r\n+ipHqiyZQVpPNfH1pPgyt0JjSdfQyHwOl4+1eLKXWctYln7NuybZMpo66+Ui\r\noawmnd6S0+XiNnkTxltZxw7lHkBB1FRpmAU=\r\n=4quy\r\n-----END PGP SIGNATURE-----\r\n"},"readme":"nebenan-redux-tools\n====================\n\nA set of redux helpers.\n\n- [Experiments Middleware](#experiments-middleware)\n- [Token Middleware](#token-middleware)\n- [Promise Middleware](#promise-middleware)\n- [Network Middleware](#network-middleware)\n  - [Trustworthy Endpoints](#trustworthy-endpoints)\n  - [API Token](#api-token)\n  - [X-Translations-Lang Header](#x-translations-lang-header)\n  - [Should Request](#should-request)\n  - [Abort Callback](#abort-callback)\n  - [Request Types](#request-types)\n  - [Pagination](#pagination)\n  - [Mock Responses](#mock-response)\n  - [Standalone Request](#standalone-request)\n  - [Customize](#customize)\n  \n# Experiments Middleware\n## Setup\n\n**NOT COMPLETE**\n```js\nimport { reducer as experiments } from 'nebenan-redux-tools/lib/experiments/state';\n\nconst reducers = { \n  // It is assumed that the experiment reducer's state\n  // is available under `state.experiments`\n  experiments \n};\n\n// ...\n\nconst createFromState = (initialState) => (\n  createStore(\n    combineReducers(reducers),\n    initialState,\n    composeEnhancers(applyMiddleware(...middleware)),\n  )\n);\n\nexport default createFromState\n```\n\n# Token Middleware\n## Setup\n**NOT COMPLETE**\n```js\nimport { reducer as token } from 'nebenan-redux-tools/lib/token';\n\nconst reducers = {\n  // It is assumed that the experiment reducer's state\n  // is available under `state.token`\n  token\n};\n\n// ...\n\nconst createFromState = (initialState) => (\n  createStore(\n    combineReducers(reducers),\n    initialState,\n    composeEnhancers(applyMiddleware(...middleware)),\n  )\n);\n\nexport default createFromState\n```\n  \n# Promise Middleware\nThe promise middleware gets triggered by dispatching actions with `promise` in payload. The middleware will dispatch resolved or rejected actions when the promise is fulfilled.\n\n```js\ndispatch({\n  type: types.GET_USERS,\n  promise: getUsersFromStorageAsync()\n})\n```\n\n```js\n// reducer\nimport { resolved, rejected } from 'nebenan-redux-tools/lib/promise';\n\nexport default (state = getDefaultState(), action) => {\n  switch(action.type) {\n    case resolved(types.GET_USERS): {\n      const usersFromStorage = action.payload;\n\n      return { ...state, users: usersFromStorage };\n    }\n\n    case rejected(types.GET_USERS): {\n      const usersFromStorage = [];\n\n      return { ...state, users: usersFromStorage };\n    }\n\n    default: {\n      return state;\n    }\n  }\n} \n```\n\n# Network Middleware\n\nThe network middleware gets triggered by dispatching actions with `request` in payload. The middleware will fire the request and dispatches resolved or rejected actions when the request is finished.\n\nExample:\n\n```js\ndispatch({\n  type: types.GET_USERS,\n  request: {\n    url: \"/users\"\n  }\n})\n```\n\n```js\nimport { resolved, rejected } from 'nebenan-redux-tools/lib/network/types';\n\nexport default (state = getDefaultState(), action) => {\n  switch(action.type) {\n    case resolved(types.GET_USERS): {\n      const usersFromResponse = action.payload;\n      \n      return { ...state, users: usersFromResponse };\n    }\n    \n    case rejected(types.GET_USERS): {\n      const usersFromResponse = [];\n      \n      return { ...state, users: usersFromResponse };\n    }\n    \n    default: {\n      return state;\n    }\n  }\n} \n```\n\n## Trustworthy Endpoints\n\nRequests to trustworthy endpoints will enable the [X-Translations-Lang Header](#x-translations-lang-header) and [API Token](#api-token) features.\n\nSet trusted domain via global config:\n```js\nimport { configureNetwork } from 'nebenan-redux-tools/lib/network';\n\nconfigureNetwork({\n  trustedDomain: \"nebenan.de\",\n  ...otherSettings\n})\n```\n\n## API Token\n\nRequests to [trustworthy endpoints](#trustworthy-endpoints) will have the `X-AUTH-TOKEN` header set, containing the api token configured in request options or through token middleware. \n\nDefault: `state.token` (see token middleware)\n\nOverwrite:\n```js\ndispatch({\n  type: \"some-type\", \n  request: {\n    url: \"/some/endpoint\",\n    token: \"special-api-token\"\n  }\n})\n```\n\n## X-Translations-Lang Header\n\nRequests to [trustworthy endpoints](#trustworthy-endpoints) will have the `X-Translations-Lang` header set, containing the locale configured in request options or through global config.\n\nDefault via global config: \n```js\nimport { configureNetwork } from 'nebenan-redux-tools/lib/network';\n\nconfigureNetwork({\n  locale: 'de-DE',\n  ...otherSettings\n})\n```\n\nOverwrite:\n```js\ndispatch({\n  type: \"some-type\",\n  request: {\n    url: \"/some/endpoint\",\n    locale: \"en-US\"  \n  }\n})\n```\n\n## Should Request\n\nPrevents unnecessary requests by checking state beforehand. \n\n```js\ndispatch({\n  type: \"some-type\",\n  request: {\n    url: \"/some/endpoint\",\n    shouldRequest(state) {\n     return !state.isFetched;\n    }\n  }\n})\n```\n\n## Abort Callback\n\nAllows to cancel running requests. You receive the cancel function by providing `getAbortCallback` in request options.\n\n```js\nlet cancelRequest;\n\ndispatch({\n  type: \"some-type\",\n  request: {\n    url: \"/some/endpoint\",\n    getAbortCallback: (callback) => {\n      cancelRequest = callback;\n    }\n  }\n})\n\n\n// later in app\ncancelRequest();\n\n```\n\n## Request Types\n\n`request.type` determines used HTTP method\n\n### `query`\n\nSends out GET request. Collects parameters from `request.query` and applies [pagination](#pagination) query options if there are any.\n\n```js\ndispatch({\n  type: \"some-type\",\n  request: {\n     url: \"/users\",\n     type: 'query',\n     query: { q: 'Peter' } \n  }\n})\n```\n\n\n### `delete` / `post` / `put`\n\n```js\ndispatch({\n  type: \"some-type\",\n  request: {\n    url: \"/some/endpoint/123\",\n    type: 'put',\n    payload: { user: { email, password }}\n  }  \n})\n```\n\n\n## Pagination\n\nThere is some boilerplate needed to fully support paginated lists loaded over the network. These helpers help with managing state and sending pagination params over the network.\n\nThe endpoint you are accessing needs to fulfill following requirements:\n- Parameters\n  - `per_page`\n  - `lower` / `higher`\n- Response\n  - `total_count` (`state.total` needs to be updated manually if field does not exist)\n\n### `assignPaginationDefaults` / `paginationGenerator` helpers\n\n```js\nimport { paginationGenerator, assignPaginationDefaults } from 'nebenan-redux-tools/lib/network/pagination';\n\nconst getDefaultState = () => assignPaginationDefaults({ entities: {} });\nconst getPaginationUpdates = paginationGenerator(types.BOOKMARKS_FETCH);\n\nexport const reducer = (state = getDefaultState(), action) => {\n  let newState = state;\n  \n  const update = getPaginationUpdates(newState, action);\n  if (update) newState = updeep(update, newState);\n  \n  switch (action.type) {\n    case resolved(types.BOOKMARKS_FETCH): {\n      const { result, entities } = parse(action.payload);\n\n      const collection = newState.collection.concat(result.bookmarks);\n\n      return updeep({ collection, entities }, newState);\n    }\n    \n    default: {\n      return newState;\n    }\n  }\n}\n```\n\nThe state now holds the following information\n```js\n{\n  // (managed by paginationGenerator)\n  currentPage: 0, \n  // datetime of last fetch (managed by paginationGenerator)\n  lastFetched: 0,\n  // request in progress (managed by paginationGenerator)\n  isFetching: false,\n  // request failed (managed by paginationGenerator) \n  isFailed: false,  \n  // total amount of items over all pages (managed by paginationGenerator)\n  total: null,\n  // item ids for current page  \n  collection: [],\n}\n```\n\n### Actions\n\nPagination query params will be added for `query` requests with either `request.pagination.first` or `request.pagination.last` set.\n\n*Only works for endpoints supporting `lower`/`higher` params.*\n\n```js\ndispatch({\n  type: types.GET_USERS,\n  request: {\n    url: \"/users\",\n    type: 'query',\n    pagination: {\n      per_page: 10, // optional\n      first: firstUserId, // optional\n      last: lastUserId // optional\n    }\n  }\n})\n```\n\n## Mock Response\n\nResponses can be mocked by using the [promise middleware](#promise-middleware). You can keep all of your request options in the action and don't need to modify reducers. Quite useful during development if you are waiting for backend to support new endpoints.\n\n\n```js\ndispatch({\n  type: types.GET_USERS,\n  promise: Promise.resolve([\n    {\n      id: 1,\n      name: \"Peter\"\n    },\n    {\n      id: 2,\n      name: \"Christina\"\n    }\n  ]),\n  request: {\n    url: \"/users\",\n    type: 'query'\n  }\n})\n```\n\n```js\n// reducer\nimport { resolved } from 'nebenan-redux-tools/lib/network/types';\n\nexport default (state = getDefaultState(), action) => {\n  switch(action.type) {\n    case resolved(types.GET_USERS): {\n      const usersFromResponse = action.payload;\n      \n      return { ...state, users: usersFromResponse };\n    }\n    \n    default: {\n      return state;\n    }\n  }\n} \n```\n\n## Standalone Request\n\nRequests can be created programmatically too.\n\n```js\nimport { createRequest } from 'nebenan-redux-tools/lib/network';\n\nconst sendFile = (file, token) => (\n  createRequest({\n    token,\n    payload: { file },\n    url: '/file-upload',\n    type: 'post',\n    multipart: true,\n  }) \n)\n\nconst handleSuccess = (payload) => {\n  // same as action.payload\n  console.log(payload);\n}\n\nsendFile(newFile, token).then(handleSuccess);\n```\n\n## Customize\n\nThe network layer uses [axios](https://github.com/axios/axios) under the hood. To access axios specific features or extend functionality you can hook into request / response generation on a global or local scale.\n\nHooks:\n- `requestHook(requestConfig, requestOptions)`\n  - `requestConfig` the [axios request config](https://github.com/axios/axios#request-config) to be mutated\n  - `requestOptions` the `request` object provided inside the action\n- `responseHook(body, requestConfig, requestOptions)`\n  - `body` response data to be mutated\n  - `requestConfig` the [axios request config](https://github.com/axios/axios#request-config)\n  - `requestOptions` the `request` object provided inside the action\n  \n### Setup global hooks\n\n```js\nimport { configureNetwork } from 'nebenan-redux-tools/lib/network';\n\nconfigureNetwork({\n  requestHook: (requestConfig, requestOptions) => {\n    // ...\n  },\n  responseHook: (body, requestConfig, requestOptions) => {\n    // ...\n  },\n  ...networkSettings\n})\n```\n\n### Action level request hook\n\n```js\nimport { createRequest } from 'nebenan-redux-tools/lib/network';\n\nconst sendFile = (file, token, onProgress) => (\n  createRequest({\n    token,\n    payload: { file },\n    url: '/file-upload',\n    type: 'post',\n    multipart: true,\n    // same as requestHook\n    customize: (requestConfig) => {\n      requestConfig.onUploadProgress = onProgress;\n    }\n  })\n)\n```\n\n","gitHead":"94854a319eefc7a5ae9dffa616b15a65d923cdf4","scripts":{"lint":"eslint --ext .es,.js ./","test":"npm run compile && TZ='GMT' mocha \"test/**/*.js\"","build":"npm run compile","check":"npm test && npm run lint && echo \"\\033[0;32mReady to publish\\033[0m\"","clean":"rm -rf ./lib/ || exit 1","compile":"NODE_ENV=production babel src --out-dir lib --copy-files","reinstall":"rm -rf node_modules package-lock.json && npm install","lint:tofile":"eslint --ext .es,.js --no-color -o ./eslint-report.log ./","test:tofile":"npm run compile && TZ='GMT' mocha --no-colors -R spec \"test/**/*.js\" 2>&1 | tee test-report.log","prepublishOnly":"npm run check && npm run clean && npm run build"},"_npmUser":{"name":"iamuchejude","email":"iamuchejude@gmail.com"},"deprecated":"Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.","repository":{"url":"git+https://github.com/good-hood-gmbh/nebenan-redux-tools.git","type":"git"},"_npmVersion":"8.15.1","description":"A set of redux helpers","directories":{},"_nodeVersion":"16.13.0","dependencies":{"qs":"^6.10.3","axios":"^0.21.0","lodash":"^4.17.21","updeep":"^1.2.1","js-cookie":"^3.0.1","escape-string-regexp-browser":"^1.1.0"},"_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"chai":"^4.3.6","mocha":"^9.2.0","react":"^17.0.2","redux":"^4.1.2","sinon":"^13.0.1","eslint":"^8.8.0","react-dom":"^17.0.2","@babel/cli":"^7.17.0","proxyquire":"^2.1.3","@babel/core":"^7.17.0","react-redux":"^7.2.6","@babel/runtime":"^7.12.5","@babel/preset-env":"^7.16.11","local-storage-adapter":"^2.0.0","eslint-config-nebenan-base":"^2.0.1","browserslist-config-nebenan":"^1.0.0","@babel/plugin-transform-runtime":"^7.17.0","babel-plugin-add-module-exports":"^1.0.4","@babel/plugin-proposal-json-strings":"^7.16.7","@babel/plugin-transform-strict-mode":"^7.16.7"},"peerDependencies":{"react":"^16.14.0 || ^17.0.1","react-redux":"^7.2.1","@babel/runtime":"^7.12.5","local-storage-adapter":"^2.0.0"},"_npmOperationalInternal":{"tmp":"tmp/nebenan-redux-tools_6.1.0-alpha.13_1663326280442_0.8908873449893553","host":"s3://npm-registry-packages"}},"6.2.0-beta.1":{"name":"nebenan-redux-tools","version":"6.2.0-beta.1","author":{"name":"Nebenan.de","email":"max@nebenan.de"},"license":"SEE LICENSE IN LICENSE FILE","_id":"nebenan-redux-tools@6.2.0-beta.1","maintainers":[{"name":"rejas","email":"npm@veeck.de"},{"name":"zeitwidrig","email":"npm@zeitwidrig.de"},{"name":"iamuchejude","email":"iamuchejude@gmail.com"},{"name":"eliasbraun","email":"elias.braun@nebenan.de"},{"name":"peterhassler","email":"peter.h@nebenan.de"},{"name":"ozerovs","email":"ozerovsa@gmail.com"},{"name":"suprmax","email":"max@degterev.me"}],"homepage":"https://nebenan.de/","bugs":{"url":"https://github.com/good-hood-gmbh/nebenan-redux-tools/issues"},"dist":{"shasum":"da67af72a00cde904831a6728fbf8736b807862f","tarball":"https://registry.npmjs.org/nebenan-redux-tools/-/nebenan-redux-tools-6.2.0-beta.1.tgz","fileCount":26,"integrity":"sha512-7jtEa10BMJYJ7vCAThRv9/aMPacWM8U2qNYwA4pNf0oulSD1FwdMOIVh6TTXOsLNS2yVLUHahtYHpyaZaGGh5g==","signatures":[{"sig":"MEUCIQDarNoE/YbZVGTWfiMQGuG0UgCVUtI/AY9wBBewxHZvRAIgAN7qhsL83Cnmr6J8jYcpvEQDxdCJSgaTLdugm+mB9Zw=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":46240,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjJKlxACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmrdWhAAgiygkwyVQ4YDczeZJ35fAFwyTBzSZxiQOBOQ9qXiKO8hY/L9\r\nLFcQefviyGK84iEg19BmVoDxNRl7PmKMebhxtDOEJoMEoy65UYR5WWVuFczY\r\niamssZN0S+sVeBCugzUkRh+cNI45xRq8pYmjQvboe8Ws77B6x8VwY7PX+VtV\r\nC7PO9ZBeSkVmCzGlO1X7+Rombku+GGQmp7mqMLVKhCheyi/N99s7MB0e1e1c\r\nJkxgTHOb4/5DFDnof+st5y2hD81t7wHYc/7YytrgXi8DWu4gYXSB2L/E00w8\r\nWtvBKV98TTgQqJEWHrgOPMgINRjIsX7il18f7x7x9AdrswE6dqZZwQsFe5w8\r\n5c1zNfkMhYXcxHUlRwvG4O6zITpkNS/jaC8jrq1KYlpE9uXwKnHLAMT4Tc1S\r\ns9woiWNunsrehS8oGcH6MRXkPRECwRLuRyELHx1PcWNRcYsJHL/0eQpSqW0W\r\nuHucNbVly1JOHy+gp535+j+DOQWhQN+HQ4a+5j3r3XxTHlx6vBV5hHXwmviK\r\nqOGVeLjgxtpEpbIWCAHWymYKZwT/K+MrEYTEbeuulGoQB6jpXOOOeG6/LKjX\r\njIuWMAA/fspncyGaNFstDdULs1PfYpDsojMhTtgD3VlYjh5v6UCFzl+mC+Ux\r\n1Gges0YbCC6JkheMGACMlU9HeeWBBZ3mzgQ=\r\n=rRHv\r\n-----END PGP SIGNATURE-----\r\n"},"gitHead":"bb698735e6544e6759b265e18f74c6bde618da21","scripts":{"lint":"eslint --ext .es,.js ./","test":"npm run compile && TZ='GMT' mocha \"test/**/*.js\"","build":"npm run compile","check":"npm test && npm run lint && echo \"\\033[0;32mReady to publish\\033[0m\"","clean":"rm -rf ./lib/ || exit 1","compile":"NODE_ENV=production babel src --out-dir lib --copy-files","reinstall":"rm -rf node_modules package-lock.json && npm install","lint:tofile":"eslint --ext .es,.js --no-color -o ./eslint-report.log ./","test:tofile":"npm run compile && TZ='GMT' mocha --no-colors -R spec \"test/**/*.js\" 2>&1 | tee test-report.log","prepublishOnly":"npm run check && npm run clean && npm run build"},"_npmUser":{"name":"iamuchejude","email":"iamuchejude@gmail.com"},"deprecated":"Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.","repository":{"url":"git+https://github.com/good-hood-gmbh/nebenan-redux-tools.git","type":"git"},"_npmVersion":"8.15.1","description":"A set of redux helpers","directories":{},"_nodeVersion":"16.13.0","dependencies":{"qs":"^6.10.3","axios":"^0.21.0","lodash":"^4.17.21","updeep":"^1.2.1","js-cookie":"^3.0.1","escape-string-regexp-browser":"^1.1.0"},"_hasShrinkwrap":false,"devDependencies":{"chai":"^4.3.6","mocha":"^9.2.0","react":"^17.0.2","redux":"^4.1.2","sinon":"^13.0.1","eslint":"^8.8.0","react-dom":"^17.0.2","@babel/cli":"^7.17.0","proxyquire":"^2.1.3","@babel/core":"^7.17.0","react-redux":"^7.2.6","@babel/runtime":"^7.12.5","@babel/preset-env":"^7.16.11","local-storage-adapter":"^2.0.0","eslint-config-nebenan-base":"^2.0.1","browserslist-config-nebenan":"^1.0.0","@babel/plugin-transform-runtime":"^7.17.0","babel-plugin-add-module-exports":"^1.0.4","@babel/plugin-proposal-json-strings":"^7.16.7","@babel/plugin-transform-strict-mode":"^7.16.7"},"peerDependencies":{"react":"^16.14.0 || ^17.0.1","react-redux":"^7.2.1","@babel/runtime":"^7.12.5","local-storage-adapter":"^2.0.0"},"_npmOperationalInternal":{"tmp":"tmp/nebenan-redux-tools_6.2.0-beta.1_1663347057577_0.8691026935408486","host":"s3://npm-registry-packages"}},"6.2.0-beta.2":{"name":"nebenan-redux-tools","version":"6.2.0-beta.2","author":{"name":"Nebenan.de","email":"max@nebenan.de"},"license":"SEE LICENSE IN LICENSE FILE","_id":"nebenan-redux-tools@6.2.0-beta.2","maintainers":[{"name":"rejas","email":"npm@veeck.de"},{"name":"zeitwidrig","email":"npm@zeitwidrig.de"},{"name":"iamuchejude","email":"iamuchejude@gmail.com"},{"name":"eliasbraun","email":"elias.braun@nebenan.de"},{"name":"peterhassler","email":"peter.h@nebenan.de"},{"name":"ozerovs","email":"ozerovsa@gmail.com"},{"name":"suprmax","email":"max@degterev.me"}],"homepage":"https://nebenan.de/","bugs":{"url":"https://github.com/good-hood-gmbh/nebenan-redux-tools/issues"},"dist":{"shasum":"a2ba553e654d93209c04fe65313f545c97c56458","tarball":"https://registry.npmjs.org/nebenan-redux-tools/-/nebenan-redux-tools-6.2.0-beta.2.tgz","fileCount":26,"integrity":"sha512-F2GPtTPVIMVkuChQ0Yt6iOEt548mb+Di0skz8iDbJ2+dmB7n/RZy0IyUq48YiRetFxBLIbiewzckPQBqXQrJqQ==","signatures":[{"sig":"MEUCIG8hRynuUmjcbm0QCrydg94rOHouQxyqQ0EdkbK6jnQ8AiEA2eu2gK6CK2TwyPRmFoDzw3JANsV958WrEMBgdfkhiQ8=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":46240,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjJKmsACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmqovQ//akC+8N64vpOlgd6Z6kkmHPkRGuuCvtdM+2IsqoTfgRm0MZ9x\r\n/hH3DdayOvy+gTS2n4VtYaRoX9l8ocfd6p+veGB+wRdI9Z+dwEx2Hx+IkgsW\r\nxCGYCR0BEziVt3fZBIImZawjJOqzT4VGW9kEMQXqDMxxnHi3MN6r5ljeujF2\r\nGp5rTfKUA3z+I1uKS7LX0+rpoa1ZpvLisFJ0042JuquHk7g+IZ97Do7brTGP\r\nFVEe4vUz9l//tZCDYcgtHZ6XjdQafLxXEcyoM0v1K0/9cr9w3KF4hQXeJSjL\r\nrlt2SCpQlFCZkrKGICPJI/4tIV1zaxZM6ucpMDSxcbQBoT4o0BVkF7ywH+Qp\r\nELBCU3/ui71C5iUDNqM9oqjiTV/NmRwOP7Mrg5FZUSSAXUYL1mgMOXZ0vSPb\r\nNlozRaqPoQGpRQWsl4QS7tS0LgdHwljkd7Mswoe8s7cQ54v0dgPbIEBJv9LC\r\nEy2ekOV/WAnjFXaRFuir0nLG/VyMxQ/YK/XbberEoV0FE8p9ypLLXYB+WcK5\r\n8G1KBiaXOjujBvDGODuGX5GjrTnLrtE6Cu3g62x5kJl2SWFjdOQhw6tLqg+w\r\nfwbdPGM+VKDhwJ0m7hm+r87MmyKmyv5F9sDfsKo9/NUS7daTGMrBC9E1Fm+R\r\nxtMtPJv+3skX8g6a2WznQSjt9jZGHkEZ99k=\r\n=zuT2\r\n-----END PGP SIGNATURE-----\r\n"},"readme":"nebenan-redux-tools\n====================\n\nA set of redux helpers.\n\n- [Experiments Middleware](#experiments-middleware)\n- [Token Middleware](#token-middleware)\n- [Promise Middleware](#promise-middleware)\n- [Network Middleware](#network-middleware)\n  - [Trustworthy Endpoints](#trustworthy-endpoints)\n  - [API Token](#api-token)\n  - [X-Translations-Lang Header](#x-translations-lang-header)\n  - [Should Request](#should-request)\n  - [Abort Callback](#abort-callback)\n  - [Request Types](#request-types)\n  - [Pagination](#pagination)\n  - [Mock Responses](#mock-response)\n  - [Standalone Request](#standalone-request)\n  - [Customize](#customize)\n  \n# Experiments Middleware\n## Setup\n\n**NOT COMPLETE**\n```js\nimport { reducer as experiments } from 'nebenan-redux-tools/lib/experiments/state';\n\nconst reducers = { \n  // It is assumed that the experiment reducer's state\n  // is available under `state.experiments`\n  experiments \n};\n\n// ...\n\nconst createFromState = (initialState) => (\n  createStore(\n    combineReducers(reducers),\n    initialState,\n    composeEnhancers(applyMiddleware(...middleware)),\n  )\n);\n\nexport default createFromState\n```\n\n# Token Middleware\n## Setup\n**NOT COMPLETE**\n```js\nimport { reducer as token } from 'nebenan-redux-tools/lib/token';\n\nconst reducers = {\n  // It is assumed that the experiment reducer's state\n  // is available under `state.token`\n  token\n};\n\n// ...\n\nconst createFromState = (initialState) => (\n  createStore(\n    combineReducers(reducers),\n    initialState,\n    composeEnhancers(applyMiddleware(...middleware)),\n  )\n);\n\nexport default createFromState\n```\n  \n# Promise Middleware\nThe promise middleware gets triggered by dispatching actions with `promise` in payload. The middleware will dispatch resolved or rejected actions when the promise is fulfilled.\n\n```js\ndispatch({\n  type: types.GET_USERS,\n  promise: getUsersFromStorageAsync()\n})\n```\n\n```js\n// reducer\nimport { resolved, rejected } from 'nebenan-redux-tools/lib/promise';\n\nexport default (state = getDefaultState(), action) => {\n  switch(action.type) {\n    case resolved(types.GET_USERS): {\n      const usersFromStorage = action.payload;\n\n      return { ...state, users: usersFromStorage };\n    }\n\n    case rejected(types.GET_USERS): {\n      const usersFromStorage = [];\n\n      return { ...state, users: usersFromStorage };\n    }\n\n    default: {\n      return state;\n    }\n  }\n} \n```\n\n# Network Middleware\n\nThe network middleware gets triggered by dispatching actions with `request` in payload. The middleware will fire the request and dispatches resolved or rejected actions when the request is finished.\n\nExample:\n\n```js\ndispatch({\n  type: types.GET_USERS,\n  request: {\n    url: \"/users\"\n  }\n})\n```\n\n```js\nimport { resolved, rejected } from 'nebenan-redux-tools/lib/network/types';\n\nexport default (state = getDefaultState(), action) => {\n  switch(action.type) {\n    case resolved(types.GET_USERS): {\n      const usersFromResponse = action.payload;\n      \n      return { ...state, users: usersFromResponse };\n    }\n    \n    case rejected(types.GET_USERS): {\n      const usersFromResponse = [];\n      \n      return { ...state, users: usersFromResponse };\n    }\n    \n    default: {\n      return state;\n    }\n  }\n} \n```\n\n## Trustworthy Endpoints\n\nRequests to trustworthy endpoints will enable the [X-Translations-Lang Header](#x-translations-lang-header) and [API Token](#api-token) features.\n\nSet trusted domain via global config:\n```js\nimport { configureNetwork } from 'nebenan-redux-tools/lib/network';\n\nconfigureNetwork({\n  trustedDomain: \"nebenan.de\",\n  ...otherSettings\n})\n```\n\n## API Token\n\nRequests to [trustworthy endpoints](#trustworthy-endpoints) will have the `X-AUTH-TOKEN` header set, containing the api token configured in request options or through token middleware. \n\nDefault: `state.token` (see token middleware)\n\nOverwrite:\n```js\ndispatch({\n  type: \"some-type\", \n  request: {\n    url: \"/some/endpoint\",\n    token: \"special-api-token\"\n  }\n})\n```\n\n## X-Translations-Lang Header\n\nRequests to [trustworthy endpoints](#trustworthy-endpoints) will have the `X-Translations-Lang` header set, containing the locale configured in request options or through global config.\n\nDefault via global config: \n```js\nimport { configureNetwork } from 'nebenan-redux-tools/lib/network';\n\nconfigureNetwork({\n  locale: 'de-DE',\n  ...otherSettings\n})\n```\n\nOverwrite:\n```js\ndispatch({\n  type: \"some-type\",\n  request: {\n    url: \"/some/endpoint\",\n    locale: \"en-US\"  \n  }\n})\n```\n\n## Should Request\n\nPrevents unnecessary requests by checking state beforehand. \n\n```js\ndispatch({\n  type: \"some-type\",\n  request: {\n    url: \"/some/endpoint\",\n    shouldRequest(state) {\n     return !state.isFetched;\n    }\n  }\n})\n```\n\n## Abort Callback\n\nAllows to cancel running requests. You receive the cancel function by providing `getAbortCallback` in request options.\n\n```js\nlet cancelRequest;\n\ndispatch({\n  type: \"some-type\",\n  request: {\n    url: \"/some/endpoint\",\n    getAbortCallback: (callback) => {\n      cancelRequest = callback;\n    }\n  }\n})\n\n\n// later in app\ncancelRequest();\n\n```\n\n## Request Types\n\n`request.type` determines used HTTP method\n\n### `query`\n\nSends out GET request. Collects parameters from `request.query` and applies [pagination](#pagination) query options if there are any.\n\n```js\ndispatch({\n  type: \"some-type\",\n  request: {\n     url: \"/users\",\n     type: 'query',\n     query: { q: 'Peter' } \n  }\n})\n```\n\n\n### `delete` / `post` / `put`\n\n```js\ndispatch({\n  type: \"some-type\",\n  request: {\n    url: \"/some/endpoint/123\",\n    type: 'put',\n    payload: { user: { email, password }}\n  }  \n})\n```\n\n\n## Pagination\n\nThere is some boilerplate needed to fully support paginated lists loaded over the network. These helpers help with managing state and sending pagination params over the network.\n\nThe endpoint you are accessing needs to fulfill following requirements:\n- Parameters\n  - `per_page`\n  - `lower` / `higher`\n- Response\n  - `total_count` (`state.total` needs to be updated manually if field does not exist)\n\n### `assignPaginationDefaults` / `paginationGenerator` helpers\n\n```js\nimport { paginationGenerator, assignPaginationDefaults } from 'nebenan-redux-tools/lib/network/pagination';\n\nconst getDefaultState = () => assignPaginationDefaults({ entities: {} });\nconst getPaginationUpdates = paginationGenerator(types.BOOKMARKS_FETCH);\n\nexport const reducer = (state = getDefaultState(), action) => {\n  let newState = state;\n  \n  const update = getPaginationUpdates(newState, action);\n  if (update) newState = updeep(update, newState);\n  \n  switch (action.type) {\n    case resolved(types.BOOKMARKS_FETCH): {\n      const { result, entities } = parse(action.payload);\n\n      const collection = newState.collection.concat(result.bookmarks);\n\n      return updeep({ collection, entities }, newState);\n    }\n    \n    default: {\n      return newState;\n    }\n  }\n}\n```\n\nThe state now holds the following information\n```js\n{\n  // (managed by paginationGenerator)\n  currentPage: 0, \n  // datetime of last fetch (managed by paginationGenerator)\n  lastFetched: 0,\n  // request in progress (managed by paginationGenerator)\n  isFetching: false,\n  // request failed (managed by paginationGenerator) \n  isFailed: false,  \n  // total amount of items over all pages (managed by paginationGenerator)\n  total: null,\n  // item ids for current page  \n  collection: [],\n}\n```\n\n### Actions\n\nPagination query params will be added for `query` requests with either `request.pagination.first` or `request.pagination.last` set.\n\n*Only works for endpoints supporting `lower`/`higher` params.*\n\n```js\ndispatch({\n  type: types.GET_USERS,\n  request: {\n    url: \"/users\",\n    type: 'query',\n    pagination: {\n      per_page: 10, // optional\n      first: firstUserId, // optional\n      last: lastUserId // optional\n    }\n  }\n})\n```\n\n## Mock Response\n\nResponses can be mocked by using the [promise middleware](#promise-middleware). You can keep all of your request options in the action and don't need to modify reducers. Quite useful during development if you are waiting for backend to support new endpoints.\n\n\n```js\ndispatch({\n  type: types.GET_USERS,\n  promise: Promise.resolve([\n    {\n      id: 1,\n      name: \"Peter\"\n    },\n    {\n      id: 2,\n      name: \"Christina\"\n    }\n  ]),\n  request: {\n    url: \"/users\",\n    type: 'query'\n  }\n})\n```\n\n```js\n// reducer\nimport { resolved } from 'nebenan-redux-tools/lib/network/types';\n\nexport default (state = getDefaultState(), action) => {\n  switch(action.type) {\n    case resolved(types.GET_USERS): {\n      const usersFromResponse = action.payload;\n      \n      return { ...state, users: usersFromResponse };\n    }\n    \n    default: {\n      return state;\n    }\n  }\n} \n```\n\n## Standalone Request\n\nRequests can be created programmatically too.\n\n```js\nimport { createRequest } from 'nebenan-redux-tools/lib/network';\n\nconst sendFile = (file, token) => (\n  createRequest({\n    token,\n    payload: { file },\n    url: '/file-upload',\n    type: 'post',\n    multipart: true,\n  }) \n)\n\nconst handleSuccess = (payload) => {\n  // same as action.payload\n  console.log(payload);\n}\n\nsendFile(newFile, token).then(handleSuccess);\n```\n\n## Customize\n\nThe network layer uses [axios](https://github.com/axios/axios) under the hood. To access axios specific features or extend functionality you can hook into request / response generation on a global or local scale.\n\nHooks:\n- `requestHook(requestConfig, requestOptions)`\n  - `requestConfig` the [axios request config](https://github.com/axios/axios#request-config) to be mutated\n  - `requestOptions` the `request` object provided inside the action\n- `responseHook(body, requestConfig, requestOptions)`\n  - `body` response data to be mutated\n  - `requestConfig` the [axios request config](https://github.com/axios/axios#request-config)\n  - `requestOptions` the `request` object provided inside the action\n  \n### Setup global hooks\n\n```js\nimport { configureNetwork } from 'nebenan-redux-tools/lib/network';\n\nconfigureNetwork({\n  requestHook: (requestConfig, requestOptions) => {\n    // ...\n  },\n  responseHook: (body, requestConfig, requestOptions) => {\n    // ...\n  },\n  ...networkSettings\n})\n```\n\n### Action level request hook\n\n```js\nimport { createRequest } from 'nebenan-redux-tools/lib/network';\n\nconst sendFile = (file, token, onProgress) => (\n  createRequest({\n    token,\n    payload: { file },\n    url: '/file-upload',\n    type: 'post',\n    multipart: true,\n    // same as requestHook\n    customize: (requestConfig) => {\n      requestConfig.onUploadProgress = onProgress;\n    }\n  })\n)\n```\n\n","gitHead":"bb698735e6544e6759b265e18f74c6bde618da21","scripts":{"lint":"eslint --ext .es,.js ./","test":"npm run compile && TZ='GMT' mocha \"test/**/*.js\"","build":"npm run compile","check":"npm test && npm run lint && echo \"\\033[0;32mReady to publish\\033[0m\"","clean":"rm -rf ./lib/ || exit 1","compile":"NODE_ENV=production babel src --out-dir lib --copy-files","reinstall":"rm -rf node_modules package-lock.json && npm install","lint:tofile":"eslint --ext .es,.js --no-color -o ./eslint-report.log ./","test:tofile":"npm run compile && TZ='GMT' mocha --no-colors -R spec \"test/**/*.js\" 2>&1 | tee test-report.log","prepublishOnly":"npm run check && npm run clean && npm run build"},"_npmUser":{"name":"iamuchejude","email":"iamuchejude@gmail.com"},"deprecated":"Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.","repository":{"url":"git+https://github.com/good-hood-gmbh/nebenan-redux-tools.git","type":"git"},"_npmVersion":"8.15.1","description":"A set of redux helpers","directories":{},"_nodeVersion":"16.13.0","dependencies":{"qs":"^6.10.3","axios":"^0.21.0","lodash":"^4.17.21","updeep":"^1.2.1","js-cookie":"^3.0.1","escape-string-regexp-browser":"^1.1.0"},"_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"chai":"^4.3.6","mocha":"^9.2.0","react":"^17.0.2","redux":"^4.1.2","sinon":"^13.0.1","eslint":"^8.8.0","react-dom":"^17.0.2","@babel/cli":"^7.17.0","proxyquire":"^2.1.3","@babel/core":"^7.17.0","react-redux":"^7.2.6","@babel/runtime":"^7.12.5","@babel/preset-env":"^7.16.11","local-storage-adapter":"^2.0.0","eslint-config-nebenan-base":"^2.0.1","browserslist-config-nebenan":"^1.0.0","@babel/plugin-transform-runtime":"^7.17.0","babel-plugin-add-module-exports":"^1.0.4","@babel/plugin-proposal-json-strings":"^7.16.7","@babel/plugin-transform-strict-mode":"^7.16.7"},"peerDependencies":{"react":"^16.14.0 || ^17.0.1","react-redux":"^7.2.1","@babel/runtime":"^7.12.5","local-storage-adapter":"^2.0.0"},"_npmOperationalInternal":{"tmp":"tmp/nebenan-redux-tools_6.2.0-beta.2_1663347116486_0.06878107714344184","host":"s3://npm-registry-packages"}},"6.1.0":{"name":"nebenan-redux-tools","version":"6.1.0","author":{"name":"Nebenan.de","email":"max@nebenan.de"},"license":"SEE LICENSE IN LICENSE FILE","_id":"nebenan-redux-tools@6.1.0","maintainers":[{"name":"rejas","email":"npm@veeck.de"},{"name":"zeitwidrig","email":"npm@zeitwidrig.de"},{"name":"iamuchejude","email":"iamuchejude@gmail.com"},{"name":"eliasbraun","email":"elias.braun@nebenan.de"},{"name":"peterhassler","email":"peter.h@nebenan.de"},{"name":"ozerovs","email":"ozerovsa@gmail.com"},{"name":"suprmax","email":"max@degterev.me"}],"homepage":"https://nebenan.de/","bugs":{"url":"https://github.com/good-hood-gmbh/nebenan-redux-tools/issues"},"dist":{"shasum":"56ee696d9230e27a59512233fedcdd5efa4db13a","tarball":"https://registry.npmjs.org/nebenan-redux-tools/-/nebenan-redux-tools-6.1.0.tgz","fileCount":26,"integrity":"sha512-xjYRw7umcwCNZaeMk911iuyCiqvAkBGSttPYuz8QOlNKqbL3CAOZWVBXFuUddhr6IPe0JhT5oO9yeKIhzIGrUw==","signatures":[{"sig":"MEQCIAYv1KC3j+iVdJJ8PKYmJv69IwYWF2lc90VjAbsGpgh+AiA+au2uMgIy5ZJMdpC7YiLZD5OilzP4MGTFBi5kAuuCZQ==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":46233,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjKbCwACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmoiMQ/+OQnX26/+8EuWJpjyIfsG6CwcKpm0ujQdOjgIn1M7K+PdhMDO\r\nxDWDpaPJnYouXPIvbCfw+mixj6ESthKF4GiX1xuGCU0ycRn6T9DLOmZpqD9k\r\noi0IM65jTTqUyMf6lIBhLHcO0IchrBMD/s8pPHC73LgNcwglwHhYch3E78Pt\r\n3hOCaH6FUlwKdYBtaSk2du7PeaFrXb/Rmgy73gsEfR6WP8ys9Z4XD8kv/EC+\r\n21Yv8HNZV15gOxsxyWkrfkucDxzeyUOe7vqVVkRo2+V/RPBw89rjuWpZNC87\r\nwrG4yf4JEr5OpBKKkGZAhPytNU7bu/2WqaBgZ52SiXkZ8j+OT32IcVhVglsV\r\n0IYf0/dCp0KB0FLOCSPlTmTX5w/scqNVd2Q8RbDeLwUICPuGpWBPhDKLpYt6\r\nweOKCLQS2wCHsWpMfwUbFlO9XcUWRvb3SKaC6j06xwXWTkM8pauj1OmyiW5R\r\ntFP1xAlntbv26xZvdSdc6gRPIoSbMBNwmaT+QEpVHOsbJ/DyAugaC/KnbE74\r\n22OJHeYjwNF6+JJZ0bVtv+9NcRt/kd9nwA9cz5Sj9o6na7TSqzTkbleV9f0I\r\n2mGfMao2bg0HJFEtCJPMi3yqlbhuYsEa7RCU+fuCIdc4J0US8iuijU98tLnt\r\nEBy3/6io2WW1Hm8l2/g9dQvqf3q/g/EUjio=\r\n=8cBs\r\n-----END PGP SIGNATURE-----\r\n"},"gitHead":"4980bb81c0dd8c8d82edffb39cd6cec185a2d5d9","scripts":{"lint":"eslint --ext .es,.js ./","test":"npm run compile && TZ='GMT' mocha \"test/**/*.js\"","build":"npm run compile","check":"npm test && npm run lint && echo \"\\033[0;32mReady to publish\\033[0m\"","clean":"rm -rf ./lib/ || exit 1","compile":"NODE_ENV=production babel src --out-dir lib --copy-files","reinstall":"rm -rf node_modules package-lock.json && npm install","lint:tofile":"eslint --ext .es,.js --no-color -o ./eslint-report.log ./","test:tofile":"npm run compile && TZ='GMT' mocha --no-colors -R spec \"test/**/*.js\" 2>&1 | tee test-report.log","prepublishOnly":"npm run check && npm run clean && npm run build"},"_npmUser":{"name":"iamuchejude","email":"iamuchejude@gmail.com"},"deprecated":"Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.","repository":{"url":"git+https://github.com/good-hood-gmbh/nebenan-redux-tools.git","type":"git"},"_npmVersion":"8.15.1","description":"A set of redux helpers","directories":{},"_nodeVersion":"16.13.0","dependencies":{"qs":"^6.10.3","axios":"^0.21.0","lodash":"^4.17.21","updeep":"^1.2.1","js-cookie":"^3.0.1","escape-string-regexp-browser":"^1.1.0"},"_hasShrinkwrap":false,"devDependencies":{"chai":"^4.3.6","mocha":"^9.2.0","react":"^17.0.2","redux":"^4.1.2","sinon":"^13.0.1","eslint":"^8.8.0","react-dom":"^17.0.2","@babel/cli":"^7.17.0","proxyquire":"^2.1.3","@babel/core":"^7.17.0","react-redux":"^7.2.6","@babel/runtime":"^7.12.5","@babel/preset-env":"^7.16.11","local-storage-adapter":"^2.0.0","eslint-config-nebenan-base":"^2.0.1","browserslist-config-nebenan":"^1.0.0","@babel/plugin-transform-runtime":"^7.17.0","babel-plugin-add-module-exports":"^1.0.4","@babel/plugin-proposal-json-strings":"^7.16.7","@babel/plugin-transform-strict-mode":"^7.16.7"},"peerDependencies":{"react":"^16.14.0 || ^17.0.1","react-redux":"^7.2.1","@babel/runtime":"^7.12.5","local-storage-adapter":"^2.0.0"},"_npmOperationalInternal":{"tmp":"tmp/nebenan-redux-tools_6.1.0_1663676591811_0.5405445502367328","host":"s3://npm-registry-packages"}},"6.2.0-beta.3":{"name":"nebenan-redux-tools","version":"6.2.0-beta.3","author":{"name":"Nebenan.de","email":"max@nebenan.de"},"license":"SEE LICENSE IN LICENSE FILE","_id":"nebenan-redux-tools@6.2.0-beta.3","maintainers":[{"name":"rejas","email":"npm@veeck.de"},{"name":"zeitwidrig","email":"npm@zeitwidrig.de"},{"name":"iamuchejude","email":"iamuchejude@gmail.com"},{"name":"eliasbraun","email":"elias.braun@nebenan.de"},{"name":"peterhassler","email":"peter.h@nebenan.de"},{"name":"ozerovs","email":"ozerovsa@gmail.com"},{"name":"suprmax","email":"max@degterev.me"}],"homepage":"https://nebenan.de/","bugs":{"url":"https://github.com/good-hood-gmbh/nebenan-redux-tools/issues"},"dist":{"shasum":"d8d2c47d9f49bda79911e6e581d9b22084ddfbd9","tarball":"https://registry.npmjs.org/nebenan-redux-tools/-/nebenan-redux-tools-6.2.0-beta.3.tgz","fileCount":26,"integrity":"sha512-X8dSafAH3scXo7WwbiOxTaWf55HgblD6zDmv19GuMeiFK3rBNpvWwUfiZu55vqPC2cpuhrKhZmmwdYbRpZpTkA==","signatures":[{"sig":"MEYCIQCQbWcG0NQGSzph6gyxt+pOmmpkgIyRYC7RGlB06eD1ywIhAKjV/TZugSyFhkLSj2ofzc/zkAUv7O6D6jUtXllORXLK","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":46931,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjRu4RACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmr3+xAAnghPg47lqBPTaiG4sh/+yDDlc5VwKQGQFkfFdA5kN0QsYQ52\r\nSQ/ZxxfFMPb8ZAEAVzLJVnEEGOrWAc/xz0d6FLc4EHrOsOkTgyQ/qXhrIZ5R\r\na1dapE0oyYVBboErinGEipmPMkZUUA2tauRF4mONklPVHeMqXZzTOwKHC0Lw\r\nflrfpeLj3xhR7ySF83QuZ6xyxVcad8ai4bthRC516shTC/9++YSAgBrDollP\r\nJkHlRRmRY9WCtLILXXp5JvT8gkq76mfFKJsZuvkeDV/Y9/sE95ORIBoRyEHq\r\njZ10QvVYR5P0m8+k7vMtq5V0i4Zvd5Tvdfq25PyQjnZHTx8bbMO1A+k0jBnA\r\nbCNCzP9Lu6k5151cYVle8GXKnOKGp3sHJhReqmOhUwMv3LAZ3PrdP3cVJvOn\r\nfBUKAOMU71PrCCXhOxrxVtt87iHfOpKm/RGbS8NVXGv/qCrzLdxGq3s1OrIZ\r\nvNZvq5W0eTSIrIpm42Q9nw/+jsO129XJ9iQwbJLxwifazDtr5AHU6kmfSbd0\r\ncWnCygwbQDF+DMVNy0xsM8/eb4iwa/lutHCQFrv+Q2IE8bZ67OU85OB6mglB\r\nU+ROrnjDQrTZq5eFApoJh+dStr9pVDw1XmDVhABhCrFYKzNKRZ3CYfmAeFKz\r\nVd5krNEp3m7tEuQBvU5khSZERvfEMfy8Fg0=\r\n=aCkj\r\n-----END PGP SIGNATURE-----\r\n"},"readme":"nebenan-redux-tools\n====================\n\nA set of redux helpers.\n\n- [Experiments Middleware](#experiments-middleware)\n- [Token Middleware](#token-middleware)\n- [Promise Middleware](#promise-middleware)\n- [Network Middleware](#network-middleware)\n  - [Trustworthy Endpoints](#trustworthy-endpoints)\n  - [API Token](#api-token)\n  - [X-Translations-Lang Header](#x-translations-lang-header)\n  - [Should Request](#should-request)\n  - [Abort Callback](#abort-callback)\n  - [Request Types](#request-types)\n  - [Pagination](#pagination)\n  - [Mock Responses](#mock-response)\n  - [Standalone Request](#standalone-request)\n  - [Customize](#customize)\n  \n# Experiments Middleware\n## Setup\n\n**NOT COMPLETE**\n```js\nimport { reducer as experiments } from 'nebenan-redux-tools/lib/experiments/state';\n\nconst reducers = { \n  // It is assumed that the experiment reducer's state\n  // is available under `state.experiments`\n  experiments \n};\n\n// ...\n\nconst createFromState = (initialState) => (\n  createStore(\n    combineReducers(reducers),\n    initialState,\n    composeEnhancers(applyMiddleware(...middleware)),\n  )\n);\n\nexport default createFromState\n```\n\n# Token Middleware\n## Setup\n**NOT COMPLETE**\n```js\nimport { reducer as token } from 'nebenan-redux-tools/lib/token';\n\nconst reducers = {\n  // It is assumed that the experiment reducer's state\n  // is available under `state.token`\n  token\n};\n\n// ...\n\nconst createFromState = (initialState) => (\n  createStore(\n    combineReducers(reducers),\n    initialState,\n    composeEnhancers(applyMiddleware(...middleware)),\n  )\n);\n\nexport default createFromState\n```\n  \n# Promise Middleware\nThe promise middleware gets triggered by dispatching actions with `promise` in payload. The middleware will dispatch resolved or rejected actions when the promise is fulfilled.\n\n```js\ndispatch({\n  type: types.GET_USERS,\n  promise: getUsersFromStorageAsync()\n})\n```\n\n```js\n// reducer\nimport { resolved, rejected } from 'nebenan-redux-tools/lib/promise';\n\nexport default (state = getDefaultState(), action) => {\n  switch(action.type) {\n    case resolved(types.GET_USERS): {\n      const usersFromStorage = action.payload;\n\n      return { ...state, users: usersFromStorage };\n    }\n\n    case rejected(types.GET_USERS): {\n      const usersFromStorage = [];\n\n      return { ...state, users: usersFromStorage };\n    }\n\n    default: {\n      return state;\n    }\n  }\n} \n```\n\n# Network Middleware\n\nThe network middleware gets triggered by dispatching actions with `request` in payload. The middleware will fire the request and dispatches resolved or rejected actions when the request is finished.\n\nExample:\n\n```js\ndispatch({\n  type: types.GET_USERS,\n  request: {\n    url: \"/users\"\n  }\n})\n```\n\n```js\nimport { resolved, rejected } from 'nebenan-redux-tools/lib/network/types';\n\nexport default (state = getDefaultState(), action) => {\n  switch(action.type) {\n    case resolved(types.GET_USERS): {\n      const usersFromResponse = action.payload;\n      \n      return { ...state, users: usersFromResponse };\n    }\n    \n    case rejected(types.GET_USERS): {\n      const usersFromResponse = [];\n      \n      return { ...state, users: usersFromResponse };\n    }\n    \n    default: {\n      return state;\n    }\n  }\n} \n```\n\n## Trustworthy Endpoints\n\nRequests to trustworthy endpoints will enable the [X-Translations-Lang Header](#x-translations-lang-header) and [API Token](#api-token) features.\n\nSet trusted domain via global config:\n```js\nimport { configureNetwork } from 'nebenan-redux-tools/lib/network';\n\nconfigureNetwork({\n  trustedDomain: \"nebenan.de\",\n  ...otherSettings\n})\n```\n\n## API Token\n\nRequests to [trustworthy endpoints](#trustworthy-endpoints) will have the `X-AUTH-TOKEN` header set, containing the api token configured in request options or through token middleware. \n\nDefault: `state.token` (see token middleware)\n\nOverwrite:\n```js\ndispatch({\n  type: \"some-type\", \n  request: {\n    url: \"/some/endpoint\",\n    token: \"special-api-token\"\n  }\n})\n```\n\n## X-Translations-Lang Header\n\nRequests to [trustworthy endpoints](#trustworthy-endpoints) will have the `X-Translations-Lang` header set, containing the locale configured in request options or through global config.\n\nDefault via global config: \n```js\nimport { configureNetwork } from 'nebenan-redux-tools/lib/network';\n\nconfigureNetwork({\n  locale: 'de-DE',\n  ...otherSettings\n})\n```\n\nOverwrite:\n```js\ndispatch({\n  type: \"some-type\",\n  request: {\n    url: \"/some/endpoint\",\n    locale: \"en-US\"  \n  }\n})\n```\n\n## Should Request\n\nPrevents unnecessary requests by checking state beforehand. \n\n```js\ndispatch({\n  type: \"some-type\",\n  request: {\n    url: \"/some/endpoint\",\n    shouldRequest(state) {\n     return !state.isFetched;\n    }\n  }\n})\n```\n\n## Abort Callback\n\nAllows to cancel running requests. You receive the cancel function by providing `getAbortCallback` in request options.\n\n```js\nlet cancelRequest;\n\ndispatch({\n  type: \"some-type\",\n  request: {\n    url: \"/some/endpoint\",\n    getAbortCallback: (callback) => {\n      cancelRequest = callback;\n    }\n  }\n})\n\n\n// later in app\ncancelRequest();\n\n```\n\n## Request Types\n\n`request.type` determines used HTTP method\n\n### `query`\n\nSends out GET request. Collects parameters from `request.query` and applies [pagination](#pagination) query options if there are any.\n\n```js\ndispatch({\n  type: \"some-type\",\n  request: {\n     url: \"/users\",\n     type: 'query',\n     query: { q: 'Peter' } \n  }\n})\n```\n\n\n### `delete` / `post` / `put`\n\n```js\ndispatch({\n  type: \"some-type\",\n  request: {\n    url: \"/some/endpoint/123\",\n    type: 'put',\n    payload: { user: { email, password }}\n  }  \n})\n```\n\n\n## Pagination\n\nThere is some boilerplate needed to fully support paginated lists loaded over the network. These helpers help with managing state and sending pagination params over the network.\n\nThe endpoint you are accessing needs to fulfill following requirements:\n- Parameters\n  - `per_page`\n  - `lower` / `higher`\n- Response\n  - `total_count` (`state.total` needs to be updated manually if field does not exist)\n\n### `assignPaginationDefaults` / `paginationGenerator` helpers\n\n```js\nimport { paginationGenerator, assignPaginationDefaults } from 'nebenan-redux-tools/lib/network/pagination';\n\nconst getDefaultState = () => assignPaginationDefaults({ entities: {} });\nconst getPaginationUpdates = paginationGenerator(types.BOOKMARKS_FETCH);\n\nexport const reducer = (state = getDefaultState(), action) => {\n  let newState = state;\n  \n  const update = getPaginationUpdates(newState, action);\n  if (update) newState = updeep(update, newState);\n  \n  switch (action.type) {\n    case resolved(types.BOOKMARKS_FETCH): {\n      const { result, entities } = parse(action.payload);\n\n      const collection = newState.collection.concat(result.bookmarks);\n\n      return updeep({ collection, entities }, newState);\n    }\n    \n    default: {\n      return newState;\n    }\n  }\n}\n```\n\nThe state now holds the following information\n```js\n{\n  // (managed by paginationGenerator)\n  currentPage: 0, \n  // datetime of last fetch (managed by paginationGenerator)\n  lastFetched: 0,\n  // request in progress (managed by paginationGenerator)\n  isFetching: false,\n  // request failed (managed by paginationGenerator) \n  isFailed: false,  \n  // total amount of items over all pages (managed by paginationGenerator)\n  total: null,\n  // item ids for current page  \n  collection: [],\n}\n```\n\n### Actions\n\nPagination query params will be added for `query` requests with either `request.pagination.first` or `request.pagination.last` set.\n\n*Only works for endpoints supporting `lower`/`higher` params.*\n\n```js\ndispatch({\n  type: types.GET_USERS,\n  request: {\n    url: \"/users\",\n    type: 'query',\n    pagination: {\n      per_page: 10, // optional\n      first: firstUserId, // optional\n      last: lastUserId // optional\n    }\n  }\n})\n```\n\n## Mock Response\n\nResponses can be mocked by using the [promise middleware](#promise-middleware). You can keep all of your request options in the action and don't need to modify reducers. Quite useful during development if you are waiting for backend to support new endpoints.\n\n\n```js\ndispatch({\n  type: types.GET_USERS,\n  promise: Promise.resolve([\n    {\n      id: 1,\n      name: \"Peter\"\n    },\n    {\n      id: 2,\n      name: \"Christina\"\n    }\n  ]),\n  request: {\n    url: \"/users\",\n    type: 'query'\n  }\n})\n```\n\n```js\n// reducer\nimport { resolved } from 'nebenan-redux-tools/lib/network/types';\n\nexport default (state = getDefaultState(), action) => {\n  switch(action.type) {\n    case resolved(types.GET_USERS): {\n      const usersFromResponse = action.payload;\n      \n      return { ...state, users: usersFromResponse };\n    }\n    \n    default: {\n      return state;\n    }\n  }\n} \n```\n\n## Standalone Request\n\nRequests can be created programmatically too.\n\n```js\nimport { createRequest } from 'nebenan-redux-tools/lib/network';\n\nconst sendFile = (file, token) => (\n  createRequest({\n    token,\n    payload: { file },\n    url: '/file-upload',\n    type: 'post',\n    multipart: true,\n  }) \n)\n\nconst handleSuccess = (payload) => {\n  // same as action.payload\n  console.log(payload);\n}\n\nsendFile(newFile, token).then(handleSuccess);\n```\n\n## Customize\n\nThe network layer uses [axios](https://github.com/axios/axios) under the hood. To access axios specific features or extend functionality you can hook into request / response generation on a global or local scale.\n\nHooks:\n- `requestHook(requestConfig, requestOptions)`\n  - `requestConfig` the [axios request config](https://github.com/axios/axios#request-config) to be mutated\n  - `requestOptions` the `request` object provided inside the action\n- `responseHook(body, requestConfig, requestOptions)`\n  - `body` response data to be mutated\n  - `requestConfig` the [axios request config](https://github.com/axios/axios#request-config)\n  - `requestOptions` the `request` object provided inside the action\n  \n### Setup global hooks\n\n```js\nimport { configureNetwork } from 'nebenan-redux-tools/lib/network';\n\nconfigureNetwork({\n  requestHook: (requestConfig, requestOptions) => {\n    // ...\n  },\n  responseHook: (body, requestConfig, requestOptions) => {\n    // ...\n  },\n  ...networkSettings\n})\n```\n\n### Action level request hook\n\n```js\nimport { createRequest } from 'nebenan-redux-tools/lib/network';\n\nconst sendFile = (file, token, onProgress) => (\n  createRequest({\n    token,\n    payload: { file },\n    url: '/file-upload',\n    type: 'post',\n    multipart: true,\n    // same as requestHook\n    customize: (requestConfig) => {\n      requestConfig.onUploadProgress = onProgress;\n    }\n  })\n)\n```\n\n","gitHead":"c94bd9106c40702c0c7213d54a587d7649763591","scripts":{"lint":"eslint --ext .es,.js ./","test":"npm run compile && TZ='GMT' mocha \"test/**/*.js\"","build":"npm run compile","check":"npm test && npm run lint && echo \"\\033[0;32mReady to publish\\033[0m\"","clean":"rm -rf ./lib/ || exit 1","compile":"NODE_ENV=production babel src --out-dir lib --copy-files","reinstall":"rm -rf node_modules package-lock.json && npm install","lint:tofile":"eslint --ext .es,.js --no-color -o ./eslint-report.log ./","test:tofile":"npm run compile && TZ='GMT' mocha --no-colors -R spec \"test/**/*.js\" 2>&1 | tee test-report.log","prepublishOnly":"npm run check && npm run clean && npm run build"},"_npmUser":{"name":"peterhassler","email":"peter.h@nebenan.de"},"deprecated":"Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.","repository":{"url":"git+https://github.com/good-hood-gmbh/nebenan-redux-tools.git","type":"git"},"_npmVersion":"8.15.0","description":"A set of redux helpers","directories":{},"_nodeVersion":"16.17.0","dependencies":{"qs":"^6.10.3","axios":"^0.21.0","lodash":"^4.17.21","updeep":"^1.2.1","js-cookie":"^3.0.1","escape-string-regexp-browser":"^1.1.0"},"_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"chai":"^4.3.6","mocha":"^9.2.0","react":"^17.0.2","redux":"^4.1.2","sinon":"^13.0.1","eslint":"^8.8.0","react-dom":"^17.0.2","@babel/cli":"^7.17.0","proxyquire":"^2.1.3","@babel/core":"^7.17.0","react-redux":"^7.2.6","@babel/runtime":"^7.12.5","@babel/preset-env":"^7.16.11","local-storage-adapter":"^2.0.0","eslint-config-nebenan-base":"^2.0.1","browserslist-config-nebenan":"^1.0.0","@babel/plugin-transform-runtime":"^7.17.0","babel-plugin-add-module-exports":"^1.0.4","@babel/plugin-proposal-json-strings":"^7.16.7","@babel/plugin-transform-strict-mode":"^7.16.7"},"peerDependencies":{"react":"^16.14.0 || ^17.0.1","react-redux":"^7.2.1","@babel/runtime":"^7.12.5","local-storage-adapter":"^2.0.0"},"_npmOperationalInternal":{"tmp":"tmp/nebenan-redux-tools_6.2.0-beta.3_1665592849425_0.879822979795589","host":"s3://npm-registry-packages"}},"6.2.0":{"name":"nebenan-redux-tools","version":"6.2.0","author":{"name":"Nebenan.de","email":"max@nebenan.de"},"license":"SEE LICENSE IN LICENSE FILE","_id":"nebenan-redux-tools@6.2.0","maintainers":[{"name":"rejas","email":"npm@veeck.de"},{"name":"zeitwidrig","email":"npm@zeitwidrig.de"},{"name":"iamuchejude","email":"iamuchejude@gmail.com"},{"name":"eliasbraun","email":"elias.braun@nebenan.de"},{"name":"peterhassler","email":"peter.h@nebenan.de"},{"name":"ozerovs","email":"ozerovsa@gmail.com"},{"name":"suprmax","email":"max@degterev.me"}],"homepage":"https://nebenan.de/","bugs":{"url":"https://github.com/good-hood-gmbh/nebenan-redux-tools/issues"},"dist":{"shasum":"740f4dc2e8552082f032eb260fceeee7f41c2b67","tarball":"https://registry.npmjs.org/nebenan-redux-tools/-/nebenan-redux-tools-6.2.0.tgz","fileCount":26,"integrity":"sha512-CZrgtZkxYc3Abxr4R/L1k9Dq4U97xrvjUryI1+Gm+8Y8OA2Y+umvtWei73R57rcZFO1eCXI6msbMlh3QzdOArg==","signatures":[{"sig":"MEUCIQCTqeEeAiWqYTjcmbfBMguoXLSJwJfcnFHqhrviwYn6+gIgKkes9+p1vOZ5zodY5B3Y4HCW7wz15n1QDtTYvqEvnks=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":47157,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjR+P+ACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmo2ahAAmwMHfjC1k+SXA/TAjq3dp2EFmJEbuO32iBBAHWvQiGB5MP+m\r\nnoqc4+BdiCHcm5KmrIBsCpxinQHcPAtU4s9HynZ0YG5aQnC0EtNcPjCiB9U8\r\nnLCmawcwcozLClUYvHG2nZH/4kRDVzSkirv5wb5eJnLDrtKoHf7o4KaS2Uvx\r\nmHjeeJG5N6Nq1s2BRbB5G+YF4vXocB+9/F2ChRYudYv7jOAtoD5laFibeVgl\r\n4jJ5mSHpNAx2qQ1cpx22sqmRxR7smpZehWfCr+1o1NOthSvcHwIO9hRpZBGk\r\nijsF4g3pE9Nqvw1rHo7VdXl+1csjO19ceY+tSyVAnVs26kQR9DWGVyBukezp\r\n9m76HERzvBlYALwMLie8U44pwVnngVFa+anP4b5ORtgKW5h9AFmTAj7m2OzN\r\nKZ0SRLQiRLTk+AKQx/fYSb7eB7vhr8EAMAIhIVgq9bta+v1K20a/AX6UILbc\r\nhCpPxHBoa2jQEdPdi+OGqBbFCWI9O2jGPJlORb1gcrwq/a3iH4WH5lWdVOVj\r\nnBprVSNkaRGKTOKEAyQkj5hr/derF1swEwgbbTNmeWAJlg1kklYvYksjSX0n\r\neUcMObF4VtHTJY6jG38ypQlBrlWF/9u4ENGY0G5lphPug6gUensMkbhrjKuG\r\nWkV3+1z3oP8zNtELRu9gisNL415z5bcbjGg=\r\n=GDrR\r\n-----END PGP SIGNATURE-----\r\n"},"gitHead":"4fda2979d5a50b4c1044a3f1c4fe3ff2705c3aa1","scripts":{"lint":"eslint --ext .es,.js ./","test":"npm run compile && TZ='GMT' mocha \"test/**/*.js\"","build":"npm run compile","check":"npm test && npm run lint && echo \"\\033[0;32mReady to publish\\033[0m\"","clean":"rm -rf ./lib/ || exit 1","compile":"NODE_ENV=production babel src --out-dir lib --copy-files","reinstall":"rm -rf node_modules package-lock.json && npm install","lint:tofile":"eslint --ext .es,.js --no-color -o ./eslint-report.log ./","test:tofile":"npm run compile && TZ='GMT' mocha --no-colors -R spec \"test/**/*.js\" 2>&1 | tee test-report.log","prepublishOnly":"npm run check && npm run clean && npm run build"},"_npmUser":{"name":"peterhassler","email":"peter.h@nebenan.de"},"deprecated":"Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.","repository":{"url":"git+https://github.com/good-hood-gmbh/nebenan-redux-tools.git","type":"git"},"_npmVersion":"8.15.0","description":"A set of redux helpers","directories":{},"_nodeVersion":"16.17.0","dependencies":{"qs":"^6.10.3","axios":"^0.21.0","lodash":"^4.17.21","updeep":"^1.2.1","js-cookie":"^3.0.1","escape-string-regexp-browser":"^1.1.0"},"_hasShrinkwrap":false,"devDependencies":{"chai":"^4.3.6","mocha":"^9.2.0","react":"^17.0.2","redux":"^4.1.2","sinon":"^13.0.1","eslint":"^8.8.0","react-dom":"^17.0.2","@babel/cli":"^7.17.0","proxyquire":"^2.1.3","@babel/core":"^7.17.0","react-redux":"^7.2.6","@babel/runtime":"^7.12.5","@babel/preset-env":"^7.16.11","local-storage-adapter":"^2.0.0","eslint-config-nebenan-base":"^2.0.1","browserslist-config-nebenan":"^1.0.0","@babel/plugin-transform-runtime":"^7.17.0","babel-plugin-add-module-exports":"^1.0.4","@babel/plugin-proposal-json-strings":"^7.16.7","@babel/plugin-transform-strict-mode":"^7.16.7"},"peerDependencies":{"react":"^16.14.0 || ^17.0.1","react-redux":"^7.2.1","@babel/runtime":"^7.12.5","local-storage-adapter":"^2.0.0"},"_npmOperationalInternal":{"tmp":"tmp/nebenan-redux-tools_6.2.0_1665655806124_0.46660035559500135","host":"s3://npm-registry-packages"}},"6.3.0-beta.0":{"name":"nebenan-redux-tools","version":"6.3.0-beta.0","author":{"name":"Nebenan.de","email":"max@nebenan.de"},"license":"SEE LICENSE IN LICENSE FILE","_id":"nebenan-redux-tools@6.3.0-beta.0","maintainers":[{"name":"rejas","email":"npm@veeck.de"},{"name":"iamuchejude","email":"iamuchejude@gmail.com"},{"name":"eliasbraun","email":"elias.braun@nebenan.de"},{"name":"peterhassler","email":"peter.h@nebenan.de"},{"name":"ozerovs","email":"ozerovsa@gmail.com"},{"name":"suprmax","email":"max@degterev.me"}],"homepage":"https://nebenan.de/","bugs":{"url":"https://github.com/good-hood-gmbh/nebenan-redux-tools/issues"},"dist":{"shasum":"2be457d0723ef782dd8dbc05a93db9ea9675037d","tarball":"https://registry.npmjs.org/nebenan-redux-tools/-/nebenan-redux-tools-6.3.0-beta.0.tgz","fileCount":26,"integrity":"sha512-5AGPBTrv7V6OuaZsq0mZ9lUST3R7ZDMzbVnPCRyUDpB6aPoXeu36rRp94G9ytzPfdgYvmTLBWpKRuQOWQWtiAQ==","signatures":[{"sig":"MEUCICPNlgWDZkABx2Pld3RXn7pit0XkrT+Fq7d/uZrIVXPDAiEA/tZi3N4BAfvADIcYFnOAViVxxiXllJBPr0/+hz027EE=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":47368,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjTW+2ACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmo7eA/+Nte2FNq9sednbtiMhGMmA4J2GB5qvo76uHXXlsPT0FKqWdq4\r\nM/5EflnuU4jEAnP4cH0BJ6OZkNgUHiLSl1Ql7bc7JLB6LiGRHc9UiDocHQl8\r\nfmXbkM3O2qwVGpdWz4SeTuXQTCAHXfYgs2hS9JOa+fxbuvD8HFRLfrTlPtWW\r\ngoyLTBY6D3Ltu679Mo9xK9Jkk9dr+HXm17JgerC8fPvkPBbEN1fHrlgsl598\r\nN2EOV9Wb6WKHc52qE6jK4dGz9hRTUTBrmHIQKY+sUu++BwSN705O8LW3wJoH\r\nlZbzHcELZ6/ywvUPnWKyQiGUJcl0AloS1rVUEkPOl8NPc/rav2fcbJHNT3un\r\n8GoLHMOnXtRhKS24ruqK7Jpb4xf9efNgyz7MWWYP+fiNguumObITvJc+nVuM\r\nbqNoYEGv9ixvfYRgfJKLl2pBRef+f0sxOE+zI4KEJXio0J2RkTHS6RJFNgW+\r\nxgzmiAT9GvwhzTdkGvMFYjlUewsglbH8ChN+C7Mc38zcak9DObkVSWHdhAtV\r\nk0AR0VaFXtoY1d8Qf2mtZ9zKdNwg5mYKPwSk7QepZAfy1BTqWuzK0/6Itwz8\r\nQzTguz2//8G/1m7vIXwWv0udA5nWX2gZnUFi0XdBa4yRzaHytey3Ff4Wk2vl\r\nyCQAlzIe+AYnoI+g2/l8xd02/7p5DGb55sA=\r\n=VOZL\r\n-----END PGP SIGNATURE-----\r\n"},"readme":"nebenan-redux-tools\n====================\n\nA set of redux helpers.\n\n- [Experiments Middleware](#experiments-middleware)\n- [Token Middleware](#token-middleware)\n- [Promise Middleware](#promise-middleware)\n- [Network Middleware](#network-middleware)\n  - [Trustworthy Endpoints](#trustworthy-endpoints)\n  - [API Token](#api-token)\n  - [X-Translations-Lang Header](#x-translations-lang-header)\n  - [Should Request](#should-request)\n  - [Abort Callback](#abort-callback)\n  - [Request Types](#request-types)\n  - [Pagination](#pagination)\n  - [Mock Responses](#mock-response)\n  - [Standalone Request](#standalone-request)\n  - [Customize](#customize)\n  \n# Experiments Middleware\n## Setup\n\n**NOT COMPLETE**\n```js\nimport { reducer as experiments } from 'nebenan-redux-tools/lib/experiments/state';\n\nconst reducers = { \n  // It is assumed that the experiment reducer's state\n  // is available under `state.experiments`\n  experiments \n};\n\n// ...\n\nconst createFromState = (initialState) => (\n  createStore(\n    combineReducers(reducers),\n    initialState,\n    composeEnhancers(applyMiddleware(...middleware)),\n  )\n);\n\nexport default createFromState\n```\n\n# Token Middleware\n## Setup\n**NOT COMPLETE**\n```js\nimport { reducer as token } from 'nebenan-redux-tools/lib/token';\n\nconst reducers = {\n  // It is assumed that the experiment reducer's state\n  // is available under `state.token`\n  token\n};\n\n// ...\n\nconst createFromState = (initialState) => (\n  createStore(\n    combineReducers(reducers),\n    initialState,\n    composeEnhancers(applyMiddleware(...middleware)),\n  )\n);\n\nexport default createFromState\n```\n  \n# Promise Middleware\nThe promise middleware gets triggered by dispatching actions with `promise` in payload. The middleware will dispatch resolved or rejected actions when the promise is fulfilled.\n\n```js\ndispatch({\n  type: types.GET_USERS,\n  promise: getUsersFromStorageAsync()\n})\n```\n\n```js\n// reducer\nimport { resolved, rejected } from 'nebenan-redux-tools/lib/promise';\n\nexport default (state = getDefaultState(), action) => {\n  switch(action.type) {\n    case resolved(types.GET_USERS): {\n      const usersFromStorage = action.payload;\n\n      return { ...state, users: usersFromStorage };\n    }\n\n    case rejected(types.GET_USERS): {\n      const usersFromStorage = [];\n\n      return { ...state, users: usersFromStorage };\n    }\n\n    default: {\n      return state;\n    }\n  }\n} \n```\n\n# Network Middleware\n\nThe network middleware gets triggered by dispatching actions with `request` in payload. The middleware will fire the request and dispatches resolved or rejected actions when the request is finished.\n\nExample:\n\n```js\ndispatch({\n  type: types.GET_USERS,\n  request: {\n    url: \"/users\"\n  }\n})\n```\n\n```js\nimport { resolved, rejected } from 'nebenan-redux-tools/lib/network/types';\n\nexport default (state = getDefaultState(), action) => {\n  switch(action.type) {\n    case resolved(types.GET_USERS): {\n      const usersFromResponse = action.payload;\n      \n      return { ...state, users: usersFromResponse };\n    }\n    \n    case rejected(types.GET_USERS): {\n      const usersFromResponse = [];\n      \n      return { ...state, users: usersFromResponse };\n    }\n    \n    default: {\n      return state;\n    }\n  }\n} \n```\n\n## Trustworthy Endpoints\n\nRequests to trustworthy endpoints will enable the [X-Translations-Lang Header](#x-translations-lang-header) and [API Token](#api-token) features.\n\nSet trusted domain via global config:\n```js\nimport { configureNetwork } from 'nebenan-redux-tools/lib/network';\n\nconfigureNetwork({\n  trustedDomain: \"nebenan.de\",\n  ...otherSettings\n})\n```\n\n## API Token\n\nRequests to [trustworthy endpoints](#trustworthy-endpoints) will have the `X-AUTH-TOKEN` header set, containing the api token configured in request options or through token middleware. \n\nDefault: `state.token` (see token middleware)\n\nOverwrite:\n```js\ndispatch({\n  type: \"some-type\", \n  request: {\n    url: \"/some/endpoint\",\n    token: \"special-api-token\"\n  }\n})\n```\n\n## X-Translations-Lang Header\n\nRequests to [trustworthy endpoints](#trustworthy-endpoints) will have the `X-Translations-Lang` header set, containing the locale configured in request options or through global config.\n\nDefault via global config: \n```js\nimport { configureNetwork } from 'nebenan-redux-tools/lib/network';\n\nconfigureNetwork({\n  locale: 'de-DE',\n  ...otherSettings\n})\n```\n\nOverwrite:\n```js\ndispatch({\n  type: \"some-type\",\n  request: {\n    url: \"/some/endpoint\",\n    locale: \"en-US\"  \n  }\n})\n```\n\n## Should Request\n\nPrevents unnecessary requests by checking state beforehand. \n\n```js\ndispatch({\n  type: \"some-type\",\n  request: {\n    url: \"/some/endpoint\",\n    shouldRequest(state) {\n     return !state.isFetched;\n    }\n  }\n})\n```\n\n## Aborting\n\nAllows to cancel running requests. Just pass in a [AbortSignal](https://developer.mozilla.org/en-US/docs/Web/API/AbortSignal).\n\n```js\nconst controller = new AbortController();\n\ndispatch({\n  type: \"some-type\",\n  request: {\n    url: \"/some/endpoint\",\n    signal: controller.signal,\n  }\n})\n\n\n// later in app\ncontroller.abort();\n\n```\n\n## Request Types\n\n`request.type` determines used HTTP method\n\n### `query`\n\nSends out GET request. Collects parameters from `request.query` and applies [pagination](#pagination) query options if there are any.\n\n```js\ndispatch({\n  type: \"some-type\",\n  request: {\n     url: \"/users\",\n     type: 'query',\n     query: { q: 'Peter' } \n  }\n})\n```\n\n\n### `delete` / `post` / `put`\n\n```js\ndispatch({\n  type: \"some-type\",\n  request: {\n    url: \"/some/endpoint/123\",\n    type: 'put',\n    payload: { user: { email, password }}\n  }  \n})\n```\n\n\n## Pagination\n\nThere is some boilerplate needed to fully support paginated lists loaded over the network. These helpers help with managing state and sending pagination params over the network.\n\nThe endpoint you are accessing needs to fulfill following requirements:\n- Parameters\n  - `per_page`\n  - `lower` / `higher`\n- Response\n  - `total_count` (`state.total` needs to be updated manually if field does not exist)\n\n### `assignPaginationDefaults` / `paginationGenerator` helpers\n\n```js\nimport { paginationGenerator, assignPaginationDefaults } from 'nebenan-redux-tools/lib/network/pagination';\n\nconst getDefaultState = () => assignPaginationDefaults({ entities: {} });\nconst getPaginationUpdates = paginationGenerator(types.BOOKMARKS_FETCH);\n\nexport const reducer = (state = getDefaultState(), action) => {\n  let newState = state;\n  \n  const update = getPaginationUpdates(newState, action);\n  if (update) newState = updeep(update, newState);\n  \n  switch (action.type) {\n    case resolved(types.BOOKMARKS_FETCH): {\n      const { result, entities } = parse(action.payload);\n\n      const collection = newState.collection.concat(result.bookmarks);\n\n      return updeep({ collection, entities }, newState);\n    }\n    \n    default: {\n      return newState;\n    }\n  }\n}\n```\n\nThe state now holds the following information\n```js\n{\n  // (managed by paginationGenerator)\n  currentPage: 0, \n  // datetime of last fetch (managed by paginationGenerator)\n  lastFetched: 0,\n  // request in progress (managed by paginationGenerator)\n  isFetching: false,\n  // request failed (managed by paginationGenerator) \n  isFailed: false,  \n  // total amount of items over all pages (managed by paginationGenerator)\n  total: null,\n  // item ids for current page  \n  collection: [],\n}\n```\n\n### Actions\n\nPagination query params will be added for `query` requests with either `request.pagination.first` or `request.pagination.last` set.\n\n*Only works for endpoints supporting `lower`/`higher` params.*\n\n```js\ndispatch({\n  type: types.GET_USERS,\n  request: {\n    url: \"/users\",\n    type: 'query',\n    pagination: {\n      per_page: 10, // optional\n      first: firstUserId, // optional\n      last: lastUserId // optional\n    }\n  }\n})\n```\n\n## Mock Response\n\nResponses can be mocked by using the [promise middleware](#promise-middleware). You can keep all of your request options in the action and don't need to modify reducers. Quite useful during development if you are waiting for backend to support new endpoints.\n\n\n```js\ndispatch({\n  type: types.GET_USERS,\n  promise: Promise.resolve([\n    {\n      id: 1,\n      name: \"Peter\"\n    },\n    {\n      id: 2,\n      name: \"Christina\"\n    }\n  ]),\n  request: {\n    url: \"/users\",\n    type: 'query'\n  }\n})\n```\n\n```js\n// reducer\nimport { resolved } from 'nebenan-redux-tools/lib/network/types';\n\nexport default (state = getDefaultState(), action) => {\n  switch(action.type) {\n    case resolved(types.GET_USERS): {\n      const usersFromResponse = action.payload;\n      \n      return { ...state, users: usersFromResponse };\n    }\n    \n    default: {\n      return state;\n    }\n  }\n} \n```\n\n## Standalone Request\n\nRequests can be created programmatically too.\n\n```js\nimport { createRequest } from 'nebenan-redux-tools/lib/network';\n\nconst sendFile = (file, token) => (\n  createRequest({\n    token,\n    payload: { file },\n    url: '/file-upload',\n    type: 'post',\n    multipart: true,\n  }) \n)\n\nconst handleSuccess = (payload) => {\n  // same as action.payload\n  console.log(payload);\n}\n\nsendFile(newFile, token).then(handleSuccess);\n```\n\n## Customize\n\nThe network layer uses [axios](https://github.com/axios/axios) under the hood. To access axios specific features or extend functionality you can hook into request / response generation on a global or local scale.\n\nHooks:\n- `requestHook(requestConfig, requestOptions)`\n  - `requestConfig` the [axios request config](https://github.com/axios/axios#request-config) to be mutated\n  - `requestOptions` the `request` object provided inside the action\n- `responseHook(body, requestConfig, requestOptions)`\n  - `body` response data to be mutated\n  - `requestConfig` the [axios request config](https://github.com/axios/axios#request-config)\n  - `requestOptions` the `request` object provided inside the action\n  \n### Setup global hooks\n\n```js\nimport { configureNetwork } from 'nebenan-redux-tools/lib/network';\n\nconfigureNetwork({\n  requestHook: (requestConfig, requestOptions) => {\n    // ...\n  },\n  responseHook: (body, requestConfig, requestOptions) => {\n    // ...\n  },\n  ...networkSettings\n})\n```\n\n### Action level request hook\n\n```js\nimport { createRequest } from 'nebenan-redux-tools/lib/network';\n\nconst sendFile = (file, token, onProgress) => (\n  createRequest({\n    token,\n    payload: { file },\n    url: '/file-upload',\n    type: 'post',\n    multipart: true,\n    // same as requestHook\n    customize: (requestConfig) => {\n      requestConfig.onUploadProgress = onProgress;\n    }\n  })\n)\n```\n\n","gitHead":"b25790c54349c142c0a72c29e0c4b42ec1a67f72","scripts":{"lint":"eslint --ext .es,.js ./","test":"npm run compile && TZ='GMT' mocha \"test/**/*.js\"","build":"npm run compile","check":"npm test && npm run lint && echo \"\\033[0;32mReady to publish\\033[0m\"","clean":"rm -rf ./lib/ || exit 1","compile":"NODE_ENV=production babel src --out-dir lib --copy-files","reinstall":"rm -rf node_modules package-lock.json && npm install","lint:tofile":"eslint --ext .es,.js --no-color -o ./eslint-report.log ./","test:tofile":"npm run compile && TZ='GMT' mocha --no-colors -R spec \"test/**/*.js\" 2>&1 | tee test-report.log","prepublishOnly":"npm run check && npm run clean && npm run build"},"_npmUser":{"name":"peterhassler","email":"peter.h@nebenan.de"},"deprecated":"Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.","repository":{"url":"git+https://github.com/good-hood-gmbh/nebenan-redux-tools.git","type":"git"},"_npmVersion":"8.15.0","description":"A set of redux helpers","directories":{},"_nodeVersion":"16.17.0","dependencies":{"qs":"^6.10.3","axios":"^0.22.0","lodash":"^4.17.21","updeep":"^1.2.1","js-cookie":"^3.0.1","escape-string-regexp-browser":"^1.1.0"},"_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"chai":"^4.3.6","mocha":"^9.2.0","react":"^17.0.2","redux":"^4.1.2","sinon":"^13.0.1","eslint":"^8.8.0","react-dom":"^17.0.2","@babel/cli":"^7.17.0","proxyquire":"^2.1.3","@babel/core":"^7.17.0","react-redux":"^7.2.6","@babel/runtime":"^7.12.5","@babel/preset-env":"^7.16.11","local-storage-adapter":"^2.0.0","eslint-config-nebenan-base":"^2.0.1","browserslist-config-nebenan":"^1.0.0","@babel/plugin-transform-runtime":"^7.17.0","babel-plugin-add-module-exports":"^1.0.4","@babel/plugin-proposal-json-strings":"^7.16.7","@babel/plugin-transform-strict-mode":"^7.16.7"},"peerDependencies":{"react":"^16.14.0 || ^17.0.1","react-redux":"^7.2.1","@babel/runtime":"^7.12.5","local-storage-adapter":"^2.0.0"},"_npmOperationalInternal":{"tmp":"tmp/nebenan-redux-tools_6.3.0-beta.0_1666019254427_0.5899143689289199","host":"s3://npm-registry-packages"}},"6.3.0":{"name":"nebenan-redux-tools","version":"6.3.0","author":{"name":"Nebenan.de","email":"max@nebenan.de"},"license":"SEE LICENSE IN LICENSE FILE","_id":"nebenan-redux-tools@6.3.0","maintainers":[{"name":"rejas","email":"npm@veeck.de"},{"name":"iamuchejude","email":"iamuchejude@gmail.com"},{"name":"eliasbraun","email":"elias.braun@nebenan.de"},{"name":"peterhassler","email":"peter.h@nebenan.de"},{"name":"ozerovs","email":"ozerovsa@gmail.com"},{"name":"suprmax","email":"max@degterev.me"}],"homepage":"https://nebenan.de/","bugs":{"url":"https://github.com/good-hood-gmbh/nebenan-redux-tools/issues"},"dist":{"shasum":"e63599db310e5157eceabf4562e93058705a9b06","tarball":"https://registry.npmjs.org/nebenan-redux-tools/-/nebenan-redux-tools-6.3.0.tgz","fileCount":26,"integrity":"sha512-4qSBkYmQ+Mx1FkdzQuYaXTpFoasrHJq+fX9PcesKdbfuFE1hCgeZym+z0Sppw7m698qa8ELGDLlw7YeZUzz/yw==","signatures":[{"sig":"MEYCIQDeMzc89DOhdniTBFS3h4DKxvK2OidMku6o+McQeHRsBwIhANJ3WypITHC1IGeVA5GA6B2GFN7sKS41N4sX3Lzt7Mss","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":46328,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjToSgACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmpvkg/9Fj/8ij1kue9pNBLHwt/rkqpXQpSbcnqUdbTtuaFhLZf92Yjt\r\np5tejxM8TwGd4LK4zXYMZtKEMW93FzQFZuCs+AnEUGqyiwQzifw+0vJ7HTNp\r\nk2dJVOf3zA5TN79EzEuBbrlbt7zTHOgf8mFyigjYnx61dHyxfaoTqHG1wdp4\r\nZcqmBEBdb7A9yz5LaBW7gse8PAJoLnbG05nHQCIbcvsLzHbi2Rmxnm4PZnpN\r\nF0CUnE3dV2+53r9giOm066G+WQ4c/XMiMFd9nkKnxAONaszJ86dvsZRg1qho\r\n/gQmJ8OCxlqIrdTYU0aD1QzTy24j/jRYDsAuH5HKz02K6SkxjnoolFPl8b4i\r\nueNJTzcgHDzVz/TyxLiEwFB9FPo/nwq5VjSJwnzJur6ccNdAggN+UJN9+xW8\r\nHzXR9YNnR8KwRom9oXTGjUg49WyvVpznWW3+zhckaboC5p8iW5Rl37dGX8df\r\nq54h2N7NGO6tDKQb57G4cUCE5pNAvoKTaQHhkAtiFVWCq2DHfFe7LT7VRUXb\r\nINSTccl5UbyIKVr9PZD5gUmmn97JlingOh14W1Sm4P47Ng0aJXxCTInJTZOa\r\npIHDWkbL56A9LKSU5RiGJnyAbXvolAWftFNNAYsh/VcuWtW4ChVYa21n92F4\r\n327tUgEbeBocY3HeIUO9bjG1C6PeMVUAYvs=\r\n=0Z7k\r\n-----END PGP SIGNATURE-----\r\n"},"gitHead":"b224e3d7bfcfdf41a3467953e87275b1292aff58","scripts":{"lint":"eslint --ext .es,.js ./","test":"npm run compile && TZ='GMT' mocha \"test/**/*.js\"","build":"npm run compile","check":"npm test && npm run lint && echo \"\\033[0;32mReady to publish\\033[0m\"","clean":"rm -rf ./lib/ || exit 1","compile":"NODE_ENV=production babel src --out-dir lib --copy-files","reinstall":"rm -rf node_modules package-lock.json && npm install","lint:tofile":"eslint --ext .es,.js --no-color -o ./eslint-report.log ./","test:tofile":"npm run compile && TZ='GMT' mocha --no-colors -R spec \"test/**/*.js\" 2>&1 | tee test-report.log","prepublishOnly":"npm run check && npm run clean && npm run build"},"_npmUser":{"name":"peterhassler","email":"peter.h@nebenan.de"},"deprecated":"Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.","repository":{"url":"git+https://github.com/good-hood-gmbh/nebenan-redux-tools.git","type":"git"},"_npmVersion":"8.15.0","description":"A set of redux helpers","directories":{},"_nodeVersion":"16.17.0","dependencies":{"qs":"^6.10.3","axios":"^0.22.0","lodash":"^4.17.21","updeep":"^1.2.1","js-cookie":"^3.0.1","escape-string-regexp-browser":"^1.1.0"},"_hasShrinkwrap":false,"devDependencies":{"chai":"^4.3.6","mocha":"^9.2.0","react":"^17.0.2","redux":"^4.1.2","sinon":"^13.0.1","eslint":"^8.8.0","react-dom":"^17.0.2","@babel/cli":"^7.17.0","proxyquire":"^2.1.3","@babel/core":"^7.17.0","react-redux":"^7.2.6","@babel/runtime":"^7.12.5","@babel/preset-env":"^7.16.11","local-storage-adapter":"^2.0.0","eslint-config-nebenan-base":"^2.0.1","browserslist-config-nebenan":"^1.0.0","@babel/plugin-transform-runtime":"^7.17.0","babel-plugin-add-module-exports":"^1.0.4","@babel/plugin-proposal-json-strings":"^7.16.7","@babel/plugin-transform-strict-mode":"^7.16.7"},"peerDependencies":{"react":"^16.14.0 || ^17.0.1","react-redux":"^7.2.1","@babel/runtime":"^7.12.5","local-storage-adapter":"^2.0.0"},"_npmOperationalInternal":{"tmp":"tmp/nebenan-redux-tools_6.3.0_1666090143970_0.069427800406898","host":"s3://npm-registry-packages"}},"6.4.0-beta.0":{"name":"nebenan-redux-tools","version":"6.4.0-beta.0","author":{"name":"Nebenan.de","email":"max@nebenan.de"},"license":"SEE LICENSE IN LICENSE FILE","_id":"nebenan-redux-tools@6.4.0-beta.0","maintainers":[{"name":"rejas","email":"npm@veeck.de"},{"name":"iamuchejude","email":"iamuchejude@gmail.com"},{"name":"eliasbraun","email":"elias.braun@nebenan.de"},{"name":"peterhassler","email":"peter.h@nebenan.de"},{"name":"ozerovs","email":"ozerovsa@gmail.com"},{"name":"suprmax","email":"max@degterev.me"}],"homepage":"https://nebenan.de/","bugs":{"url":"https://github.com/good-hood-gmbh/nebenan-redux-tools/issues"},"dist":{"shasum":"616c0149f816e336797f40952e3731039f3914ca","tarball":"https://registry.npmjs.org/nebenan-redux-tools/-/nebenan-redux-tools-6.4.0-beta.0.tgz","fileCount":26,"integrity":"sha512-hj0RGxDdaw89xdebQpRaxj3aDEv2pRJjkZvgP6kYeXQMl/6coK7qZu01jy7TqMT7XYBDEsJIAFUIHJCBG5aNfg==","signatures":[{"sig":"MEYCIQCCq+tjOu+VE/PgU23INiHjvU9TMYx5oC0bK/Cp4/y90gIhALyvm2XZnboSWd+aigQAmOMldYInmxi5YJUneaarnI43","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":46764,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjToU6ACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmrJfRAAgPdAoJS/LBfA8va8EnPPKBag3Gw1RSDqNuDNZoAG6Ize1aaZ\r\n/V3mFhz8p7hzgbk9bZgjRqqW83FbQX1ndKVOgM8ghI83T0t/+gydsLMVYP+I\r\nZMvyfAOJZcoGatUEvcc0rO5u44T85UPXYHkZLMVp8pHkBtrkJUccXnIpaFGH\r\n4uxkgPyenhGwJ5yWaNE6zXqapCg3UHI9VR0GXYm+91kAHiMfmLK8Nt04ug9g\r\nAwNZvB3Wd62oUs9qhTGjYCHc5IZ+IraWNVbD+FKB37WSiigqrCuzbSU5ge6x\r\nl3g5dRyDB3kEWS49CQbHFw84RCvt1iktjqNdsO1biVzG2HU7f5jzosTmZphh\r\n12cPo9cQ0ZBziM+I4bpgc7AFjjanP6GAGjs7ipcVL791kqvtXVfchMcMfQbz\r\ncnDSYppsC3vvLIr9RxjdFjJULDFqQfVLwk5jUQ3xF+6p0ILIo7kmJpNoQmLt\r\nqWaaXxkYcE3KzvCE/kyEtRW4bjp9OOfqyk3LfC8aTwyBlq/rbD77jY5gyYkv\r\nTNU3Ra+zWdLtIoS2j5Df8MmgHbaMqRboJOYjjxLmVpS0xLQ29oNKU6wEWrFs\r\nqtkLQv8l2pmUs5H4vT/5qpNEm/fn95w9p3amD+2/71lTZPt1EtyfePsAR+8i\r\n4/IxlVM0g1p3RhM1X4eU1XuukQP9lSBBTzM=\r\n=rNRs\r\n-----END PGP SIGNATURE-----\r\n"},"readme":"nebenan-redux-tools\n====================\n\nA set of redux helpers.\n\n- [Experiments Middleware](#experiments-middleware)\n- [Token Middleware](#token-middleware)\n- [Promise Middleware](#promise-middleware)\n- [Network Middleware](#network-middleware)\n  - [Trustworthy Endpoints](#trustworthy-endpoints)\n  - [API Token](#api-token)\n  - [X-Translations-Lang Header](#x-translations-lang-header)\n  - [Should Request](#should-request)\n  - [Abort Callback](#abort-callback)\n  - [Request Types](#request-types)\n  - [Pagination](#pagination)\n  - [Mock Responses](#mock-response)\n  - [Standalone Request](#standalone-request)\n  - [Customize](#customize)\n  \n# Experiments Middleware\n## Setup\n\n**NOT COMPLETE**\n```js\nimport { reducer as experiments } from 'nebenan-redux-tools/lib/experiments/state';\n\nconst reducers = { \n  // It is assumed that the experiment reducer's state\n  // is available under `state.experiments`\n  experiments \n};\n\n// ...\n\nconst createFromState = (initialState) => (\n  createStore(\n    combineReducers(reducers),\n    initialState,\n    composeEnhancers(applyMiddleware(...middleware)),\n  )\n);\n\nexport default createFromState\n```\n\n# Token Middleware\n## Setup\n**NOT COMPLETE**\n```js\nimport { reducer as token } from 'nebenan-redux-tools/lib/token';\n\nconst reducers = {\n  // It is assumed that the experiment reducer's state\n  // is available under `state.token`\n  token\n};\n\n// ...\n\nconst createFromState = (initialState) => (\n  createStore(\n    combineReducers(reducers),\n    initialState,\n    composeEnhancers(applyMiddleware(...middleware)),\n  )\n);\n\nexport default createFromState\n```\n  \n# Promise Middleware\nThe promise middleware gets triggered by dispatching actions with `promise` key in payload. The middleware will dispatch resolved or rejected actions when the promise is fulfilled.\n\n```js\ndispatch({\n  type: types.GET_USERS,\n  promise: {\n    getPromise: () => getUsersFromStorageAsync(),\n  }\n})\n```\n\n```js\n// reducer\nimport { resolved, rejected } from 'nebenan-redux-tools/lib/promise';\n\nexport default (state = getDefaultState(), action) => {\n  switch(action.type) {\n    case resolved(types.GET_USERS): {\n      const usersFromStorage = action.payload;\n\n      return { ...state, users: usersFromStorage };\n    }\n\n    case rejected(types.GET_USERS): {\n      const usersFromStorage = [];\n\n      return { ...state, users: usersFromStorage };\n    }\n\n    default: {\n      return state;\n    }\n  }\n} \n```\n\n\n## Should Execute\n\nPrevents unnecessary promise executions by checking state beforehand. Dispatches resolved action on prevented execution.\n\n```js\ndispatch({\n  type: types.GET_USERS,\n  promise: {\n    getPromise: () => getUsersFromStorageAsync(),\n    shouldExecute: (state) => !state.isFetched,\n  }\n})\n```\n\n# Network Middleware\n\nThe network middleware gets triggered by dispatching actions with `request` in payload. The middleware will fire the request and dispatches resolved or rejected actions when the request is finished.\n\nExample:\n\n```js\ndispatch({\n  type: types.GET_USERS,\n  request: {\n    url: \"/users\"\n  }\n})\n```\n\n```js\nimport { resolved, rejected } from 'nebenan-redux-tools/lib/network/types';\n\nexport default (state = getDefaultState(), action) => {\n  switch(action.type) {\n    case resolved(types.GET_USERS): {\n      const usersFromResponse = action.payload;\n      \n      return { ...state, users: usersFromResponse };\n    }\n    \n    case rejected(types.GET_USERS): {\n      const usersFromResponse = [];\n      \n      return { ...state, users: usersFromResponse };\n    }\n    \n    default: {\n      return state;\n    }\n  }\n} \n```\n\n## Trustworthy Endpoints\n\nRequests to trustworthy endpoints will enable the [X-Translations-Lang Header](#x-translations-lang-header) and [API Token](#api-token) features.\n\nSet trusted domain via global config:\n```js\nimport { configureNetwork } from 'nebenan-redux-tools/lib/network';\n\nconfigureNetwork({\n  trustedDomain: \"nebenan.de\",\n  ...otherSettings\n})\n```\n\n## API Token\n\nRequests to [trustworthy endpoints](#trustworthy-endpoints) will have the `X-AUTH-TOKEN` header set, containing the api token configured in request options or through token middleware. \n\nDefault: `state.token` (see token middleware)\n\nOverwrite:\n```js\ndispatch({\n  type: \"some-type\", \n  request: {\n    url: \"/some/endpoint\",\n    token: \"special-api-token\"\n  }\n})\n```\n\n## X-Translations-Lang Header\n\nRequests to [trustworthy endpoints](#trustworthy-endpoints) will have the `X-Translations-Lang` header set, containing the locale configured in request options or through global config.\n\nDefault via global config: \n```js\nimport { configureNetwork } from 'nebenan-redux-tools/lib/network';\n\nconfigureNetwork({\n  locale: 'de-DE',\n  ...otherSettings\n})\n```\n\nOverwrite:\n```js\ndispatch({\n  type: \"some-type\",\n  request: {\n    url: \"/some/endpoint\",\n    locale: \"en-US\"  \n  }\n})\n```\n\n## Should Request\n\nPrevents unnecessary requests by checking state beforehand. \n\n```js\ndispatch({\n  type: \"some-type\",\n  request: {\n    url: \"/some/endpoint\",\n    shouldRequest(state) {\n     return !state.isFetched;\n    }\n  }\n})\n```\n\n## Aborting\n\nAllows to cancel running requests. Just pass in a [AbortSignal](https://developer.mozilla.org/en-US/docs/Web/API/AbortSignal).\n\n```js\nconst controller = new AbortController();\n\ndispatch({\n  type: \"some-type\",\n  request: {\n    url: \"/some/endpoint\",\n    signal: controller.signal,\n  }\n})\n\n\n// later in app\ncontroller.abort();\n\n```\n\n## Request Types\n\n`request.type` determines used HTTP method\n\n### `query`\n\nSends out GET request. Collects parameters from `request.query` and applies [pagination](#pagination) query options if there are any.\n\n```js\ndispatch({\n  type: \"some-type\",\n  request: {\n     url: \"/users\",\n     type: 'query',\n     query: { q: 'Peter' } \n  }\n})\n```\n\n\n### `delete` / `post` / `put`\n\n```js\ndispatch({\n  type: \"some-type\",\n  request: {\n    url: \"/some/endpoint/123\",\n    type: 'put',\n    payload: { user: { email, password }}\n  }  \n})\n```\n\n\n## Pagination\n\nThere is some boilerplate needed to fully support paginated lists loaded over the network. These helpers help with managing state and sending pagination params over the network.\n\nThe endpoint you are accessing needs to fulfill following requirements:\n- Parameters\n  - `per_page`\n  - `lower` / `higher`\n- Response\n  - `total_count` (`state.total` needs to be updated manually if field does not exist)\n\n### `assignPaginationDefaults` / `paginationGenerator` helpers\n\n```js\nimport { paginationGenerator, assignPaginationDefaults } from 'nebenan-redux-tools/lib/network/pagination';\n\nconst getDefaultState = () => assignPaginationDefaults({ entities: {} });\nconst getPaginationUpdates = paginationGenerator(types.BOOKMARKS_FETCH);\n\nexport const reducer = (state = getDefaultState(), action) => {\n  let newState = state;\n  \n  const update = getPaginationUpdates(newState, action);\n  if (update) newState = updeep(update, newState);\n  \n  switch (action.type) {\n    case resolved(types.BOOKMARKS_FETCH): {\n      const { result, entities } = parse(action.payload);\n\n      const collection = newState.collection.concat(result.bookmarks);\n\n      return updeep({ collection, entities }, newState);\n    }\n    \n    default: {\n      return newState;\n    }\n  }\n}\n```\n\nThe state now holds the following information\n```js\n{\n  // (managed by paginationGenerator)\n  currentPage: 0, \n  // datetime of last fetch (managed by paginationGenerator)\n  lastFetched: 0,\n  // request in progress (managed by paginationGenerator)\n  isFetching: false,\n  // request failed (managed by paginationGenerator) \n  isFailed: false,  \n  // total amount of items over all pages (managed by paginationGenerator)\n  total: null,\n  // item ids for current page  \n  collection: [],\n}\n```\n\n### Actions\n\nPagination query params will be added for `query` requests with either `request.pagination.first` or `request.pagination.last` set.\n\n*Only works for endpoints supporting `lower`/`higher` params.*\n\n```js\ndispatch({\n  type: types.GET_USERS,\n  request: {\n    url: \"/users\",\n    type: 'query',\n    pagination: {\n      per_page: 10, // optional\n      first: firstUserId, // optional\n      last: lastUserId // optional\n    }\n  }\n})\n```\n\n## Mock Response\n\nResponses can be mocked by using the [promise middleware](#promise-middleware). You can keep all of your request options in the action and don't need to modify reducers. Quite useful during development if you are waiting for backend to support new endpoints.\n\n\n```js\ndispatch({\n  type: types.GET_USERS,\n  promise: Promise.resolve([\n    {\n      id: 1,\n      name: \"Peter\"\n    },\n    {\n      id: 2,\n      name: \"Christina\"\n    }\n  ]),\n  request: {\n    url: \"/users\",\n    type: 'query'\n  }\n})\n```\n\n```js\n// reducer\nimport { resolved } from 'nebenan-redux-tools/lib/network/types';\n\nexport default (state = getDefaultState(), action) => {\n  switch(action.type) {\n    case resolved(types.GET_USERS): {\n      const usersFromResponse = action.payload;\n      \n      return { ...state, users: usersFromResponse };\n    }\n    \n    default: {\n      return state;\n    }\n  }\n} \n```\n\n## Standalone Request\n\nRequests can be created programmatically too.\n\n```js\nimport { createRequest } from 'nebenan-redux-tools/lib/network';\n\nconst sendFile = (file, token) => (\n  createRequest({\n    token,\n    payload: { file },\n    url: '/file-upload',\n    type: 'post',\n    multipart: true,\n  }) \n)\n\nconst handleSuccess = (payload) => {\n  // same as action.payload\n  console.log(payload);\n}\n\nsendFile(newFile, token).then(handleSuccess);\n```\n\n## Customize\n\nThe network layer uses [axios](https://github.com/axios/axios) under the hood. To access axios specific features or extend functionality you can hook into request / response generation on a global or local scale.\n\nHooks:\n- `requestHook(requestConfig, requestOptions)`\n  - `requestConfig` the [axios request config](https://github.com/axios/axios#request-config) to be mutated\n  - `requestOptions` the `request` object provided inside the action\n- `responseHook(body, requestConfig, requestOptions)`\n  - `body` response data to be mutated\n  - `requestConfig` the [axios request config](https://github.com/axios/axios#request-config)\n  - `requestOptions` the `request` object provided inside the action\n  \n### Setup global hooks\n\n```js\nimport { configureNetwork } from 'nebenan-redux-tools/lib/network';\n\nconfigureNetwork({\n  requestHook: (requestConfig, requestOptions) => {\n    // ...\n  },\n  responseHook: (body, requestConfig, requestOptions) => {\n    // ...\n  },\n  ...networkSettings\n})\n```\n\n### Action level request hook\n\n```js\nimport { createRequest } from 'nebenan-redux-tools/lib/network';\n\nconst sendFile = (file, token, onProgress) => (\n  createRequest({\n    token,\n    payload: { file },\n    url: '/file-upload',\n    type: 'post',\n    multipart: true,\n    // same as requestHook\n    customize: (requestConfig) => {\n      requestConfig.onUploadProgress = onProgress;\n    }\n  })\n)\n```\n\n","gitHead":"37846d72efd925866181eb0433a71959c4a2001b","scripts":{"lint":"eslint --ext .es,.js ./","test":"npm run compile && TZ='GMT' mocha \"test/**/*.js\"","yalc":"npm run build && yalc push","build":"npm run compile","check":"npm test && npm run lint && echo \"\\033[0;32mReady to publish\\033[0m\"","clean":"rm -rf ./lib/ || exit 1","compile":"NODE_ENV=production babel src --out-dir lib --copy-files","reinstall":"rm -rf node_modules package-lock.json && npm install","lint:tofile":"eslint --ext .es,.js --no-color -o ./eslint-report.log ./","test:tofile":"npm run compile && TZ='GMT' mocha --no-colors -R spec \"test/**/*.js\" 2>&1 | tee test-report.log","prepublishOnly":"npm run check && npm run clean && npm run build"},"_npmUser":{"name":"peterhassler","email":"peter.h@nebenan.de"},"deprecated":"Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.","repository":{"url":"git+https://github.com/good-hood-gmbh/nebenan-redux-tools.git","type":"git"},"_npmVersion":"8.15.0","description":"A set of redux helpers","directories":{},"_nodeVersion":"16.17.0","dependencies":{"qs":"^6.11.0","axios":"^0.22.0","react":"^17.0.2","lodash":"^4.17.21","updeep":"^1.2.1","js-cookie":"^3.0.1","react-dom":"^17.0.2","react-redux":"^7.2.6","local-storage-adapter":"^2.0.0","escape-string-regexp-browser":"^1.1.0"},"_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"chai":"^4.3.6","mocha":"^9.2.2","sinon":"^13.0.2","eslint":"^8.24.0","@babel/cli":"^7.19.3","@babel/core":"^7.19.3","@babel/runtime":"^7.19.0","@babel/preset-env":"^7.19.3","eslint-config-nebenan-base":"^2.0.1","browserslist-config-nebenan":"^1.0.0","@babel/plugin-transform-runtime":"^7.19.1","babel-plugin-add-module-exports":"^1.0.4","@babel/plugin-proposal-json-strings":"^7.18.6","@babel/plugin-transform-strict-mode":"^7.18.6"},"_npmOperationalInternal":{"tmp":"tmp/nebenan-redux-tools_6.4.0-beta.0_1666090297849_0.5626086707637243","host":"s3://npm-registry-packages"}},"6.4.0-beta.1":{"name":"nebenan-redux-tools","version":"6.4.0-beta.1","author":{"name":"Nebenan.de","email":"max@nebenan.de"},"license":"SEE LICENSE IN LICENSE FILE","_id":"nebenan-redux-tools@6.4.0-beta.1","maintainers":[{"name":"rejas","email":"npm@veeck.de"},{"name":"iamuchejude","email":"iamuchejude@gmail.com"},{"name":"eliasbraun","email":"elias.braun@nebenan.de"},{"name":"peterhassler","email":"peter.h@nebenan.de"},{"name":"ozerovs","email":"ozerovsa@gmail.com"},{"name":"suprmax","email":"max@degterev.me"}],"homepage":"https://nebenan.de/","bugs":{"url":"https://github.com/good-hood-gmbh/nebenan-redux-tools/issues"},"dist":{"shasum":"d95b7b3a85e32a72445652dcd908a41f6270563a","tarball":"https://registry.npmjs.org/nebenan-redux-tools/-/nebenan-redux-tools-6.4.0-beta.1.tgz","fileCount":26,"integrity":"sha512-5WWV6gNYbu2zyz/yWmDb3GuCxn41ALwlSd054GNYe2XxWP7kdDBeVsvNu5J4x+6Iswz0VZfrOPz4s2B0X9kI0Q==","signatures":[{"sig":"MEUCIGK7dUhu0h0UXK6N4gReTGqbV/Px8fwbDdJxUrKcOW3vAiEA/tO3S0h0YKHgtPryoT3AcCTK+XUJKhkSA4SF3Re4uos=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":46970,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjTo3rACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmryBA/+K0tRQk7TCunN23QnW467nRWN3ORKq5uOeiBGjUVsoi02NNvJ\r\nZhPYdfoGzHuX8HJt4UR4JxT7E74zWjWFCFTMD+puDtfr7xefWhMr9CDi8obq\r\n8Qgoz5GJD1/p+PrjyPwitiwaHqODRkWuq8rf/7zFY9iv2EHImvZfL7MYfu3+\r\n32wXXrJUzbl+87VAsiK8ogUDM08I+TGbgwBtNktPMbd0cI0XhzLZBcWUnI8d\r\nYfCNnb0S+Foy10RtlHW8VAFeW6C1s/395JcIgC/XASqpMR4E/G2Ywf961/UY\r\nQoN/NoybIO5x80DuuNSVF5XRzVVnESk7K+OzuEsaUQp8MrnnPhJyOjDcseYt\r\nHw9/1Kgetw2zUD4bdVTVB9hyW/XUML7gUCTkzP2XdF/s93PqtNDs0vm6y8mz\r\n0IBN1IzwJ6tgPsBeb4xTO/VLHJDeQpiqDewepIjQ8GhB+l3HYXRcdoypb0Ql\r\nSXUfzDeQhMiNeX3gj9a9mf2aSxLAZmd6Guk/SeQG1Mchf/ODp8yByaIL2vIK\r\ntgUA1KuRb4I4sb+0CpyMA020xNDh29e/OwMbxpyrUx+DolMCHOoU7iITeHAZ\r\njfWDoTxw4T3zyIJxBxd/KjEcDLEivch2L73M4MAeqJs0C/IynOtmnjoApIml\r\nBgOz+XhY2D8pocsNO0ZxeFOP77M4JzMN1nE=\r\n=2W69\r\n-----END PGP SIGNATURE-----\r\n"},"readme":"nebenan-redux-tools\n====================\n\nA set of redux helpers.\n\n- [Experiments Middleware](#experiments-middleware)\n- [Token Middleware](#token-middleware)\n- [Promise Middleware](#promise-middleware)\n- [Network Middleware](#network-middleware)\n  - [Trustworthy Endpoints](#trustworthy-endpoints)\n  - [API Token](#api-token)\n  - [X-Translations-Lang Header](#x-translations-lang-header)\n  - [Should Request](#should-request)\n  - [Abort Callback](#abort-callback)\n  - [Request Types](#request-types)\n  - [Pagination](#pagination)\n  - [Mock Responses](#mock-response)\n  - [Standalone Request](#standalone-request)\n  - [Customize](#customize)\n  \n# Experiments Middleware\n## Setup\n\n**NOT COMPLETE**\n```js\nimport { reducer as experiments } from 'nebenan-redux-tools/lib/experiments/state';\n\nconst reducers = { \n  // It is assumed that the experiment reducer's state\n  // is available under `state.experiments`\n  experiments \n};\n\n// ...\n\nconst createFromState = (initialState) => (\n  createStore(\n    combineReducers(reducers),\n    initialState,\n    composeEnhancers(applyMiddleware(...middleware)),\n  )\n);\n\nexport default createFromState\n```\n\n# Token Middleware\n## Setup\n**NOT COMPLETE**\n```js\nimport { reducer as token } from 'nebenan-redux-tools/lib/token';\n\nconst reducers = {\n  // It is assumed that the experiment reducer's state\n  // is available under `state.token`\n  token\n};\n\n// ...\n\nconst createFromState = (initialState) => (\n  createStore(\n    combineReducers(reducers),\n    initialState,\n    composeEnhancers(applyMiddleware(...middleware)),\n  )\n);\n\nexport default createFromState\n```\n  \n# Promise Middleware\nThe promise middleware gets triggered by dispatching actions with `promise` key in payload. The middleware will dispatch resolved or rejected actions when the promise is fulfilled.\n\n```js\ndispatch({\n  type: types.GET_USERS,\n  promise: {\n    getPromise: () => getUsersFromStorageAsync(),\n    \n    // Ensures the returned promise by the dispatched action to resolve even if the provided promise rejected\n    // graceful: true\n  }\n})\n```\n\n```js\n// reducer\nimport { resolved, rejected } from 'nebenan-redux-tools/lib/promise';\n\nexport default (state = getDefaultState(), action) => {\n  switch(action.type) {\n    case resolved(types.GET_USERS): {\n      const usersFromStorage = action.payload;\n\n      return { ...state, users: usersFromStorage };\n    }\n\n    case rejected(types.GET_USERS): {\n      const usersFromStorage = [];\n\n      return { ...state, users: usersFromStorage };\n    }\n\n    default: {\n      return state;\n    }\n  }\n} \n```\n\n\n## Should Execute\n\nPrevents unnecessary promise executions by checking state beforehand. Dispatches resolved action on prevented execution.\n\n```js\ndispatch({\n  type: types.GET_USERS,\n  promise: {\n    getPromise: () => getUsersFromStorageAsync(),\n    shouldExecute: (state) => !state.isFetched,\n  }\n})\n```\n\n# Network Middleware\n\nThe network middleware gets triggered by dispatching actions with `request` in payload. The middleware will fire the request and dispatches resolved or rejected actions when the request is finished.\n\nExample:\n\n```js\ndispatch({\n  type: types.GET_USERS,\n  request: {\n    url: \"/users\"\n  }\n})\n```\n\n```js\nimport { resolved, rejected } from 'nebenan-redux-tools/lib/network/types';\n\nexport default (state = getDefaultState(), action) => {\n  switch(action.type) {\n    case resolved(types.GET_USERS): {\n      const usersFromResponse = action.payload;\n      \n      return { ...state, users: usersFromResponse };\n    }\n    \n    case rejected(types.GET_USERS): {\n      const usersFromResponse = [];\n      \n      return { ...state, users: usersFromResponse };\n    }\n    \n    default: {\n      return state;\n    }\n  }\n} \n```\n\n## Trustworthy Endpoints\n\nRequests to trustworthy endpoints will enable the [X-Translations-Lang Header](#x-translations-lang-header) and [API Token](#api-token) features.\n\nSet trusted domain via global config:\n```js\nimport { configureNetwork } from 'nebenan-redux-tools/lib/network';\n\nconfigureNetwork({\n  trustedDomain: \"nebenan.de\",\n  ...otherSettings\n})\n```\n\n## API Token\n\nRequests to [trustworthy endpoints](#trustworthy-endpoints) will have the `X-AUTH-TOKEN` header set, containing the api token configured in request options or through token middleware. \n\nDefault: `state.token` (see token middleware)\n\nOverwrite:\n```js\ndispatch({\n  type: \"some-type\", \n  request: {\n    url: \"/some/endpoint\",\n    token: \"special-api-token\"\n  }\n})\n```\n\n## X-Translations-Lang Header\n\nRequests to [trustworthy endpoints](#trustworthy-endpoints) will have the `X-Translations-Lang` header set, containing the locale configured in request options or through global config.\n\nDefault via global config: \n```js\nimport { configureNetwork } from 'nebenan-redux-tools/lib/network';\n\nconfigureNetwork({\n  locale: 'de-DE',\n  ...otherSettings\n})\n```\n\nOverwrite:\n```js\ndispatch({\n  type: \"some-type\",\n  request: {\n    url: \"/some/endpoint\",\n    locale: \"en-US\"  \n  }\n})\n```\n\n## Should Request\n\nPrevents unnecessary requests by checking state beforehand. \n\n```js\ndispatch({\n  type: \"some-type\",\n  request: {\n    url: \"/some/endpoint\",\n    shouldRequest(state) {\n     return !state.isFetched;\n    }\n  }\n})\n```\n\n## Aborting\n\nAllows to cancel running requests. Just pass in a [AbortSignal](https://developer.mozilla.org/en-US/docs/Web/API/AbortSignal).\n\n```js\nconst controller = new AbortController();\n\ndispatch({\n  type: \"some-type\",\n  request: {\n    url: \"/some/endpoint\",\n    signal: controller.signal,\n  }\n})\n\n\n// later in app\ncontroller.abort();\n\n```\n\n## Request Types\n\n`request.type` determines used HTTP method\n\n### `query`\n\nSends out GET request. Collects parameters from `request.query` and applies [pagination](#pagination) query options if there are any.\n\n```js\ndispatch({\n  type: \"some-type\",\n  request: {\n     url: \"/users\",\n     type: 'query',\n     query: { q: 'Peter' } \n  }\n})\n```\n\n\n### `delete` / `post` / `put`\n\n```js\ndispatch({\n  type: \"some-type\",\n  request: {\n    url: \"/some/endpoint/123\",\n    type: 'put',\n    payload: { user: { email, password }}\n  }  \n})\n```\n\n\n## Pagination\n\nThere is some boilerplate needed to fully support paginated lists loaded over the network. These helpers help with managing state and sending pagination params over the network.\n\nThe endpoint you are accessing needs to fulfill following requirements:\n- Parameters\n  - `per_page`\n  - `lower` / `higher`\n- Response\n  - `total_count` (`state.total` needs to be updated manually if field does not exist)\n\n### `assignPaginationDefaults` / `paginationGenerator` helpers\n\n```js\nimport { paginationGenerator, assignPaginationDefaults } from 'nebenan-redux-tools/lib/network/pagination';\n\nconst getDefaultState = () => assignPaginationDefaults({ entities: {} });\nconst getPaginationUpdates = paginationGenerator(types.BOOKMARKS_FETCH);\n\nexport const reducer = (state = getDefaultState(), action) => {\n  let newState = state;\n  \n  const update = getPaginationUpdates(newState, action);\n  if (update) newState = updeep(update, newState);\n  \n  switch (action.type) {\n    case resolved(types.BOOKMARKS_FETCH): {\n      const { result, entities } = parse(action.payload);\n\n      const collection = newState.collection.concat(result.bookmarks);\n\n      return updeep({ collection, entities }, newState);\n    }\n    \n    default: {\n      return newState;\n    }\n  }\n}\n```\n\nThe state now holds the following information\n```js\n{\n  // (managed by paginationGenerator)\n  currentPage: 0, \n  // datetime of last fetch (managed by paginationGenerator)\n  lastFetched: 0,\n  // request in progress (managed by paginationGenerator)\n  isFetching: false,\n  // request failed (managed by paginationGenerator) \n  isFailed: false,  \n  // total amount of items over all pages (managed by paginationGenerator)\n  total: null,\n  // item ids for current page  \n  collection: [],\n}\n```\n\n### Actions\n\nPagination query params will be added for `query` requests with either `request.pagination.first` or `request.pagination.last` set.\n\n*Only works for endpoints supporting `lower`/`higher` params.*\n\n```js\ndispatch({\n  type: types.GET_USERS,\n  request: {\n    url: \"/users\",\n    type: 'query',\n    pagination: {\n      per_page: 10, // optional\n      first: firstUserId, // optional\n      last: lastUserId // optional\n    }\n  }\n})\n```\n\n## Mock Response\n\nResponses can be mocked by using the [promise middleware](#promise-middleware). You can keep all of your request options in the action and don't need to modify reducers. Quite useful during development if you are waiting for backend to support new endpoints.\n\n\n```js\ndispatch({\n  type: types.GET_USERS,\n  promise: Promise.resolve([\n    {\n      id: 1,\n      name: \"Peter\"\n    },\n    {\n      id: 2,\n      name: \"Christina\"\n    }\n  ]),\n  request: {\n    url: \"/users\",\n    type: 'query'\n  }\n})\n```\n\n```js\n// reducer\nimport { resolved } from 'nebenan-redux-tools/lib/network/types';\n\nexport default (state = getDefaultState(), action) => {\n  switch(action.type) {\n    case resolved(types.GET_USERS): {\n      const usersFromResponse = action.payload;\n      \n      return { ...state, users: usersFromResponse };\n    }\n    \n    default: {\n      return state;\n    }\n  }\n} \n```\n\n## Standalone Request\n\nRequests can be created programmatically too.\n\n```js\nimport { createRequest } from 'nebenan-redux-tools/lib/network';\n\nconst sendFile = (file, token) => (\n  createRequest({\n    token,\n    payload: { file },\n    url: '/file-upload',\n    type: 'post',\n    multipart: true,\n  }) \n)\n\nconst handleSuccess = (payload) => {\n  // same as action.payload\n  console.log(payload);\n}\n\nsendFile(newFile, token).then(handleSuccess);\n```\n\n## Customize\n\nThe network layer uses [axios](https://github.com/axios/axios) under the hood. To access axios specific features or extend functionality you can hook into request / response generation on a global or local scale.\n\nHooks:\n- `requestHook(requestConfig, requestOptions)`\n  - `requestConfig` the [axios request config](https://github.com/axios/axios#request-config) to be mutated\n  - `requestOptions` the `request` object provided inside the action\n- `responseHook(body, requestConfig, requestOptions)`\n  - `body` response data to be mutated\n  - `requestConfig` the [axios request config](https://github.com/axios/axios#request-config)\n  - `requestOptions` the `request` object provided inside the action\n  \n### Setup global hooks\n\n```js\nimport { configureNetwork } from 'nebenan-redux-tools/lib/network';\n\nconfigureNetwork({\n  requestHook: (requestConfig, requestOptions) => {\n    // ...\n  },\n  responseHook: (body, requestConfig, requestOptions) => {\n    // ...\n  },\n  ...networkSettings\n})\n```\n\n### Action level request hook\n\n```js\nimport { createRequest } from 'nebenan-redux-tools/lib/network';\n\nconst sendFile = (file, token, onProgress) => (\n  createRequest({\n    token,\n    payload: { file },\n    url: '/file-upload',\n    type: 'post',\n    multipart: true,\n    // same as requestHook\n    customize: (requestConfig) => {\n      requestConfig.onUploadProgress = onProgress;\n    }\n  })\n)\n```\n\n","gitHead":"37846d72efd925866181eb0433a71959c4a2001b","scripts":{"lint":"eslint --ext .es,.js ./","test":"npm run compile && TZ='GMT' mocha \"test/**/*.js\"","yalc":"npm run build && yalc push","build":"npm run compile","check":"npm test && npm run lint && echo \"\\033[0;32mReady to publish\\033[0m\"","clean":"rm -rf ./lib/ || exit 1","compile":"NODE_ENV=production babel src --out-dir lib --copy-files","reinstall":"rm -rf node_modules package-lock.json && npm install","lint:tofile":"eslint --ext .es,.js --no-color -o ./eslint-report.log ./","test:tofile":"npm run compile && TZ='GMT' mocha --no-colors -R spec \"test/**/*.js\" 2>&1 | tee test-report.log","prepublishOnly":"npm run check && npm run clean && npm run build"},"_npmUser":{"name":"peterhassler","email":"peter.h@nebenan.de"},"deprecated":"Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.","repository":{"url":"git+https://github.com/good-hood-gmbh/nebenan-redux-tools.git","type":"git"},"_npmVersion":"8.15.0","description":"A set of redux helpers","directories":{},"_nodeVersion":"16.17.0","dependencies":{"qs":"^6.11.0","axios":"^0.22.0","react":"^17.0.2","lodash":"^4.17.21","updeep":"^1.2.1","js-cookie":"^3.0.1","react-dom":"^17.0.2","react-redux":"^7.2.6","local-storage-adapter":"^2.0.0","escape-string-regexp-browser":"^1.1.0"},"_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"chai":"^4.3.6","mocha":"^9.2.2","sinon":"^13.0.2","eslint":"^8.24.0","@babel/cli":"^7.19.3","@babel/core":"^7.19.3","@babel/runtime":"^7.19.0","@babel/preset-env":"^7.19.3","eslint-config-nebenan-base":"^2.0.1","browserslist-config-nebenan":"^1.0.0","@babel/plugin-transform-runtime":"^7.19.1","babel-plugin-add-module-exports":"^1.0.4","@babel/plugin-proposal-json-strings":"^7.18.6","@babel/plugin-transform-strict-mode":"^7.18.6"},"_npmOperationalInternal":{"tmp":"tmp/nebenan-redux-tools_6.4.0-beta.1_1666092522815_0.7611941922538528","host":"s3://npm-registry-packages"}},"6.4.0-beta.2":{"name":"nebenan-redux-tools","version":"6.4.0-beta.2","author":{"name":"Nebenan.de","email":"max@nebenan.de"},"license":"SEE LICENSE IN LICENSE FILE","_id":"nebenan-redux-tools@6.4.0-beta.2","maintainers":[{"name":"rejas","email":"npm@veeck.de"},{"name":"iamuchejude","email":"iamuchejude@gmail.com"},{"name":"eliasbraun","email":"elias.braun@nebenan.de"},{"name":"peterhassler","email":"peter.h@nebenan.de"},{"name":"ozerovs","email":"ozerovsa@gmail.com"},{"name":"suprmax","email":"max@degterev.me"}],"homepage":"https://nebenan.de/","bugs":{"url":"https://github.com/good-hood-gmbh/nebenan-redux-tools/issues"},"dist":{"shasum":"669197cb5699a5c3346dbb7029c9dfb7b1ff1ee7","tarball":"https://registry.npmjs.org/nebenan-redux-tools/-/nebenan-redux-tools-6.4.0-beta.2.tgz","fileCount":27,"integrity":"sha512-n+mIUZ2DZ21xKr5IXZiO6XIkudoEd826Q81S+ojFmDsnqhpMFYgO6DUAypUlLdSVFC7rENGPFXZ/rHhjRqZNyg==","signatures":[{"sig":"MEUCIQCEuNXcNa75PLCWtJFF9j07WGqRe0bhptX2/9d+lqZKjQIgRmd0nsWbEEFk9nyK2XhjRJj9Nf9EzWzE0GAh9wJdxBE=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":47620,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjUVaHACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmr7Og//QXESNQf85xLATxi3LgbQI3xs+rdGSHryy8dI5cY96ZEeinUP\r\nMcLWCd3pyes+w40N0eRNto7i763p02rllizCJiI0ipWK7PfAzclC59XKYq/x\r\n5Eqv2iwRzfpwK4Oya5PCNr2ZyNaXm5caEx2cfIZZ0U2TevIqntnrHyT/8aks\r\nJxVk1KCHs3/i4OjhHUYD9peQIJslOF4m1qihZSW0yIkcd/qs1ojVBEpzKZTb\r\n6/FlXgzIjOQw1zSYqlNv190f/EOCtWxGPEfUvvR3lVqDbGMKf9XNw8CrTfJ8\r\nRPAAdZF3tT2GtyLc45oXhIVfGQn2YvQVR8KF+bbAqBXrIiTiMUUcrP1iLAl3\r\nVyxxyr8io3nxju9Zkld//HPQMF6CBX643OtflA1f9VqoZPK9rl7VcnNcDT91\r\nmbvSwMLWhvI1IlxiNr4FLVB5U566iyAuRl0YweymB2sJuFHmzo9JOuTwrlMD\r\nLvxtgeNAztMl0iyxHkslPNXzkfclzZShiDxnE564+hOIexTJlNWy+rSrF9xz\r\nrpKofrX8B4TLxxhOpGutM3EyNUoTjuHDXMO3bUXIDWE43SY1dzK/epJLhft+\r\n6JBtXgsNbJsbcssPPWDvxbDbu/Ok+RlxtLW/4ljJ3VzyK6SsFKWToAP65CTY\r\ne4peUhyd/MZgog1n/96wqRpNcyUkANqmD28=\r\n=RDVm\r\n-----END PGP SIGNATURE-----\r\n"},"readme":"nebenan-redux-tools\n====================\n\nA set of redux helpers.\n\n- [Experiments Middleware](#experiments-middleware)\n- [Token Middleware](#token-middleware)\n- [Promise Middleware](#promise-middleware)\n- [Network Middleware](#network-middleware)\n  - [Trustworthy Endpoints](#trustworthy-endpoints)\n  - [API Token](#api-token)\n  - [X-Translations-Lang Header](#x-translations-lang-header)\n  - [Should Request](#should-request)\n  - [Abort Callback](#abort-callback)\n  - [Request Types](#request-types)\n  - [Pagination](#pagination)\n  - [Mock Responses](#mock-response)\n  - [Standalone Request](#standalone-request)\n  - [Customize](#customize)\n  \n# Experiments Middleware\n## Setup\n\n**NOT COMPLETE**\n```js\nimport { reducer as experiments } from 'nebenan-redux-tools/lib/experiments/state';\n\nconst reducers = { \n  // It is assumed that the experiment reducer's state\n  // is available under `state.experiments`\n  experiments \n};\n\n// ...\n\nconst createFromState = (initialState) => (\n  createStore(\n    combineReducers(reducers),\n    initialState,\n    composeEnhancers(applyMiddleware(...middleware)),\n  )\n);\n\nexport default createFromState\n```\n\n# Token Middleware\n## Setup\n**NOT COMPLETE**\n```js\nimport { reducer as token } from 'nebenan-redux-tools/lib/token';\n\nconst reducers = {\n  // It is assumed that the experiment reducer's state\n  // is available under `state.token`\n  token\n};\n\n// ...\n\nconst createFromState = (initialState) => (\n  createStore(\n    combineReducers(reducers),\n    initialState,\n    composeEnhancers(applyMiddleware(...middleware)),\n  )\n);\n\nexport default createFromState\n```\n  \n# Promise Middleware\nThe promise middleware gets triggered by dispatching actions with `promise` key in payload. The middleware will dispatch resolved or rejected actions when the promise is fulfilled.\n\n```js\ndispatch({\n  type: types.GET_USERS,\n  promise: {\n    getPromise: () => getUsersFromStorageAsync(),\n    \n    // Ensures the returned promise by the dispatched action to resolve even if the provided promise rejected\n    // graceful: true\n  }\n})\n```\n\n```js\n// reducer\nimport { resolved, rejected } from 'nebenan-redux-tools/lib/promise';\n\nexport default (state = getDefaultState(), action) => {\n  switch(action.type) {\n    case resolved(types.GET_USERS): {\n      const usersFromStorage = action.payload;\n\n      return { ...state, users: usersFromStorage };\n    }\n\n    case rejected(types.GET_USERS): {\n      const usersFromStorage = [];\n\n      return { ...state, users: usersFromStorage };\n    }\n\n    default: {\n      return state;\n    }\n  }\n} \n```\n\n\n## Should Execute\n\nPrevents unnecessary promise executions by checking state beforehand. Dispatches resolved action on prevented execution.\n\n```js\ndispatch({\n  type: types.GET_USERS,\n  promise: {\n    getPromise: () => getUsersFromStorageAsync(),\n    shouldExecute: (state) => !state.isFetched,\n  }\n})\n```\n\n# Network Middleware\n\nThe network middleware gets triggered by dispatching actions with `request` in payload. The middleware will fire the request and dispatches resolved or rejected actions when the request is finished.\n\nExample:\n\n```js\ndispatch({\n  type: types.GET_USERS,\n  request: {\n    url: \"/users\"\n  }\n})\n```\n\n```js\nimport { resolved, rejected } from 'nebenan-redux-tools/lib/network/types';\n\nexport default (state = getDefaultState(), action) => {\n  switch(action.type) {\n    case resolved(types.GET_USERS): {\n      const usersFromResponse = action.payload;\n      \n      return { ...state, users: usersFromResponse };\n    }\n    \n    case rejected(types.GET_USERS): {\n      const usersFromResponse = [];\n      \n      return { ...state, users: usersFromResponse };\n    }\n    \n    default: {\n      return state;\n    }\n  }\n} \n```\n\n## Trustworthy Endpoints\n\nRequests to trustworthy endpoints will enable the [X-Translations-Lang Header](#x-translations-lang-header) and [API Token](#api-token) features.\n\nSet trusted domain via global config:\n```js\nimport { configureNetwork } from 'nebenan-redux-tools/lib/network';\n\nconfigureNetwork({\n  trustedDomain: \"nebenan.de\",\n  ...otherSettings\n})\n```\n\n## API Token\n\nRequests to [trustworthy endpoints](#trustworthy-endpoints) will have the `X-AUTH-TOKEN` header set, containing the api token configured in request options or through token middleware. \n\nDefault: `state.token` (see token middleware)\n\nOverwrite:\n```js\ndispatch({\n  type: \"some-type\", \n  request: {\n    url: \"/some/endpoint\",\n    token: \"special-api-token\"\n  }\n})\n```\n\n## X-Translations-Lang Header\n\nRequests to [trustworthy endpoints](#trustworthy-endpoints) will have the `X-Translations-Lang` header set, containing the locale configured in request options or through global config.\n\nDefault via global config: \n```js\nimport { configureNetwork } from 'nebenan-redux-tools/lib/network';\n\nconfigureNetwork({\n  locale: 'de-DE',\n  ...otherSettings\n})\n```\n\nOverwrite:\n```js\ndispatch({\n  type: \"some-type\",\n  request: {\n    url: \"/some/endpoint\",\n    locale: \"en-US\"  \n  }\n})\n```\n\n## Should Request\n\nPrevents unnecessary requests by checking state beforehand. \n\n```js\ndispatch({\n  type: \"some-type\",\n  request: {\n    url: \"/some/endpoint\",\n    shouldRequest(state) {\n     return !state.isFetched;\n    }\n  }\n})\n```\n\n## Aborting\n\nAllows to cancel running requests. Just pass in a [AbortSignal](https://developer.mozilla.org/en-US/docs/Web/API/AbortSignal).\n\n```js\nconst controller = new AbortController();\n\ndispatch({\n  type: \"some-type\",\n  request: {\n    url: \"/some/endpoint\",\n    signal: controller.signal,\n  }\n})\n\n\n// later in app\ncontroller.abort();\n\n```\n\n## Request Types\n\n`request.type` determines used HTTP method\n\n### `query`\n\nSends out GET request. Collects parameters from `request.query` and applies [pagination](#pagination) query options if there are any.\n\n```js\ndispatch({\n  type: \"some-type\",\n  request: {\n     url: \"/users\",\n     type: 'query',\n     query: { q: 'Peter' } \n  }\n})\n```\n\n\n### `delete` / `post` / `put`\n\n```js\ndispatch({\n  type: \"some-type\",\n  request: {\n    url: \"/some/endpoint/123\",\n    type: 'put',\n    payload: { user: { email, password }}\n  }  \n})\n```\n\n\n## Pagination\n\nThere is some boilerplate needed to fully support paginated lists loaded over the network. These helpers help with managing state and sending pagination params over the network.\n\nThe endpoint you are accessing needs to fulfill following requirements:\n- Parameters\n  - `per_page`\n  - `lower` / `higher`\n- Response\n  - `total_count` (`state.total` needs to be updated manually if field does not exist)\n\n### `assignPaginationDefaults` / `paginationGenerator` helpers\n\n```js\nimport { paginationGenerator, assignPaginationDefaults } from 'nebenan-redux-tools/lib/network/pagination';\n\nconst getDefaultState = () => assignPaginationDefaults({ entities: {} });\nconst getPaginationUpdates = paginationGenerator(types.BOOKMARKS_FETCH);\n\nexport const reducer = (state = getDefaultState(), action) => {\n  let newState = state;\n  \n  const update = getPaginationUpdates(newState, action);\n  if (update) newState = updeep(update, newState);\n  \n  switch (action.type) {\n    case resolved(types.BOOKMARKS_FETCH): {\n      const { result, entities } = parse(action.payload);\n\n      const collection = newState.collection.concat(result.bookmarks);\n\n      return updeep({ collection, entities }, newState);\n    }\n    \n    default: {\n      return newState;\n    }\n  }\n}\n```\n\nThe state now holds the following information\n```js\n{\n  // (managed by paginationGenerator)\n  currentPage: 0, \n  // datetime of last fetch (managed by paginationGenerator)\n  lastFetched: 0,\n  // request in progress (managed by paginationGenerator)\n  isFetching: false,\n  // request failed (managed by paginationGenerator) \n  isFailed: false,  \n  // total amount of items over all pages (managed by paginationGenerator)\n  total: null,\n  // item ids for current page  \n  collection: [],\n}\n```\n\n### Actions\n\nPagination query params will be added for `query` requests with either `request.pagination.first` or `request.pagination.last` set.\n\n*Only works for endpoints supporting `lower`/`higher` params.*\n\n```js\ndispatch({\n  type: types.GET_USERS,\n  request: {\n    url: \"/users\",\n    type: 'query',\n    pagination: {\n      per_page: 10, // optional\n      first: firstUserId, // optional\n      last: lastUserId // optional\n    }\n  }\n})\n```\n\n## Mock Response\n\nResponses can be mocked by using the [promise middleware](#promise-middleware). You can keep all of your request options in the action and don't need to modify reducers. Quite useful during development if you are waiting for backend to support new endpoints.\n\n\n```js\ndispatch({\n  type: types.GET_USERS,\n  promise: Promise.resolve([\n    {\n      id: 1,\n      name: \"Peter\"\n    },\n    {\n      id: 2,\n      name: \"Christina\"\n    }\n  ]),\n  request: {\n    url: \"/users\",\n    type: 'query'\n  }\n})\n```\n\n```js\n// reducer\nimport { resolved } from 'nebenan-redux-tools/lib/network/types';\n\nexport default (state = getDefaultState(), action) => {\n  switch(action.type) {\n    case resolved(types.GET_USERS): {\n      const usersFromResponse = action.payload;\n      \n      return { ...state, users: usersFromResponse };\n    }\n    \n    default: {\n      return state;\n    }\n  }\n} \n```\n\n## Standalone Request\n\nRequests can be created programmatically too.\n\n```js\nimport { createRequest } from 'nebenan-redux-tools/lib/network';\n\nconst sendFile = (file, token) => (\n  createRequest({\n    token,\n    payload: { file },\n    url: '/file-upload',\n    type: 'post',\n    multipart: true,\n  }) \n)\n\nconst handleSuccess = (payload) => {\n  // same as action.payload\n  console.log(payload);\n}\n\nsendFile(newFile, token).then(handleSuccess);\n```\n\n## Customize\n\nThe network layer uses [axios](https://github.com/axios/axios) under the hood. To access axios specific features or extend functionality you can hook into request / response generation on a global or local scale.\n\nHooks:\n- `requestHook(requestConfig, requestOptions)`\n  - `requestConfig` the [axios request config](https://github.com/axios/axios#request-config) to be mutated\n  - `requestOptions` the `request` object provided inside the action\n- `responseHook(body, requestConfig, requestOptions)`\n  - `body` response data to be mutated\n  - `requestConfig` the [axios request config](https://github.com/axios/axios#request-config)\n  - `requestOptions` the `request` object provided inside the action\n  \n### Setup global hooks\n\n```js\nimport { configureNetwork } from 'nebenan-redux-tools/lib/network';\n\nconfigureNetwork({\n  requestHook: (requestConfig, requestOptions) => {\n    // ...\n  },\n  responseHook: (body, requestConfig, requestOptions) => {\n    // ...\n  },\n  ...networkSettings\n})\n```\n\n### Action level request hook\n\n```js\nimport { createRequest } from 'nebenan-redux-tools/lib/network';\n\nconst sendFile = (file, token, onProgress) => (\n  createRequest({\n    token,\n    payload: { file },\n    url: '/file-upload',\n    type: 'post',\n    multipart: true,\n    // same as requestHook\n    customize: (requestConfig) => {\n      requestConfig.onUploadProgress = onProgress;\n    }\n  })\n)\n```\n\n","gitHead":"5d80d0abf4af099b29804b6c13ad1aca89a5f144","scripts":{"lint":"eslint --ext .es,.js ./","test":"npm run compile && TZ='GMT' mocha \"test/**/*.js\"","yalc":"npm run build && yalc push","build":"npm run compile","check":"npm test && npm run lint && echo \"\\033[0;32mReady to publish\\033[0m\"","clean":"rm -rf ./lib/ || exit 1","compile":"NODE_ENV=production babel src --out-dir lib --copy-files","reinstall":"rm -rf node_modules package-lock.json && npm install","lint:tofile":"eslint --ext .es,.js --no-color -o ./eslint-report.log ./","test:tofile":"npm run compile && TZ='GMT' mocha --no-colors -R spec \"test/**/*.js\" 2>&1 | tee test-report.log","prepublishOnly":"npm run check && npm run clean && npm run build"},"_npmUser":{"name":"peterhassler","email":"peter.h@nebenan.de"},"deprecated":"Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.","repository":{"url":"git+https://github.com/good-hood-gmbh/nebenan-redux-tools.git","type":"git"},"_npmVersion":"8.13.2","description":"A set of redux helpers","directories":{},"_nodeVersion":"17.3.0","dependencies":{"qs":"^6.11.0","axios":"^0.22.0","react":"^17.0.2","lodash":"^4.17.21","updeep":"^1.2.1","js-cookie":"^3.0.1","react-dom":"^17.0.2","react-redux":"^7.2.6","local-storage-adapter":"^2.0.0","escape-string-regexp-browser":"^1.1.0"},"_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"chai":"^4.3.6","mocha":"^9.2.2","sinon":"^13.0.2","eslint":"^8.24.0","@babel/cli":"^7.19.3","@babel/core":"^7.19.3","@babel/runtime":"^7.19.0","@babel/preset-env":"^7.19.3","eslint-config-nebenan-base":"^2.0.1","browserslist-config-nebenan":"^1.0.0","@babel/plugin-transform-runtime":"^7.19.1","babel-plugin-add-module-exports":"^1.0.4","@babel/plugin-proposal-json-strings":"^7.18.6","@babel/plugin-transform-strict-mode":"^7.18.6"},"_npmOperationalInternal":{"tmp":"tmp/nebenan-redux-tools_6.4.0-beta.2_1666274951476_0.7258587429861691","host":"s3://npm-registry-packages"}},"6.4.0-beta.3":{"name":"nebenan-redux-tools","version":"6.4.0-beta.3","author":{"name":"Nebenan.de","email":"max@nebenan.de"},"license":"SEE LICENSE IN LICENSE FILE","_id":"nebenan-redux-tools@6.4.0-beta.3","maintainers":[{"name":"rejas","email":"npm@veeck.de"},{"name":"iamuchejude","email":"iamuchejude@gmail.com"},{"name":"eliasbraun","email":"elias.braun@nebenan.de"},{"name":"peterhassler","email":"peter.h@nebenan.de"},{"name":"ozerovs","email":"ozerovsa@gmail.com"},{"name":"suprmax","email":"max@degterev.me"}],"homepage":"https://nebenan.de/","bugs":{"url":"https://github.com/good-hood-gmbh/nebenan-redux-tools/issues"},"dist":{"shasum":"139f58182098bc71c5ace0f1cba0da4382fda307","tarball":"https://registry.npmjs.org/nebenan-redux-tools/-/nebenan-redux-tools-6.4.0-beta.3.tgz","fileCount":27,"integrity":"sha512-VmRSFeRwWz2ssltcppgYUrnQ+7WRoLzQReb1Kg0GLZoNatMnmOYhEtSz6cxRfbegx2c/lS3xbGBiWw6amUwi8g==","signatures":[{"sig":"MEUCIQD1O/aCsQsosmnMU+j4qGsP7kv4DVVFG10Pu5MwKW6nqwIgaLU3QS0DRcyCCWUG6sG8svs2zjMEQ4umWAQSb0hlQ1M=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":47510,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjUWB4ACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmqwJw//YfgtM4DqsuvNeKnMf5L/T/gy+q4yiLcn5S3W6qh9rPyBaP57\r\nxntRCJ+JSaQCwTVAqSfyxLIY7OZ+HCHeEX7ApwlWnTkRoHn7UwTLXERFEwXp\r\nDR7/eYmk3kIoacAN8fkPASn1TWVaHW7Bbgi0wV2EuY1NaSxUQloU9dsisYrH\r\nB70+BrETvxfVAh1wQgTqtLf3uSYonW06maPdiS7cXx0ffGsF1rMtTWptyGML\r\nxxRO1mQFoTR38E7P8/NGhLNufICkRi1gn766KDT5ouXJ6x3efG3kDR5bp0xz\r\nxVcSUtzLP5+ZgQO3kkrJvrFSgAJuIIuNjrXOY9y2++a6h3Cdv6U8kSpVxNwM\r\njmejTFh05/C5RSd8/qR7/yeGkLooZv4dO9wjNGKkfdDXL/C2lxtA4zpkegpq\r\nr7stXcT2VGJKIRDIhO6eQJc+GdGQ95LTNKt06RULQHdG63lv8ShC1rV9bbMW\r\nw/LxZsRRsGOLXJwObw3XeRt24/EtM833pFa5CHWyZ3o59rjkTeFqnJZjAHTX\r\nZVJXxoXe/gLQM9BaD80KJIakro9Z16YFSohUtIMTCvJ3QU1jcW2IX8WsEb29\r\nq/e0qHR3SHAtCuUJGMKRsqHziZNfKeKWjQKxnGsO6SkRXldZa6pFDXrr1tTn\r\nojfFJgu9gVjUmaJq2V0kt2BH0PN423CfxdY=\r\n=wM4W\r\n-----END PGP SIGNATURE-----\r\n"},"readme":"nebenan-redux-tools\n====================\n\nA set of redux helpers.\n\n- [Experiments Middleware](#experiments-middleware)\n- [Token Middleware](#token-middleware)\n- [Promise Middleware](#promise-middleware)\n- [Network Middleware](#network-middleware)\n  - [Trustworthy Endpoints](#trustworthy-endpoints)\n  - [API Token](#api-token)\n  - [X-Translations-Lang Header](#x-translations-lang-header)\n  - [Should Request](#should-request)\n  - [Abort Callback](#abort-callback)\n  - [Request Types](#request-types)\n  - [Pagination](#pagination)\n  - [Mock Responses](#mock-response)\n  - [Standalone Request](#standalone-request)\n  - [Customize](#customize)\n  \n# Experiments Middleware\n## Setup\n\n**NOT COMPLETE**\n```js\nimport { reducer as experiments } from 'nebenan-redux-tools/lib/experiments/state';\n\nconst reducers = { \n  // It is assumed that the experiment reducer's state\n  // is available under `state.experiments`\n  experiments \n};\n\n// ...\n\nconst createFromState = (initialState) => (\n  createStore(\n    combineReducers(reducers),\n    initialState,\n    composeEnhancers(applyMiddleware(...middleware)),\n  )\n);\n\nexport default createFromState\n```\n\n# Token Middleware\n## Setup\n**NOT COMPLETE**\n```js\nimport { reducer as token } from 'nebenan-redux-tools/lib/token';\n\nconst reducers = {\n  // It is assumed that the experiment reducer's state\n  // is available under `state.token`\n  token\n};\n\n// ...\n\nconst createFromState = (initialState) => (\n  createStore(\n    combineReducers(reducers),\n    initialState,\n    composeEnhancers(applyMiddleware(...middleware)),\n  )\n);\n\nexport default createFromState\n```\n  \n# Promise Middleware\nThe promise middleware gets triggered by dispatching actions with `promise` key in payload. The middleware will dispatch resolved or rejected actions when the promise is fulfilled.\n\n```js\ndispatch({\n  type: types.GET_USERS,\n  promise: {\n    getPromise: () => getUsersFromStorageAsync(),\n    \n    // Ensures the returned promise by the dispatched action to resolve even if the provided promise rejected\n    // graceful: true\n  }\n})\n```\n\n```js\n// reducer\nimport { resolved, rejected } from 'nebenan-redux-tools/lib/promise';\n\nexport default (state = getDefaultState(), action) => {\n  switch(action.type) {\n    case resolved(types.GET_USERS): {\n      const usersFromStorage = action.payload;\n\n      return { ...state, users: usersFromStorage };\n    }\n\n    case rejected(types.GET_USERS): {\n      const usersFromStorage = [];\n\n      return { ...state, users: usersFromStorage };\n    }\n\n    default: {\n      return state;\n    }\n  }\n} \n```\n\n\n## Should Execute\n\nPrevents unnecessary promise executions by checking state beforehand. Dispatches resolved action on prevented execution.\n\n```js\ndispatch({\n  type: types.GET_USERS,\n  promise: {\n    getPromise: () => getUsersFromStorageAsync(),\n    shouldExecute: (state) => !state.isFetched,\n  }\n})\n```\n\n# Network Middleware\n\nThe network middleware gets triggered by dispatching actions with `request` in payload. The middleware will fire the request and dispatches resolved or rejected actions when the request is finished.\n\nExample:\n\n```js\ndispatch({\n  type: types.GET_USERS,\n  request: {\n    url: \"/users\"\n  }\n})\n```\n\n```js\nimport { resolved, rejected } from 'nebenan-redux-tools/lib/network/types';\n\nexport default (state = getDefaultState(), action) => {\n  switch(action.type) {\n    case resolved(types.GET_USERS): {\n      const usersFromResponse = action.payload;\n      \n      return { ...state, users: usersFromResponse };\n    }\n    \n    case rejected(types.GET_USERS): {\n      const usersFromResponse = [];\n      \n      return { ...state, users: usersFromResponse };\n    }\n    \n    default: {\n      return state;\n    }\n  }\n} \n```\n\n## Trustworthy Endpoints\n\nRequests to trustworthy endpoints will enable the [X-Translations-Lang Header](#x-translations-lang-header) and [API Token](#api-token) features.\n\nSet trusted domain via global config:\n```js\nimport { configureNetwork } from 'nebenan-redux-tools/lib/network';\n\nconfigureNetwork({\n  trustedDomain: \"nebenan.de\",\n  ...otherSettings\n})\n```\n\n## API Token\n\nRequests to [trustworthy endpoints](#trustworthy-endpoints) will have the `X-AUTH-TOKEN` header set, containing the api token configured in request options or through token middleware. \n\nDefault: `state.token` (see token middleware)\n\nOverwrite:\n```js\ndispatch({\n  type: \"some-type\", \n  request: {\n    url: \"/some/endpoint\",\n    token: \"special-api-token\"\n  }\n})\n```\n\n## X-Translations-Lang Header\n\nRequests to [trustworthy endpoints](#trustworthy-endpoints) will have the `X-Translations-Lang` header set, containing the locale configured in request options or through global config.\n\nDefault via global config: \n```js\nimport { configureNetwork } from 'nebenan-redux-tools/lib/network';\n\nconfigureNetwork({\n  locale: 'de-DE',\n  ...otherSettings\n})\n```\n\nOverwrite:\n```js\ndispatch({\n  type: \"some-type\",\n  request: {\n    url: \"/some/endpoint\",\n    locale: \"en-US\"  \n  }\n})\n```\n\n## Should Request\n\nPrevents unnecessary requests by checking state beforehand. \n\n```js\ndispatch({\n  type: \"some-type\",\n  request: {\n    url: \"/some/endpoint\",\n    shouldRequest(state) {\n     return !state.isFetched;\n    }\n  }\n})\n```\n\n## Aborting\n\nAllows to cancel running requests. Just pass in a [AbortSignal](https://developer.mozilla.org/en-US/docs/Web/API/AbortSignal).\n\n```js\nconst controller = new AbortController();\n\ndispatch({\n  type: \"some-type\",\n  request: {\n    url: \"/some/endpoint\",\n    signal: controller.signal,\n  }\n})\n\n\n// later in app\ncontroller.abort();\n\n```\n\n## Request Types\n\n`request.type` determines used HTTP method\n\n### `query`\n\nSends out GET request. Collects parameters from `request.query` and applies [pagination](#pagination) query options if there are any.\n\n```js\ndispatch({\n  type: \"some-type\",\n  request: {\n     url: \"/users\",\n     type: 'query',\n     query: { q: 'Peter' } \n  }\n})\n```\n\n\n### `delete` / `post` / `put`\n\n```js\ndispatch({\n  type: \"some-type\",\n  request: {\n    url: \"/some/endpoint/123\",\n    type: 'put',\n    payload: { user: { email, password }}\n  }  \n})\n```\n\n\n## Pagination\n\nThere is some boilerplate needed to fully support paginated lists loaded over the network. These helpers help with managing state and sending pagination params over the network.\n\nThe endpoint you are accessing needs to fulfill following requirements:\n- Parameters\n  - `per_page`\n  - `lower` / `higher`\n- Response\n  - `total_count` (`state.total` needs to be updated manually if field does not exist)\n\n### `assignPaginationDefaults` / `paginationGenerator` helpers\n\n```js\nimport { paginationGenerator, assignPaginationDefaults } from 'nebenan-redux-tools/lib/network/pagination';\n\nconst getDefaultState = () => assignPaginationDefaults({ entities: {} });\nconst getPaginationUpdates = paginationGenerator(types.BOOKMARKS_FETCH);\n\nexport const reducer = (state = getDefaultState(), action) => {\n  let newState = state;\n  \n  const update = getPaginationUpdates(newState, action);\n  if (update) newState = updeep(update, newState);\n  \n  switch (action.type) {\n    case resolved(types.BOOKMARKS_FETCH): {\n      const { result, entities } = parse(action.payload);\n\n      const collection = newState.collection.concat(result.bookmarks);\n\n      return updeep({ collection, entities }, newState);\n    }\n    \n    default: {\n      return newState;\n    }\n  }\n}\n```\n\nThe state now holds the following information\n```js\n{\n  // (managed by paginationGenerator)\n  currentPage: 0, \n  // datetime of last fetch (managed by paginationGenerator)\n  lastFetched: 0,\n  // request in progress (managed by paginationGenerator)\n  isFetching: false,\n  // request failed (managed by paginationGenerator) \n  isFailed: false,  \n  // total amount of items over all pages (managed by paginationGenerator)\n  total: null,\n  // item ids for current page  \n  collection: [],\n}\n```\n\n### Actions\n\nPagination query params will be added for `query` requests with either `request.pagination.first` or `request.pagination.last` set.\n\n*Only works for endpoints supporting `lower`/`higher` params.*\n\n```js\ndispatch({\n  type: types.GET_USERS,\n  request: {\n    url: \"/users\",\n    type: 'query',\n    pagination: {\n      per_page: 10, // optional\n      first: firstUserId, // optional\n      last: lastUserId // optional\n    }\n  }\n})\n```\n\n## Mock Response\n\nResponses can be mocked by using the [promise middleware](#promise-middleware). You can keep all of your request options in the action and don't need to modify reducers. Quite useful during development if you are waiting for backend to support new endpoints.\n\n\n```js\ndispatch({\n  type: types.GET_USERS,\n  promise: Promise.resolve([\n    {\n      id: 1,\n      name: \"Peter\"\n    },\n    {\n      id: 2,\n      name: \"Christina\"\n    }\n  ]),\n  request: {\n    url: \"/users\",\n    type: 'query'\n  }\n})\n```\n\n```js\n// reducer\nimport { resolved } from 'nebenan-redux-tools/lib/network/types';\n\nexport default (state = getDefaultState(), action) => {\n  switch(action.type) {\n    case resolved(types.GET_USERS): {\n      const usersFromResponse = action.payload;\n      \n      return { ...state, users: usersFromResponse };\n    }\n    \n    default: {\n      return state;\n    }\n  }\n} \n```\n\n## Standalone Request\n\nRequests can be created programmatically too.\n\n```js\nimport { createRequest } from 'nebenan-redux-tools/lib/network';\n\nconst sendFile = (file, token) => (\n  createRequest({\n    token,\n    payload: { file },\n    url: '/file-upload',\n    type: 'post',\n    multipart: true,\n  }) \n)\n\nconst handleSuccess = (payload) => {\n  // same as action.payload\n  console.log(payload);\n}\n\nsendFile(newFile, token).then(handleSuccess);\n```\n\n## Customize\n\nThe network layer uses [axios](https://github.com/axios/axios) under the hood. To access axios specific features or extend functionality you can hook into request / response generation on a global or local scale.\n\nHooks:\n- `requestHook(requestConfig, requestOptions)`\n  - `requestConfig` the [axios request config](https://github.com/axios/axios#request-config) to be mutated\n  - `requestOptions` the `request` object provided inside the action\n- `responseHook(body, requestConfig, requestOptions)`\n  - `body` response data to be mutated\n  - `requestConfig` the [axios request config](https://github.com/axios/axios#request-config)\n  - `requestOptions` the `request` object provided inside the action\n  \n### Setup global hooks\n\n```js\nimport { configureNetwork } from 'nebenan-redux-tools/lib/network';\n\nconfigureNetwork({\n  requestHook: (requestConfig, requestOptions) => {\n    // ...\n  },\n  responseHook: (body, requestConfig, requestOptions) => {\n    // ...\n  },\n  ...networkSettings\n})\n```\n\n### Action level request hook\n\n```js\nimport { createRequest } from 'nebenan-redux-tools/lib/network';\n\nconst sendFile = (file, token, onProgress) => (\n  createRequest({\n    token,\n    payload: { file },\n    url: '/file-upload',\n    type: 'post',\n    multipart: true,\n    // same as requestHook\n    customize: (requestConfig) => {\n      requestConfig.onUploadProgress = onProgress;\n    }\n  })\n)\n```\n\n","gitHead":"5d80d0abf4af099b29804b6c13ad1aca89a5f144","scripts":{"lint":"eslint --ext .es,.js ./","test":"npm run compile && TZ='GMT' mocha \"test/**/*.js\"","yalc":"npm run build && yalc push","build":"npm run compile","check":"npm test && npm run lint && echo \"\\033[0;32mReady to publish\\033[0m\"","clean":"rm -rf ./lib/ || exit 1","compile":"NODE_ENV=production babel src --out-dir lib --copy-files","reinstall":"rm -rf node_modules package-lock.json && npm install","lint:tofile":"eslint --ext .es,.js --no-color -o ./eslint-report.log ./","test:tofile":"npm run compile && TZ='GMT' mocha --no-colors -R spec \"test/**/*.js\" 2>&1 | tee test-report.log","prepublishOnly":"npm run check && npm run clean && npm run build"},"_npmUser":{"name":"peterhassler","email":"peter.h@nebenan.de"},"deprecated":"Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.","repository":{"url":"git+https://github.com/good-hood-gmbh/nebenan-redux-tools.git","type":"git"},"_npmVersion":"8.13.2","description":"A set of redux helpers","directories":{},"_nodeVersion":"17.3.0","dependencies":{"qs":"^6.11.0","axios":"^0.22.0","react":"^17.0.2","lodash":"^4.17.21","updeep":"^1.2.1","js-cookie":"^3.0.1","react-dom":"^17.0.2","react-redux":"^7.2.6","local-storage-adapter":"^2.0.0","escape-string-regexp-browser":"^1.1.0"},"_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"chai":"^4.3.6","mocha":"^9.2.2","sinon":"^13.0.2","eslint":"^8.24.0","@babel/cli":"^7.19.3","@babel/core":"^7.19.3","@babel/runtime":"^7.19.0","@babel/preset-env":"^7.19.3","eslint-config-nebenan-base":"^2.0.1","browserslist-config-nebenan":"^1.0.0","@babel/plugin-transform-runtime":"^7.19.1","babel-plugin-add-module-exports":"^1.0.4","@babel/plugin-proposal-json-strings":"^7.18.6","@babel/plugin-transform-strict-mode":"^7.18.6"},"_npmOperationalInternal":{"tmp":"tmp/nebenan-redux-tools_6.4.0-beta.3_1666277496632_0.7673517432387709","host":"s3://npm-registry-packages"}},"6.4.0-beta.4":{"name":"nebenan-redux-tools","version":"6.4.0-beta.4","author":{"name":"Nebenan.de","email":"max@nebenan.de"},"license":"SEE LICENSE IN LICENSE FILE","_id":"nebenan-redux-tools@6.4.0-beta.4","maintainers":[{"name":"rejas","email":"npm@veeck.de"},{"name":"iamuchejude","email":"iamuchejude@gmail.com"},{"name":"eliasbraun","email":"elias.braun@nebenan.de"},{"name":"peterhassler","email":"peter.h@nebenan.de"},{"name":"ozerovs","email":"ozerovsa@gmail.com"},{"name":"suprmax","email":"max@degterev.me"}],"homepage":"https://nebenan.de/","bugs":{"url":"https://github.com/good-hood-gmbh/nebenan-redux-tools/issues"},"dist":{"shasum":"ac950a05f40ec98855437543e36d336e30176f1f","tarball":"https://registry.npmjs.org/nebenan-redux-tools/-/nebenan-redux-tools-6.4.0-beta.4.tgz","fileCount":27,"integrity":"sha512-iDN0DNvukUNYoEYAx7l8KqfCJyMs8SnLPpvEoqeNr6uYx8Py3iTXiQSnVPOt/ASeeQgYbcOLBvCMHzgwOVwlUg==","signatures":[{"sig":"MEQCIEqyT5ALFGVfiCFjN6V9T0azcraQZucfiMltK3+hMoC2AiATyicH9kOuo7UMeImZ5p/MUztJeEpnlgCPmPPi+/LbrA==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":47509,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjUWLRACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmqPtxAAmEEEDElzpxKYHaYVDgScO4MqX1qCAoFu9mG7FlAdq3o9e0ti\r\npHu0Is3Jf7WNOXNIfWfHE+xLLe2081yTqy5AaabkLW71oipaQ+M1sNY+g2O1\r\nXuHfUIqjEeZur7IQPMnrdKgjumBNiYSn0oziUCAX/AvFR/CI2FKLLKqKKSiQ\r\njaa+N0SWW7OR7Lms0JJk1HHCm+7QhlXT9KHfgPSVXGRuTc3rH3DrYOXQmEwR\r\nup2Loz6k8uur/c50EPBkBZPjpgfcqk0s0B0OStFkcnmeOje8OA2jtscshXCg\r\nHqryZMGd9WcKbMe56R8NS9bB/MxZznKmyElWsqk9Zz+rPSYxacRpO93vbX17\r\nD0DNx3yZ2sHKxIDblz3WcTP5UE5fGGqxerTz03OyFBK6CV1iN5wHRl1T+JOj\r\nfWWPyPHbOGroNJ+XuMaB+barbwSh34XJY39Fk0Z6rKHtFfIgv9qnEf6GuYXN\r\nk42Zj7oftVpL4DUVORF2SPujYV5aYcCm2DiIbz9AwNAeInyRYDvRhnSLXMD+\r\n19Gt6nrj7Ia1mbnud27S2hjZnpENvHkvG+8rDNBHfz+3Aw3MBKyw2ZgjYGus\r\nrCU3R49pMQ/sjpWj86dzeezeZspl+FKdHxF4TKRWtNrR5CJ8bBWS3i/D4V+8\r\neOKJ555EjAdqQxnNDlwjvwGtYL0xIMaPJfQ=\r\n=Bt5L\r\n-----END PGP SIGNATURE-----\r\n"},"readme":"nebenan-redux-tools\n====================\n\nA set of redux helpers.\n\n- [Experiments Middleware](#experiments-middleware)\n- [Token Middleware](#token-middleware)\n- [Promise Middleware](#promise-middleware)\n- [Network Middleware](#network-middleware)\n  - [Trustworthy Endpoints](#trustworthy-endpoints)\n  - [API Token](#api-token)\n  - [X-Translations-Lang Header](#x-translations-lang-header)\n  - [Should Request](#should-request)\n  - [Abort Callback](#abort-callback)\n  - [Request Types](#request-types)\n  - [Pagination](#pagination)\n  - [Mock Responses](#mock-response)\n  - [Standalone Request](#standalone-request)\n  - [Customize](#customize)\n  \n# Experiments Middleware\n## Setup\n\n**NOT COMPLETE**\n```js\nimport { reducer as experiments } from 'nebenan-redux-tools/lib/experiments/state';\n\nconst reducers = { \n  // It is assumed that the experiment reducer's state\n  // is available under `state.experiments`\n  experiments \n};\n\n// ...\n\nconst createFromState = (initialState) => (\n  createStore(\n    combineReducers(reducers),\n    initialState,\n    composeEnhancers(applyMiddleware(...middleware)),\n  )\n);\n\nexport default createFromState\n```\n\n# Token Middleware\n## Setup\n**NOT COMPLETE**\n```js\nimport { reducer as token } from 'nebenan-redux-tools/lib/token';\n\nconst reducers = {\n  // It is assumed that the experiment reducer's state\n  // is available under `state.token`\n  token\n};\n\n// ...\n\nconst createFromState = (initialState) => (\n  createStore(\n    combineReducers(reducers),\n    initialState,\n    composeEnhancers(applyMiddleware(...middleware)),\n  )\n);\n\nexport default createFromState\n```\n  \n# Promise Middleware\nThe promise middleware gets triggered by dispatching actions with `promise` key in payload. The middleware will dispatch resolved or rejected actions when the promise is fulfilled.\n\n```js\ndispatch({\n  type: types.GET_USERS,\n  promise: {\n    getPromise: () => getUsersFromStorageAsync(),\n    \n    // Ensures the returned promise by the dispatched action to resolve even if the provided promise rejected\n    // graceful: true\n  }\n})\n```\n\n```js\n// reducer\nimport { resolved, rejected } from 'nebenan-redux-tools/lib/promise';\n\nexport default (state = getDefaultState(), action) => {\n  switch(action.type) {\n    case resolved(types.GET_USERS): {\n      const usersFromStorage = action.payload;\n\n      return { ...state, users: usersFromStorage };\n    }\n\n    case rejected(types.GET_USERS): {\n      const usersFromStorage = [];\n\n      return { ...state, users: usersFromStorage };\n    }\n\n    default: {\n      return state;\n    }\n  }\n} \n```\n\n\n## Should Execute\n\nPrevents unnecessary promise executions by checking state beforehand. Dispatches resolved action on prevented execution.\n\n```js\ndispatch({\n  type: types.GET_USERS,\n  promise: {\n    getPromise: () => getUsersFromStorageAsync(),\n    shouldExecute: (state) => !state.isFetched,\n  }\n})\n```\n\n# Network Middleware\n\nThe network middleware gets triggered by dispatching actions with `request` in payload. The middleware will fire the request and dispatches resolved or rejected actions when the request is finished.\n\nExample:\n\n```js\ndispatch({\n  type: types.GET_USERS,\n  request: {\n    url: \"/users\"\n  }\n})\n```\n\n```js\nimport { resolved, rejected } from 'nebenan-redux-tools/lib/network/types';\n\nexport default (state = getDefaultState(), action) => {\n  switch(action.type) {\n    case resolved(types.GET_USERS): {\n      const usersFromResponse = action.payload;\n      \n      return { ...state, users: usersFromResponse };\n    }\n    \n    case rejected(types.GET_USERS): {\n      const usersFromResponse = [];\n      \n      return { ...state, users: usersFromResponse };\n    }\n    \n    default: {\n      return state;\n    }\n  }\n} \n```\n\n## Trustworthy Endpoints\n\nRequests to trustworthy endpoints will enable the [X-Translations-Lang Header](#x-translations-lang-header) and [API Token](#api-token) features.\n\nSet trusted domain via global config:\n```js\nimport { configureNetwork } from 'nebenan-redux-tools/lib/network';\n\nconfigureNetwork({\n  trustedDomain: \"nebenan.de\",\n  ...otherSettings\n})\n```\n\n## API Token\n\nRequests to [trustworthy endpoints](#trustworthy-endpoints) will have the `X-AUTH-TOKEN` header set, containing the api token configured in request options or through token middleware. \n\nDefault: `state.token` (see token middleware)\n\nOverwrite:\n```js\ndispatch({\n  type: \"some-type\", \n  request: {\n    url: \"/some/endpoint\",\n    token: \"special-api-token\"\n  }\n})\n```\n\n## X-Translations-Lang Header\n\nRequests to [trustworthy endpoints](#trustworthy-endpoints) will have the `X-Translations-Lang` header set, containing the locale configured in request options or through global config.\n\nDefault via global config: \n```js\nimport { configureNetwork } from 'nebenan-redux-tools/lib/network';\n\nconfigureNetwork({\n  locale: 'de-DE',\n  ...otherSettings\n})\n```\n\nOverwrite:\n```js\ndispatch({\n  type: \"some-type\",\n  request: {\n    url: \"/some/endpoint\",\n    locale: \"en-US\"  \n  }\n})\n```\n\n## Should Request\n\nPrevents unnecessary requests by checking state beforehand. \n\n```js\ndispatch({\n  type: \"some-type\",\n  request: {\n    url: \"/some/endpoint\",\n    shouldRequest(state) {\n     return !state.isFetched;\n    }\n  }\n})\n```\n\n## Aborting\n\nAllows to cancel running requests. Just pass in a [AbortSignal](https://developer.mozilla.org/en-US/docs/Web/API/AbortSignal).\n\n```js\nconst controller = new AbortController();\n\ndispatch({\n  type: \"some-type\",\n  request: {\n    url: \"/some/endpoint\",\n    signal: controller.signal,\n  }\n})\n\n\n// later in app\ncontroller.abort();\n\n```\n\n## Request Types\n\n`request.type` determines used HTTP method\n\n### `query`\n\nSends out GET request. Collects parameters from `request.query` and applies [pagination](#pagination) query options if there are any.\n\n```js\ndispatch({\n  type: \"some-type\",\n  request: {\n     url: \"/users\",\n     type: 'query',\n     query: { q: 'Peter' } \n  }\n})\n```\n\n\n### `delete` / `post` / `put`\n\n```js\ndispatch({\n  type: \"some-type\",\n  request: {\n    url: \"/some/endpoint/123\",\n    type: 'put',\n    payload: { user: { email, password }}\n  }  \n})\n```\n\n\n## Pagination\n\nThere is some boilerplate needed to fully support paginated lists loaded over the network. These helpers help with managing state and sending pagination params over the network.\n\nThe endpoint you are accessing needs to fulfill following requirements:\n- Parameters\n  - `per_page`\n  - `lower` / `higher`\n- Response\n  - `total_count` (`state.total` needs to be updated manually if field does not exist)\n\n### `assignPaginationDefaults` / `paginationGenerator` helpers\n\n```js\nimport { paginationGenerator, assignPaginationDefaults } from 'nebenan-redux-tools/lib/network/pagination';\n\nconst getDefaultState = () => assignPaginationDefaults({ entities: {} });\nconst getPaginationUpdates = paginationGenerator(types.BOOKMARKS_FETCH);\n\nexport const reducer = (state = getDefaultState(), action) => {\n  let newState = state;\n  \n  const update = getPaginationUpdates(newState, action);\n  if (update) newState = updeep(update, newState);\n  \n  switch (action.type) {\n    case resolved(types.BOOKMARKS_FETCH): {\n      const { result, entities } = parse(action.payload);\n\n      const collection = newState.collection.concat(result.bookmarks);\n\n      return updeep({ collection, entities }, newState);\n    }\n    \n    default: {\n      return newState;\n    }\n  }\n}\n```\n\nThe state now holds the following information\n```js\n{\n  // (managed by paginationGenerator)\n  currentPage: 0, \n  // datetime of last fetch (managed by paginationGenerator)\n  lastFetched: 0,\n  // request in progress (managed by paginationGenerator)\n  isFetching: false,\n  // request failed (managed by paginationGenerator) \n  isFailed: false,  \n  // total amount of items over all pages (managed by paginationGenerator)\n  total: null,\n  // item ids for current page  \n  collection: [],\n}\n```\n\n### Actions\n\nPagination query params will be added for `query` requests with either `request.pagination.first` or `request.pagination.last` set.\n\n*Only works for endpoints supporting `lower`/`higher` params.*\n\n```js\ndispatch({\n  type: types.GET_USERS,\n  request: {\n    url: \"/users\",\n    type: 'query',\n    pagination: {\n      per_page: 10, // optional\n      first: firstUserId, // optional\n      last: lastUserId // optional\n    }\n  }\n})\n```\n\n## Mock Response\n\nResponses can be mocked by using the [promise middleware](#promise-middleware). You can keep all of your request options in the action and don't need to modify reducers. Quite useful during development if you are waiting for backend to support new endpoints.\n\n\n```js\ndispatch({\n  type: types.GET_USERS,\n  promise: Promise.resolve([\n    {\n      id: 1,\n      name: \"Peter\"\n    },\n    {\n      id: 2,\n      name: \"Christina\"\n    }\n  ]),\n  request: {\n    url: \"/users\",\n    type: 'query'\n  }\n})\n```\n\n```js\n// reducer\nimport { resolved } from 'nebenan-redux-tools/lib/network/types';\n\nexport default (state = getDefaultState(), action) => {\n  switch(action.type) {\n    case resolved(types.GET_USERS): {\n      const usersFromResponse = action.payload;\n      \n      return { ...state, users: usersFromResponse };\n    }\n    \n    default: {\n      return state;\n    }\n  }\n} \n```\n\n## Standalone Request\n\nRequests can be created programmatically too.\n\n```js\nimport { createRequest } from 'nebenan-redux-tools/lib/network';\n\nconst sendFile = (file, token) => (\n  createRequest({\n    token,\n    payload: { file },\n    url: '/file-upload',\n    type: 'post',\n    multipart: true,\n  }) \n)\n\nconst handleSuccess = (payload) => {\n  // same as action.payload\n  console.log(payload);\n}\n\nsendFile(newFile, token).then(handleSuccess);\n```\n\n## Customize\n\nThe network layer uses [axios](https://github.com/axios/axios) under the hood. To access axios specific features or extend functionality you can hook into request / response generation on a global or local scale.\n\nHooks:\n- `requestHook(requestConfig, requestOptions)`\n  - `requestConfig` the [axios request config](https://github.com/axios/axios#request-config) to be mutated\n  - `requestOptions` the `request` object provided inside the action\n- `responseHook(body, requestConfig, requestOptions)`\n  - `body` response data to be mutated\n  - `requestConfig` the [axios request config](https://github.com/axios/axios#request-config)\n  - `requestOptions` the `request` object provided inside the action\n  \n### Setup global hooks\n\n```js\nimport { configureNetwork } from 'nebenan-redux-tools/lib/network';\n\nconfigureNetwork({\n  requestHook: (requestConfig, requestOptions) => {\n    // ...\n  },\n  responseHook: (body, requestConfig, requestOptions) => {\n    // ...\n  },\n  ...networkSettings\n})\n```\n\n### Action level request hook\n\n```js\nimport { createRequest } from 'nebenan-redux-tools/lib/network';\n\nconst sendFile = (file, token, onProgress) => (\n  createRequest({\n    token,\n    payload: { file },\n    url: '/file-upload',\n    type: 'post',\n    multipart: true,\n    // same as requestHook\n    customize: (requestConfig) => {\n      requestConfig.onUploadProgress = onProgress;\n    }\n  })\n)\n```\n\n","gitHead":"5d80d0abf4af099b29804b6c13ad1aca89a5f144","scripts":{"lint":"eslint --ext .es,.js ./","test":"npm run compile && TZ='GMT' mocha \"test/**/*.js\"","yalc":"npm run build && yalc push","build":"npm run compile","check":"npm test && npm run lint && echo \"\\033[0;32mReady to publish\\033[0m\"","clean":"rm -rf ./lib/ || exit 1","compile":"NODE_ENV=production babel src --out-dir lib --copy-files","reinstall":"rm -rf node_modules package-lock.json && npm install","lint:tofile":"eslint --ext .es,.js --no-color -o ./eslint-report.log ./","test:tofile":"npm run compile && TZ='GMT' mocha --no-colors -R spec \"test/**/*.js\" 2>&1 | tee test-report.log","prepublishOnly":"npm run check && npm run clean && npm run build"},"_npmUser":{"name":"peterhassler","email":"peter.h@nebenan.de"},"deprecated":"Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.","repository":{"url":"git+https://github.com/good-hood-gmbh/nebenan-redux-tools.git","type":"git"},"_npmVersion":"8.13.2","description":"A set of redux helpers","directories":{},"_nodeVersion":"17.3.0","dependencies":{"qs":"^6.11.0","axios":"^0.22.0","react":"^17.0.2","lodash":"^4.17.21","updeep":"^1.2.1","js-cookie":"^3.0.1","react-dom":"^17.0.2","react-redux":"^7.2.6","local-storage-adapter":"^2.0.0","escape-string-regexp-browser":"^1.1.0"},"_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"chai":"^4.3.6","mocha":"^9.2.2","sinon":"^13.0.2","eslint":"^8.24.0","@babel/cli":"^7.19.3","@babel/core":"^7.19.3","@babel/runtime":"^7.19.0","@babel/preset-env":"^7.19.3","eslint-config-nebenan-base":"^2.0.1","browserslist-config-nebenan":"^1.0.0","@babel/plugin-transform-runtime":"^7.19.1","babel-plugin-add-module-exports":"^1.0.4","@babel/plugin-proposal-json-strings":"^7.18.6","@babel/plugin-transform-strict-mode":"^7.18.6"},"_npmOperationalInternal":{"tmp":"tmp/nebenan-redux-tools_6.4.0-beta.4_1666278097733_0.06978327238216808","host":"s3://npm-registry-packages"}},"6.4.0":{"name":"nebenan-redux-tools","version":"6.4.0","author":{"name":"Nebenan.de","email":"max@nebenan.de"},"license":"SEE LICENSE IN LICENSE FILE","_id":"nebenan-redux-tools@6.4.0","maintainers":[{"name":"rejas","email":"npm@veeck.de"},{"name":"iamuchejude","email":"iamuchejude@gmail.com"},{"name":"eliasbraun","email":"elias.braun@nebenan.de"},{"name":"peterhassler","email":"peter.h@nebenan.de"},{"name":"ozerovs","email":"ozerovsa@gmail.com"},{"name":"suprmax","email":"max@degterev.me"}],"homepage":"https://nebenan.de/","bugs":{"url":"https://github.com/good-hood-gmbh/nebenan-redux-tools/issues"},"dist":{"shasum":"11d3415b39281ae31c3fd1784b0ed46f556f63d2","tarball":"https://registry.npmjs.org/nebenan-redux-tools/-/nebenan-redux-tools-6.4.0.tgz","fileCount":27,"integrity":"sha512-AHXSp+arz6KbqFOj8v4EpF+QhyaTtyavMx1yHRuG4KUqSCsk1QTVFK7blY1JiWfn/q9duDupDbk/rqVigGGdqg==","signatures":[{"sig":"MEQCIH4/HCtn0OnXR4XKS0WbFw8G3i72UtAdfVgLXg9z9bktAiBKlsXpVknqK4gASqt11Hw4ie7Fsh8KjgnxvWH8IIDRbA==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":47650,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjX6dvACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmrj2w/+KCayebtLsRMmkkwN9TNwVyWSow8Q+tr71zkkaDNtlaFnHccu\r\n3EBXQT0y14yMcEFhzCs/Wv4mRuvKU9VXRtbl3ewD8ZmTbJoS7VMUa9Q98Hr+\r\nzCUjtDPYFSu0qHigcZhtmXO13Csa1unZa4hzGWXcRP4J4vR5QJtyfdpdq9gC\r\nhPVvDA/CCO7RoXjI+3Ls4WI/wasQYfwO+yd282UAV+J+ALYOD3b6Haw86VYM\r\n7cB7OY0ACwg8nTydcVNnArhzysz9N6Quc+MnSz4gcFARD/TPfW18Iw9uRAnZ\r\nH10xotHoJj38LQbev2umKF6bMtnStOvJ6ExojYCzVFJ1dkPMqr1lKeB/AEC7\r\nV9VcxX4ztBDRdJl4Q8v5dH7xipWjtLzjCxU5Y3aHt45pAjwTuJNJ7En4tiVh\r\nvo698aNs+UuOvyAOY7FX0hJZBsEAnbYS6/nTUzX3vbEY1dfnoEZjW34M0DG2\r\niELqpMK/AcFcRhM0h2R1xpE/zFUOEsOOnQpWuLphL+Qdm5Z+kSji8qbhxtzZ\r\nRGtfwevo36kI6WtFDkw2USjSN9W/78773X+l1tStRxJL5RkFRjDexRKaR6IU\r\nqK4X/glBzIQXLXIselITGEh3+YZg3hFsyPKIlOh3KoC7asyf43hDuuDbs4Iv\r\nBtI7YL8ln6qcZxmz+VPH5atypmd0XdHLACo=\r\n=kC0m\r\n-----END PGP SIGNATURE-----\r\n"},"gitHead":"6ecf5078548b8575bfe16b736e7d2b86038202ef","scripts":{"lint":"eslint --ext .es,.js ./","test":"npm run compile && TZ='GMT' mocha \"test/**/*.js\"","yalc":"npm run build && yalc push","build":"npm run compile","check":"npm test && npm run lint && echo \"\\033[0;32mReady to publish\\033[0m\"","clean":"rm -rf ./lib/ || exit 1","compile":"NODE_ENV=production babel src --out-dir lib --copy-files","reinstall":"rm -rf node_modules package-lock.json && npm install","lint:tofile":"eslint --ext .es,.js --no-color -o ./eslint-report.log ./","test:tofile":"npm run compile && TZ='GMT' mocha --no-colors -R spec \"test/**/*.js\" 2>&1 | tee test-report.log","prepublishOnly":"npm run check && npm run clean && npm run build"},"_npmUser":{"name":"peterhassler","email":"peter.h@nebenan.de"},"deprecated":"Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.","repository":{"url":"git+https://github.com/good-hood-gmbh/nebenan-redux-tools.git","type":"git"},"_npmVersion":"8.15.0","description":"A set of redux helpers","directories":{},"_nodeVersion":"16.17.0","dependencies":{"qs":"^6.11.0","axios":"^0.22.0","react":"^17.0.2","lodash":"^4.17.21","updeep":"^1.2.1","js-cookie":"^3.0.1","react-dom":"^17.0.2","react-redux":"^7.2.6","local-storage-adapter":"^2.0.0","escape-string-regexp-browser":"^1.1.0"},"_hasShrinkwrap":false,"devDependencies":{"chai":"^4.3.6","mocha":"^9.2.2","sinon":"^13.0.2","eslint":"^8.24.0","@babel/cli":"^7.19.3","@babel/core":"^7.19.3","@babel/runtime":"^7.19.0","@babel/preset-env":"^7.19.3","eslint-config-nebenan-base":"^2.0.1","browserslist-config-nebenan":"^1.0.0","@babel/plugin-transform-runtime":"^7.19.1","babel-plugin-add-module-exports":"^1.0.4","@babel/plugin-proposal-json-strings":"^7.18.6","@babel/plugin-transform-strict-mode":"^7.18.6"},"_npmOperationalInternal":{"tmp":"tmp/nebenan-redux-tools_6.4.0_1667213167602_0.5778853035571472","host":"s3://npm-registry-packages"}},"6.5.0-beta.0":{"name":"nebenan-redux-tools","version":"6.5.0-beta.0","author":{"name":"Nebenan.de","email":"max@nebenan.de"},"license":"SEE LICENSE IN LICENSE FILE","_id":"nebenan-redux-tools@6.5.0-beta.0","maintainers":[{"name":"rejas","email":"npm@veeck.de"},{"name":"iamuchejude","email":"iamuchejude@gmail.com"},{"name":"eliasbraun","email":"elias.braun@nebenan.de"},{"name":"peterhassler","email":"peter.h@nebenan.de"},{"name":"ozerovs","email":"ozerovsa@gmail.com"},{"name":"suprmax","email":"max@degterev.me"}],"homepage":"https://nebenan.de/","bugs":{"url":"https://github.com/good-hood-gmbh/nebenan-redux-tools/issues"},"dist":{"shasum":"c7895c0fdb059897925dd1d30ace39175b61e101","tarball":"https://registry.npmjs.org/nebenan-redux-tools/-/nebenan-redux-tools-6.5.0-beta.0.tgz","fileCount":27,"integrity":"sha512-NgLGCydtBoyQ55vygQKWWokEzQDvXNpeaQE2szrnZmnSPPUECzMkpm1n80I1nPcmVKDyOoIYj/l3X/Y/XGbhMg==","signatures":[{"sig":"MEQCIAToSgj7h3bUAMvXOpyyZHD3xEbY5sx0tK+CUQCJHlUIAiAf4h3engNjpv9ZhmJQ/XvjS3snZvu/9Fq2SP40P6mKMQ==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":47837,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjao8/ACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmoF3A/9EoOxB3EmolHQnxB5UjIHPzsSNr8KzlfuTJiMvv6MoqwoDRBf\r\nTPwdWW2Mroe0nJI47r4kJOUJMXrbSBlkaKJ3mn8qJTfkZj0XnbE1sz9jtuBR\r\nCusS72FCdElBdE9uXFOaqoUufqHKOicCDyc6XM9iUQBVVtN4prd1pn61wWg5\r\n9YE9kUZbbMX4VJYm8u0lv/wv88j7LvjCiLBmITmBkim/7eOKfMzjVaRnwIkj\r\naruAxlcEs8MGO85XAfnrKw7bscjc3syPrM+QuCCqaHKDkEcm1nzsBF+hMoo1\r\n7zdeds6sFtqG1/rcVnabH9/ZtB6Gnr1SDFKYpfcUcAkAQ9tzqciRazp+wFpf\r\nSC/qY629g9t5FOY0vlPV4M1R8H0xFQwnxWoIN7qB41sWkdT6xbWZauiLDChq\r\nmNIrZkZWHGhjhzmn3cl8dAk7wIHIiDSvH37lpuT8labsV1vnGiweBQOKPGTg\r\n8nQpgzH38n3cqNuNv34PQip1Sk4b5rnkWkXXI7rYgDXRUkOZrxEccV9RcDnY\r\nG2cAWlN5n5Sd3VV6roneM8FgLSlES4eaiuZLIb/p+PpqkeT+NFxwZVsPYiSZ\r\nMcckRHYFUcfv195KwUI36dVUtQTIOERsorYgV/1FDkb+eAUECSzczdhPLeaX\r\nHDXbDcwpBSXnQlypLLu++mFDRsy9tcqvV4s=\r\n=ht9x\r\n-----END PGP SIGNATURE-----\r\n"},"readme":"nebenan-redux-tools\n====================\n\nA set of redux helpers.\n\n- [Experiments Middleware](#experiments-middleware)\n- [Token Middleware](#token-middleware)\n- [Promise Middleware](#promise-middleware)\n- [Network Middleware](#network-middleware)\n  - [Trustworthy Endpoints](#trustworthy-endpoints)\n  - [API Token](#api-token)\n  - [X-Translations-Lang Header](#x-translations-lang-header)\n  - [Should Request](#should-request)\n  - [Abort Callback](#aborting)\n  - [Request Types](#request-types)\n  - [Pagination](#pagination)\n  - [Mock Responses](#mock-response)\n  - [Standalone Request](#standalone-request)\n  - [Customize](#customize)\n  \n# Experiments Middleware\n## Setup\n\n**NOT COMPLETE**\n```js\nimport { reducer as experiments } from 'nebenan-redux-tools/lib/experiments/state';\n\nconst reducers = { \n  // It is assumed that the experiment reducer's state\n  // is available under `state.experiments`\n  experiments \n};\n\n// ...\n\nconst createFromState = (initialState) => (\n  createStore(\n    combineReducers(reducers),\n    initialState,\n    composeEnhancers(applyMiddleware(...middleware)),\n  )\n);\n\nexport default createFromState\n```\n\n# Token Middleware\n## Setup\n**NOT COMPLETE**\n```js\nimport { reducer as token } from 'nebenan-redux-tools/lib/token';\n\nconst reducers = {\n  // It is assumed that the experiment reducer's state\n  // is available under `state.token`\n  token\n};\n\n// ...\n\nconst createFromState = (initialState) => (\n  createStore(\n    combineReducers(reducers),\n    initialState,\n    composeEnhancers(applyMiddleware(...middleware)),\n  )\n);\n\nexport default createFromState\n```\n  \n# Promise Middleware\nThe promise middleware gets triggered by dispatching actions with `promise` key in payload. The middleware will dispatch resolved or rejected actions when the promise is fulfilled.\n\n```js\ndispatch({\n  type: types.GET_USERS,\n  promise: {\n    getPromise: () => getUsersFromStorageAsync(),\n    \n    // Ensures the returned promise by the dispatched action to resolve even if the provided promise rejected\n    // graceful: true\n  }\n})\n```\n\n```js\n// reducer\nimport { resolved, rejected } from 'nebenan-redux-tools/lib/promise';\n\nexport default (state = getDefaultState(), action) => {\n  switch(action.type) {\n    case resolved(types.GET_USERS): {\n      const usersFromStorage = action.payload;\n\n      return { ...state, users: usersFromStorage };\n    }\n\n    case rejected(types.GET_USERS): {\n      const usersFromStorage = [];\n\n      return { ...state, users: usersFromStorage };\n    }\n\n    default: {\n      return state;\n    }\n  }\n} \n```\n\n\n## Should Execute\n\nPrevents unnecessary promise executions by checking state beforehand. Dispatches resolved action on prevented execution.\n\n```js\ndispatch({\n  type: types.GET_USERS,\n  promise: {\n    getPromise: () => getUsersFromStorageAsync(),\n    shouldExecute: (state) => !state.isFetched,\n  }\n})\n```\n\n# Network Middleware\n\nThe network middleware gets triggered by dispatching actions with `request` in payload. The middleware will fire the request and dispatches resolved or rejected actions when the request is finished.\n\nExample:\n\n```js\ndispatch({\n  type: types.GET_USERS,\n  request: {\n    url: \"/users\"\n  }\n})\n```\n\n```js\nimport { resolved, rejected } from 'nebenan-redux-tools/lib/network/types';\n\nexport default (state = getDefaultState(), action) => {\n  switch(action.type) {\n    case resolved(types.GET_USERS): {\n      const usersFromResponse = action.payload;\n      \n      return { ...state, users: usersFromResponse };\n    }\n    \n    case rejected(types.GET_USERS): {\n      const usersFromResponse = [];\n      \n      return { ...state, users: usersFromResponse };\n    }\n    \n    default: {\n      return state;\n    }\n  }\n} \n```\n\n## Trustworthy Endpoints\n\nRequests to trustworthy endpoints will enable the [X-Translations-Lang Header](#x-translations-lang-header) and [API Token](#api-token) features.\n\nSet trusted domain via global config:\n```js\nimport { configureNetwork } from 'nebenan-redux-tools/lib/network';\n\nconfigureNetwork({\n  trustedDomain: \"nebenan.de\",\n  ...otherSettings\n})\n```\n\n## API Token\n\nRequests to [trustworthy endpoints](#trustworthy-endpoints) will have the `X-AUTH-TOKEN` header set, containing the api token configured in request options or through token middleware. \n\nDefault: `state.token` (see token middleware)\n\nOverwrite:\n```js\ndispatch({\n  type: \"some-type\", \n  request: {\n    url: \"/some/endpoint\",\n    token: \"special-api-token\"\n  }\n})\n```\n\n## X-Translations-Lang Header\n\nRequests to [trustworthy endpoints](#trustworthy-endpoints) will have the `X-Translations-Lang` header set, containing the locale configured in request options or through global config.\n\nDefault via global config: \n```js\nimport { configureNetwork } from 'nebenan-redux-tools/lib/network';\n\nconfigureNetwork({\n  locale: 'de-DE',\n  ...otherSettings\n})\n```\n\nOverwrite:\n```js\ndispatch({\n  type: \"some-type\",\n  request: {\n    url: \"/some/endpoint\",\n    locale: \"en-US\"  \n  }\n})\n```\n\n## Should Request\n\nPrevents unnecessary requests by checking state beforehand. \n\n```js\ndispatch({\n  type: \"some-type\",\n  request: {\n    url: \"/some/endpoint\",\n    shouldRequest(state) {\n     return !state.isFetched;\n    }\n  }\n})\n```\n\n## Aborting\n\nAllows to cancel running requests. Just pass in a [AbortSignal](https://developer.mozilla.org/en-US/docs/Web/API/AbortSignal).\n\n```js\nconst controller = new AbortController();\n\ndispatch({\n  type: \"some-type\",\n  request: {\n    url: \"/some/endpoint\",\n    signal: controller.signal,\n  }\n})\n\n\n// later in app\ncontroller.abort();\n\n```\n\n## Request Types\n\n`request.type` determines used HTTP method\n\n### `query`\n\nSends out GET request. Collects parameters from `request.query` and applies [pagination](#pagination) query options if there are any.\n\n```js\ndispatch({\n  type: \"some-type\",\n  request: {\n     url: \"/users\",\n     type: 'query',\n     query: { q: 'Peter' } \n  }\n})\n```\n\n\n### `delete` / `post` / `put`\n\n```js\ndispatch({\n  type: \"some-type\",\n  request: {\n    url: \"/some/endpoint/123\",\n    type: 'put',\n    payload: { user: { email, password }}\n  }  \n})\n```\n\n\n## Pagination\n\nThere is some boilerplate needed to fully support paginated lists loaded over the network. These helpers help with managing state and sending pagination params over the network.\n\nThe endpoint you are accessing needs to fulfill following requirements:\n- Parameters\n  - `per_page`\n  - `lower` / `higher`\n- Response\n  - `total_count` (`state.total` needs to be updated manually if field does not exist)\n\n### `assignPaginationDefaults` / `paginationGenerator` helpers\n\n```js\nimport { paginationGenerator, assignPaginationDefaults } from 'nebenan-redux-tools/lib/network/pagination';\n\nconst getDefaultState = () => assignPaginationDefaults({ entities: {} });\nconst getPaginationUpdates = paginationGenerator(types.BOOKMARKS_FETCH);\n\nexport const reducer = (state = getDefaultState(), action) => {\n  let newState = state;\n  \n  const update = getPaginationUpdates(newState, action);\n  if (update) newState = updeep(update, newState);\n  \n  switch (action.type) {\n    case resolved(types.BOOKMARKS_FETCH): {\n      const { result, entities } = parse(action.payload);\n\n      const collection = newState.collection.concat(result.bookmarks);\n\n      return updeep({ collection, entities }, newState);\n    }\n    \n    default: {\n      return newState;\n    }\n  }\n}\n```\n\nThe state now holds the following information\n```js\n{\n  // (managed by paginationGenerator)\n  currentPage: 0, \n  // datetime of last fetch (managed by paginationGenerator)\n  lastFetched: 0,\n  // request in progress (managed by paginationGenerator)\n  isFetching: false,\n  // request failed (managed by paginationGenerator) \n  isFailed: false,  \n  // total amount of items over all pages (managed by paginationGenerator)\n  total: null,\n  // item ids for current page  \n  collection: [],\n}\n```\n\n### Actions\n\nPagination query params will be added for `query` requests with either `request.pagination.first` or `request.pagination.last` set.\n\n*Only works for endpoints supporting `lower`/`higher` params.*\n\n```js\ndispatch({\n  type: types.GET_USERS,\n  request: {\n    url: \"/users\",\n    type: 'query',\n    pagination: {\n      per_page: 10, // optional\n      first: firstUserId, // optional\n      last: lastUserId // optional\n    }\n  }\n})\n```\n\n## Mock Response\n\nResponses can be mocked by using the [promise middleware](#promise-middleware). You can keep all of your request options in the action and don't need to modify reducers. Quite useful during development if you are waiting for backend to support new endpoints.\n\n\n```js\ndispatch({\n  type: types.GET_USERS,\n  promise: Promise.resolve([\n    {\n      id: 1,\n      name: \"Peter\"\n    },\n    {\n      id: 2,\n      name: \"Christina\"\n    }\n  ]),\n  request: {\n    url: \"/users\",\n    type: 'query'\n  }\n})\n```\n\n```js\n// reducer\nimport { resolved } from 'nebenan-redux-tools/lib/network/types';\n\nexport default (state = getDefaultState(), action) => {\n  switch(action.type) {\n    case resolved(types.GET_USERS): {\n      const usersFromResponse = action.payload;\n      \n      return { ...state, users: usersFromResponse };\n    }\n    \n    default: {\n      return state;\n    }\n  }\n} \n```\n\n## Standalone Request\n\nRequests can be created programmatically too.\n\n```js\nimport { createRequest } from 'nebenan-redux-tools/lib/network';\n\nconst sendFile = (file, token) => (\n  createRequest({\n    token,\n    payload: { file },\n    url: '/file-upload',\n    type: 'post',\n    multipart: true,\n  }) \n)\n\nconst handleSuccess = (payload) => {\n  // same as action.payload\n  console.log(payload);\n}\n\nsendFile(newFile, token).then(handleSuccess);\n```\n\n## Customize\n\nThe network layer uses [axios](https://github.com/axios/axios) under the hood. To access axios specific features or extend functionality you can hook into request / response generation on a global or local scale.\n\nHooks:\n- `requestHook(requestConfig, requestOptions)`\n  - `requestConfig` the [axios request config](https://github.com/axios/axios#request-config) to be mutated\n  - `requestOptions` the `request` object provided inside the action\n- `responseHook(body, requestConfig, requestOptions)`\n  - `body` response data to be mutated\n  - `requestConfig` the [axios request config](https://github.com/axios/axios#request-config)\n  - `requestOptions` the `request` object provided inside the action\n  \n### Setup global hooks\n\n```js\nimport { configureNetwork } from 'nebenan-redux-tools/lib/network';\n\nconfigureNetwork({\n  requestHook: (requestConfig, requestOptions) => {\n    // ...\n  },\n  responseHook: (body, requestConfig, requestOptions) => {\n    // ...\n  },\n  ...networkSettings\n})\n```\n\n### Action level request hook\n\n```js\nimport { createRequest } from 'nebenan-redux-tools/lib/network';\n\nconst sendFile = (file, token, onProgress) => (\n  createRequest({\n    token,\n    payload: { file },\n    url: '/file-upload',\n    type: 'post',\n    multipart: true,\n    // same as requestHook\n    customize: (requestConfig) => {\n      requestConfig.onUploadProgress = onProgress;\n    }\n  })\n)\n```\n\n","gitHead":"96370af410f1a27316693dd947ebb5b55aa973cc","scripts":{"lint":"eslint --ext .es,.js ./","test":"npm run compile && TZ='GMT' mocha \"test/**/*.js\"","yalc":"npm run build && yalc push","build":"npm run compile","check":"npm test && npm run lint && echo \"\\033[0;32mReady to publish\\033[0m\"","clean":"rm -rf ./lib/ || exit 1","compile":"NODE_ENV=production babel src --out-dir lib --copy-files","reinstall":"rm -rf node_modules package-lock.json && npm install","lint:tofile":"eslint --ext .es,.js --no-color -o ./eslint-report.log ./","test:tofile":"npm run compile && TZ='GMT' mocha --no-colors -R spec \"test/**/*.js\" 2>&1 | tee test-report.log","prepublishOnly":"npm run check && npm run clean && npm run build"},"_npmUser":{"name":"peterhassler","email":"peter.h@nebenan.de"},"deprecated":"Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.","repository":{"url":"git+https://github.com/good-hood-gmbh/nebenan-redux-tools.git","type":"git"},"_npmVersion":"8.15.0","description":"A set of redux helpers","directories":{},"_nodeVersion":"16.17.0","dependencies":{"qs":"^6.11.0","axios":"^0.22.0","react":"^17.0.2","lodash":"^4.17.21","updeep":"^1.2.1","js-cookie":"^3.0.1","react-dom":"^17.0.2","react-redux":"^7.2.6","local-storage-adapter":"^2.0.0","escape-string-regexp-browser":"^1.1.0"},"_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"chai":"^4.3.6","mocha":"^9.2.2","sinon":"^13.0.2","eslint":"^8.24.0","@babel/cli":"^7.19.3","@babel/core":"^7.19.3","@babel/runtime":"^7.19.0","@babel/preset-env":"^7.19.3","eslint-config-nebenan-base":"^2.0.1","browserslist-config-nebenan":"^1.0.0","@babel/plugin-transform-runtime":"^7.19.1","babel-plugin-add-module-exports":"^1.0.4","@babel/plugin-proposal-json-strings":"^7.18.6","@babel/plugin-transform-strict-mode":"^7.18.6"},"_npmOperationalInternal":{"tmp":"tmp/nebenan-redux-tools_6.5.0-beta.0_1667927870913_0.7434605302822248","host":"s3://npm-registry-packages"}},"6.5.1":{"name":"nebenan-redux-tools","version":"6.5.1","author":{"name":"Nebenan.de","email":"max@nebenan.de"},"license":"SEE LICENSE IN LICENSE FILE","_id":"nebenan-redux-tools@6.5.1","maintainers":[{"name":"rejas","email":"npm@veeck.de"},{"name":"iamuchejude","email":"iamuchejude@gmail.com"},{"name":"eliasbraun","email":"elias.braun@nebenan.de"},{"name":"peterhassler","email":"peter.h@nebenan.de"},{"name":"ozerovs","email":"ozerovsa@gmail.com"},{"name":"suprmax","email":"max@degterev.me"}],"homepage":"https://nebenan.de/","bugs":{"url":"https://github.com/good-hood-gmbh/nebenan-redux-tools/issues"},"dist":{"shasum":"3fb9c3a771f51e8aa41beda8d69883d79d7524d0","tarball":"https://registry.npmjs.org/nebenan-redux-tools/-/nebenan-redux-tools-6.5.1.tgz","fileCount":27,"integrity":"sha512-FQwDyJvkjc8dGJOrlc7qC1uIGNAso+Pw9f6KS3ETzc4x67ZsvtS7f8T3ouglVBqUBR7kdAFPGBUHNngI4jqNlw==","signatures":[{"sig":"MEUCIQDylrjexk+wngStqq6b4kr3jYhi4z8OW1qn2SpLL2m4tAIgeZUiYcYuKJCRAf6X3T3lJXIRXg5tFicPz8nu/r1PaCg=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":47830,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjapLKACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmrnjg/+OmE0gp5GWAP8fbBcSigNFYS0vslzAlsKxs4t/CsiciHED9sc\r\nBTAG3HrRp8MvmcK/UDH4+BGWZuyQAAiZME1kqTqlUtuSqcR0pCmVA7WhJrdN\r\n85REY9xCgYL3PpGJYC9hAC8HrKk3aN2BIcd4zDOFLOJq7KrlBS4C/oLTEApA\r\n3rnknQGhxJOmY4gkq2vRiynN4/PNVkCVnlW5s+CH/r+u6323vpWYCllWNR1J\r\nref7gJ+FwixSxYEaBV8OZwyiYir3KU8Bodh1xfannho2FltfTAyQp566UwWd\r\nNLQ5oGfjG36yukGIlcGr/uXorWrszK7DKKhwGeweK2NQNwRDS7DAUBx2BczJ\r\nGu2gnmMimCFzN/mY3rleykKckOGOgirtBo09BGZ0bxroerMi13iasxOE9TkA\r\ntlIUCFeKwsWuALZSdpANQ1zxCoEvwERyIqpRObXYKuUloCAn1enYMuq3IU/L\r\n2/QUJQ80sPwmwuWF58A+iJyyVfioP1L/vnhICb2D8mM0A93qXXciHbWXvbE/\r\nmV1Zv/E5y4h3B7vcjtYYQ9vAOEMyTnFa2pxUNOYPME1OfpW8TBVgMjgKzfy6\r\nRIwU/h1KFqN+6T1BDen49NO85AVMbBODsG8hnNs1XZ5FqVrS4Ha5zFiqOVOm\r\nWtC6KnhktMS0gecHH1Nf6IFKOosHpp9hiO0=\r\n=qZ4k\r\n-----END PGP SIGNATURE-----\r\n"},"gitHead":"e1c8018236a134a6a30431484255f18545f760cf","scripts":{"lint":"eslint --ext .es,.js ./","test":"npm run compile && TZ='GMT' mocha \"test/**/*.js\"","yalc":"npm run build && yalc push","build":"npm run compile","check":"npm test && npm run lint && echo \"\\033[0;32mReady to publish\\033[0m\"","clean":"rm -rf ./lib/ || exit 1","compile":"NODE_ENV=production babel src --out-dir lib --copy-files","reinstall":"rm -rf node_modules package-lock.json && npm install","lint:tofile":"eslint --ext .es,.js --no-color -o ./eslint-report.log ./","test:tofile":"npm run compile && TZ='GMT' mocha --no-colors -R spec \"test/**/*.js\" 2>&1 | tee test-report.log","prepublishOnly":"npm run check && npm run clean && npm run build"},"_npmUser":{"name":"peterhassler","email":"peter.h@nebenan.de"},"deprecated":"Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.","repository":{"url":"git+https://github.com/good-hood-gmbh/nebenan-redux-tools.git","type":"git"},"_npmVersion":"8.15.0","description":"A set of redux helpers","directories":{},"_nodeVersion":"16.17.0","dependencies":{"qs":"^6.11.0","axios":"^0.22.0","react":"^17.0.2","lodash":"^4.17.21","updeep":"^1.2.1","js-cookie":"^3.0.1","react-dom":"^17.0.2","react-redux":"^7.2.6","local-storage-adapter":"^2.0.0","escape-string-regexp-browser":"^1.1.0"},"_hasShrinkwrap":false,"devDependencies":{"chai":"^4.3.6","mocha":"^9.2.2","sinon":"^13.0.2","eslint":"^8.24.0","@babel/cli":"^7.19.3","@babel/core":"^7.19.3","@babel/runtime":"^7.19.0","@babel/preset-env":"^7.19.3","eslint-config-nebenan-base":"^2.0.1","browserslist-config-nebenan":"^1.0.0","@babel/plugin-transform-runtime":"^7.19.1","babel-plugin-add-module-exports":"^1.0.4","@babel/plugin-proposal-json-strings":"^7.18.6","@babel/plugin-transform-strict-mode":"^7.18.6"},"_npmOperationalInternal":{"tmp":"tmp/nebenan-redux-tools_6.5.1_1667928778588_0.12346758924787093","host":"s3://npm-registry-packages"}},"6.6.0":{"name":"nebenan-redux-tools","version":"6.6.0","author":{"name":"Nebenan.de","email":"max@nebenan.de"},"license":"SEE LICENSE IN LICENSE FILE","_id":"nebenan-redux-tools@6.6.0","maintainers":[{"name":"rejas","email":"npm@veeck.de"},{"name":"iamuchejude","email":"iamuchejude@gmail.com"},{"name":"eliasbraun","email":"elias.braun@nebenan.de"},{"name":"peterhassler","email":"peter.h@nebenan.de"},{"name":"suprmax","email":"max@degterev.me"}],"homepage":"https://nebenan.de/","bugs":{"url":"https://github.com/good-hood-gmbh/nebenan-redux-tools/issues"},"dist":{"shasum":"0c1ccf60e4ddf0f9d63ed44915b27abd19f00540","tarball":"https://registry.npmjs.org/nebenan-redux-tools/-/nebenan-redux-tools-6.6.0.tgz","fileCount":27,"integrity":"sha512-2W5vzuWm2z74/6Yc0YeXHp+eWbgwhLKRin6BLxQSCCULn/mN5iy8B+ylYzEEe9gPc6sZt97LkFsKltnM+3Opiw==","signatures":[{"sig":"MEYCIQCirjt/dcTaA8XnKh4bqItsKu/dfZ/NlaeS6hzvJ+Wo3AIhAJNcPVszXggy2Q9NDU087y8W8bvCkK4xMjIO0/jI6rWe","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":47820,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJkQQMeACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmo2PQ/+Mdl3Tidga5M/3JRMU/sXm+LSAuEBoWe6YtDyoHRbW5l/iBhM\r\nfKfLBY6fNatHOrakIPgGR9LVvmr9g3dsz1lKnYAJTdfSerNHY4UMRN1qUtxO\r\nPgT8zlqxhFvNj5Ye3p61JHg1rILPwp9tT7OePIvX7pr1kepj0xSd539rL+Rq\r\niyPLBDvGxRYY5v94tdfYWjTz3RhWKKe1xWg7fcew7ZGxi24NA620pjHY7sQk\r\nuT0moKbzWJj5caoj5H+ryTvc6XSnpe3iE+AthM389UV6AN2P3H4MeS5rdcC0\r\nLqOJcMnUpe9/mb74llSBlbE7n+ZZuY5NqWiwEXaQ/JBo69B72+HGcNlYWLvD\r\nIks+hZqlfBz9U0dCX0kZ0sWhTSh5hQYqmRS4chgJ7kKQxhGN9VeJZ7PcmpNN\r\nFJdgu3bfZmKAPv0v91VXnaMrSZMc2O2cGdNIZPAeRX9Yq6eFTIus7MfraQXk\r\nX0XeF/VyuZ5bt33BhGey1er5odB2KGi5xMZ0BkpQUlWuPq0yt8IabAV3Qr2g\r\nLuUk0AGdL2/q/tHcQj1MYdq3QVtd9GkntbjPjC4oSNHaAgWzEIPSKnKY1k2T\r\n6bFVrx+GurBKqgVklz8BEB9vyqqq8nKV63We8igjzCuxZI2eAk2BnEjuBuML\r\nuLQnH7z0frvMT0xG4kmHJ0luKPcSNa/W6oU=\r\n=W9im\r\n-----END PGP SIGNATURE-----\r\n"},"gitHead":"a3f3ebc134d2e98a64b07d82fbf24761688b80e1","scripts":{"lint":"eslint --ext .es,.js ./","test":"npm run compile && TZ='GMT' mocha \"test/**/*.js\"","build":"npm run compile","check":"npm test && npm run lint && echo \"\\033[0;32mReady to publish\\033[0m\"","clean":"rm -rf ./lib/ || exit 1","compile":"NODE_ENV=production babel src --out-dir lib --copy-files","reinstall":"rm -rf node_modules package-lock.json && npm install","lint:tofile":"eslint --ext .es,.js --no-color -o ./eslint-report.log ./","test:tofile":"npm run compile && TZ='GMT' mocha --no-colors -R spec \"test/**/*.js\" 2>&1 | tee test-report.log","prepublishOnly":"npm run check && npm run clean && npm run build"},"_npmUser":{"name":"eliasbraun","email":"elias.braun@nebenan.de"},"deprecated":"Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.","repository":{"url":"git+https://github.com/good-hood-gmbh/nebenan-redux-tools.git","type":"git"},"_npmVersion":"8.19.1","description":"A set of redux helpers","directories":{},"_nodeVersion":"18.9.0","dependencies":{"qs":"^6.11.0","axios":"^0.22.0","lodash":"^4.17.21","updeep":"^1.2.1","js-cookie":"^3.0.1","local-storage-adapter":"^2.0.0","escape-string-regexp-browser":"^1.1.0"},"_hasShrinkwrap":false,"devDependencies":{"chai":"^4.3.6","mocha":"^10.2.0","sinon":"^13.0.2","eslint":"^8.24.0","react-dom":"^17.0.2","@babel/cli":"^7.19.3","@babel/core":"^7.19.3","@babel/runtime":"^7.19.0","@babel/preset-env":"^7.19.3","eslint-config-nebenan-base":"^2.0.1","browserslist-config-nebenan":"^1.0.0","@babel/plugin-transform-runtime":"^7.19.1","babel-plugin-add-module-exports":"^1.0.4","@babel/plugin-proposal-json-strings":"^7.18.6","@babel/plugin-transform-strict-mode":"^7.18.6"},"peerDependencies":{"react":">= 16.14.0","react-redux":"^7.2.6"},"_npmOperationalInternal":{"tmp":"tmp/nebenan-redux-tools_6.6.0_1681982238746_0.04027000651301038","host":"s3://npm-registry-packages"}},"6.7.0-beta.0":{"name":"nebenan-redux-tools","version":"6.7.0-beta.0","author":{"name":"Good Hood GmbH","email":"tech@nebenan.de"},"license":"MIT","_id":"nebenan-redux-tools@6.7.0-beta.0","maintainers":[{"name":"spossner","email":"npm@possner.de"},{"name":"rejas","email":"npm@veeck.de"},{"name":"iamuchejude","email":"iamuchejude@gmail.com"},{"name":"eliasbraun","email":"elias.braun@nebenan.de"},{"name":"peterhassler","email":"peter.h@nebenan.de"},{"name":"suprmax","email":"max@degterev.me"}],"homepage":"https://github.com/goodhood-eu/nebenan-redux-tools#readme","bugs":{"url":"https://github.com/good-hood-gmbh/nebenan-redux-tools/issues"},"dist":{"shasum":"1851fe66dccea8edc85ef7355042b37f7046eb9c","tarball":"https://registry.npmjs.org/nebenan-redux-tools/-/nebenan-redux-tools-6.7.0-beta.0.tgz","fileCount":27,"integrity":"sha512-9HwXiBqpSKwpk4OnuzBd0bNoixnIr6VaaoKt6kxEgtGarXB8N21VOtFkm8QUE9oylcrHzf126kst3hgqlbfgtQ==","signatures":[{"sig":"MEUCIFEA0aZSAo6+DyqgVxF6n5zS6S/notyQHPMUBObCP+KbAiEA2UGrl+tjMi9Flxn9cawmYywMbtcVgrZEeYoUBarPzGU=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":48829},"readme":"nebenan-redux-tools\n====================\n\nA set of redux helpers.\n\n- [Experiments Middleware](#experiments-middleware)\n- [Token Middleware](#token-middleware)\n- [Promise Middleware](#promise-middleware)\n- [Network Middleware](#network-middleware)\n  - [Trustworthy Endpoints](#trustworthy-endpoints)\n  - [API Token](#api-token)\n  - [X-Translations-Lang Header](#x-translations-lang-header)\n  - [Should Request](#should-request)\n  - [Abort Callback](#aborting)\n  - [Request Types](#request-types)\n  - [Pagination](#pagination)\n  - [Mock Responses](#mock-response)\n  - [Standalone Request](#standalone-request)\n  - [Customize](#customize)\n  \n# Experiments Middleware\n## Setup\n\n**NOT COMPLETE**\n```js\nimport { reducer as experiments } from 'nebenan-redux-tools/lib/experiments/state';\n\nconst reducers = { \n  // It is assumed that the experiment reducer's state\n  // is available under `state.experiments`\n  experiments \n};\n\n// ...\n\nconst createFromState = (initialState) => (\n  createStore(\n    combineReducers(reducers),\n    initialState,\n    composeEnhancers(applyMiddleware(...middleware)),\n  )\n);\n\nexport default createFromState\n```\n\n# Token Middleware\n## Setup\n**NOT COMPLETE**\n```js\nimport { reducer as token } from 'nebenan-redux-tools/lib/token';\n\nconst reducers = {\n  // It is assumed that the experiment reducer's state\n  // is available under `state.token`\n  token\n};\n\n// ...\n\nconst createFromState = (initialState) => (\n  createStore(\n    combineReducers(reducers),\n    initialState,\n    composeEnhancers(applyMiddleware(...middleware)),\n  )\n);\n\nexport default createFromState\n```\n  \n# Promise Middleware\nThe promise middleware gets triggered by dispatching actions with `promise` key in payload. The middleware will dispatch resolved or rejected actions when the promise is fulfilled.\n\n```js\ndispatch({\n  type: types.GET_USERS,\n  promise: {\n    getPromise: () => getUsersFromStorageAsync(),\n    \n    // Ensures the returned promise by the dispatched action to resolve even if the provided promise rejected\n    // graceful: true\n  }\n})\n```\n\n```js\n// reducer\nimport { resolved, rejected } from 'nebenan-redux-tools/lib/promise';\n\nexport default (state = getDefaultState(), action) => {\n  switch(action.type) {\n    case resolved(types.GET_USERS): {\n      const usersFromStorage = action.payload;\n\n      return { ...state, users: usersFromStorage };\n    }\n\n    case rejected(types.GET_USERS): {\n      const usersFromStorage = [];\n\n      return { ...state, users: usersFromStorage };\n    }\n\n    default: {\n      return state;\n    }\n  }\n} \n```\n\n\n## Should Execute\n\nPrevents unnecessary promise executions by checking state beforehand. Dispatches resolved action on prevented execution.\n\n```js\ndispatch({\n  type: types.GET_USERS,\n  promise: {\n    getPromise: () => getUsersFromStorageAsync(),\n    shouldExecute: (state) => !state.isFetched,\n  }\n})\n```\n\n# Network Middleware\n\nThe network middleware gets triggered by dispatching actions with `request` in payload. The middleware will fire the request and dispatches resolved or rejected actions when the request is finished.\n\nExample:\n\n```js\ndispatch({\n  type: types.GET_USERS,\n  request: {\n    url: \"/users\"\n  }\n})\n```\n\n```js\nimport { resolved, rejected } from 'nebenan-redux-tools/lib/network/types';\n\nexport default (state = getDefaultState(), action) => {\n  switch(action.type) {\n    case resolved(types.GET_USERS): {\n      const usersFromResponse = action.payload;\n      \n      return { ...state, users: usersFromResponse };\n    }\n    \n    case rejected(types.GET_USERS): {\n      const usersFromResponse = [];\n      \n      return { ...state, users: usersFromResponse };\n    }\n    \n    default: {\n      return state;\n    }\n  }\n} \n```\n\n## Trustworthy Endpoints\n\nRequests to trustworthy endpoints will enable the [X-Translations-Lang Header](#x-translations-lang-header) and [API Token](#api-token) features.\n\nSet trusted domain via global config:\n```js\nimport { configureNetwork } from 'nebenan-redux-tools/lib/network';\n\nconfigureNetwork({\n  trustedDomain: \"nebenan.de\",\n  ...otherSettings\n})\n```\n\n## API Token\n\nRequests to [trustworthy endpoints](#trustworthy-endpoints) will have the `X-AUTH-TOKEN` header set, containing the api token configured in request options or through token middleware. \n\nDefault: `state.token` (see token middleware)\n\nOverwrite:\n```js\ndispatch({\n  type: \"some-type\", \n  request: {\n    url: \"/some/endpoint\",\n    token: \"special-api-token\"\n  }\n})\n```\n\n## X-Translations-Lang Header\n\nRequests to [trustworthy endpoints](#trustworthy-endpoints) will have the `X-Translations-Lang` header set, containing the locale configured in request options or through global config.\n\nDefault via global config: \n```js\nimport { configureNetwork } from 'nebenan-redux-tools/lib/network';\n\nconfigureNetwork({\n  locale: 'de-DE',\n  ...otherSettings\n})\n```\n\nOverwrite:\n```js\ndispatch({\n  type: \"some-type\",\n  request: {\n    url: \"/some/endpoint\",\n    locale: \"en-US\"  \n  }\n})\n```\n\n## Should Request\n\nPrevents unnecessary requests by checking state beforehand. \n\n```js\ndispatch({\n  type: \"some-type\",\n  request: {\n    url: \"/some/endpoint\",\n    shouldRequest(state) {\n     return !state.isFetched;\n    }\n  }\n})\n```\n\n## Aborting\n\nAllows to cancel running requests. Just pass in a [AbortSignal](https://developer.mozilla.org/en-US/docs/Web/API/AbortSignal).\n\n```js\nconst controller = new AbortController();\n\ndispatch({\n  type: \"some-type\",\n  request: {\n    url: \"/some/endpoint\",\n    signal: controller.signal,\n  }\n})\n\n\n// later in app\ncontroller.abort();\n\n```\n\n## Request Types\n\n`request.type` determines used HTTP method\n\n### `query`\n\nSends out GET request. Collects parameters from `request.query` and applies [pagination](#pagination) query options if there are any.\n\n```js\ndispatch({\n  type: \"some-type\",\n  request: {\n     url: \"/users\",\n     type: 'query',\n     query: { q: 'Peter' } \n  }\n})\n```\n\n\n### `delete` / `post` / `put`\n\n```js\ndispatch({\n  type: \"some-type\",\n  request: {\n    url: \"/some/endpoint/123\",\n    type: 'put',\n    payload: { user: { email, password }}\n  }  \n})\n```\n\n\n## Pagination\n\nThere is some boilerplate needed to fully support paginated lists loaded over the network. These helpers help with managing state and sending pagination params over the network.\n\nThe endpoint you are accessing needs to fulfill following requirements:\n- Parameters\n  - `per_page`\n  - `lower` / `higher`\n- Response\n  - `total_count` (`state.total` needs to be updated manually if field does not exist)\n\n### `assignPaginationDefaults` / `paginationGenerator` helpers\n\n```js\nimport { paginationGenerator, assignPaginationDefaults } from 'nebenan-redux-tools/lib/network/pagination';\n\nconst getDefaultState = () => assignPaginationDefaults({ entities: {} });\nconst getPaginationUpdates = paginationGenerator(types.BOOKMARKS_FETCH);\n\nexport const reducer = (state = getDefaultState(), action) => {\n  let newState = state;\n  \n  const update = getPaginationUpdates(newState, action);\n  if (update) newState = updeep(update, newState);\n  \n  switch (action.type) {\n    case resolved(types.BOOKMARKS_FETCH): {\n      const { result, entities } = parse(action.payload);\n\n      const collection = newState.collection.concat(result.bookmarks);\n\n      return updeep({ collection, entities }, newState);\n    }\n    \n    default: {\n      return newState;\n    }\n  }\n}\n```\n\nThe state now holds the following information\n```js\n{\n  // (managed by paginationGenerator)\n  currentPage: 0, \n  // datetime of last fetch (managed by paginationGenerator)\n  lastFetched: 0,\n  // request in progress (managed by paginationGenerator)\n  isFetching: false,\n  // request failed (managed by paginationGenerator) \n  isFailed: false,  \n  // total amount of items over all pages (managed by paginationGenerator)\n  total: null,\n  // item ids for current page  \n  collection: [],\n}\n```\n\n### Actions\n\nPagination query params will be added for `query` requests with either `request.pagination.first` or `request.pagination.last` set.\n\n*Only works for endpoints supporting `lower`/`higher` params.*\n\n```js\ndispatch({\n  type: types.GET_USERS,\n  request: {\n    url: \"/users\",\n    type: 'query',\n    pagination: {\n      per_page: 10, // optional\n      first: firstUserId, // optional\n      last: lastUserId // optional\n    }\n  }\n})\n```\n\n## Mock Response\n\nResponses can be mocked by using the [promise middleware](#promise-middleware). You can keep all of your request options in the action and don't need to modify reducers. Quite useful during development if you are waiting for backend to support new endpoints.\n\n\n```js\ndispatch({\n  type: types.GET_USERS,\n  promise: Promise.resolve([\n    {\n      id: 1,\n      name: \"Peter\"\n    },\n    {\n      id: 2,\n      name: \"Christina\"\n    }\n  ]),\n  request: {\n    url: \"/users\",\n    type: 'query'\n  }\n})\n```\n\n```js\n// reducer\nimport { resolved } from 'nebenan-redux-tools/lib/network/types';\n\nexport default (state = getDefaultState(), action) => {\n  switch(action.type) {\n    case resolved(types.GET_USERS): {\n      const usersFromResponse = action.payload;\n      \n      return { ...state, users: usersFromResponse };\n    }\n    \n    default: {\n      return state;\n    }\n  }\n} \n```\n\n## Standalone Request\n\nRequests can be created programmatically too.\n\n```js\nimport { createRequest } from 'nebenan-redux-tools/lib/network';\n\nconst sendFile = (file, token) => (\n  createRequest({\n    token,\n    payload: { file },\n    url: '/file-upload',\n    type: 'post',\n    multipart: true,\n  }) \n)\n\nconst handleSuccess = (payload) => {\n  // same as action.payload\n  console.log(payload);\n}\n\nsendFile(newFile, token).then(handleSuccess);\n```\n\n## Customize\n\nThe network layer uses [axios](https://github.com/axios/axios) under the hood. To access axios specific features or extend functionality you can hook into request / response generation on a global or local scale.\n\nHooks:\n- `requestHook(requestConfig, requestOptions)`\n  - `requestConfig` the [axios request config](https://github.com/axios/axios#request-config) to be mutated\n  - `requestOptions` the `request` object provided inside the action\n- `responseHook(body, requestConfig, requestOptions)`\n  - `body` response data to be mutated\n  - `requestConfig` the [axios request config](https://github.com/axios/axios#request-config)\n  - `requestOptions` the `request` object provided inside the action\n  \n### Setup global hooks\n\n```js\nimport { configureNetwork } from 'nebenan-redux-tools/lib/network';\n\nconfigureNetwork({\n  requestHook: (requestConfig, requestOptions) => {\n    // ...\n  },\n  responseHook: (body, requestConfig, requestOptions) => {\n    // ...\n  },\n  ...networkSettings\n})\n```\n\n### Action level request hook\n\n```js\nimport { createRequest } from 'nebenan-redux-tools/lib/network';\n\nconst sendFile = (file, token, onProgress) => (\n  createRequest({\n    token,\n    payload: { file },\n    url: '/file-upload',\n    type: 'post',\n    multipart: true,\n    // same as requestHook\n    customize: (requestConfig) => {\n      requestConfig.onUploadProgress = onProgress;\n    }\n  })\n)\n```\n\n","gitHead":"9d5049e10a9ec2cf84f22b029a47b6429e59a8c0","scripts":{"lint":"eslint --ext .es,.js ./","test":"npm run compile && TZ='GMT' mocha \"test/**/*.js\"","build":"npm run compile","check":"npm test && npm run lint && echo \"\\033[0;32mReady to publish\\033[0m\"","clean":"rm -rf ./lib/ || exit 1","compile":"NODE_ENV=production babel src --out-dir lib --copy-files","reinstall":"rm -rf node_modules package-lock.json && npm install","lint:tofile":"eslint --ext .es,.js --no-color -o ./eslint-report.log ./","test:tofile":"npm run compile && TZ='GMT' mocha --no-colors -R spec \"test/**/*.js\" 2>&1 | tee test-report.log","prepublishOnly":"npm run check && npm run clean && npm run build"},"_npmUser":{"name":"rejas","email":"npm@veeck.de"},"deprecated":"Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.","repository":{"url":"git+https://github.com/good-hood-gmbh/nebenan-redux-tools.git","type":"git"},"_npmVersion":"8.19.3","description":"A set of redux helpers","directories":{},"_nodeVersion":"16.19.1","dependencies":{"qs":"^6.11.2","axios":"^0.22.0","lodash":"^4.17.21","updeep":"^1.2.4","js-cookie":"^3.0.5","local-storage-adapter":"^2.0.0","escape-string-regexp-browser":"^1.1.0"},"_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"chai":"^4.3.7","mocha":"^10.2.0","sinon":"^13.0.2","eslint":"^8.42.0","@babel/cli":"^7.22.5","@babel/core":"^7.22.5","@babel/preset-env":"^7.22.5","eslint-config-nebenan-base":"^2.0.2","browserslist-config-nebenan":"^1.0.1","@babel/plugin-transform-runtime":"^7.22.5","babel-plugin-add-module-exports":"^1.0.4","@babel/plugin-transform-strict-mode":"^7.22.5"},"peerDependencies":{"react":">= 16.14.0","react-dom":">= 16.14.0","react-redux":"^7.2.6","@babel/runtime":"^7.12.5"},"_npmOperationalInternal":{"tmp":"tmp/nebenan-redux-tools_6.7.0-beta.0_1686915557205_0.4095070067966571","host":"s3://npm-registry-packages"}},"6.7.0":{"name":"nebenan-redux-tools","version":"6.7.0","author":{"name":"Good Hood GmbH","email":"tech@nebenan.de"},"license":"MIT","_id":"nebenan-redux-tools@6.7.0","maintainers":[{"name":"spossner","email":"npm@possner.de"},{"name":"rejas","email":"npm@veeck.de"},{"name":"iamuchejude","email":"iamuchejude@gmail.com"},{"name":"eliasbraun","email":"elias.braun@nebenan.de"},{"name":"peterhassler","email":"peter.h@nebenan.de"},{"name":"suprmax","email":"max@degterev.me"}],"homepage":"https://github.com/goodhood-eu/nebenan-redux-tools#readme","bugs":{"url":"https://github.com/good-hood-gmbh/nebenan-redux-tools/issues"},"dist":{"shasum":"fe1f39ee7b1bc48cc3d2b6c908a963e7434becf8","tarball":"https://registry.npmjs.org/nebenan-redux-tools/-/nebenan-redux-tools-6.7.0.tgz","fileCount":27,"integrity":"sha512-oSaPUrK8ZhB3I/bLxl7A400blU+b7TmwFvY7pOZKiS1McsE/Edsa7KVXe2j2Mao1T5hl8RHF3p9wexE9FAs3Yw==","signatures":[{"sig":"MEQCICBInlgbwAOpEG6e2G44nCqiWuyX7L41si/qBH/eF6aMAiAmMivuF3h9jj12KP4BTB8znmJBSWAkcsAtNXBQcRV1Mg==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":48527},"gitHead":"3f076214f8a0f14f5ceceda139c40d236de8782c","scripts":{"lint":"eslint --ext .es,.js ./","test":"npm run compile && TZ='GMT' mocha \"test/**/*.js\"","build":"npm run compile","check":"npm test && npm run lint && echo \"\\033[0;32mReady to publish\\033[0m\"","clean":"rm -rf ./lib/ || exit 1","compile":"NODE_ENV=production babel src --out-dir lib --copy-files","reinstall":"rm -rf node_modules package-lock.json && npm install","lint:tofile":"eslint --ext .es,.js --no-color -o ./eslint-report.log ./","test:tofile":"npm run compile && TZ='GMT' mocha --no-colors -R spec \"test/**/*.js\" 2>&1 | tee test-report.log","prepublishOnly":"npm run check && npm run clean && npm run build"},"_npmUser":{"name":"rejas","email":"npm@veeck.de"},"deprecated":"Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.","repository":{"url":"git+https://github.com/good-hood-gmbh/nebenan-redux-tools.git","type":"git"},"_npmVersion":"8.19.4","description":"A set of redux helpers","directories":{},"_nodeVersion":"16.20.0","dependencies":{"qs":"^6.11.2","axios":"^0.22.0","lodash":"^4.17.21","updeep":"^1.2.4","js-cookie":"^3.0.5","local-storage-adapter":"^2.0.0","escape-string-regexp-browser":"^1.1.0"},"_hasShrinkwrap":false,"devDependencies":{"chai":"^4.3.7","mocha":"^10.2.0","sinon":"^15.2.0","eslint":"^8.43.0","@babel/cli":"^7.22.5","@babel/core":"^7.22.5","@babel/preset-env":"^7.22.5","eslint-config-nebenan-base":"^2.0.2","browserslist-config-nebenan":"^1.0.1","@babel/plugin-transform-runtime":"^7.22.5","babel-plugin-add-module-exports":"^1.0.4","@babel/plugin-transform-strict-mode":"^7.22.5"},"peerDependencies":{"react":">= 16.14.0","react-dom":">= 16.14.0","react-redux":"^7.2.6","@babel/runtime":"^7.12.5"},"_npmOperationalInternal":{"tmp":"tmp/nebenan-redux-tools_6.7.0_1687512590596_0.06539011527627259","host":"s3://npm-registry-packages"}},"6.8.0-beta.0":{"name":"nebenan-redux-tools","version":"6.8.0-beta.0","author":{"name":"Good Hood GmbH","email":"tech@nebenan.de"},"license":"MIT","_id":"nebenan-redux-tools@6.8.0-beta.0","maintainers":[{"name":"spossner","email":"npm@possner.de"},{"name":"rejas","email":"npm@veeck.de"},{"name":"iamuchejude","email":"iamuchejude@gmail.com"},{"name":"eliasbraun","email":"elias.braun@nebenan.de"},{"name":"peterhassler","email":"peter.h@nebenan.de"},{"name":"suprmax","email":"max@degterev.me"}],"homepage":"https://github.com/goodhood-eu/nebenan-redux-tools#readme","bugs":{"url":"https://github.com/goodhood-eu/nebenan-redux-tools/issues"},"dist":{"shasum":"b5a18398e0b38b654cc45b5f74a3ccc7f83141a3","tarball":"https://registry.npmjs.org/nebenan-redux-tools/-/nebenan-redux-tools-6.8.0-beta.0.tgz","fileCount":27,"integrity":"sha512-bpZDbzmnukHgmiN6B05DipeViYGc93yNYDVqOFkDRFs33QA7j3tj3W6T9umV7539tMQge7N5XTV0JM66aaNeeA==","signatures":[{"sig":"MEUCIQDT3SC3CoX1feoUk1NtGO8Yk7uoVKBQ0dEh7a02D9sqTQIgfjejAMt8uuZfxcZTsGbIJk+Dufc59oewfKpBLJOqPbU=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":48499},"readme":"nebenan-redux-tools\n====================\n\nA set of redux helpers.\n\n- [Experiments Middleware](#experiments-middleware)\n- [Token Middleware](#token-middleware)\n- [Promise Middleware](#promise-middleware)\n- [Network Middleware](#network-middleware)\n  - [Trustworthy Endpoints](#trustworthy-endpoints)\n  - [API Token](#api-token)\n  - [X-Translations-Lang Header](#x-translations-lang-header)\n  - [Should Request](#should-request)\n  - [Abort Callback](#aborting)\n  - [Request Types](#request-types)\n  - [Pagination](#pagination)\n  - [Mock Responses](#mock-response)\n  - [Standalone Request](#standalone-request)\n  - [Customize](#customize)\n  \n# Experiments Middleware\n## Setup\n\n**NOT COMPLETE**\n```js\nimport { reducer as experiments } from 'nebenan-redux-tools/lib/experiments/state';\n\nconst reducers = { \n  // It is assumed that the experiment reducer's state\n  // is available under `state.experiments`\n  experiments \n};\n\n// ...\n\nconst createFromState = (initialState) => (\n  createStore(\n    combineReducers(reducers),\n    initialState,\n    composeEnhancers(applyMiddleware(...middleware)),\n  )\n);\n\nexport default createFromState\n```\n\n# Token Middleware\n## Setup\n**NOT COMPLETE**\n```js\nimport { reducer as token } from 'nebenan-redux-tools/lib/token';\n\nconst reducers = {\n  // It is assumed that the experiment reducer's state\n  // is available under `state.token`\n  token\n};\n\n// ...\n\nconst createFromState = (initialState) => (\n  createStore(\n    combineReducers(reducers),\n    initialState,\n    composeEnhancers(applyMiddleware(...middleware)),\n  )\n);\n\nexport default createFromState\n```\n  \n# Promise Middleware\nThe promise middleware gets triggered by dispatching actions with `promise` key in payload. The middleware will dispatch resolved or rejected actions when the promise is fulfilled.\n\n```js\ndispatch({\n  type: types.GET_USERS,\n  promise: {\n    getPromise: () => getUsersFromStorageAsync(),\n    \n    // Ensures the returned promise by the dispatched action to resolve even if the provided promise rejected\n    // graceful: true\n  }\n})\n```\n\n```js\n// reducer\nimport { resolved, rejected } from 'nebenan-redux-tools/lib/promise';\n\nexport default (state = getDefaultState(), action) => {\n  switch(action.type) {\n    case resolved(types.GET_USERS): {\n      const usersFromStorage = action.payload;\n\n      return { ...state, users: usersFromStorage };\n    }\n\n    case rejected(types.GET_USERS): {\n      const usersFromStorage = [];\n\n      return { ...state, users: usersFromStorage };\n    }\n\n    default: {\n      return state;\n    }\n  }\n} \n```\n\n\n## Should Execute\n\nPrevents unnecessary promise executions by checking state beforehand. Dispatches resolved action on prevented execution.\n\n```js\ndispatch({\n  type: types.GET_USERS,\n  promise: {\n    getPromise: () => getUsersFromStorageAsync(),\n    shouldExecute: (state) => !state.isFetched,\n  }\n})\n```\n\n# Network Middleware\n\nThe network middleware gets triggered by dispatching actions with `request` in payload. The middleware will fire the request and dispatches resolved or rejected actions when the request is finished.\n\nExample:\n\n```js\ndispatch({\n  type: types.GET_USERS,\n  request: {\n    url: \"/users\"\n  }\n})\n```\n\n```js\nimport { resolved, rejected } from 'nebenan-redux-tools/lib/network/types';\n\nexport default (state = getDefaultState(), action) => {\n  switch(action.type) {\n    case resolved(types.GET_USERS): {\n      const usersFromResponse = action.payload;\n      \n      return { ...state, users: usersFromResponse };\n    }\n    \n    case rejected(types.GET_USERS): {\n      const usersFromResponse = [];\n      \n      return { ...state, users: usersFromResponse };\n    }\n    \n    default: {\n      return state;\n    }\n  }\n} \n```\n\n## Trustworthy Endpoints\n\nRequests to trustworthy endpoints will enable the [X-Translations-Lang Header](#x-translations-lang-header) and [API Token](#api-token) features.\n\nSet trusted domain via global config:\n```js\nimport { configureNetwork } from 'nebenan-redux-tools/lib/network';\n\nconfigureNetwork({\n  trustedDomain: \"nebenan.de\",\n  ...otherSettings\n})\n```\n\n## API Token\n\nRequests to [trustworthy endpoints](#trustworthy-endpoints) will have the `X-AUTH-TOKEN` header set, containing the api token configured in request options or through token middleware. \n\nDefault: `state.token` (see token middleware)\n\nOverwrite:\n```js\ndispatch({\n  type: \"some-type\", \n  request: {\n    url: \"/some/endpoint\",\n    token: \"special-api-token\"\n  }\n})\n```\n\n## X-Translations-Lang Header\n\nRequests to [trustworthy endpoints](#trustworthy-endpoints) will have the `X-Translations-Lang` header set, containing the locale configured in request options or through global config.\n\nDefault via global config: \n```js\nimport { configureNetwork } from 'nebenan-redux-tools/lib/network';\n\nconfigureNetwork({\n  locale: 'de-DE',\n  ...otherSettings\n})\n```\n\nOverwrite:\n```js\ndispatch({\n  type: \"some-type\",\n  request: {\n    url: \"/some/endpoint\",\n    locale: \"en-US\"  \n  }\n})\n```\n\n## Should Request\n\nPrevents unnecessary requests by checking state beforehand. \n\n```js\ndispatch({\n  type: \"some-type\",\n  request: {\n    url: \"/some/endpoint\",\n    shouldRequest(state) {\n     return !state.isFetched;\n    }\n  }\n})\n```\n\n## Aborting\n\nAllows to cancel running requests. Just pass in a [AbortSignal](https://developer.mozilla.org/en-US/docs/Web/API/AbortSignal).\n\n```js\nconst controller = new AbortController();\n\ndispatch({\n  type: \"some-type\",\n  request: {\n    url: \"/some/endpoint\",\n    signal: controller.signal,\n  }\n})\n\n\n// later in app\ncontroller.abort();\n\n```\n\n## Request Types\n\n`request.type` determines used HTTP method\n\n### `query`\n\nSends out GET request. Collects parameters from `request.query` and applies [pagination](#pagination) query options if there are any.\n\n```js\ndispatch({\n  type: \"some-type\",\n  request: {\n     url: \"/users\",\n     type: 'query',\n     query: { q: 'Peter' } \n  }\n})\n```\n\n\n### `delete` / `post` / `put`\n\n```js\ndispatch({\n  type: \"some-type\",\n  request: {\n    url: \"/some/endpoint/123\",\n    type: 'put',\n    payload: { user: { email, password }}\n  }  \n})\n```\n\n\n## Pagination\n\nThere is some boilerplate needed to fully support paginated lists loaded over the network. These helpers help with managing state and sending pagination params over the network.\n\nThe endpoint you are accessing needs to fulfill following requirements:\n- Parameters\n  - `per_page`\n  - `lower` / `higher`\n- Response\n  - `total_count` (`state.total` needs to be updated manually if field does not exist)\n\n### `assignPaginationDefaults` / `paginationGenerator` helpers\n\n```js\nimport { paginationGenerator, assignPaginationDefaults } from 'nebenan-redux-tools/lib/network/pagination';\n\nconst getDefaultState = () => assignPaginationDefaults({ entities: {} });\nconst getPaginationUpdates = paginationGenerator(types.BOOKMARKS_FETCH);\n\nexport const reducer = (state = getDefaultState(), action) => {\n  let newState = state;\n  \n  const update = getPaginationUpdates(newState, action);\n  if (update) newState = updeep(update, newState);\n  \n  switch (action.type) {\n    case resolved(types.BOOKMARKS_FETCH): {\n      const { result, entities } = parse(action.payload);\n\n      const collection = newState.collection.concat(result.bookmarks);\n\n      return updeep({ collection, entities }, newState);\n    }\n    \n    default: {\n      return newState;\n    }\n  }\n}\n```\n\nThe state now holds the following information\n```js\n{\n  // (managed by paginationGenerator)\n  currentPage: 0, \n  // datetime of last fetch (managed by paginationGenerator)\n  lastFetched: 0,\n  // request in progress (managed by paginationGenerator)\n  isFetching: false,\n  // request failed (managed by paginationGenerator) \n  isFailed: false,  \n  // total amount of items over all pages (managed by paginationGenerator)\n  total: null,\n  // item ids for current page  \n  collection: [],\n}\n```\n\n### Actions\n\nPagination query params will be added for `query` requests with either `request.pagination.first` or `request.pagination.last` set.\n\n*Only works for endpoints supporting `lower`/`higher` params.*\n\n```js\ndispatch({\n  type: types.GET_USERS,\n  request: {\n    url: \"/users\",\n    type: 'query',\n    pagination: {\n      per_page: 10, // optional\n      first: firstUserId, // optional\n      last: lastUserId // optional\n    }\n  }\n})\n```\n\n## Mock Response\n\nResponses can be mocked by using the [promise middleware](#promise-middleware). You can keep all of your request options in the action and don't need to modify reducers. Quite useful during development if you are waiting for backend to support new endpoints.\n\n\n```js\ndispatch({\n  type: types.GET_USERS,\n  promise: Promise.resolve([\n    {\n      id: 1,\n      name: \"Peter\"\n    },\n    {\n      id: 2,\n      name: \"Christina\"\n    }\n  ]),\n  request: {\n    url: \"/users\",\n    type: 'query'\n  }\n})\n```\n\n```js\n// reducer\nimport { resolved } from 'nebenan-redux-tools/lib/network/types';\n\nexport default (state = getDefaultState(), action) => {\n  switch(action.type) {\n    case resolved(types.GET_USERS): {\n      const usersFromResponse = action.payload;\n      \n      return { ...state, users: usersFromResponse };\n    }\n    \n    default: {\n      return state;\n    }\n  }\n} \n```\n\n## Standalone Request\n\nRequests can be created programmatically too.\n\n```js\nimport { createRequest } from 'nebenan-redux-tools/lib/network';\n\nconst sendFile = (file, token) => (\n  createRequest({\n    token,\n    payload: { file },\n    url: '/file-upload',\n    type: 'post',\n    multipart: true,\n  }) \n)\n\nconst handleSuccess = (payload) => {\n  // same as action.payload\n  console.log(payload);\n}\n\nsendFile(newFile, token).then(handleSuccess);\n```\n\n## Customize\n\nThe network layer uses [axios](https://github.com/axios/axios) under the hood. To access axios specific features or extend functionality you can hook into request / response generation on a global or local scale.\n\nHooks:\n- `requestHook(requestConfig, requestOptions)`\n  - `requestConfig` the [axios request config](https://github.com/axios/axios#request-config) to be mutated\n  - `requestOptions` the `request` object provided inside the action\n- `responseHook(body, requestConfig, requestOptions)`\n  - `body` response data to be mutated\n  - `requestConfig` the [axios request config](https://github.com/axios/axios#request-config)\n  - `requestOptions` the `request` object provided inside the action\n  \n### Setup global hooks\n\n```js\nimport { configureNetwork } from 'nebenan-redux-tools/lib/network';\n\nconfigureNetwork({\n  requestHook: (requestConfig, requestOptions) => {\n    // ...\n  },\n  responseHook: (body, requestConfig, requestOptions) => {\n    // ...\n  },\n  ...networkSettings\n})\n```\n\n### Action level request hook\n\n```js\nimport { createRequest } from 'nebenan-redux-tools/lib/network';\n\nconst sendFile = (file, token, onProgress) => (\n  createRequest({\n    token,\n    payload: { file },\n    url: '/file-upload',\n    type: 'post',\n    multipart: true,\n    // same as requestHook\n    customize: (requestConfig) => {\n      requestConfig.onUploadProgress = onProgress;\n    }\n  })\n)\n```\n\n","gitHead":"9acb4624669a8b9d2b78344c1f0ccb2c1ac53c6f","scripts":{"lint":"eslint --ext .es,.js ./","test":"npm run compile && TZ='GMT' mocha \"test/**/*.js\"","build":"npm run compile","check":"npm test && npm run lint && echo \"\\033[0;32mReady to publish\\033[0m\"","clean":"rm -rf ./lib/ || exit 1","compile":"NODE_ENV=production babel src --out-dir lib --copy-files","reinstall":"rm -rf node_modules package-lock.json && npm install","lint:tofile":"eslint --ext .es,.js --no-color -o ./eslint-report.log ./","test:tofile":"npm run compile && TZ='GMT' mocha --no-colors -R spec \"test/**/*.js\" 2>&1 | tee test-report.log","prepublishOnly":"npm run check && npm run clean && npm run build"},"_npmUser":{"name":"rejas","email":"npm@veeck.de"},"deprecated":"Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.","repository":{"url":"git+https://github.com/goodhood-eu/nebenan-redux-tools.git","type":"git"},"_npmVersion":"8.19.4","description":"A set of redux helpers","directories":{},"_nodeVersion":"16.20.0","dependencies":{"qs":"^6.11.2","axios":"^0.22.0","lodash":"^4.17.21","updeep":"^1.2.4","js-cookie":"^3.0.5","escape-string-regexp":"^4.0.0","local-storage-adapter":"^2.0.0"},"_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"chai":"^4.3.7","mocha":"^10.2.0","sinon":"^15.2.0","eslint":"^8.44.0","@babel/cli":"^7.22.6","@babel/core":"^7.22.8","@babel/preset-env":"^7.22.7","eslint-config-nebenan-base":"^2.0.2","browserslist-config-nebenan":"^1.0.1","@babel/plugin-transform-runtime":"^7.22.7","babel-plugin-add-module-exports":"^1.0.4","@babel/plugin-transform-strict-mode":"^7.22.5"},"peerDependencies":{"react":">= 16.14.0","react-dom":">= 16.14.0","react-redux":"^7.2.6","@babel/runtime":"^7.12.5"},"_npmOperationalInternal":{"tmp":"tmp/nebenan-redux-tools_6.8.0-beta.0_1688648475332_0.28084925077176304","host":"s3://npm-registry-packages"}},"6.8.0":{"name":"nebenan-redux-tools","version":"6.8.0","author":{"name":"Good Hood GmbH","email":"tech@nebenan.de"},"license":"MIT","_id":"nebenan-redux-tools@6.8.0","maintainers":[{"name":"spossner","email":"npm@possner.de"},{"name":"rejas","email":"npm@veeck.de"},{"name":"iamuchejude","email":"iamuchejude@gmail.com"},{"name":"eliasbraun","email":"elias.braun@nebenan.de"},{"name":"peterhassler","email":"peter.h@nebenan.de"},{"name":"suprmax","email":"max@degterev.me"}],"homepage":"https://github.com/goodhood-eu/nebenan-redux-tools#readme","bugs":{"url":"https://github.com/goodhood-eu/nebenan-redux-tools/issues"},"dist":{"shasum":"7ff87c0ac91f4313948ed0356cefbf67309c8fdc","tarball":"https://registry.npmjs.org/nebenan-redux-tools/-/nebenan-redux-tools-6.8.0.tgz","fileCount":27,"integrity":"sha512-JhmH88CEqQZwEOfC0KG1fJzs4AqeBumml8K9Q9n3v2QuvzLzKx84MXsyl0VM+RCrSPE27Z4dfcXUD/zQaxPJJA==","signatures":[{"sig":"MEUCIH+V8sAL//+GZKNwrp2cTo4zVCQ0VOFUsPZiMSE0uYsxAiEA2FOuLrBMAC+BWEneT9xqGQuCZbN6HfAcsbaYmMYxsMY=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":48492},"gitHead":"e3999020cd35f3a77bf6f5b12b6734c6d1af04b7","scripts":{"lint":"eslint --ext .es,.js ./","test":"npm run compile && TZ='GMT' mocha \"test/**/*.js\"","build":"npm run compile","check":"npm test && npm run lint && echo \"\\033[0;32mReady to publish\\033[0m\"","clean":"rm -rf ./lib/ || exit 1","compile":"NODE_ENV=production babel src --out-dir lib --copy-files","reinstall":"rm -rf node_modules package-lock.json && npm install","lint:tofile":"eslint --ext .es,.js --no-color -o ./eslint-report.log ./","test:tofile":"npm run compile && TZ='GMT' mocha --no-colors -R spec \"test/**/*.js\" 2>&1 | tee test-report.log","prepublishOnly":"npm run check && npm run clean && npm run build"},"_npmUser":{"name":"rejas","email":"npm@veeck.de"},"deprecated":"Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.","repository":{"url":"git+https://github.com/goodhood-eu/nebenan-redux-tools.git","type":"git"},"_npmVersion":"8.19.4","description":"A set of redux helpers","directories":{},"_nodeVersion":"16.20.0","dependencies":{"qs":"^6.11.2","axios":"^0.22.0","lodash":"^4.17.21","updeep":"^1.2.4","js-cookie":"^3.0.5","escape-string-regexp":"^4.0.0","local-storage-adapter":"^2.0.0"},"_hasShrinkwrap":false,"devDependencies":{"chai":"^4.3.7","mocha":"^10.2.0","sinon":"^15.2.0","eslint":"^8.44.0","@babel/cli":"^7.22.6","@babel/core":"^7.22.8","@babel/preset-env":"^7.22.7","eslint-config-nebenan-base":"^2.0.2","browserslist-config-nebenan":"^1.0.1","@babel/plugin-transform-runtime":"^7.22.7","babel-plugin-add-module-exports":"^1.0.4","@babel/plugin-transform-strict-mode":"^7.22.5"},"peerDependencies":{"react":">= 16.14.0","react-dom":">= 16.14.0","react-redux":"^7.2.6","@babel/runtime":"^7.12.5"},"_npmOperationalInternal":{"tmp":"tmp/nebenan-redux-tools_6.8.0_1688736952140_0.1472595127682037","host":"s3://npm-registry-packages"}},"6.5.2-beta.1":{"name":"nebenan-redux-tools","version":"6.5.2-beta.1","author":{"name":"Nebenan.de","email":"max@nebenan.de"},"license":"SEE LICENSE IN LICENSE FILE","_id":"nebenan-redux-tools@6.5.2-beta.1","maintainers":[{"name":"hahiii","email":"shalanazim@gmail.com"},{"name":"fweinrich","email":"florian@weinrich.dev"},{"name":"spossner","email":"npm@possner.de"},{"name":"rejas","email":"npm@veeck.de"},{"name":"iamuchejude","email":"iamuchejude@gmail.com"},{"name":"peterhassler","email":"peter.h@nebenan.de"},{"name":"suprmax","email":"max@degterev.me"}],"homepage":"https://nebenan.de/","bugs":{"url":"https://github.com/good-hood-gmbh/nebenan-redux-tools/issues"},"dist":{"shasum":"1a8c07000ea4dc23ddcd2aa3424d3fc669fc3669","tarball":"https://registry.npmjs.org/nebenan-redux-tools/-/nebenan-redux-tools-6.5.2-beta.1.tgz","fileCount":27,"integrity":"sha512-/qzPYo5lTxduJVjFP4jfEXzk+oj64+PIRNZfcXfamyoJPE+4qozmD3//5PzD4HutfalCbPqTulsHbMq1GXVDGA==","signatures":[{"sig":"MEUCIQCClJeNZnFxdcjbVzcLS8N2VaWz4jUeXrNv+og1f2/FLgIgAsfAeJ+iiQOE4lTk39TTQAaEsyruxGZmZSUiFlMjN48=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":48118},"gitHead":"61332eaa3766379c5c6381170afe7ca7656b62c3","scripts":{"lint":"eslint --ext .es,.js ./","test":"npm run compile && TZ='GMT' mocha \"test/**/*.js\"","build":"npm run compile","check":"npm test && npm run lint && echo \"\\033[0;32mReady to publish\\033[0m\"","clean":"rm -rf ./lib/ || exit 1","compile":"NODE_ENV=production babel src --out-dir lib --copy-files","reinstall":"rm -rf node_modules package-lock.json && npm install","lint:tofile":"eslint --ext .es,.js --no-color -o ./eslint-report.log ./","test:tofile":"npm run compile && TZ='GMT' mocha --no-colors -R spec \"test/**/*.js\" 2>&1 | tee test-report.log","prepublishOnly":"npm run check && npm run clean && npm run build"},"_npmUser":{"name":"iamuchejude","email":"iamuchejude@gmail.com"},"deprecated":"Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.","repository":{"url":"git+https://github.com/good-hood-gmbh/nebenan-redux-tools.git","type":"git"},"_npmVersion":"9.5.0","description":"A set of redux helpers","directories":{},"_nodeVersion":"19.7.0","dependencies":{"qs":"^6.11.0","axios":"^0.22.0","react":"^17.0.2","lodash":"^4.17.21","updeep":"^1.2.1","js-cookie":"^3.0.1","react-dom":"^17.0.2","react-redux":"^7.2.6","local-storage-adapter":"^2.0.0","escape-string-regexp-browser":"^1.1.0"},"_hasShrinkwrap":false,"devDependencies":{"chai":"^4.3.6","mocha":"^9.2.2","sinon":"^13.0.2","eslint":"^8.24.0","@babel/cli":"^7.19.3","@babel/core":"^7.19.3","@babel/runtime":"^7.19.0","@babel/preset-env":"^7.19.3","eslint-config-nebenan-base":"^2.0.1","browserslist-config-nebenan":"^1.0.0","@babel/plugin-transform-runtime":"^7.19.1","babel-plugin-add-module-exports":"^1.0.4","@babel/plugin-proposal-json-strings":"^7.18.6","@babel/plugin-transform-strict-mode":"^7.18.6"},"_npmOperationalInternal":{"tmp":"tmp/nebenan-redux-tools_6.5.2-beta.1_1691509758552_0.9409582833186818","host":"s3://npm-registry-packages"}},"6.8.2":{"name":"nebenan-redux-tools","version":"6.8.2","author":{"name":"Good Hood GmbH","email":"tech@nebenan.de"},"license":"MIT","_id":"nebenan-redux-tools@6.8.2","maintainers":[{"name":"hahiii","email":"shalanazim@gmail.com"},{"name":"fweinrich","email":"florian@weinrich.dev"},{"name":"spossner","email":"npm@possner.de"},{"name":"rejas","email":"npm@veeck.de"},{"name":"iamuchejude","email":"iamuchejude@gmail.com"},{"name":"peterhassler","email":"peter.h@nebenan.de"},{"name":"suprmax","email":"max@degterev.me"}],"homepage":"https://github.com/goodhood-eu/nebenan-redux-tools#readme","bugs":{"url":"https://github.com/goodhood-eu/nebenan-redux-tools/issues"},"dist":{"shasum":"03ba3a80d47e813cb2e5e58e301d30202c7d3c45","tarball":"https://registry.npmjs.org/nebenan-redux-tools/-/nebenan-redux-tools-6.8.2.tgz","fileCount":27,"integrity":"sha512-OsnfBkyzZbM3onnIYep5D2XlmfRKBxIyx4Lf2DlqtcHRiRHYC5w5G9En2ZRpjVt7XScMfoDIe5TNEtzJf12MIQ==","signatures":[{"sig":"MEUCIQD1dkqoaKU4l7VrM38rOJUSXhn3Okv98FDyYuHxx+Fa/AIgMrDkovJpkONiL+kEUAM/5V8H9cp/vV9Z4KESl3W+mXw=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":48856},"gitHead":"77d934a099ec2d4b03e414a3b1dfa9177d9d0646","scripts":{"lint":"eslint --ext .es,.js ./","test":"npm run compile && TZ='GMT' mocha \"test/**/*.js\"","build":"npm run compile","check":"npm test && npm run lint && echo \"\\033[0;32mReady to publish\\033[0m\"","clean":"rm -rf ./lib/ || exit 1","compile":"NODE_ENV=production babel src --out-dir lib --copy-files","reinstall":"rm -rf node_modules package-lock.json && npm install","lint:tofile":"eslint --ext .es,.js --no-color -o ./eslint-report.log ./","test:tofile":"npm run compile && TZ='GMT' mocha --no-colors -R spec \"test/**/*.js\" 2>&1 | tee test-report.log","prepublishOnly":"npm run check && npm run clean && npm run build"},"_npmUser":{"name":"iamuchejude","email":"iamuchejude@gmail.com"},"deprecated":"Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.","repository":{"url":"git+https://github.com/goodhood-eu/nebenan-redux-tools.git","type":"git"},"_npmVersion":"9.5.0","description":"A set of redux helpers","directories":{},"_nodeVersion":"19.7.0","dependencies":{"qs":"^6.11.2","axios":"^0.22.0","lodash":"^4.17.21","updeep":"^1.2.4","js-cookie":"^3.0.5","escape-string-regexp":"^4.0.0","local-storage-adapter":"^2.0.0"},"_hasShrinkwrap":false,"devDependencies":{"chai":"^4.3.7","mocha":"^10.2.0","sinon":"^15.2.0","eslint":"^8.44.0","@babel/cli":"^7.22.6","@babel/core":"^7.22.8","@babel/preset-env":"^7.22.7","eslint-config-nebenan-base":"^2.0.2","browserslist-config-nebenan":"^1.0.1","@babel/plugin-transform-runtime":"^7.22.7","babel-plugin-add-module-exports":"^1.0.4","@babel/plugin-transform-strict-mode":"^7.22.5"},"peerDependencies":{"react":">= 16.14.0","react-dom":">= 16.14.0","react-redux":"^7.2.6","@babel/runtime":"^7.12.5"},"_npmOperationalInternal":{"tmp":"tmp/nebenan-redux-tools_6.8.2_1691512593782_0.3969863739726811","host":"s3://npm-registry-packages"}},"6.9.0-beta.0":{"name":"nebenan-redux-tools","version":"6.9.0-beta.0","author":{"name":"Good Hood GmbH","email":"tech@nebenan.de"},"license":"MIT","_id":"nebenan-redux-tools@6.9.0-beta.0","maintainers":[{"name":"hahiii","email":"shalanazim@gmail.com"},{"name":"fweinrich","email":"florian@weinrich.dev"},{"name":"spossner","email":"npm@possner.de"},{"name":"rejas","email":"npm@veeck.de"},{"name":"iamuchejude","email":"iamuchejude@gmail.com"},{"name":"peterhassler","email":"peter.h@nebenan.de"},{"name":"suprmax","email":"max@degterev.me"}],"homepage":"https://github.com/goodhood-eu/nebenan-redux-tools#readme","bugs":{"url":"https://github.com/goodhood-eu/nebenan-redux-tools/issues"},"dist":{"shasum":"91b5e450dda2d76b87585e84fe5a16204363c6eb","tarball":"https://registry.npmjs.org/nebenan-redux-tools/-/nebenan-redux-tools-6.9.0-beta.0.tgz","fileCount":27,"integrity":"sha512-/Zx/YGmjRwFgLhO+dAA2xkU2OzAnzCVAO54vbpwLxZMLzgFnlQv2YPqWhMK8SYlS/lXWBBhbT/lWJUA6pvhnvw==","signatures":[{"sig":"MEUCIQCS1i+4ykjGoTkstY+2pON8mZqqJeT62U1TxLJYGyNpkQIgdjyiGd/6L4QOJ7uI+dg58K4suhlh8SWlBPOnb3RvHzA=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":48445},"readme":"nebenan-redux-tools\n====================\n\nA set of redux helpers.\n\n- [Experiments Middleware](#experiments-middleware)\n- [Token Middleware](#token-middleware)\n- [Promise Middleware](#promise-middleware)\n- [Network Middleware](#network-middleware)\n  - [Trustworthy Endpoints](#trustworthy-endpoints)\n  - [API Token](#api-token)\n  - [X-Translations-Lang Header](#x-translations-lang-header)\n  - [Should Request](#should-request)\n  - [Abort Callback](#aborting)\n  - [Request Types](#request-types)\n  - [Pagination](#pagination)\n  - [Mock Responses](#mock-response)\n  - [Standalone Request](#standalone-request)\n  - [Customize](#customize)\n  \n# Experiments Middleware\n## Setup\n\n**NOT COMPLETE**\n```js\nimport { reducer as experiments } from 'nebenan-redux-tools/lib/experiments/state';\n\nconst reducers = { \n  // It is assumed that the experiment reducer's state\n  // is available under `state.experiments`\n  experiments \n};\n\n// ...\n\nconst createFromState = (initialState) => (\n  createStore(\n    combineReducers(reducers),\n    initialState,\n    composeEnhancers(applyMiddleware(...middleware)),\n  )\n);\n\nexport default createFromState\n```\n\n# Token Middleware\n## Setup\n**NOT COMPLETE**\n```js\nimport { reducer as token } from 'nebenan-redux-tools/lib/token';\n\nconst reducers = {\n  // It is assumed that the experiment reducer's state\n  // is available under `state.token`\n  token\n};\n\n// ...\n\nconst createFromState = (initialState) => (\n  createStore(\n    combineReducers(reducers),\n    initialState,\n    composeEnhancers(applyMiddleware(...middleware)),\n  )\n);\n\nexport default createFromState\n```\n  \n# Promise Middleware\nThe promise middleware gets triggered by dispatching actions with `promise` key in payload. The middleware will dispatch resolved or rejected actions when the promise is fulfilled.\n\n```js\ndispatch({\n  type: types.GET_USERS,\n  promise: {\n    getPromise: () => getUsersFromStorageAsync(),\n    \n    // Ensures the returned promise by the dispatched action to resolve even if the provided promise rejected\n    // graceful: true\n  }\n})\n```\n\n```js\n// reducer\nimport { resolved, rejected } from 'nebenan-redux-tools/lib/promise';\n\nexport default (state = getDefaultState(), action) => {\n  switch(action.type) {\n    case resolved(types.GET_USERS): {\n      const usersFromStorage = action.payload;\n\n      return { ...state, users: usersFromStorage };\n    }\n\n    case rejected(types.GET_USERS): {\n      const usersFromStorage = [];\n\n      return { ...state, users: usersFromStorage };\n    }\n\n    default: {\n      return state;\n    }\n  }\n} \n```\n\n\n## Should Execute\n\nPrevents unnecessary promise executions by checking state beforehand. Dispatches resolved action on prevented execution.\n\n```js\ndispatch({\n  type: types.GET_USERS,\n  promise: {\n    getPromise: () => getUsersFromStorageAsync(),\n    shouldExecute: (state) => !state.isFetched,\n  }\n})\n```\n\n# Network Middleware\n\nThe network middleware gets triggered by dispatching actions with `request` in payload. The middleware will fire the request and dispatches resolved or rejected actions when the request is finished.\n\nExample:\n\n```js\ndispatch({\n  type: types.GET_USERS,\n  request: {\n    url: \"/users\"\n  }\n})\n```\n\n```js\nimport { resolved, rejected } from 'nebenan-redux-tools/lib/network/types';\n\nexport default (state = getDefaultState(), action) => {\n  switch(action.type) {\n    case resolved(types.GET_USERS): {\n      const usersFromResponse = action.payload;\n      \n      return { ...state, users: usersFromResponse };\n    }\n    \n    case rejected(types.GET_USERS): {\n      const usersFromResponse = [];\n      \n      return { ...state, users: usersFromResponse };\n    }\n    \n    default: {\n      return state;\n    }\n  }\n} \n```\n\n## Trustworthy Endpoints\n\nRequests to trustworthy endpoints will enable the [X-Translations-Lang Header](#x-translations-lang-header) and [API Token](#api-token) features.\n\nSet trusted domain via global config:\n```js\nimport { configureNetwork } from 'nebenan-redux-tools/lib/network';\n\nconfigureNetwork({\n  trustedDomain: \"nebenan.de\",\n  ...otherSettings\n})\n```\n\n## API Token\n\nRequests to [trustworthy endpoints](#trustworthy-endpoints) will have the `X-AUTH-TOKEN` header set, containing the api token configured in request options or through token middleware. \n\nDefault: `state.token` (see token middleware)\n\nOverwrite:\n```js\ndispatch({\n  type: \"some-type\", \n  request: {\n    url: \"/some/endpoint\",\n    token: \"special-api-token\"\n  }\n})\n```\n\n## X-Translations-Lang Header\n\nRequests to [trustworthy endpoints](#trustworthy-endpoints) will have the `X-Translations-Lang` header set, containing the locale configured in request options or through global config.\n\nDefault via global config: \n```js\nimport { configureNetwork } from 'nebenan-redux-tools/lib/network';\n\nconfigureNetwork({\n  locale: 'de-DE',\n  ...otherSettings\n})\n```\n\nOverwrite:\n```js\ndispatch({\n  type: \"some-type\",\n  request: {\n    url: \"/some/endpoint\",\n    locale: \"en-US\"  \n  }\n})\n```\n\n## Should Request\n\nPrevents unnecessary requests by checking state beforehand. \n\n```js\ndispatch({\n  type: \"some-type\",\n  request: {\n    url: \"/some/endpoint\",\n    shouldRequest(state) {\n     return !state.isFetched;\n    }\n  }\n})\n```\n\n## Aborting\n\nAllows to cancel running requests. Just pass in a [AbortSignal](https://developer.mozilla.org/en-US/docs/Web/API/AbortSignal).\n\n```js\nconst controller = new AbortController();\n\ndispatch({\n  type: \"some-type\",\n  request: {\n    url: \"/some/endpoint\",\n    signal: controller.signal,\n  }\n})\n\n\n// later in app\ncontroller.abort();\n\n```\n\n## Request Types\n\n`request.type` determines used HTTP method\n\n### `query`\n\nSends out GET request. Collects parameters from `request.query` and applies [pagination](#pagination) query options if there are any.\n\n```js\ndispatch({\n  type: \"some-type\",\n  request: {\n     url: \"/users\",\n     type: 'query',\n     query: { q: 'Peter' } \n  }\n})\n```\n\n\n### `delete` / `post` / `put`\n\n```js\ndispatch({\n  type: \"some-type\",\n  request: {\n    url: \"/some/endpoint/123\",\n    type: 'put',\n    payload: { user: { email, password }}\n  }  \n})\n```\n\n\n## Pagination\n\nThere is some boilerplate needed to fully support paginated lists loaded over the network. These helpers help with managing state and sending pagination params over the network.\n\nThe endpoint you are accessing needs to fulfill following requirements:\n- Parameters\n  - `per_page`\n  - `lower` / `higher`\n- Response\n  - `total_count` (`state.total` needs to be updated manually if field does not exist)\n\n### `assignPaginationDefaults` / `paginationGenerator` helpers\n\n```js\nimport { paginationGenerator, assignPaginationDefaults } from 'nebenan-redux-tools/lib/network/pagination';\n\nconst getDefaultState = () => assignPaginationDefaults({ entities: {} });\nconst getPaginationUpdates = paginationGenerator(types.BOOKMARKS_FETCH);\n\nexport const reducer = (state = getDefaultState(), action) => {\n  let newState = state;\n  \n  const update = getPaginationUpdates(newState, action);\n  if (update) newState = updeep(update, newState);\n  \n  switch (action.type) {\n    case resolved(types.BOOKMARKS_FETCH): {\n      const { result, entities } = parse(action.payload);\n\n      const collection = newState.collection.concat(result.bookmarks);\n\n      return updeep({ collection, entities }, newState);\n    }\n    \n    default: {\n      return newState;\n    }\n  }\n}\n```\n\nThe state now holds the following information\n```js\n{\n  // (managed by paginationGenerator)\n  currentPage: 0, \n  // datetime of last fetch (managed by paginationGenerator)\n  lastFetched: 0,\n  // request in progress (managed by paginationGenerator)\n  isFetching: false,\n  // request failed (managed by paginationGenerator) \n  isFailed: false,  \n  // total amount of items over all pages (managed by paginationGenerator)\n  total: null,\n  // item ids for current page  \n  collection: [],\n}\n```\n\n### Actions\n\nPagination query params will be added for `query` requests with either `request.pagination.first` or `request.pagination.last` set.\n\n*Only works for endpoints supporting `lower`/`higher` params.*\n\n```js\ndispatch({\n  type: types.GET_USERS,\n  request: {\n    url: \"/users\",\n    type: 'query',\n    pagination: {\n      per_page: 10, // optional\n      first: firstUserId, // optional\n      last: lastUserId // optional\n    }\n  }\n})\n```\n\n## Mock Response\n\nResponses can be mocked by using the [promise middleware](#promise-middleware). You can keep all of your request options in the action and don't need to modify reducers. Quite useful during development if you are waiting for backend to support new endpoints.\n\n\n```js\ndispatch({\n  type: types.GET_USERS,\n  promise: Promise.resolve([\n    {\n      id: 1,\n      name: \"Peter\"\n    },\n    {\n      id: 2,\n      name: \"Christina\"\n    }\n  ]),\n  request: {\n    url: \"/users\",\n    type: 'query'\n  }\n})\n```\n\n```js\n// reducer\nimport { resolved } from 'nebenan-redux-tools/lib/network/types';\n\nexport default (state = getDefaultState(), action) => {\n  switch(action.type) {\n    case resolved(types.GET_USERS): {\n      const usersFromResponse = action.payload;\n      \n      return { ...state, users: usersFromResponse };\n    }\n    \n    default: {\n      return state;\n    }\n  }\n} \n```\n\n## Standalone Request\n\nRequests can be created programmatically too.\n\n```js\nimport { createRequest } from 'nebenan-redux-tools/lib/network';\n\nconst sendFile = (file, token) => (\n  createRequest({\n    token,\n    payload: { file },\n    url: '/file-upload',\n    type: 'post',\n    multipart: true,\n  }) \n)\n\nconst handleSuccess = (payload) => {\n  // same as action.payload\n  console.log(payload);\n}\n\nsendFile(newFile, token).then(handleSuccess);\n```\n\n## Customize\n\nThe network layer uses [axios](https://github.com/axios/axios) under the hood. To access axios specific features or extend functionality you can hook into request / response generation on a global or local scale.\n\nHooks:\n- `requestHook(requestConfig, requestOptions)`\n  - `requestConfig` the [axios request config](https://github.com/axios/axios#request-config) to be mutated\n  - `requestOptions` the `request` object provided inside the action\n- `responseHook(body, requestConfig, requestOptions)`\n  - `body` response data to be mutated\n  - `requestConfig` the [axios request config](https://github.com/axios/axios#request-config)\n  - `requestOptions` the `request` object provided inside the action\n  \n### Setup global hooks\n\n```js\nimport { configureNetwork } from 'nebenan-redux-tools/lib/network';\n\nconfigureNetwork({\n  requestHook: (requestConfig, requestOptions) => {\n    // ...\n  },\n  responseHook: (body, requestConfig, requestOptions) => {\n    // ...\n  },\n  ...networkSettings\n})\n```\n\n### Action level request hook\n\n```js\nimport { createRequest } from 'nebenan-redux-tools/lib/network';\n\nconst sendFile = (file, token, onProgress) => (\n  createRequest({\n    token,\n    payload: { file },\n    url: '/file-upload',\n    type: 'post',\n    multipart: true,\n    // same as requestHook\n    customize: (requestConfig) => {\n      requestConfig.onUploadProgress = onProgress;\n    }\n  })\n)\n```\n\n","gitHead":"c5266eca93e9104eb30e2a5faa5dfbfedeb59ec8","scripts":{"lint":"eslint --ext .es,.js ./","test":"npm run compile && TZ='GMT' mocha \"test/**/*.js\"","build":"npm run compile","check":"npm test && npm run lint && echo \"\\033[0;32mReady to publish\\033[0m\"","clean":"rm -rf ./lib/ || exit 1","compile":"NODE_ENV=production babel src --out-dir lib --copy-files","reinstall":"rm -rf node_modules package-lock.json && npm install","lint:tofile":"eslint --ext .es,.js --no-color -o ./eslint-report.log ./","test:tofile":"npm run compile && TZ='GMT' mocha --no-colors -R spec \"test/**/*.js\" 2>&1 | tee test-report.log","prepublishOnly":"npm run check && npm run clean && npm run build"},"_npmUser":{"name":"rejas","email":"npm@veeck.de"},"deprecated":"Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.","repository":{"url":"git+https://github.com/goodhood-eu/nebenan-redux-tools.git","type":"git"},"_npmVersion":"9.6.7","description":"A set of redux helpers","directories":{},"_nodeVersion":"18.17.1","dependencies":{"qs":"^6.11.2","axios":"^1.4.0","lodash":"^4.17.21","updeep":"^1.2.4","js-cookie":"^3.0.5","escape-string-regexp":"^4.0.0","local-storage-adapter":"^2.0.0"},"_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"chai":"^4.3.7","mocha":"^10.2.0","sinon":"^15.2.0","eslint":"^8.44.0","@babel/cli":"^7.22.6","@babel/core":"^7.22.8","@babel/preset-env":"^7.22.7","eslint-config-nebenan-base":"^2.0.2","browserslist-config-nebenan":"^1.0.1","@babel/plugin-transform-runtime":"^7.22.7","babel-plugin-add-module-exports":"^1.0.4","@babel/plugin-transform-strict-mode":"^7.22.5"},"peerDependencies":{"react":">= 16.14.0","react-dom":">= 16.14.0","react-redux":"^7.2.6","@babel/runtime":"^7.12.5"},"_npmOperationalInternal":{"tmp":"tmp/nebenan-redux-tools_6.9.0-beta.0_1692695237068_0.9828623446626616","host":"s3://npm-registry-packages"}},"6.8.3":{"name":"nebenan-redux-tools","version":"6.8.3","author":{"name":"Good Hood GmbH","email":"tech@nebenan.de"},"license":"MIT","_id":"nebenan-redux-tools@6.8.3","maintainers":[{"name":"hahiii","email":"shalanazim@gmail.com"},{"name":"fweinrich","email":"florian@weinrich.dev"},{"name":"spossner","email":"npm@possner.de"},{"name":"rejas","email":"npm@veeck.de"},{"name":"iamuchejude","email":"iamuchejude@gmail.com"},{"name":"peterhassler","email":"peter.h@nebenan.de"},{"name":"suprmax","email":"max@degterev.me"}],"homepage":"https://github.com/goodhood-eu/nebenan-redux-tools#readme","bugs":{"url":"https://github.com/goodhood-eu/nebenan-redux-tools/issues"},"dist":{"shasum":"b796c1d47b80be1d7d1540d627230909213356fa","tarball":"https://registry.npmjs.org/nebenan-redux-tools/-/nebenan-redux-tools-6.8.3.tgz","fileCount":27,"integrity":"sha512-UkeaXDK3Z49KOLdgYgHQfxS6VDsRNbumd6TuiBu26dp/e9vGhhlQK1ZuegCMEGRqaNTtchgel6UBTk7c+JBmYg==","signatures":[{"sig":"MEUCIQCsWwwsXKTHSjjXtWoHNIbn8TZj42ioVIKdtuG9cm9OLAIgIgm//+9A4s4/czp0uNF7Obm0Yu1K2BaLgREEYVbeCWg=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":48106},"gitHead":"376af3cd4b96a40b41edf33f4a83633b639f9036","scripts":{"lint":"eslint --ext .es,.js ./","test":"npm run compile && TZ='GMT' mocha \"test/**/*.js\"","build":"npm run compile","check":"npm test && npm run lint && echo \"\\033[0;32mReady to publish\\033[0m\"","clean":"rm -rf ./lib/ || exit 1","compile":"NODE_ENV=production babel src --out-dir lib --copy-files","reinstall":"rm -rf node_modules package-lock.json && npm install","lint:tofile":"eslint --ext .es,.js --no-color -o ./eslint-report.log ./","test:tofile":"npm run compile && TZ='GMT' mocha --no-colors -R spec \"test/**/*.js\" 2>&1 | tee test-report.log","prepublishOnly":"npm run check && npm run clean && npm run build"},"_npmUser":{"name":"rejas","email":"npm@veeck.de"},"deprecated":"Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.","repository":{"url":"git+https://github.com/goodhood-eu/nebenan-redux-tools.git","type":"git"},"_npmVersion":"9.8.0","description":"A set of redux helpers","directories":{},"_nodeVersion":"20.5.1","dependencies":{"qs":"^6.11.2","axios":"^0.22.0","lodash":"^4.17.21","updeep":"^1.2.4","js-cookie":"^3.0.5","escape-string-regexp":"^4.0.0","local-storage-adapter":"^2.0.0"},"_hasShrinkwrap":false,"devDependencies":{"chai":"^4.3.8","mocha":"^10.2.0","sinon":"^15.2.0","eslint":"^8.49.0","@babel/cli":"^7.22.15","@babel/core":"^7.22.20","@babel/preset-env":"^7.22.20","eslint-config-nebenan-base":"^2.0.2","browserslist-config-nebenan":"^1.0.2","@babel/plugin-transform-runtime":"^7.22.15","babel-plugin-add-module-exports":"^1.0.4","@babel/plugin-transform-strict-mode":"^7.22.5"},"peerDependencies":{"react":">= 16.14.0","react-dom":">= 16.14.0","react-redux":"^7.2.6","@babel/runtime":"^7.12.5"},"_npmOperationalInternal":{"tmp":"tmp/nebenan-redux-tools_6.8.3_1695109200961_0.45821361857571286","host":"s3://npm-registry-packages"}},"6.9.0-beta.1":{"name":"nebenan-redux-tools","version":"6.9.0-beta.1","author":{"name":"Good Hood GmbH","email":"tech@nebenan.de"},"license":"MIT","_id":"nebenan-redux-tools@6.9.0-beta.1","maintainers":[{"name":"jobemichael","email":"jobe.michael@nebenan.de"},{"name":"hahiii","email":"shalanazim@gmail.com"},{"name":"fweinrich","email":"florian@weinrich.dev"},{"name":"spossner","email":"npm@possner.de"},{"name":"rejas","email":"npm@veeck.de"},{"name":"iamuchejude","email":"iamuchejude@gmail.com"},{"name":"suprmax","email":"max@degterev.me"}],"homepage":"https://github.com/goodhood-eu/nebenan-redux-tools#readme","bugs":{"url":"https://github.com/goodhood-eu/nebenan-redux-tools/issues"},"dist":{"shasum":"8a1471793c6ecc1879171c203d2c1c4a716dac94","tarball":"https://registry.npmjs.org/nebenan-redux-tools/-/nebenan-redux-tools-6.9.0-beta.1.tgz","fileCount":27,"integrity":"sha512-f4YhkxFvwfdluWYyB2YUDDD6fX+XONGmu1MGxImaa80Wf7stZ8ayrZKlJWpES/f+iAN2xWtkX49iDOovjipCjQ==","signatures":[{"sig":"MEYCIQDLmFx4Fkn1rgEWMKN+KrKoC29lG/8yNEn506tCzo37eQIhAN/fe1wvj7cF6N4QxzCdD3DbwoV6sGYGvxRtlyjOz/7V","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":46956},"readme":"nebenan-redux-tools\n====================\n\nA set of redux helpers.\n\n- [Experiments Middleware](#experiments-middleware)\n- [Token Middleware](#token-middleware)\n- [Promise Middleware](#promise-middleware)\n- [Network Middleware](#network-middleware)\n  - [Trustworthy Endpoints](#trustworthy-endpoints)\n  - [API Token](#api-token)\n  - [X-Translations-Lang Header](#x-translations-lang-header)\n  - [Should Request](#should-request)\n  - [Abort Callback](#aborting)\n  - [Request Types](#request-types)\n  - [Pagination](#pagination)\n  - [Mock Responses](#mock-response)\n  - [Standalone Request](#standalone-request)\n  - [Customize](#customize)\n  \n# Experiments Middleware\n## Setup\n\n**NOT COMPLETE**\n```js\nimport { reducer as experiments } from 'nebenan-redux-tools/lib/experiments/state';\n\nconst reducers = { \n  // It is assumed that the experiment reducer's state\n  // is available under `state.experiments`\n  experiments \n};\n\n// ...\n\nconst createFromState = (initialState) => (\n  createStore(\n    combineReducers(reducers),\n    initialState,\n    composeEnhancers(applyMiddleware(...middleware)),\n  )\n);\n\nexport default createFromState\n```\n\n# Token Middleware\n## Setup\n**NOT COMPLETE**\n```js\nimport { reducer as token } from 'nebenan-redux-tools/lib/token';\n\nconst reducers = {\n  // It is assumed that the experiment reducer's state\n  // is available under `state.token`\n  token\n};\n\n// ...\n\nconst createFromState = (initialState) => (\n  createStore(\n    combineReducers(reducers),\n    initialState,\n    composeEnhancers(applyMiddleware(...middleware)),\n  )\n);\n\nexport default createFromState\n```\n  \n# Promise Middleware\nThe promise middleware gets triggered by dispatching actions with `promise` key in payload. The middleware will dispatch resolved or rejected actions when the promise is fulfilled.\n\n```js\ndispatch({\n  type: types.GET_USERS,\n  promise: {\n    getPromise: () => getUsersFromStorageAsync(),\n    \n    // Ensures the returned promise by the dispatched action to resolve even if the provided promise rejected\n    // graceful: true\n  }\n})\n```\n\n```js\n// reducer\nimport { resolved, rejected } from 'nebenan-redux-tools/lib/promise';\n\nexport default (state = getDefaultState(), action) => {\n  switch(action.type) {\n    case resolved(types.GET_USERS): {\n      const usersFromStorage = action.payload;\n\n      return { ...state, users: usersFromStorage };\n    }\n\n    case rejected(types.GET_USERS): {\n      const usersFromStorage = [];\n\n      return { ...state, users: usersFromStorage };\n    }\n\n    default: {\n      return state;\n    }\n  }\n} \n```\n\n\n## Should Execute\n\nPrevents unnecessary promise executions by checking state beforehand. Dispatches resolved action on prevented execution.\n\n```js\ndispatch({\n  type: types.GET_USERS,\n  promise: {\n    getPromise: () => getUsersFromStorageAsync(),\n    shouldExecute: (state) => !state.isFetched,\n  }\n})\n```\n\n# Network Middleware\n\nThe network middleware gets triggered by dispatching actions with `request` in payload. The middleware will fire the request and dispatches resolved or rejected actions when the request is finished.\n\nExample:\n\n```js\ndispatch({\n  type: types.GET_USERS,\n  request: {\n    url: \"/users\"\n  }\n})\n```\n\n```js\nimport { resolved, rejected } from 'nebenan-redux-tools/lib/network/types';\n\nexport default (state = getDefaultState(), action) => {\n  switch(action.type) {\n    case resolved(types.GET_USERS): {\n      const usersFromResponse = action.payload;\n      \n      return { ...state, users: usersFromResponse };\n    }\n    \n    case rejected(types.GET_USERS): {\n      const usersFromResponse = [];\n      \n      return { ...state, users: usersFromResponse };\n    }\n    \n    default: {\n      return state;\n    }\n  }\n} \n```\n\n## Trustworthy Endpoints\n\nRequests to trustworthy endpoints will enable the [X-Translations-Lang Header](#x-translations-lang-header) and [API Token](#api-token) features.\n\nSet trusted domain via global config:\n```js\nimport { configureNetwork } from 'nebenan-redux-tools/lib/network';\n\nconfigureNetwork({\n  trustedDomain: \"nebenan.de\",\n  ...otherSettings\n})\n```\n\n## API Token\n\nRequests to [trustworthy endpoints](#trustworthy-endpoints) will have the `X-AUTH-TOKEN` header set, containing the api token configured in request options or through token middleware. \n\nDefault: `state.token` (see token middleware)\n\nOverwrite:\n```js\ndispatch({\n  type: \"some-type\", \n  request: {\n    url: \"/some/endpoint\",\n    token: \"special-api-token\"\n  }\n})\n```\n\n## X-Translations-Lang Header\n\nRequests to [trustworthy endpoints](#trustworthy-endpoints) will have the `X-Translations-Lang` header set, containing the locale configured in request options or through global config.\n\nDefault via global config: \n```js\nimport { configureNetwork } from 'nebenan-redux-tools/lib/network';\n\nconfigureNetwork({\n  locale: 'de-DE',\n  ...otherSettings\n})\n```\n\nOverwrite:\n```js\ndispatch({\n  type: \"some-type\",\n  request: {\n    url: \"/some/endpoint\",\n    locale: \"en-US\"  \n  }\n})\n```\n\n## Should Request\n\nPrevents unnecessary requests by checking state beforehand. \n\n```js\ndispatch({\n  type: \"some-type\",\n  request: {\n    url: \"/some/endpoint\",\n    shouldRequest(state) {\n     return !state.isFetched;\n    }\n  }\n})\n```\n\n## Aborting\n\nAllows to cancel running requests. Just pass in a [AbortSignal](https://developer.mozilla.org/en-US/docs/Web/API/AbortSignal).\n\n```js\nconst controller = new AbortController();\n\ndispatch({\n  type: \"some-type\",\n  request: {\n    url: \"/some/endpoint\",\n    signal: controller.signal,\n  }\n})\n\n\n// later in app\ncontroller.abort();\n\n```\n\n## Request Types\n\n`request.type` determines used HTTP method\n\n### `query`\n\nSends out GET request. Collects parameters from `request.query` and applies [pagination](#pagination) query options if there are any.\n\n```js\ndispatch({\n  type: \"some-type\",\n  request: {\n     url: \"/users\",\n     type: 'query',\n     query: { q: 'Peter' } \n  }\n})\n```\n\n\n### `delete` / `post` / `put`\n\n```js\ndispatch({\n  type: \"some-type\",\n  request: {\n    url: \"/some/endpoint/123\",\n    type: 'put',\n    payload: { user: { email, password }}\n  }  \n})\n```\n\n\n## Pagination\n\nThere is some boilerplate needed to fully support paginated lists loaded over the network. These helpers help with managing state and sending pagination params over the network.\n\nThe endpoint you are accessing needs to fulfill following requirements:\n- Parameters\n  - `per_page`\n  - `lower` / `higher`\n- Response\n  - `total_count` (`state.total` needs to be updated manually if field does not exist)\n\n### `assignPaginationDefaults` / `paginationGenerator` helpers\n\n```js\nimport { paginationGenerator, assignPaginationDefaults } from 'nebenan-redux-tools/lib/network/pagination';\n\nconst getDefaultState = () => assignPaginationDefaults({ entities: {} });\nconst getPaginationUpdates = paginationGenerator(types.BOOKMARKS_FETCH);\n\nexport const reducer = (state = getDefaultState(), action) => {\n  let newState = state;\n  \n  const update = getPaginationUpdates(newState, action);\n  if (update) newState = updeep(update, newState);\n  \n  switch (action.type) {\n    case resolved(types.BOOKMARKS_FETCH): {\n      const { result, entities } = parse(action.payload);\n\n      const collection = newState.collection.concat(result.bookmarks);\n\n      return updeep({ collection, entities }, newState);\n    }\n    \n    default: {\n      return newState;\n    }\n  }\n}\n```\n\nThe state now holds the following information\n```js\n{\n  // (managed by paginationGenerator)\n  currentPage: 0, \n  // datetime of last fetch (managed by paginationGenerator)\n  lastFetched: 0,\n  // request in progress (managed by paginationGenerator)\n  isFetching: false,\n  // request failed (managed by paginationGenerator) \n  isFailed: false,  \n  // total amount of items over all pages (managed by paginationGenerator)\n  total: null,\n  // item ids for current page  \n  collection: [],\n}\n```\n\n### Actions\n\nPagination query params will be added for `query` requests with either `request.pagination.first` or `request.pagination.last` set.\n\n*Only works for endpoints supporting `lower`/`higher` params.*\n\n```js\ndispatch({\n  type: types.GET_USERS,\n  request: {\n    url: \"/users\",\n    type: 'query',\n    pagination: {\n      per_page: 10, // optional\n      first: firstUserId, // optional\n      last: lastUserId // optional\n    }\n  }\n})\n```\n\n## Mock Response\n\nResponses can be mocked by using the [promise middleware](#promise-middleware). You can keep all of your request options in the action and don't need to modify reducers. Quite useful during development if you are waiting for backend to support new endpoints.\n\n\n```js\ndispatch({\n  type: types.GET_USERS,\n  promise: Promise.resolve([\n    {\n      id: 1,\n      name: \"Peter\"\n    },\n    {\n      id: 2,\n      name: \"Christina\"\n    }\n  ]),\n  request: {\n    url: \"/users\",\n    type: 'query'\n  }\n})\n```\n\n```js\n// reducer\nimport { resolved } from 'nebenan-redux-tools/lib/network/types';\n\nexport default (state = getDefaultState(), action) => {\n  switch(action.type) {\n    case resolved(types.GET_USERS): {\n      const usersFromResponse = action.payload;\n      \n      return { ...state, users: usersFromResponse };\n    }\n    \n    default: {\n      return state;\n    }\n  }\n} \n```\n\n## Standalone Request\n\nRequests can be created programmatically too.\n\n```js\nimport { createRequest } from 'nebenan-redux-tools/lib/network';\n\nconst sendFile = (file, token) => (\n  createRequest({\n    token,\n    payload: { file },\n    url: '/file-upload',\n    type: 'post',\n    multipart: true,\n  }) \n)\n\nconst handleSuccess = (payload) => {\n  // same as action.payload\n  console.log(payload);\n}\n\nsendFile(newFile, token).then(handleSuccess);\n```\n\n## Customize\n\nThe network layer uses [axios](https://github.com/axios/axios) under the hood. To access axios specific features or extend functionality you can hook into request / response generation on a global or local scale.\n\nHooks:\n- `requestHook(requestConfig, requestOptions)`\n  - `requestConfig` the [axios request config](https://github.com/axios/axios#request-config) to be mutated\n  - `requestOptions` the `request` object provided inside the action\n- `responseHook(body, requestConfig, requestOptions)`\n  - `body` response data to be mutated\n  - `requestConfig` the [axios request config](https://github.com/axios/axios#request-config)\n  - `requestOptions` the `request` object provided inside the action\n  \n### Setup global hooks\n\n```js\nimport { configureNetwork } from 'nebenan-redux-tools/lib/network';\n\nconfigureNetwork({\n  requestHook: (requestConfig, requestOptions) => {\n    // ...\n  },\n  responseHook: (body, requestConfig, requestOptions) => {\n    // ...\n  },\n  ...networkSettings\n})\n```\n\n### Action level request hook\n\n```js\nimport { createRequest } from 'nebenan-redux-tools/lib/network';\n\nconst sendFile = (file, token, onProgress) => (\n  createRequest({\n    token,\n    payload: { file },\n    url: '/file-upload',\n    type: 'post',\n    multipart: true,\n    // same as requestHook\n    customize: (requestConfig) => {\n      requestConfig.onUploadProgress = onProgress;\n    }\n  })\n)\n```\n\n","gitHead":"3a2a829f2b7a751ea368366643b4c39c1ee0a95b","scripts":{"lint":"eslint --ext .es,.js ./","test":"npm run compile && TZ='GMT' mocha \"test/**/*.js\"","build":"npm run compile","check":"npm test && npm run lint && echo \"\\033[0;32mReady to publish\\033[0m\"","clean":"rm -rf ./lib/ || exit 1","compile":"NODE_ENV=production babel src --out-dir lib --copy-files","reinstall":"rm -rf node_modules package-lock.json && npm install","lint:tofile":"eslint --ext .es,.js --no-color -o ./eslint-report.log ./","test:tofile":"npm run compile && TZ='GMT' mocha --no-colors -R spec \"test/**/*.js\" 2>&1 | tee test-report.log","prepublishOnly":"npm run check && npm run clean && npm run build"},"_npmUser":{"name":"rejas","email":"npm@veeck.de"},"deprecated":"Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.","repository":{"url":"git+https://github.com/goodhood-eu/nebenan-redux-tools.git","type":"git"},"_npmVersion":"9.8.1","description":"A set of redux helpers","directories":{},"_nodeVersion":"18.18.2","dependencies":{"qs":"^6.11.2","axios":"^1.6.1","lodash":"^4.17.21","updeep":"^1.2.4","js-cookie":"^3.0.5","escape-string-regexp":"4.0.0","local-storage-adapter":"^2.0.0"},"_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"chai":"^4.3.10","mocha":"^10.2.0","sinon":"^17.0.1","eslint":"^8.53.0","@babel/cli":"^7.23.0","@babel/core":"^7.23.3","@babel/preset-env":"^7.23.3","eslint-config-nebenan-base":"^2.0.3","browserslist-config-nebenan":"^1.0.2","@babel/plugin-transform-runtime":"^7.23.3","babel-plugin-add-module-exports":"^1.0.4","@babel/plugin-transform-strict-mode":"^7.23.3"},"peerDependencies":{"react":">= 16.14.0","react-dom":">= 16.14.0","react-redux":"^7.2.6","@babel/runtime":"^7.12.5"},"_npmOperationalInternal":{"tmp":"tmp/nebenan-redux-tools_6.9.0-beta.1_1699953631151_0.6588852571114474","host":"s3://npm-registry-packages"}},"6.9.0":{"name":"nebenan-redux-tools","version":"6.9.0","author":{"name":"Good Hood GmbH","email":"tech@nebenan.de"},"license":"MIT","_id":"nebenan-redux-tools@6.9.0","maintainers":[{"name":"jobemichael","email":"jobe.michael@nebenan.de"},{"name":"hahiii","email":"shalanazim@gmail.com"},{"name":"fweinrich","email":"florian@weinrich.dev"},{"name":"spossner","email":"npm@possner.de"},{"name":"rejas","email":"npm@veeck.de"},{"name":"iamuchejude","email":"iamuchejude@gmail.com"},{"name":"suprmax","email":"max@degterev.me"}],"homepage":"https://github.com/goodhood-eu/nebenan-redux-tools#readme","bugs":{"url":"https://github.com/goodhood-eu/nebenan-redux-tools/issues"},"dist":{"shasum":"bb7bb83568d12232c2e05cb75531fe34e4d01764","tarball":"https://registry.npmjs.org/nebenan-redux-tools/-/nebenan-redux-tools-6.9.0.tgz","fileCount":27,"integrity":"sha512-RUEci4EGoqDPlRDRd3HRh5wWL16G9yfMm+Q0NW8EY+GI9GHTJuzT1IbSjyOvSgMrqqZSF2oV51GCYZ0+gjlngA==","signatures":[{"sig":"MEQCIFmo6CBqXTYN6if2dLbKEuEopZbBK4SUEOyuFptyIYpsAiAGOOm0RMynrBEDlfpUQOmS1bVbnyyeacaA5mjWOba9ZA==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":46949},"gitHead":"4423402fee6d24325c112a8daf9174ba40b7c31a","scripts":{"lint":"eslint --ext .es,.js ./","test":"npm run compile && TZ='GMT' mocha \"test/**/*.js\"","build":"npm run compile","check":"npm test && npm run lint && echo \"\\033[0;32mReady to publish\\033[0m\"","clean":"rm -rf ./lib/ || exit 1","compile":"NODE_ENV=production babel src --out-dir lib --copy-files","reinstall":"rm -rf node_modules package-lock.json && npm install","lint:tofile":"eslint --ext .es,.js --no-color -o ./eslint-report.log ./","test:tofile":"npm run compile && TZ='GMT' mocha --no-colors -R spec \"test/**/*.js\" 2>&1 | tee test-report.log","prepublishOnly":"npm run check && npm run clean && npm run build"},"_npmUser":{"name":"rejas","email":"npm@veeck.de"},"deprecated":"Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.","repository":{"url":"git+https://github.com/goodhood-eu/nebenan-redux-tools.git","type":"git"},"_npmVersion":"9.8.1","description":"A set of redux helpers","directories":{},"_nodeVersion":"18.18.2","dependencies":{"qs":"^6.11.2","axios":"^1.6.1","lodash":"^4.17.21","updeep":"^1.2.4","js-cookie":"^3.0.5","escape-string-regexp":"4.0.0","local-storage-adapter":"^2.0.0"},"_hasShrinkwrap":false,"devDependencies":{"chai":"^4.3.10","mocha":"^10.2.0","sinon":"^17.0.1","eslint":"^8.53.0","@babel/cli":"^7.23.0","@babel/core":"^7.23.3","@babel/preset-env":"^7.23.3","eslint-config-nebenan-base":"^2.0.3","browserslist-config-nebenan":"^1.0.2","@babel/plugin-transform-runtime":"^7.23.3","babel-plugin-add-module-exports":"^1.0.4","@babel/plugin-transform-strict-mode":"^7.23.3"},"peerDependencies":{"react":">= 16.14.0","react-dom":">= 16.14.0","react-redux":"^7.2.6","@babel/runtime":"^7.12.5"},"_npmOperationalInternal":{"tmp":"tmp/nebenan-redux-tools_6.9.0_1699962882945_0.35841499882225736","host":"s3://npm-registry-packages"}}},"time":{"created":"2018-08-14T16:13:25.301Z","modified":"2025-09-19T10:49:41.405Z","1.0.0":"2018-08-14T16:13:25.383Z","2.0.0":"2018-12-19T12:42:59.837Z","3.0.0-beta1":"2019-01-10T20:42:19.239Z","3.0.0-beta2":"2019-01-14T17:19:10.756Z","3.0.0":"2019-01-15T12:59:31.711Z","4.0.0":"2019-04-16T13:07:06.339Z","4.1.0":"2019-04-17T15:25:24.295Z","4.2.0":"2019-04-17T15:50:06.963Z","4.3.0":"2019-04-23T16:25:32.109Z","4.3.1":"2019-04-26T12:29:24.473Z","4.4.0":"2019-06-05T16:30:07.947Z","4.4.1":"2019-08-15T15:48:44.064Z","4.5.0":"2019-08-28T12:50:41.183Z","4.6.1":"2019-09-24T15:23:06.444Z","4.6.2":"2019-10-28T13:18:53.479Z","4.7.0":"2019-11-07T13:40:01.581Z","4.7.1":"2020-04-21T14:27:30.480Z","4.8.0":"2020-06-08T08:32:24.462Z","5.0.0":"2020-08-25T08:02:08.420Z","5.0.1":"2020-08-25T11:24:40.176Z","5.1.0":"2020-09-02T14:44:51.613Z","5.2.0-beta.0":"2020-10-27T17:39:47.509Z","5.2.0":"2020-10-27T17:49:39.158Z","5.3.0":"2020-11-05T18:15:46.421Z","5.4.0-beta.0":"2020-11-18T14:43:15.386Z","5.4.0":"2020-11-19T11:24:38.410Z","5.5.0":"2020-11-20T17:02:09.037Z","5.6.0":"2020-12-04T10:31:29.275Z","5.7.0":"2021-04-21T15:07:51.565Z","5.8.0":"2021-04-29T10:49:44.872Z","5.9.0":"2021-05-19T14:00:05.616Z","5.10.0":"2021-05-25T07:25:37.787Z","5.11.0-beta.0":"2021-06-07T11:26:27.945Z","5.11.0":"2021-06-08T14:10:05.457Z","5.11.1-beta.0":"2021-09-21T09:17:37.299Z","5.11.1":"2021-09-21T09:35:04.707Z","5.12.0-beta.0":"2022-01-20T08:45:25.674Z","6.0.0":"2022-01-26T16:57:55.066Z","6.0.1":"2022-02-07T10:26:14.153Z","6.0.2":"2022-02-08T09:32:22.811Z","6.1.0-beta.0":"2022-06-02T14:02:54.361Z","6.1.0-beta.1":"2022-06-02T14:10:46.040Z","6.1.0-beta.2":"2022-06-02T14:15:15.661Z","6.1.0-beta.3":"2022-06-02T14:19:10.915Z","6.1.0-beta.4":"2022-06-02T14:37:50.575Z","6.1.0-beta.5":"2022-06-08T15:08:41.060Z","6.1.0-alpha.0":"2022-09-02T13:31:12.365Z","6.1.0-alpha.1":"2022-09-02T13:45:06.529Z","6.1.0-alpha.2":"2022-09-14T07:40:08.386Z","6.1.0-alpha.3":"2022-09-14T12:34:01.977Z","6.1.0-alpha.4":"2022-09-14T13:30:37.358Z","6.1.0-alpha.5":"2022-09-14T20:24:48.714Z","6.1.0-alpha.6":"2022-09-14T21:02:27.625Z","6.1.0-alpha.7":"2022-09-14T21:08:48.661Z","6.1.0-alpha.8":"2022-09-14T21:44:15.114Z","6.1.0-alpha.9":"2022-09-14T21:51:26.586Z","6.1.0-alpha.10":"2022-09-14T23:00:40.339Z","6.1.0-alpha.11":"2022-09-15T01:01:52.398Z","6.1.0-alpha.12":"2022-09-16T10:25:28.702Z","6.1.0-alpha.13":"2022-09-16T11:04:40.603Z","6.2.0-beta.1":"2022-09-16T16:50:57.772Z","6.2.0-beta.2":"2022-09-16T16:51:56.646Z","6.1.0":"2022-09-20T12:23:11.995Z","6.2.0-beta.3":"2022-10-12T16:40:49.602Z","6.2.0":"2022-10-13T10:10:06.356Z","6.3.0-beta.0":"2022-10-17T15:07:34.556Z","6.3.0":"2022-10-18T10:49:04.234Z","6.4.0-beta.0":"2022-10-18T10:51:38.126Z","6.4.0-beta.1":"2022-10-18T11:28:43.001Z","6.4.0-beta.2":"2022-10-20T14:09:11.623Z","6.4.0-beta.3":"2022-10-20T14:51:36.919Z","6.4.0-beta.4":"2022-10-20T15:01:37.946Z","6.4.0":"2022-10-31T10:46:07.820Z","6.5.0-beta.0":"2022-11-08T17:17:51.118Z","6.5.0":"2022-11-08T17:29:49.991Z","6.5.1":"2022-11-08T17:32:58.787Z","6.6.0":"2023-04-20T09:17:18.936Z","6.7.0-beta.0":"2023-06-16T11:39:17.387Z","6.7.0":"2023-06-23T09:29:50.805Z","6.8.0-beta.0":"2023-07-06T13:01:15.521Z","6.8.0":"2023-07-07T13:35:52.319Z","6.5.2-beta.1":"2023-08-08T15:49:18.708Z","6.8.2":"2023-08-08T16:36:34.067Z","6.9.0-beta.0":"2023-08-22T09:07:17.346Z","6.8.3":"2023-09-19T07:40:01.228Z","6.9.0-beta.1":"2023-11-14T09:20:31.343Z","6.9.0":"2023-11-14T11:54:43.114Z"},"bugs":{"url":"https://github.com/goodhood-eu/nebenan-redux-tools/issues"},"author":{"name":"Good Hood GmbH","email":"tech@nebenan.de"},"license":"MIT","homepage":"https://github.com/goodhood-eu/nebenan-redux-tools#readme","repository":{"url":"git+https://github.com/goodhood-eu/nebenan-redux-tools.git","type":"git"},"description":"A set of redux helpers","maintainers":[{"email":"jobe.michael@nebenan.de","name":"jobemichael"},{"email":"shalanazim@gmail.com","name":"hahiii"},{"email":"florian@weinrich.dev","name":"fweinrich"},{"email":"max@degterev.me","name":"suprmax"}],"readme":"nebenan-redux-tools\n====================\n\nA set of redux helpers.\n\n- [Experiments Middleware](#experiments-middleware)\n- [Token Middleware](#token-middleware)\n- [Promise Middleware](#promise-middleware)\n- [Network Middleware](#network-middleware)\n  - [Trustworthy Endpoints](#trustworthy-endpoints)\n  - [API Token](#api-token)\n  - [X-Translations-Lang Header](#x-translations-lang-header)\n  - [Should Request](#should-request)\n  - [Abort Callback](#aborting)\n  - [Request Types](#request-types)\n  - [Pagination](#pagination)\n  - [Mock Responses](#mock-response)\n  - [Standalone Request](#standalone-request)\n  - [Customize](#customize)\n  \n# Experiments Middleware\n## Setup\n\n**NOT COMPLETE**\n```js\nimport { reducer as experiments } from 'nebenan-redux-tools/lib/experiments/state';\n\nconst reducers = { \n  // It is assumed that the experiment reducer's state\n  // is available under `state.experiments`\n  experiments \n};\n\n// ...\n\nconst createFromState = (initialState) => (\n  createStore(\n    combineReducers(reducers),\n    initialState,\n    composeEnhancers(applyMiddleware(...middleware)),\n  )\n);\n\nexport default createFromState\n```\n\n# Token Middleware\n## Setup\n**NOT COMPLETE**\n```js\nimport { reducer as token } from 'nebenan-redux-tools/lib/token';\n\nconst reducers = {\n  // It is assumed that the experiment reducer's state\n  // is available under `state.token`\n  token\n};\n\n// ...\n\nconst createFromState = (initialState) => (\n  createStore(\n    combineReducers(reducers),\n    initialState,\n    composeEnhancers(applyMiddleware(...middleware)),\n  )\n);\n\nexport default createFromState\n```\n  \n# Promise Middleware\nThe promise middleware gets triggered by dispatching actions with `promise` key in payload. The middleware will dispatch resolved or rejected actions when the promise is fulfilled.\n\n```js\ndispatch({\n  type: types.GET_USERS,\n  promise: {\n    getPromise: () => getUsersFromStorageAsync(),\n    \n    // Ensures the returned promise by the dispatched action to resolve even if the provided promise rejected\n    // graceful: true\n  }\n})\n```\n\n```js\n// reducer\nimport { resolved, rejected } from 'nebenan-redux-tools/lib/promise';\n\nexport default (state = getDefaultState(), action) => {\n  switch(action.type) {\n    case resolved(types.GET_USERS): {\n      const usersFromStorage = action.payload;\n\n      return { ...state, users: usersFromStorage };\n    }\n\n    case rejected(types.GET_USERS): {\n      const usersFromStorage = [];\n\n      return { ...state, users: usersFromStorage };\n    }\n\n    default: {\n      return state;\n    }\n  }\n} \n```\n\n\n## Should Execute\n\nPrevents unnecessary promise executions by checking state beforehand. Dispatches resolved action on prevented execution.\n\n```js\ndispatch({\n  type: types.GET_USERS,\n  promise: {\n    getPromise: () => getUsersFromStorageAsync(),\n    shouldExecute: (state) => !state.isFetched,\n  }\n})\n```\n\n# Network Middleware\n\nThe network middleware gets triggered by dispatching actions with `request` in payload. The middleware will fire the request and dispatches resolved or rejected actions when the request is finished.\n\nExample:\n\n```js\ndispatch({\n  type: types.GET_USERS,\n  request: {\n    url: \"/users\"\n  }\n})\n```\n\n```js\nimport { resolved, rejected } from 'nebenan-redux-tools/lib/network/types';\n\nexport default (state = getDefaultState(), action) => {\n  switch(action.type) {\n    case resolved(types.GET_USERS): {\n      const usersFromResponse = action.payload;\n      \n      return { ...state, users: usersFromResponse };\n    }\n    \n    case rejected(types.GET_USERS): {\n      const usersFromResponse = [];\n      \n      return { ...state, users: usersFromResponse };\n    }\n    \n    default: {\n      return state;\n    }\n  }\n} \n```\n\n## Trustworthy Endpoints\n\nRequests to trustworthy endpoints will enable the [X-Translations-Lang Header](#x-translations-lang-header) and [API Token](#api-token) features.\n\nSet trusted domain via global config:\n```js\nimport { configureNetwork } from 'nebenan-redux-tools/lib/network';\n\nconfigureNetwork({\n  trustedDomain: \"nebenan.de\",\n  ...otherSettings\n})\n```\n\n## API Token\n\nRequests to [trustworthy endpoints](#trustworthy-endpoints) will have the `X-AUTH-TOKEN` header set, containing the api token configured in request options or through token middleware. \n\nDefault: `state.token` (see token middleware)\n\nOverwrite:\n```js\ndispatch({\n  type: \"some-type\", \n  request: {\n    url: \"/some/endpoint\",\n    token: \"special-api-token\"\n  }\n})\n```\n\n## X-Translations-Lang Header\n\nRequests to [trustworthy endpoints](#trustworthy-endpoints) will have the `X-Translations-Lang` header set, containing the locale configured in request options or through global config.\n\nDefault via global config: \n```js\nimport { configureNetwork } from 'nebenan-redux-tools/lib/network';\n\nconfigureNetwork({\n  locale: 'de-DE',\n  ...otherSettings\n})\n```\n\nOverwrite:\n```js\ndispatch({\n  type: \"some-type\",\n  request: {\n    url: \"/some/endpoint\",\n    locale: \"en-US\"  \n  }\n})\n```\n\n## Should Request\n\nPrevents unnecessary requests by checking state beforehand. \n\n```js\ndispatch({\n  type: \"some-type\",\n  request: {\n    url: \"/some/endpoint\",\n    shouldRequest(state) {\n     return !state.isFetched;\n    }\n  }\n})\n```\n\n## Aborting\n\nAllows to cancel running requests. Just pass in a [AbortSignal](https://developer.mozilla.org/en-US/docs/Web/API/AbortSignal).\n\n```js\nconst controller = new AbortController();\n\ndispatch({\n  type: \"some-type\",\n  request: {\n    url: \"/some/endpoint\",\n    signal: controller.signal,\n  }\n})\n\n\n// later in app\ncontroller.abort();\n\n```\n\n## Request Types\n\n`request.type` determines used HTTP method\n\n### `query`\n\nSends out GET request. Collects parameters from `request.query` and applies [pagination](#pagination) query options if there are any.\n\n```js\ndispatch({\n  type: \"some-type\",\n  request: {\n     url: \"/users\",\n     type: 'query',\n     query: { q: 'Peter' } \n  }\n})\n```\n\n\n### `delete` / `post` / `put`\n\n```js\ndispatch({\n  type: \"some-type\",\n  request: {\n    url: \"/some/endpoint/123\",\n    type: 'put',\n    payload: { user: { email, password }}\n  }  \n})\n```\n\n\n## Pagination\n\nThere is some boilerplate needed to fully support paginated lists loaded over the network. These helpers help with managing state and sending pagination params over the network.\n\nThe endpoint you are accessing needs to fulfill following requirements:\n- Parameters\n  - `per_page`\n  - `lower` / `higher`\n- Response\n  - `total_count` (`state.total` needs to be updated manually if field does not exist)\n\n### `assignPaginationDefaults` / `paginationGenerator` helpers\n\n```js\nimport { paginationGenerator, assignPaginationDefaults } from 'nebenan-redux-tools/lib/network/pagination';\n\nconst getDefaultState = () => assignPaginationDefaults({ entities: {} });\nconst getPaginationUpdates = paginationGenerator(types.BOOKMARKS_FETCH);\n\nexport const reducer = (state = getDefaultState(), action) => {\n  let newState = state;\n  \n  const update = getPaginationUpdates(newState, action);\n  if (update) newState = updeep(update, newState);\n  \n  switch (action.type) {\n    case resolved(types.BOOKMARKS_FETCH): {\n      const { result, entities } = parse(action.payload);\n\n      const collection = newState.collection.concat(result.bookmarks);\n\n      return updeep({ collection, entities }, newState);\n    }\n    \n    default: {\n      return newState;\n    }\n  }\n}\n```\n\nThe state now holds the following information\n```js\n{\n  // (managed by paginationGenerator)\n  currentPage: 0, \n  // datetime of last fetch (managed by paginationGenerator)\n  lastFetched: 0,\n  // request in progress (managed by paginationGenerator)\n  isFetching: false,\n  // request failed (managed by paginationGenerator) \n  isFailed: false,  \n  // total amount of items over all pages (managed by paginationGenerator)\n  total: null,\n  // item ids for current page  \n  collection: [],\n}\n```\n\n### Actions\n\nPagination query params will be added for `query` requests with either `request.pagination.first` or `request.pagination.last` set.\n\n*Only works for endpoints supporting `lower`/`higher` params.*\n\n```js\ndispatch({\n  type: types.GET_USERS,\n  request: {\n    url: \"/users\",\n    type: 'query',\n    pagination: {\n      per_page: 10, // optional\n      first: firstUserId, // optional\n      last: lastUserId // optional\n    }\n  }\n})\n```\n\n## Mock Response\n\nResponses can be mocked by using the [promise middleware](#promise-middleware). You can keep all of your request options in the action and don't need to modify reducers. Quite useful during development if you are waiting for backend to support new endpoints.\n\n\n```js\ndispatch({\n  type: types.GET_USERS,\n  promise: Promise.resolve([\n    {\n      id: 1,\n      name: \"Peter\"\n    },\n    {\n      id: 2,\n      name: \"Christina\"\n    }\n  ]),\n  request: {\n    url: \"/users\",\n    type: 'query'\n  }\n})\n```\n\n```js\n// reducer\nimport { resolved } from 'nebenan-redux-tools/lib/network/types';\n\nexport default (state = getDefaultState(), action) => {\n  switch(action.type) {\n    case resolved(types.GET_USERS): {\n      const usersFromResponse = action.payload;\n      \n      return { ...state, users: usersFromResponse };\n    }\n    \n    default: {\n      return state;\n    }\n  }\n} \n```\n\n## Standalone Request\n\nRequests can be created programmatically too.\n\n```js\nimport { createRequest } from 'nebenan-redux-tools/lib/network';\n\nconst sendFile = (file, token) => (\n  createRequest({\n    token,\n    payload: { file },\n    url: '/file-upload',\n    type: 'post',\n    multipart: true,\n  }) \n)\n\nconst handleSuccess = (payload) => {\n  // same as action.payload\n  console.log(payload);\n}\n\nsendFile(newFile, token).then(handleSuccess);\n```\n\n## Customize\n\nThe network layer uses [axios](https://github.com/axios/axios) under the hood. To access axios specific features or extend functionality you can hook into request / response generation on a global or local scale.\n\nHooks:\n- `requestHook(requestConfig, requestOptions)`\n  - `requestConfig` the [axios request config](https://github.com/axios/axios#request-config) to be mutated\n  - `requestOptions` the `request` object provided inside the action\n- `responseHook(body, requestConfig, requestOptions)`\n  - `body` response data to be mutated\n  - `requestConfig` the [axios request config](https://github.com/axios/axios#request-config)\n  - `requestOptions` the `request` object provided inside the action\n  \n### Setup global hooks\n\n```js\nimport { configureNetwork } from 'nebenan-redux-tools/lib/network';\n\nconfigureNetwork({\n  requestHook: (requestConfig, requestOptions) => {\n    // ...\n  },\n  responseHook: (body, requestConfig, requestOptions) => {\n    // ...\n  },\n  ...networkSettings\n})\n```\n\n### Action level request hook\n\n```js\nimport { createRequest } from 'nebenan-redux-tools/lib/network';\n\nconst sendFile = (file, token, onProgress) => (\n  createRequest({\n    token,\n    payload: { file },\n    url: '/file-upload',\n    type: 'post',\n    multipart: true,\n    // same as requestHook\n    customize: (requestConfig) => {\n      requestConfig.onUploadProgress = onProgress;\n    }\n  })\n)\n```\n\n","readmeFilename":"README.md"}