{"_id":"@adamdickinson/react-service","_rev":"7-1c5e4639f31f36bb9cd041771c23b039","name":"@adamdickinson/react-service","dist-tags":{"latest":"2.0.0"},"versions":{"0.0.1":{"name":"@adamdickinson/react-service","version":"0.0.1","description":"Expose internal application APIs as a service.","main":"./dist/index.js","repository":{"type":"git","url":"https://github.com/adamdickinson/react-service"},"author":{"name":"Adam Dickinson","email":"me@adamdickinson.com.au"},"license":"MIT","types":"./dist/index.d.ts","scripts":{"build":"bili","prepare":"yarn build","test":"jest"},"dependencies":{"react":"^16.8"},"devDependencies":{"@testing-library/jest-dom":"^4.2.4","@testing-library/react":"^9.3.2","@types/jest":"^24.0.23","bili":"^4.8.1","jest":"^24.9.0","np":"^5.1.3","react-dom":"^16.12.0","rollup-plugin-typescript2":"^0.25.2","ts-jest":"^24.2.0","typescript":"^3.7.2"},"_id":"@adamdickinson/react-service@0.0.1","dist":{"shasum":"104ed98f30eda1079e6182b69926c85a696f4498","integrity":"sha512-enPyTksPwExW4AzRsmgJ4vWJFa8+IDv9pqpicLrRmziSJilaNA6uWaSv9+FDRI3cFS3MtSLu9XWzaQc/srLneQ==","tarball":"https://registry.npmjs.org/@adamdickinson/react-service/-/react-service-0.0.1.tgz","fileCount":4,"unpackedSize":1681,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJd3l3aCRA9TVsSAnZWagAAMz4P/2nAJhch88G4UZS5rKsG\nH6iE8eLwMTSf6l6AJEQ/M9a6dFob7M6GYA8X953frn1SLQcnJgUhgx9qcoRu\nu3Iua8VIWiD5+ecbttexSC7peMY+aS3SVLtzK9mmvJyiartwGfZkHUOfmL4B\nmV4C4xT6oX7uH5WNdodZ39itvteqbRQuYa2bUVHkN4eAq+qxVOou4DL+ztkP\n/X3ScJUX9GdoK1pGycL6O3C6DKpuM58fq8rqFTQAHDiEKs7C/Bu7pmtsId3V\n0qg3Nb+7ogmQgYsNxOcZBMW/F3rAm8KHemEax1o6nhj0h85LKsCHlc/zp7cE\nI8DeKI4jK0oC5dPHxAO8TsPOdUFzJVFwzIAKynF6y/WyMxLUTg/MyyXfBb3e\nCjiQrIMdTchGeilSYakb4fP9KInzldoyjxNH1GsoMIO5TIsK3XVYXSaiQ+li\n+NMgcaTTCrhQre/mmLA5UtdtxFq++fN3CK0/d1EuWrJyfJ2bY3UAG0H7DLeH\nzx8i9NZ61qfRTdxwWLzEzhmZ9xUSfbyIAomRZWf5lYKHLII1xsLGe/ERAumK\nfn/fvRyhzH61/pFH6kTwKJjOhu9U+6RpyXp/YOEozkRfSJM9uyf/saZXNYYo\nOi/Lc62oP5HxjRijlLKtYLs5gBEx6h6V5bt+TytKW0tlw3wvV12S6Z8XsOWY\nGMiZ\r\n=ANEy\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDNtBnoXjv5JkZZrjjXqTy8c0Ae10Uyp5KH82JPg9/yRwIgfKtIe9Uyt5TAL5ub8i+1YWMNtdM3+HmveBLer1oN8fY="}]},"maintainers":[{"name":"adomnom","email":"me@adamdickinson.com.au"}],"_npmUser":{"name":"adomnom","email":"me@adamdickinson.com.au"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-service_0.0.1_1574854106036_0.9613944050898153"},"_hasShrinkwrap":false},"0.0.2":{"name":"@adamdickinson/react-service","version":"0.0.2","description":"Expose internal application APIs as a service.","main":"./dist/index.js","repository":{"type":"git","url":"https://github.com/adamdickinson/react-service"},"author":{"name":"Adam Dickinson","email":"me@adamdickinson.com.au"},"license":"MIT","types":"./dist/index.d.ts","scripts":{"build":"bili","prepare":"yarn build","test":"jest"},"dependencies":{"react":"^16.13.1"},"devDependencies":{"@testing-library/jest-dom":"^5.11.0","@testing-library/react":"^10.4.4","@types/jest":"^26.0.4","@types/react":"^16.9.41","bili":"^5.0.5","jest":"^26.1.0","np":"^6.3.1","react-dom":"^16.13.1","rollup-plugin-typescript2":"^0.27.1","ts-jest":"^26.1.1","typescript":"^3.9.6"},"_id":"@adamdickinson/react-service@0.0.2","dist":{"shasum":"7c7482006cc29da6335ab4d73df1765165929d8e","integrity":"sha512-YMnXm40Rl8R/EmR569LHtdDl2gVYklwYb7z8S2XPPIStCuxGrj3lgkCAJRLnpWupDW00BCICfCK7tbwkq22JfA==","tarball":"https://registry.npmjs.org/@adamdickinson/react-service/-/react-service-0.0.2.tgz","fileCount":6,"unpackedSize":9326,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJfBTEWCRA9TVsSAnZWagAAJBAP/18eAFooHVv40NTDKLTj\nR2tJzUBrQNlSJ1FWVl57qSKFzqHIKXoQX0BrqgBqS8/twpYuGJlDKUQSOBNV\nNvDB/SqvpuPA+7IKL8tg6FAD+fLmqwBTtggcmPcI4/14gR9MVVNtPHWoQqle\ntZZmT3G4h91qPcq5768ED7tFlO57ScdHGaC+gePG5LffkPukDKj0KH0s2tSO\naiWs9DyV3lmT3M9xq6WzOFXpqt4IBj+RDVuBTOcS/lG+Pw12RlS/6SbKJSeA\njdBWbKKXQvdwLXDP1NdVSAtZbhezSoUPu3ceCDjTW4eo3nRYJAPGmZZY7LcE\nitRyVOQ2Cnz96EWxr0oW1x9EOWfRVp4o85ZCWiab/d/5Fs6pjT2YYvUbTxvN\ndMmvn53oBVpn8wrbAIP48RZjf3RKE5D+0PdbDF44pqPu19s6/lgoWyLIFW+E\nSjFYhdgTdB99W7co74GM4SB8M6HyR/NbL2VpzArD5rjSYpk53zA5AbeRpkCW\nxpYH/QYymOY6XPbeWs5oDyQfYvjVLCgHHeHvqps8BgwhymOVfhFSZP7tJmga\nnL4NztGgHHlxMbci1AxDNbCA1x45YUPkp2e3j2IkJARf0sFYs6ibkX2Uupz6\nGyshr2Vxp6KdH+n5C6BA8C/SQeTnPjY4JiOD7j1zQVSngKOIAR/uuwTL9Hr6\ng9E9\r\n=6WJv\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDlV3GPztvjvp/tY7Gj59NHf+7tJDx4jq9mmZFSIDUdOgIgTBggM/6FwtV0yMNwGe+X33luOZID3zBXROqB6PDiXKw="}]},"maintainers":[{"name":"adomnom","email":"me@adamdickinson.com.au"}],"_npmUser":{"name":"adomnom","email":"me@adamdickinson.com.au"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-service_0.0.2_1594175766414_0.8548448887644979"},"_hasShrinkwrap":false},"0.0.3":{"name":"@adamdickinson/react-service","version":"0.0.3","description":"Expose internal application APIs as a service.","main":"./dist/index.js","repository":{"type":"git","url":"https://github.com/adamdickinson/react-service"},"author":{"name":"Adam Dickinson","email":"me@adamdickinson.com.au"},"license":"MIT","types":"./dist/index.d.ts","scripts":{"build":"bili","prepare":"yarn build","test":"jest"},"devDependencies":{"@testing-library/jest-dom":"^5.11.0","@testing-library/react":"^10.4.4","@types/jest":"^26.0.4","@types/react":"^16.9.41","bili":"^5.0.5","jest":"^26.1.0","np":"^6.3.1","react":"^16.13.1","react-dom":"^16.13.1","rollup-plugin-typescript2":"^0.27.1","ts-jest":"^26.1.1","typescript":"^3.9.6"},"peerDependencies":{"react":"^16.13.1"},"_id":"@adamdickinson/react-service@0.0.3","dist":{"shasum":"3a1d7bd7ea3c91c6aa3786fe3bf3ae0d963a423e","integrity":"sha512-yeytoJxx+WgCOX3TDS3Rn5cGnuL1vZrh9H33E2eLKmIk2IyHLYNOAjVGnzVl2+5qs/vWpbaGOUu8cy15OxIXXg==","tarball":"https://registry.npmjs.org/@adamdickinson/react-service/-/react-service-0.0.3.tgz","fileCount":6,"unpackedSize":9922,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJfD72ZCRA9TVsSAnZWagAAjFgQAI54X5sQrgR2I1hr66mF\nh4jSIX6sEWZBCuG8Bmyv7QxXC5BDJ9whaQ72dnQNm465H8w6elpX8vdoEdLE\nzlsZfrRVHPjFLMxAXz9TIMFe2jloj7zJQ0A3Y43Zc6MLixoLNdo6O3PTjmHb\nsjzwPMFAYHwE8lXdfD7XlWxc4PQru3AQFsNtCJ9rTXap7+ESWgjWiqTtSRHH\nzYQnTAWr5MCiyhixNqdgO5hph0Wwlx+IfJI4A5l1zF3FL3bxlm1noXbpkNS8\nZ6adzsQj+vufC5s90GbWnZ9F4ogOSc5O01Cy4Z8gdJV91MT6FuHajO2DEAyT\n6ImfLQa77UMWDaHRL0m8RLr7SbE205akMe7N474H5pHM3bN0wSDhM7e8aL6x\nMBGqN7HMl0MIiNu+FQxMmoU3lXRU/2K05mFPALjE14qIX9ANq6BCnjRRdUtT\nSOHu0y6I/WnTNs9ZfZHzlpyrUrpIM1FnvLYk7WxMrn6XrgLTQ6sWQcZtD6L1\nq5HmzaQZJzGVEbW5Nz4qdoSNtf+DlTdsI05Zng52LTMVNW786mX5g+tDbiIZ\nDz4G1F1uNM9kbgvbzcKLfVlvQfgkgxGELuZgWgZIrNdh5hU7ySCPGTDar2IF\nhp15mZKXRJVXhy5alOSaKOnpRPdAsIIKaXyICv4Vl0K8oLC70B5BhoAXtDm7\nHxTA\r\n=LQmR\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDTMRuhWpHCSFPP3Lmc5ssJeJ/Iidbgz0hubJ1bKsr+kgIgIY5l2mr59X08uohUM1qTE2VIvCKbQAvfvUNYWf+svj0="}]},"maintainers":[{"name":"adomnom","email":"me@adamdickinson.com.au"}],"_npmUser":{"name":"adomnom","email":"me@adamdickinson.com.au"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-service_0.0.3_1594867096739_0.2226814909721515"},"_hasShrinkwrap":false},"0.1.0":{"name":"@adamdickinson/react-service","version":"0.1.0","description":"Expose internal application APIs as a service.","main":"./dist/index.js","repository":{"type":"git","url":"https://github.com/adamdickinson/react-service"},"author":{"name":"Adam Dickinson","email":"me@adamdickinson.com.au"},"license":"MIT","types":"./dist/index.d.ts","scripts":{"build":"bili","prepare":"yarn build","test":"jest"},"devDependencies":{"@testing-library/jest-dom":"^5.11.0","@testing-library/react":"^10.4.4","@types/jest":"^26.0.4","@types/react":"^16.9.41","bili":"^5.0.5","jest":"^26.1.0","np":"^6.3.1","react":"^16.13.1","react-dom":"^16.13.1","rollup-plugin-typescript2":"^0.27.1","ts-jest":"^26.1.1","typescript":"^3.9.6"},"peerDependencies":{"react":"^16.13.1"},"_id":"@adamdickinson/react-service@0.1.0","dist":{"shasum":"f80fb51cccdf7706c2cced299ee53b25468a9e4a","integrity":"sha512-2pejMQyLZP/FrcyD1HTLi5Jr7uQF51BJG98YvgzM86bx+iTZj2WBRfG10o9Yi9M3lsswBgISGnnLZ7/bqJkw4A==","tarball":"https://registry.npmjs.org/@adamdickinson/react-service/-/react-service-0.1.0.tgz","fileCount":7,"unpackedSize":11958,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJfRcOsCRA9TVsSAnZWagAAtkoP/iuk2AsOPuPIBVl6bCFM\n/S2rxIaDf1nynLakvje8SkXWbONwnykMpWytervT/7B0evScQmVxqjKLN9WC\ncoCy4Qc2+akmVJ12IXo7MaBkYLXqGgScc68ZtEROxcnYQ8d7Z3w1IP97dE3M\niEHV+t/25dQoNpZjIkEmXJz3rNevwGmtXTi9QINcYog5NoEoAx9irv+uy26i\nC3+rpjnyv/rnex3D98dv8Tp2hJjoORD9ZU3oPDXs0lDuhefnh5E5cqzPyj9J\niF+ZKqQrDXQVlZ+8KPWeINdAtUrCRdIXre2Bt5nbkWWmbWQsIRIEJNw9SyBs\nrHVNAvoQmTXF58PoSgtehE6WsW21r08dvVDSbrgG2OtTrIhyjUe37k4GgJBM\nVQV3Lls8j5YHymIEHQ/I4PQHm8mQWvEPpKA8Tw/WT+AurgkF2sYfC9nZWpkl\nmqqq7mj8sHfV8ibO9I45uJIF/eWI1d+CwHn7nuTnhEP1lsfBGk/YnVgV8Ivp\nqzD6F8UvFV1ddQQg46HUN6XILA+qCWIJRZ0gVgIHt8P2+kuRw1rh86f1dahd\nlh8c7h/Ji912XlwqABhJcaxZOrQApFfKMZQ6BIkrznGs/b2SsPck5wVPY55S\nly6bdh8Knfk/fmX3W8kogFsyo8m9ayKQLussnPJR4DzPxZJElJcsiTKxDKY2\n4Uon\r\n=HZ1O\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIHlommZaT4C5n4BmBiahtuCTNu9cescwhADEKnVcRmxcAiBcnR411XsSrOJ4519F5vhFOcEgU3BK0J20d/ZTlPIe0w=="}]},"maintainers":[{"name":"adomnom","email":"me@adamdickinson.com.au"}],"_npmUser":{"name":"adomnom","email":"me@adamdickinson.com.au"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-service_0.1.0_1598407596471_0.7624689081752498"},"_hasShrinkwrap":false},"1.0.0":{"name":"@adamdickinson/react-service","version":"1.0.0","description":"Expose internal application APIs as a service.","main":"./dist/index.js","repository":{"type":"git","url":"git+https://github.com/adamdickinson/react-service.git"},"author":{"name":"Adam Dickinson","email":"me@adamdickinson.com.au"},"license":"MIT","types":"./dist/index.d.ts","scripts":{"build":"rollup -c","ci":"yarn install --frozen-lockfile","prepare":"yarn build","test":"jest"},"devDependencies":{"@rollup/plugin-typescript":"^8.2.1","@testing-library/jest-dom":"^5.12.0","@testing-library/react":"^11.2.7","@types/jest":"^26.0.23","@types/react":"^17.0.8","jest":"^27.0.1","react":"^17.0.0","react-dom":"^17.0.0","rollup":"^2.50.3","rollup-plugin-cleanup":"^3.2.1","rollup-plugin-terser":"^7.0.2","ts-jest":"^27.0.1","tslib":"^2.2.0","typescript":"^4.3.2"},"peerDependencies":{"react":"^16.13.1-^17.0.0"},"gitHead":"41b788e6023aeb2918c0bbc780a93ed75e37fde4","bugs":{"url":"https://github.com/adamdickinson/react-service/issues"},"homepage":"https://github.com/adamdickinson/react-service#readme","_id":"@adamdickinson/react-service@1.0.0","_nodeVersion":"14.17.0","_npmVersion":"6.14.13","dist":{"integrity":"sha512-I3PqYX6TWfFqdDb5fzNvIhw+LCJew4hMqawHuXK8miUbpM+iQI9DJnv416sUh50ni6YEdGcvvy8LB2gZZ5QmOw==","shasum":"33cd24a532279904f6e0abb579268ad870b7108c","tarball":"https://registry.npmjs.org/@adamdickinson/react-service/-/react-service-1.0.0.tgz","fileCount":6,"unpackedSize":25688,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJgsPnzCRA9TVsSAnZWagAAZMIP+wc4QTciZFpSIUs/QT3j\nC5iZix9oWC1uYuXRA9gFGcBaWrP/sQmDJlsWdmzXC4YH6Is8HXqjp712pkTZ\nnyqG8raIdU9O/MMLZvFRSEe+xY0wYxN/hJTE289LBogYkV/WuKxLRaPaIwPZ\nIIJ+CLoISzUoKzmWtpOUCMRm/eLKqvWH/FfXjV/XLAa8GkNqpKveGDbMOsfJ\nX56AFfP4vM9whXGQpfsm5AyjmhPSq7XZJ0BiKZJzrFfaCklfd+BwFLPt/w7e\nFKi3KMrWk9dYLFA6lZ+plpq7ElBo8gfZmqTxR5MWowg4+W4XPmuyyy8rtYdb\ni9Lu2ZcXXtALoEUburYoGIfiUn/7H2L7sgK52I1SQFDM2dq7SQdoaRgv+iEk\nRi85cD0C9gnUAqU6uIjkAtGc2zdCg+g6QEx8SHbXFe08pjrjvwhkOPRvHTA3\ncZ4chnzVMzK2wVYvUgydkvl2T/3biNR/lLC2sQ+rcqLgtVzg9igJj7F6inQ9\nOfuN4EzR7zplLUijCQTGv5bCDxsICuxwhqX+n8v7UyJQgSaDBsu5KnaLHU8S\nHeEAn7zirEUhcGbl6fdHC3UM31okcvfvCrQuZxj5DAmzPTZENXwfpvdc88CL\nA9gS9Bk2zcwLHs2n3vX3QNRuteHYbaDfKtkXCZsjXMCKo9ZHCJHd9613GqOa\n2QnL\r\n=M2Uv\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDt5x63Zh48xYdsqQ9mCgjpqzjIxodENnkM4/44IpGbagIgTp5Q+hNdkYKLJaYpki4oVhzqdP/VMQIPpoo7Cby69yM="}]},"_npmUser":{"name":"adomnom","email":"me@adamdickinson.com.au"},"directories":{},"maintainers":[{"name":"adomnom","email":"me@adamdickinson.com.au"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-service_1.0.0_1622211059054_0.9534240761084796"},"_hasShrinkwrap":false},"1.0.1":{"name":"@adamdickinson/react-service","version":"1.0.1","description":"Expose internal application APIs as a service.","main":"./dist/index.js","repository":{"type":"git","url":"git+https://github.com/adamdickinson/react-service.git"},"author":{"name":"Adam Dickinson","email":"me@adamdickinson.com.au"},"license":"MIT","types":"./dist/index.d.ts","scripts":{"build":"rollup -c","ci":"yarn install --frozen-lockfile","prepare":"yarn build","test":"jest"},"devDependencies":{"@rollup/plugin-typescript":"^8.2.1","@testing-library/jest-dom":"^5.12.0","@testing-library/react":"^11.2.7","@types/jest":"^26.0.23","@types/react":"^17.0.8","jest":"^27.0.1","react":"^17.0.0","react-dom":"^17.0.0","rollup":"^2.50.3","rollup-plugin-cleanup":"^3.2.1","rollup-plugin-terser":"^7.0.2","ts-jest":"^27.0.1","tslib":"^2.2.0","typescript":"^4.3.2"},"peerDependencies":{"react":"^16.13.1 || ^17.0.0"},"gitHead":"23021a0e8f047b98d2f9f9fac0ba143fd0c4eab6","bugs":{"url":"https://github.com/adamdickinson/react-service/issues"},"homepage":"https://github.com/adamdickinson/react-service#readme","_id":"@adamdickinson/react-service@1.0.1","_nodeVersion":"14.17.0","_npmVersion":"6.14.13","dist":{"integrity":"sha512-cKKtW9QSOjCIobzZJ13YdRY3wL7BLj9cX3DN3aB32nk0lXEJX9dNpcfY9igazTYz/2DDBMUKJbYpnQ+3LLCZaw==","shasum":"ae5db0c91557ee39eb4fcd9241bb9910b4da05e9","tarball":"https://registry.npmjs.org/@adamdickinson/react-service/-/react-service-1.0.1.tgz","fileCount":6,"unpackedSize":25691,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJgtPKSCRA9TVsSAnZWagAAOtwP/0MxVRgBQIJEDpESz9ib\nRBAo/ZISvW9ZIzwTifPntMmld9DwBpi5Y87f5fM00dVDKWk1BGozuJNNssRx\n8w6DIhrRPdsSaCkqs06J94nB1lajhXh+adMM5d6lG6bfyDqQT+crSSawqi2Q\n079lsNzvJKoaSnLskoMH5BE9zTliVJTW9kG1EoB5VNANMSV2qSGetP1JTRgI\nqyunRGcbRwG9ihpz+yZ3ZALOy2Y+BQy8qdc64yE1zyqPnBQQHdcqFoTFcq3H\nuwC0UG9A19rl18vyoyG/GK3OYliT+8hihOsRXWr/ryPwKechw8kwPiTbW+Qb\nJ3YJwHDujhR2lmvYL6oblztGUCP4a2/OSpJn62HJ9AV+sDnG/bQhDa07udYv\n2mKudfttbz8xvyh2SjWTfDPouRXK/X5K3DVSzAoT/aWRq6OGd8uLhTE0G0/S\naKVCPCytZUIogpSYahUSovyzBH6GT19vi49py13kMnkbrmjpn4WMy1Aql+vk\nitKyRQd/qCseOIQTIEv6K7Kax+gdxX5+CLKTqvv5ZQeCZ70qFZTo8CX6oB/5\nkhNQJa14xsNLyaCaZNv42KlpTeCsXk0ibuVZM5EVQv3Hlh5j6lPjFDitHDcv\n/4Vmfx/bbfe5MT2mOqZQsbmETfgTOlzP1fne1zo2GXDvA2A38b2AbEsI21+s\nGAOT\r\n=2KJz\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIHW3WyI0JFnNbk18g1jL5qFgyCcTz+DnRt9tdccOARZqAiBA+iy2kjdy7vDAzTkHhbhTaedVJhA3uqdDejPScopLDA=="}]},"_npmUser":{"name":"adomnom","email":"me@adamdickinson.com.au"},"directories":{},"maintainers":[{"name":"adomnom","email":"me@adamdickinson.com.au"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-service_1.0.1_1622471314274_0.2839354910580958"},"_hasShrinkwrap":false},"2.0.0":{"name":"@adamdickinson/react-service","version":"2.0.0","description":"Expose internal application APIs as a service.","main":"./dist/index.js","repository":{"type":"git","url":"git+https://github.com/adamdickinson/react-service.git"},"author":{"name":"Adam Dickinson","email":"me@adamdickinson.com.au"},"license":"MIT","types":"./dist/index.d.ts","scripts":{"build":"rollup -c","ci":"yarn install --frozen-lockfile","prepare":"yarn build","test":"jest"},"devDependencies":{"@rollup/plugin-typescript":"^8.2.1","@testing-library/jest-dom":"^5.12.0","@testing-library/react":"^11.2.7","@types/jest":"^26.0.23","@types/react":"^17.0.8","jest":"^27.0.1","react":"^17.0.0","react-dom":"^17.0.0","rollup":"^2.50.3","rollup-plugin-cleanup":"^3.2.1","rollup-plugin-terser":"^7.0.2","ts-jest":"^27.0.1","tslib":"^2.2.0","typescript":"^4.3.2"},"peerDependencies":{"react":"^16.13.1 || ^17.0.0"},"gitHead":"ea713dcf0e483cb509e3ff627f4684c15d0ab17d","bugs":{"url":"https://github.com/adamdickinson/react-service/issues"},"homepage":"https://github.com/adamdickinson/react-service#readme","_id":"@adamdickinson/react-service@2.0.0","_nodeVersion":"14.17.3","_npmVersion":"6.14.13","dist":{"integrity":"sha512-gDp/J7NOO2lyOIsQJvqfkwJX4ZiaHwDTFSTUHHvDevR23zN79KnkEzE/Dvp1bwUnGJhbhDj3JGX6r2glcjqlRw==","shasum":"e63dee2630f7f6019390387ebf191fcf77555577","tarball":"https://registry.npmjs.org/@adamdickinson/react-service/-/react-service-2.0.0.tgz","fileCount":6,"unpackedSize":25819,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJg9qNiCRA9TVsSAnZWagAA1VAQAIq16MdedkvL4EIag1GF\nGeUSRkdZNdqn/HHFpFunAOlW+2Wif5vjFENrnkgunvs+Q2helap41/7RCy4Z\nZXTvSk0+N5FDOGkCC6l2hmJOOEDu19k9Ap1VCW+DutcFscbsvKBUZPUtWo14\nN6zAgJRQ5rK85DaW8+GjU8MU7Tr3IFCy3U0mJtXwbZK0ncxGNacil4eTOGYN\n9x+5+DcU8P95vPf2vMNTxO9EG3bVP9IhUc1U1af6rFhUPFn7jlsjs9ZSlqER\nff4kxpV8I+DY7fbexEVfCWwqrJZ33rpsxeh2byPNpuWErBZFntd3eyM9RlOP\nYnRUmL4jtdhhNo2c66aiyJ7froJ+CbY3aOMXaT2kB7y/NI4j4eBg7qqjjfeI\nwsoRuymNritmqGLKOieQ2HW9ae3+3yEDkvvremIQ94c7Z6rpqC/IMGvktg+4\nfEazNqxF94Hf8EYlVqvZN48H3UIBL5dMNbKBPbmXujTBZZKD2i1d+zwKvXXt\nhXnNZJZQDS/fGQYsCz7pYW25Z2nt6hE5rjWFWlRsH3gegb9VAHxHb2y9gy8T\nxrHe+GYJionaCJUPFsQDs1Io8+f4PI0vmaSeyAGQR9uLiDZqEHFWGPECCTqW\nVNmVTAOZkwi9HNG0irYmVPn3T4utu0kqazyQV6TSsP4l8OsPRSVU7ZB6UUT2\nZ46L\r\n=53Wz\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDjQOGggd7/KJ2wSZVuYjjYLgtr5DSOVp4eQl41XAp1RgIgXv6ngvD62go8QBfxkq+bZczC1FxxRrE5I6Zf4J6CL0Q="}]},"_npmUser":{"name":"adomnom","email":"me@adamdickinson.com.au"},"directories":{},"maintainers":[{"name":"adomnom","email":"me@adamdickinson.com.au"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-service_2.0.0_1626776417792_0.7354336548415847"},"_hasShrinkwrap":false}},"time":{"created":"2019-11-27T11:28:25.847Z","0.0.1":"2019-11-27T11:28:26.203Z","modified":"2022-04-04T11:25:11.096Z","0.0.2":"2020-07-08T02:36:06.535Z","0.0.3":"2020-07-16T02:38:16.880Z","0.1.0":"2020-08-26T02:06:36.631Z","1.0.0":"2021-05-28T14:10:59.156Z","1.0.1":"2021-05-31T14:28:34.522Z","2.0.0":"2021-07-20T10:20:18.157Z"},"maintainers":[{"name":"adomnom","email":"me@adamdickinson.com.au"}],"description":"Expose internal application APIs as a service.","repository":{"type":"git","url":"git+https://github.com/adamdickinson/react-service.git"},"author":{"name":"Adam Dickinson","email":"me@adamdickinson.com.au"},"license":"MIT","readme":"# React Service\n\nInternal APIs for your application.\n\nA React Service is one answer to the questions:\n\n_How should I manage state in my application? Redux has a lot of boilerplate and slows us down, MobX is tricky to debug and is kinda magic, component state + prop drilling is annoying and adds unnecessary complexity, React context is annoying to set up. What do?_\n\n## Installation\n\n```sh\nnpm install @adamdickinson/react-service\n```\n\nor\n\n```sh\nyarn add @adamdickinson/react-service\n```\n\n## API\n\nThere's only one method you really need to know about:\n\n`createService(hook) -> [ProviderComponent, UseServiceHook]`\n\nCreates the provider and access hook for a new service.\n\n### Parameters\n\n**hook**\n\nA react hook function used to expose data.\n\n### Returns\n\n**[ProviderComponent, UseServiceHook]**\n\nMuch like React's `useState` method, will return two values - the definition of\na provider component, and the definition of a service hook.\n\nThe provider component is designed to be rendered in your application,\nproviding access to the defined service to all child components.\n\nThe service hook is designed to be used within child components as needed to\naccess service data.\n\n## Usage\n\nLet's cut the discourse - it's demo time. Here are a handful of ways to\nimplement what is effectively the same thing:\n\n### Basic Usage\n\nAs a contrived example, let's say we want to make a random number service.\n\n```ts\n// 1. We define the service\nconst [RandomProvider, useRandom] = createService(({ max }: { max: number }) => {\n  const [number, setNumber] = useState<number>()\n  return {\n    update: () => setNumber(Math.floor(Math.random() * max)),\n    number,\n  }\n})\n\n// 2. We use the service with the `useRandom` hook in some components\nconst Displayer = () => {\n  const random = useRandom()\n  if (!random) return null\n  return <p>The number is {random.number}</p>\n}\n\nconst Changer = () => {\n  const random = useRandom()\n  if (!random) return null\n  return <button onClick={random.update}>Randomize!</button>\n}\n\n// 3. We expose the service to those components that use it by rendering a parent `RandomProvider` component\nReactDOM.render(\n  <RandomProvider max={100}>\n    <Displayer />\n    <Changer />\n  </RandomProvider>,\n  document.getElementById('root')\n)\n```\n\n### Usage as an Auth Service\n\nHere's how we define a service. We start by simply and concisely defining data\nand processes...\n\n```ts\n// src/services/auth.ts\nimport createService from '@adamdickinson/react-service'\nimport store from 'store'\nimport { useEffect, useState } from 'react'\n\n// Define our contract\ninterface User {\n  id: string\n  firstName: string\n  lastName: string\n  email: string\n}\n\ninterface AuthAPI {\n  logIn(username: string, password: string): Promise<User>\n  logOut(): void\n  user?: User\n}\n\n// Define our API as a hook so we can leverage React functionality\nconst useAuthAPI = ({ serverUrl }: { serverUrl: string }) => {\n  const [user, setUser] = useState<User>()\n\n  const onChangeUser = (newUser?: User) => {\n    // Set local state, and persist change to storage\n    store.set('user', newUser)\n    setUser(newUser)\n  }\n\n  useEffect(() => {\n    // Restore existing user from persistent storage into local state\n    const existingUser = store.get('user')\n    if (existingUser) {\n      setUser(existingUser)\n    }\n  }, [])\n\n  const api: AuthAPI = {\n    logIn: async (username: string, password: string) => {\n      const response = await fetch(`${serverUrl}/login`)\n      if (!response.ok) {\n        throw new Error(response.statusText)\n      }\n\n      onChangeUser(await response.json())\n    },\n    logOut: () => onChangeUser(undefined),\n    user,\n  }\n\n  return api\n}\n\nconst [AuthService, useAuth] = createService<AuthAPI>(useAuthAPI)\n\nexport { AuthService, useAuth }\n```\n\n... then we expose it to our application...\n\n```ts\n// src/index.tsx\nimport ReactDOM from 'react-dom'\nimport App from './App'\nimport { AuthService } from './services/auth'\n\nReactDOM.render(\n  <AuthService serverUrl=\"http://api.myapp.com\">\n    <App />\n  </AuthService>,\n  document.getElementById('root')\n)\n```\n\n... and finally, start using it wherever we need it!\n\n```ts\n// src/App.tsx\nimport { useAuth } from './services/auth'\nimport { BrowserRouter as Router, Route, Switch } from 'react-router-dom'\n\nexport default () => {\n  const auth = useAuth()\n  return (\n    <Router>\n      <Switch>\n        // Unauthed routes\n        {!auth?.user && <Route path=\"/\" component={LogIn} />}\n        // Authed routes\n        {!!auth?.user && <Route path=\"/\" component={Welcome} />}\n      </Switch>\n    </Router>\n  )\n}\n```\n\n```ts\n// src/containers/LogIn.tsx\nimport { useAuth } from './services/auth'\nimport { useState } from 'react'\n\nexport default () => {\n  const auth = useAuth()\n  const [loggingIn, setLoggingIn] = useState(false)\n  const [error, setError] = useState('')\n\n  const login = async () => {\n    setLoggingIn(true)\n    try {\n      await auth.logIn('me', 'my-pass')\n    } catch (error) {\n      setError(error?.message || error)\n      setLoggingIn(false)\n    }\n  }\n\n  return (\n    <>\n      {error && <p>{error}</p>}\n      <button onClick={login}>Log In</button>\n    </>\n  )\n}\n```\n\n```ts\n// src/containers/Welcome.tsx\nimport { useAuth } from './services/auth'\n\nexport default () => {\n  const auth = useAuth()\n  return `Welcome ${auth?.user?.firstName}!`\n}\n```\n\n## Limitations\n\nAny good library will identify where it falls down and where it wants to\nimprove. In an attempt to make this a good library too, here goes:\n\n### Too many services spoil the broth\n\nUsing multiple services at once poses some interesting challenges:\n\n#### 1. Nesting Nightmares\n\nLook at this (if you dare):\n\n```ts\nconst App = ({ children }) => (\n  <AuthProvider>\n    <APIProvider>\n      <CommentsProvider>\n        <PlaylistProvider>{children}</PlaylistProvider>\n      </CommentsProvider>\n    </APIProvider>\n  </AuthProvider>\n)\n```\n\nIt only uses four randomly named services, but it's already becoming a nested\nmess.\n\n#### 2. Inter-service Relationships\n\nLet's say we have an Auth service that uses an API service to communicate on\nits behalf, but the API service needs an auth token. Very quickly, we discover\nthat we have a circular dependency. There are ways to handle this - namely\ndelegating the task of token association to the caller rather than have the API\nservice itself associate it to a call, but that's adding more complexity.\n\n#### 3. Performance Risks\n\nWhile no performance issues have arisen in our extensive experimentation with\nthis library, there is a risk of running extra renders when they are simply not\nrequired, again due to the nested nature of services, however more research is\nrequired here to confirm or deny this to any real extent.\n\n### There ain't much structure\n\nRedux has set standard processes when it comes to its actions and reducers.\nIt's all explicit and all verbose. While this is often seen as a curse, it can\nalso be a blessing as it also defines a structure that many developers can work\nwith simultaneously.\n\nThere is very little boilerplate, and therefore very few explicit structure\nrequirements for services. While this does mean getting more done with much\nless code, it also makes things less verbose and less structured.\n\n### Got more?\n\nSpin up an issue!\n\n### Got a solution?\n\nSpin up a PR! Standards are pretty high, but feedback is a cornerstone of any\ngood pull request so expect much love for any contributions.\n","readmeFilename":"README.md","homepage":"https://github.com/adamdickinson/react-service#readme","bugs":{"url":"https://github.com/adamdickinson/react-service/issues"}}