{"_id":"thunderclap","_rev":"26-fc5cd8e1816e82c3432bdb567cf1be42","name":"thunderclap","dist-tags":{"latest":"0.0.33-a"},"versions":{"0.0.1-a":{"name":"thunderclap","version":"0.0.1-a","description":"Thunderclap: An indexed object database for Cloudflare","engines":{"node":"10.x"},"license":"SSPL v1","scripts":{"thunderclap":"webpack"},"repository":{"type":"git","url":"git+https://github.com/eventscope/thunderclap.git"},"keywords":[],"author":{"name":"Simon Y. Blackwell","email":"syblackwell@anywhichway.com","url":"http://app.github.com/anywhichway"},"bugs":{"url":"https://github.com/eventscope/thunderclap/issues"},"homepage":"https://github.com/eventscope/thunderclap#readme","devDependencies":{"chai":"^4.2.0","live-server":"^1.2.1","mocha":"^5.2.0","webpack":"^4.33.0","webpack-cli":"^3.3.4","webpack-shell-plugin":"^0.5.0"},"dependencies":{},"gitHead":"6a592dd46f5c326582572a8147af7be99c69281d","_id":"thunderclap@0.0.1-a","_nodeVersion":"11.13.0","_npmVersion":"6.7.0","dist":{"integrity":"sha512-cCwAfcFLU+zAy2tBZ6BfnPvcGCfZs0T7RzHr+ES/1WLizZHZMCgqjRaWTNEfF8O1cywdxEfthgDxe6sGJNmzGg==","shasum":"8d4bf1ee5dbd9ad57570ba2982d155acb5e2030c","tarball":"https://registry.npmjs.org/thunderclap/-/thunderclap-0.0.1-a.tgz","fileCount":29,"unpackedSize":222389,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdCu8lCRA9TVsSAnZWagAAelIQAId7ZAuISoGSY/ZFVVVv\nOEk++uVH6A77gu2M1oePx5NAVnWwPTihLl2B1YWwQE01mozMKeeQL7ayuLeN\n6GdhpFlEQyl5VUdq44lJ6jJ7hn8j8TG4Ucr/3v4RGhh4i6Zg0egi/YF+2gpU\n8trTSJNuhNYeB3FryGcfGQzkIDucHLoqg2TRtrGxYl/4W64vV1tkkR+Vhtll\nNsAwQv6BfZgGhmM5C58NMdjt3tuU8NJ0ugB2pfAz4sXJHHpIF/lw3SBVGHRI\ne9/ZiZqUw/eZvytlzFFCHY33fkk7TiJ78XD9B0cipyquOTcZPosG2aiRBvHJ\nfEw4Mn0vnHK9q+FPcHukZ85LEmwco7DkBdvQtxtFg3+QDYHVaRTkLyzWl/6L\nkSEVaj47g5YD1h7tYtYtVfA+DKkuNgs8elj5msqQk6YYV7HfNqO/ke6k78BU\nNQvF5G9dy7dvLVRsQEIxxR0Fg6pyx9Gf4Y4a16ueVtJlZRehJrlLtpEhZwSK\nFfxCU/pUMC4jayDuQLtm2qGSDra4jbdg3y2w+QWuNLuH2fysdvyVEEcSjMGU\n3ulHBgw9oJAABFAle7Gru6axlcJXY/dFBBC7nCdEPX7iWc8+hhT6cgkm/7Gr\nD29LtwWk5VQEwEz8Ptb3qGaHy2CaPaHLzjmnTnzSYaVq4suRHwjaOLJZaRzt\nth9Q\r\n=jBh2\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDjFZhoI7hApBO4WY+FCWD0hBeJ89s2lAgXt7w309nU+gIgJKo0ST4z0coHbbQot237aqNBLyfGNJ7w8oO93ySI9I0="}]},"maintainers":[{"name":"anywhichway","email":"syblackwell@anywhichway.com"}],"_npmUser":{"name":"anywhichway","email":"syblackwell@anywhichway.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/thunderclap_0.0.1-a_1560997668631_0.23277323172364528"},"_hasShrinkwrap":false},"0.0.3-a":{"name":"thunderclap","version":"0.0.3-a","description":"Thunderclap: An indexed object database for Cloudflare","engines":{"node":"10.x"},"license":"SSPL v1","scripts":{"thunderclap":"webpack"},"repository":{"type":"git","url":"git+https://github.com/eventscope/thunderclap.git"},"keywords":[],"author":{"name":"Simon Y. Blackwell","email":"syblackwell@anywhichway.com","url":"http://app.github.com/anywhichway"},"bugs":{"url":"https://github.com/eventscope/thunderclap/issues"},"homepage":"https://github.com/eventscope/thunderclap#readme","devDependencies":{"chai":"^4.2.0","live-server":"^1.2.1","mocha":"^5.2.0","webpack":"^4.33.0","webpack-cli":"^3.3.4","webpack-shell-plugin":"^0.5.0"},"dependencies":{},"gitHead":"66109c08855b59b81909b711d9428b16ba3af318","_id":"thunderclap@0.0.3-a","_nodeVersion":"11.13.0","_npmVersion":"6.7.0","dist":{"integrity":"sha512-3TLDQEuMIjh3W/Tih3ggPx3Sxi1DzfktoPewvzdc0xC3qolE3y6FqN58wCDGutgRK/xnnMuIITuyWh4BiXIQmA==","shasum":"ec4fc47e0e0387755b52f00da85f39721d895825","tarball":"https://registry.npmjs.org/thunderclap/-/thunderclap-0.0.3-a.tgz","fileCount":31,"unpackedSize":1027544,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdC3MJCRA9TVsSAnZWagAAqB8QAJjFgPSks3udjYX3QAIO\nGV2XEYWI6aUnG3AzORpcCs0NNCx785h02P2ve/QQNLwOFY5fM18GOwMxT0YO\nvWX8PLBgZVmstygw9rpypMtT6P7nxXOP9bIRaFQmZFxGP9F9PBfBK4O6QiL7\nuV4018dR7neJ9REmFw5r8HooE2EO07QZVToZTH0LQf5SWT37H5vQf8p8vq+p\nEN5MIoG/u0ScKg0tHjStT2xryk2fmVGoJcLNOBiZC2lgg2UQAhkq6FJJ/f1D\n+N0UajYAhTnrlg2Di6cW2A5DQUP0xCCFBIpV0Mz3e6/iFXrRJ1h/yK+eJ7QF\n5+jI7zvzR5fmgHzj5lwd9sGgBmglfD4OP+WTWQOWIulUiAcQRif9YnHEIE3+\nf8NQKhunMlulI22o9emIZ6W3k7A6s25zhFs0HoBcpLQhiBlszFeFMEDMLJms\nM7kGu2XxD0zuo5jHov4DmapEkPU74YHplaZK25ABP+yWY7YlPn3pGk0uEsGG\nX/VerAlc1Xkf+rZtCPXAUUSBVCFLeUgBPqHP2j9ndTJPgR3nLqWnz4w5K2Sm\nc/uYJQx1d7vK+oqDjHMt85uRjt6B5GLhlAjVboDXOTpTQ2crZejonY7vtl1O\nIeaIpN2w17RmV+JX9yMTsXSfobiWyCNvSNVjjJrMu8iIAQq5akG7kdQrkjb8\nXPOJ\r\n=Sz9A\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIBegbRZdIgCDUDSWBpDJpn0IaSzY9i8pVBpDCYulLyeKAiEAha2Ipha8MFh6kNI9z5Ra9qXrQGZZfDWqsWd/JmmEzuA="}]},"maintainers":[{"name":"anywhichway","email":"syblackwell@anywhichway.com"}],"_npmUser":{"name":"anywhichway","email":"syblackwell@anywhichway.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/thunderclap_0.0.3-a_1561031432922_0.24621700819107617"},"_hasShrinkwrap":false},"0.0.4-a":{"name":"thunderclap","version":"0.0.4-a","description":"Thunderclap: An indexed object database for Cloudflare","engines":{"node":"10.x"},"license":"SSPL v1","scripts":{"thunderclap":"webpack"},"repository":{"type":"git","url":"git+https://github.com/eventscope/thunderclap.git"},"keywords":[],"author":{"name":"Simon Y. Blackwell","email":"syblackwell@anywhichway.com","url":"http://app.github.com/anywhichway"},"bugs":{"url":"https://github.com/eventscope/thunderclap/issues"},"homepage":"https://github.com/eventscope/thunderclap#readme","devDependencies":{"chai":"^4.2.0","live-server":"^1.2.1","mocha":"^5.2.0","webpack":"^4.33.0","webpack-cli":"^3.3.4","webpack-shell-plugin":"^0.5.0"},"dependencies":{},"gitHead":"455da539e12f643b25ef5b4dae36b44947d47ef5","_id":"thunderclap@0.0.4-a","_nodeVersion":"11.13.0","_npmVersion":"6.7.0","dist":{"integrity":"sha512-H0JN/0OG2ppKkVKGYnFp1IshEc26+Wcm7VBq027Ek5yCMyO1fvhid2xKgSNdLsYbRjONj1ZmxAdP7dT7ZZhi4A==","shasum":"b11ba6219420ae24041e697d866f4ed1589c0b34","tarball":"https://registry.npmjs.org/thunderclap/-/thunderclap-0.0.4-a.tgz","fileCount":31,"unpackedSize":1028718,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdDD9CCRA9TVsSAnZWagAA+WkP/1egsRNz75Fsx8zLk1LS\nhil53qD+9S7SW22TPcuT5dEX3PJLP4XzYr1saZUF4qy1R/BnbKCDQcAF3eX5\nPiGH912GE1RFDVXCMhdv+uyuJpt9Gp7eSg3UncJUadEk63P3GzlqVvQKYld8\n7Jvk8pXImO1oB2zeXYgAyn7Yxc2HqX+PJME0khAjx6Ul4eTNGoRkS04GIMRv\nwycz2wFE/2hBlO95un+jKs4nkSkRy1y708d5zI4eiI+VDdxiU2VCGWMDNMCS\nu2IogdsGig8kh1jEjLn/SOG4YHTficb91PiJ3hrDUx8F2JWspIHYnRKqukoi\nJtAUsEis3JNZ0yjQBJAN3xrx7jN+anAhdnYDK7wCoYsNWwnCNc6quFqgOf/x\nyo4FKXZ/C8huTVxjCHCPVWIvAtVJo8HtQ9AT9PYkoMa45EXGQDk7qZ8JYgY+\n2jmhd9xeZSE5TDy0iz+XsFspdTCu5RQ5K4Krgwoj8iNtiXeDLuSIFKsy8GN9\ncSTS3+tSLXNCTIBWB1A+xYdmtxAlQMHpVzTB7PytlA1COXk59gpEA+v3NzGJ\nX4gtz9eopRNuK/5UcY7iASU61qRc9zUYMzJZdjCbDLvKi0rUOAIkJJn6kIYs\nW1nJoclxWWi1YsCNt5M+Se6GAd0UXQrPkdxk/anuM5qJcZ+p0o2Eqb4RhPnl\n6Wy2\r\n=ESLz\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQC5Hhm0NOBVvtMATnXeP0BCxGDtCNM68Fn48ZaH38zqgAIhAP15ouJJu+43/xqKv+9J/Po2bQTv/tQQrIyzRZ/4VPDv"}]},"maintainers":[{"name":"anywhichway","email":"syblackwell@anywhichway.com"}],"_npmUser":{"name":"anywhichway","email":"syblackwell@anywhichway.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/thunderclap_0.0.4-a_1561083714218_0.5932138368151347"},"_hasShrinkwrap":false},"0.0.5-a":{"name":"thunderclap","version":"0.0.5-a","description":"Thunderclap: An indexed object database for Cloudflare","engines":{"node":"10.x"},"license":"SSPL v1","scripts":{"thunderclap":"webpack"},"repository":{"type":"git","url":"git+https://github.com/eventscope/thunderclap.git"},"keywords":[],"author":{"name":"Simon Y. Blackwell","email":"syblackwell@anywhichway.com","url":"http://app.github.com/anywhichway"},"bugs":{"url":"https://github.com/eventscope/thunderclap/issues"},"homepage":"https://github.com/eventscope/thunderclap#readme","devDependencies":{"chai":"^4.2.0","live-server":"^1.2.1","mocha":"^5.2.0","webpack":"^4.33.0","webpack-cli":"^3.3.4","webpack-shell-plugin":"^0.5.0"},"dependencies":{"node-fetch":"^2.6.0"},"gitHead":"c6a6130b990a5c3a5488999ac2976712f596fbd9","_id":"thunderclap@0.0.5-a","_nodeVersion":"11.13.0","_npmVersion":"6.7.0","dist":{"integrity":"sha512-NUM9iHpfVAMjWiDhjr07HnDQBlnZCSn5UnrYm4ZXb0yde4v56x0pqiwka5VXFgVxpnAfuRLyFTqUgcC2oj81Mw==","shasum":"69298be6cb0ae66510c24af064d8ced8457f7739","tarball":"https://registry.npmjs.org/thunderclap/-/thunderclap-0.0.5-a.tgz","fileCount":31,"unpackedSize":1034288,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdDNJSCRA9TVsSAnZWagAA2XgP/R0zELZBmlqRR7iUu+gc\n2SrzRnLSgYaUNYy7hRvvFnlqiMhmmIn/TvYeEbTJeaCt2RiLBBXEQuhkhoZB\nMBTsvN9SZceELveu7YS1b7KkXoRGEcSVsMeDaHBnU2MB3F4PAgy/s1C3cE/P\nzZLz3BOScE04szdsFFRfWwIawvRPu2C+6QPQ8axgf/8wfL2Q++SrN9P4yzJl\nWLzZrSPW4ImFv3ZzaNODdQ1NzRddP68Yk0Blr7ZqkErw3vWf8uW0NxUf9uYb\nWLOJtNjI1xW89ASwql1PyHfHS24VgR1yiY4b6en9WqgacgEf8B/+PZh1U4oJ\nZDVxPZOgQnzCzzlfA3+q6c6h+q4F9c19fsgw2juBhtgFYGbfa1I+26xV4yRf\nQvetCrdHQGow4NfDl6Z0JrdoAH9uRLjxOrv1gwRn37W67mdhrZkGQPo/1pu1\n3+851mScY9+oCrgitYlSYINm1IisS0oOEt6mNS5kkCEJVH+E7MCDrpVRLFMZ\n2AkJWjKl/7lu/TaaBh/K7jZCsKsoeHku/nrcyccS77gynV8SCLflNzM3fWFL\nzB7xbJqac2QUXA3wiE0CoQ8L0x+Qh1m4UhiYRrigP/Q77ZpR3uUxDdM382oL\nT0y6G253kTclVh7vF67DuodyCxXwLg7euco+31JIO1ntLhqzDIjy73Dcq1C6\nbj5n\r\n=at3G\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIAgs+dkS/1k2HmaZGdcjJ9NN0RUaW8uvWEY6esJP8JwjAiEAu44QXzxQDqtqFZApx36j9peA4SEnTJfpFIAdMJ3wBUs="}]},"maintainers":[{"name":"anywhichway","email":"syblackwell@anywhichway.com"}],"_npmUser":{"name":"anywhichway","email":"syblackwell@anywhichway.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/thunderclap_0.0.5-a_1561121362165_0.775031363951985"},"_hasShrinkwrap":false},"0.0.9-a":{"name":"thunderclap","version":"0.0.9-a","description":"Thunderclap: An indexed object database for Cloudflare","engines":{"node":"10.x"},"license":"SSPL v1","scripts":{"thunderclap":"webpack"},"repository":{"type":"git","url":"git+https://github.com/eventscope/thunderclap.git"},"keywords":[],"author":{"name":"Simon Y. Blackwell","email":"syblackwell@anywhichway.com","url":"http://app.github.com/anywhichway"},"bugs":{"url":"https://github.com/eventscope/thunderclap/issues"},"homepage":"https://github.com/eventscope/thunderclap#readme","devDependencies":{"chai":"^4.2.0","live-server":"^1.2.1","mocha":"^5.2.0","terser-webpack-plugin":"^1.3.0","webpack":"^4.33.0","webpack-cli":"^3.3.4","webpack-shell-plugin":"^0.5.0"},"dependencies":{"node-fetch":"^2.6.0"},"gitHead":"e1d27b0a6e3fedcbf9347d80e0dd39999fe17842","_id":"thunderclap@0.0.9-a","_nodeVersion":"11.13.0","_npmVersion":"6.7.0","dist":{"integrity":"sha512-dTaujAOJxqr8418yQa6M6gdsem2MAUEKqMD2cP1kK2XMhl7x3raqN1mAH+yOCxVzDGm2/O+NbxyVEyFJQOoxcg==","shasum":"a9c07eefd365985dcbb1a6e22d5cefaa692664d6","tarball":"https://registry.npmjs.org/thunderclap/-/thunderclap-0.0.9-a.tgz","fileCount":36,"unpackedSize":1059294,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdD41tCRA9TVsSAnZWagAA+q4P/3iZBEVew2QyBTH2LCaW\nd9nySRG/L6DapzSnoagImCYW8WpMxE6x5iUlRb4PPGUrAP9rH9jtfbJ3A6CB\nt6JfvUd4yzbY0pmAO6+6kwCn1UVxwnhiJyF3Ig1e7D41DHQxj1fspvGikhQ5\nRyS40aU2MnuDJxqFguE/pq9R60G+iVQoma2HFb4OHh3FA0I9bZiJc5QJ8wej\nduPM+og5YsQLzbyUSpQyfc9Gzf0pfulmgEFzB1zO/2Yg7/mssZivHdNgdmI5\nLjnZEMlArcXZQldn1DghyMRkJd0vjx2EKsspYJfCyyIWOAoFeZwaUFsHydkM\nhEJajcPWVUayzmidOb2smApIE5KKw3Nr1XqA2KDbYRZhCDtz8FyAm8r23zdm\nU+n0EZ5hFSGDmMYq4heH7JnPcQZC9zDebo5p2qs0bodR/a+IhMz2k+EmIG//\nIhdjYtX7K3EIW8lJ6UmDYKUrihtB8FIvoy3TLIlfn8C/Wk+hKt0oL2D4F4K7\nRh1xQxhLTnM1XlGxgmV5LZsoQk0hA1nstuLwM+eMFXeGNz38re24ygHoWuvQ\n8qzQsE6Ul28EBqDQRajEHaI2h97tyQDblmrkB2YwEwRpuEx6/KFm6DcY5NpQ\nbmGJmewz9BBqyDtBsTkLYsnFWYwUKV5S4RPDel0NV2NNbezzZVBeuW+C6sb8\nINy2\r\n=Orxi\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIExLyDsUISKZ0+CjQvq0mQc6TSIgNLh7kVMLVyjrWqmfAiAhxhd+TwR7Fo/v0s0Tpv1QeVSjY3lGRsmxSa/ETylInw=="}]},"maintainers":[{"name":"anywhichway","email":"syblackwell@anywhichway.com"}],"_npmUser":{"name":"anywhichway","email":"syblackwell@anywhichway.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/thunderclap_0.0.9-a_1561300332773_0.030279974145972943"},"_hasShrinkwrap":false},"0.0.10-a":{"name":"thunderclap","version":"0.0.10-a","description":"Thunderclap: An indexed object database for Cloudflare","engines":{"node":"10.x"},"license":"SSPL v1","scripts":{"thunderclap":"webpack","start":"node server.js"},"repository":{"type":"git","url":"git+https://github.com/eventscope/thunderclap.git"},"keywords":[],"author":{"name":"Simon Y. Blackwell","email":"syblackwell@anywhichway.com","url":"http://app.github.com/anywhichway"},"bugs":{"url":"https://github.com/eventscope/thunderclap/issues"},"homepage":"https://github.com/eventscope/thunderclap#readme","devDependencies":{"chai":"^4.2.0","live-server":"^1.2.1","mocha":"^5.2.0","terser-webpack-plugin":"^1.3.0","webpack":"^4.33.0","webpack-cli":"^3.3.4","webpack-shell-plugin":"^0.5.0"},"dependencies":{"node-fetch":"^2.6.0"},"gitHead":"2fd81bd3acc113eeb276e662590e64acde620009","_id":"thunderclap@0.0.10-a","_nodeVersion":"11.13.0","_npmVersion":"6.7.0","dist":{"integrity":"sha512-k2rsSdsg29pqrAK3ec0Cgksexti6fCreNfMaAbcv0vZnWpf5YFe8J81aGwWkBxd2pynZiI72HixLK4UpRXokUA==","shasum":"7951472b5414220f55df7d0485c6aa8fccbdb9c4","tarball":"https://registry.npmjs.org/thunderclap/-/thunderclap-0.0.10-a.tgz","fileCount":41,"unpackedSize":1068482,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdEOOyCRA9TVsSAnZWagAAZAkP/2J9QuZQ7BRuPLEaUj3n\nRgwYasrfWF3O74ihi/UUAyrtx+k9YjiVr2FSad5U/ySSI3eO57q4YQX72jBe\nZpuVXDAY1yleOyuAraYfKfCuNj+Cv4StbH/TfqRo1WwhYfkLLuESf2NZ/Dmx\nqQtOr7fbcBEQ3JrMxI/6nDAIZVbFR/CuVbE7oCa9uGLLGkyeUN6y+OEkcErH\nhotUOx+8yE1HCCD4Sti6WfKDNoRTwEbwo5GEfWFVxp62W4JWDnLhPRkbesmD\nZHVQsNiSh9ZMPS5L6CdlTfI0uOwHfenFcGiuJVzyUz2zibgNjWWn4XBu6Emx\n0PtJLW3hJdV7WLA40XWreMTDVYvWYvx9RZuTO9J2c/Mbo8Y1pJMUFWZxtwfW\nB31u2fL2yuZImUiX+eigJIu4LBeIDBkWnhPLJ2icSeu3WJjCF3cO5AAz1crZ\nakOZ76ubHjbgxL4Ue07CSf2lJV/eZOjrOMwBjUcewrahggGNzXWHDlXOzEk0\n3/SYDUn7mmVbypazJzVTc7C4RHpa9AGvy2ZFoVh/W/NOYzEa+D9GhfSUOnLd\nfIbdD5kTtKUc/kzMdTGQ1BB6Pz7FNrjw1jGJneKCooxRlhR/j2mRSIClFqMX\neBkxMAnkD5Exdv/VimdK4j8I1DqFmNz3QadXI3kVWj+eZnB1cCnHkZkp5NMG\nwqiT\r\n=Exl6\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIC7FQJ0374t0CP7w7/oD84eN4iOqm/LHYvM//apjygQlAiBargNHPFCkN3z9VzUE0nhBpP7B9ZIQB5dej21Kpp9YRA=="}]},"maintainers":[{"name":"anywhichway","email":"syblackwell@anywhichway.com"}],"_npmUser":{"name":"anywhichway","email":"syblackwell@anywhichway.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/thunderclap_0.0.10-a_1561387954223_0.2875110198297597"},"_hasShrinkwrap":false},"0.0.11-a":{"name":"thunderclap","version":"0.0.11-a","description":"Thunderclap: An indexed object database for Cloudflare","engines":{"node":"10.x"},"license":"SSPL v1","scripts":{"thunderclap":"webpack","start":"node server.js"},"repository":{"type":"git","url":"git+https://github.com/eventscope/thunderclap.git"},"keywords":[],"author":{"name":"Simon Y. Blackwell","email":"syblackwell@anywhichway.com","url":"http://app.github.com/anywhichway"},"bugs":{"url":"https://github.com/eventscope/thunderclap/issues"},"homepage":"https://github.com/eventscope/thunderclap#readme","devDependencies":{"chai":"^4.2.0","live-server":"^1.2.1","mocha":"^5.2.0","terser-webpack-plugin":"^1.3.0","webpack":"^4.33.0","webpack-cli":"^3.3.4","webpack-shell-plugin":"^0.5.0"},"dependencies":{"node-fetch":"^2.6.0"},"gitHead":"8fef53da35b6105ff75e5d8e8d6dbe2d700ab6e5","_id":"thunderclap@0.0.11-a","_nodeVersion":"11.13.0","_npmVersion":"6.7.0","dist":{"integrity":"sha512-XFuXwa8KciB1fHi0YOUYASJMn8qjU9fSt4cJUKeA7QZv+CNPq3ojEcINLt5Uwmmoz/SRcRTZKc8CZXcsfR0phA==","shasum":"1edb0a79875795c2870a99a0e327ca9f331da807","tarball":"https://registry.npmjs.org/thunderclap/-/thunderclap-0.0.11-a.tgz","fileCount":41,"unpackedSize":1076604,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdEb8UCRA9TVsSAnZWagAARgUP/AzTEhu8S1l3f0ADPYEY\nAPZ2RcF6CE3yLfBTjuwsKbFyMgKIl5Yw4+ZGjL6wYaC1kNNSGWVeTYRVCSoG\nUBPlx18eHP7g1PYqAACn441tjMGRrQLxy3zqmvpClhOBmZBj70e2zpJeu0m0\nz7ZzpjEzyDjp/jUK0v7mW1mUqtaCwTwGv4BTJIh8cOhzzWsuuDxkgZKK4W7h\nhhznGMwGs3EaMO7Kpc0mRVwOnz1yhbT7rhs15XoYNlDhLzRKVSYhkcn5CZa0\nKc4uqyqb6UUlae7mbkgjkE0oJU5sLOKjdwS0ondIyBXRdmrchwemcOJ2Zmh9\nWy47Z+/PVctPzgxtEzVa6NXH5NgobsFQCJG6BB6QVkGMjlPNlrUPK8RtSupM\nlVb/PEc0CL+DxG7kgiyatrNKvcBXyPhZDj+6jkUSw2ku3adgwFIZjajZwtNS\n174jnnSYZIUqqqb+snyLWoAjxezf4l1egLLnv9sOyN7fr1C6kfWziBnI7Lra\nQfh69JivEPVFG8vts8TUPgJzVxj0TCzxERb2PvE8eIDxFlZJct1O8IExQt8k\nqOA452mUopzC8eQX+RCZC7sipq5/QmlVcxCC1nt8smj94q5jDszhBi/fftj5\nNuqI2pqSlsL8hnqg8YrU9bho1k4GyGCpdgGvKCTQOZ7avOpb/04HwJm9s1I9\nl1Yg\r\n=8pzd\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIDeMlHbrMQEXjA56W6cL6yZu7vPFkhnC+B8v98iLvt/EAiBT1prRoS7t9wwYztlmv212dZA35p0Tjj1mLFYsc+yW/w=="}]},"maintainers":[{"name":"anywhichway","email":"syblackwell@anywhichway.com"}],"_npmUser":{"name":"anywhichway","email":"syblackwell@anywhichway.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/thunderclap_0.0.11-a_1561444115416_0.36947384107270853"},"_hasShrinkwrap":false},"0.0.12-a":{"name":"thunderclap","version":"0.0.12-a","description":"Thunderclap: An indexed object database for Cloudflare","engines":{"node":"10.x"},"license":"SSPL v1","scripts":{"thunderclap":"webpack","start":"node server.js"},"repository":{"type":"git","url":"git+https://github.com/eventscope/thunderclap.git"},"keywords":[],"author":{"name":"Simon Y. Blackwell","email":"syblackwell@anywhichway.com","url":"http://app.github.com/anywhichway"},"bugs":{"url":"https://github.com/eventscope/thunderclap/issues"},"homepage":"https://github.com/eventscope/thunderclap#readme","devDependencies":{"chai":"^4.2.0","live-server":"^1.2.1","mocha":"^5.2.0","terser-webpack-plugin":"^1.3.0","webpack":"^4.33.0","webpack-cli":"^3.3.4","webpack-shell-plugin":"^0.5.0"},"dependencies":{"node-fetch":"^2.6.0"},"gitHead":"d098e76863c8f7b5be2b74a9f92cafc11787c2d5","_id":"thunderclap@0.0.12-a","_nodeVersion":"11.13.0","_npmVersion":"6.7.0","dist":{"integrity":"sha512-k2GzsAo7w8gLpdxO9kIwVH3N4SkP4108IVFVRPF85TArOimnuUWYBEw0f1NjFAGxh8JARpqJIt8QpwjEwan+JQ==","shasum":"161c41cb73b9735439f021f1217bd1d93153092d","tarball":"https://registry.npmjs.org/thunderclap/-/thunderclap-0.0.12-a.tgz","fileCount":42,"unpackedSize":1083621,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdEve/CRA9TVsSAnZWagAA2EgQAI6cKZ/NPQYv2SkGQ9tn\ncUTdbnFv3GGTlFWiFDj3DZnAJ/Go3/RFYHebMaZ9c1A9Qha2rwjnb2vXReZv\nJwAOrskXLoxX7LLp0L/XYmzdAGj/F99VtLb7zTyLL+VrD/eZrDN7WsmqRY50\njrO7gqFAMfPa2R68Hhkc299ImadiGPmaeinX3woEwALZSi/3Zt5xGSjlqgHW\ny6W3+7WMFr4CacTSvOFuVeeF3tk2fd9KZNxiCG1+k4k5wTlNDaG52lpYZitO\nz9OFubYfcVv2myuEiSTb2ogqB72kEZn8AKXNVYBkZOVDSK1S8ty4nPUprjUN\n8VOImZOx1ikoL2BbTkmSqjiAsthK54GwXBYsjERS0+xTJsMRm9jjOfh2XXPV\nzGUErqtDhwenIYkvzat96f0O5XAwoWBkQz+xC+VlHgPBie22NKUz2+oJ58B4\netCEgTejuwM88indWSv+FeR085FjRfjy0Sgl5sfvzdaZXBsFzEyZRfaoVvp5\nZrVCMqVpUMc2Reybxjl5oXLs9kpr8X6vgGpFv9pO9WmihJZFEhHyI5Jfc4Hg\nu7ChqPkVEKUnAaIfMu4nG0icytf/BwNBKIrQS0GjAQ5eU/1vspxDOasGOBSe\nHEauWA2tVRbXezpbiYKmwIEa4WvVp72q+QTuZ6kvLs2KDZzfaj6O/T3le8yc\nhhpH\r\n=TdL2\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIE1WuulbDZCPIgAFzQ7gz60J8GyX8PFRgqGR94R6uuDXAiAXwgjq/7wQVnlSveP7s3W8uA+amivD2Q5oSucKezm2IQ=="}]},"maintainers":[{"name":"anywhichway","email":"syblackwell@anywhichway.com"}],"_npmUser":{"name":"anywhichway","email":"syblackwell@anywhichway.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/thunderclap_0.0.12-a_1561524158316_0.871241327797013"},"_hasShrinkwrap":false},"0.0.14-a":{"name":"thunderclap","version":"0.0.14-a","description":"Thunderclap: An indexed object database for Cloudflare","engines":{"node":"10.x"},"license":"SSPL v1","scripts":{"thunderclap":"webpack"},"repository":{"type":"git","url":"git+https://github.com/eventscope/thunderclap.git"},"keywords":[],"author":{"name":"Simon Y. Blackwell","email":"syblackwell@anywhichway.com","url":"http://app.github.com/anywhichway"},"bugs":{"url":"https://github.com/eventscope/thunderclap/issues"},"homepage":"https://github.com/eventscope/thunderclap#readme","devDependencies":{"chai":"^4.2.0","live-server":"^1.2.1","mocha":"^5.2.0","terser-webpack-plugin":"^1.3.0","webpack":"^4.33.0","webpack-cli":"^3.3.5","webpack-shell-plugin":"^0.5.0"},"dependencies":{"node-fetch":"^2.6.0"},"gitHead":"2e5a46d62706939afac53fa6fcda6cb0008d7c6e","_id":"thunderclap@0.0.14-a","_nodeVersion":"11.13.0","_npmVersion":"6.7.0","dist":{"integrity":"sha512-NS4yPhzWiqoUn+k+odo+xAUVS55Dw6hIz5+5ir9qAWzzVoXyvFFX4cZQHSBCV1mfdJe6Aqimq6lnp3C2V4zNpg==","shasum":"a4d093ba3b151ad63c9ef67f4a75514d44f267e2","tarball":"https://registry.npmjs.org/thunderclap/-/thunderclap-0.0.14-a.tgz","fileCount":43,"unpackedSize":1093278,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdGhD6CRA9TVsSAnZWagAAbeMP+QAa8IfIagMR34feBBKj\ntnDzVKSLFLbhgB4Ib41hqgCW2GgbkgLdPgJQW2A3ditVQ1VVFX85VGhTFK3/\n0XkL6ribsbLLe28/RN5FMdsv8R6HBA43xfy1QwgqF539Uw5Z3icVlOUeGifM\nOCHFun1x6EqxdxiTboGU+Q2untkAQX0qIA1DIlj/wkbtCH/ntTe3pQ7OLINM\nCI5OxeboVUKEJuj/HPeR68HY6AgyfG4Q//jkOrM3lN5oKEmAMWdkidBNmVCR\nUiLeytV/SSFj+mQ+wSJ3j9RU9qTbnNx/0iLQSyfFsiSfwvZbh9UUuVgygaGV\nwAgJByHZUAhTsMtD7mD2MI/QVDkdATVnF9EGii50MuGqP9g5ReeP8baYnEZZ\n1t+/4Zr3Dann/o4T1yBCbE1JQ57jtjviRYsHJRGETYgpIQM63PDPLG7rS1x1\nekr/wgqWaybKgfzMMtMVntEvIlhVfPgVvU/6JWc7t2ueyuwNI9HhB9KT7PPL\nfVTaL9vJrxu6MmpQDvBitDKWj+1/ZU1eATMUslZQPPH0rKTjftJTLN6xIidS\nqAkebKVvnRibxux71KiShb5UEeQ7lS55+SkG75lzCCsGmmC8XbIpcc7RaNKi\n9Lm/MQmvTyNeCaYlmobktqMsfYZjxgmEX46E5jeAh34W5f640ECqvTEfMso9\nQNqC\r\n=6WqQ\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIGJ2BMFdxgubhbQyxIdXsEwxWhYWA86ZGb6JRlnIn3CVAiEAxFLCTwLt/q1duLO+jsWt8sb4JCrCio7uyRuJvMXQ+Cs="}]},"maintainers":[{"name":"anywhichway","email":"syblackwell@anywhichway.com"}],"_npmUser":{"name":"anywhichway","email":"syblackwell@anywhichway.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/thunderclap_0.0.14-a_1561989369582_0.5657313806153421"},"_hasShrinkwrap":false},"0.0.15-a":{"name":"thunderclap","version":"0.0.15-a","description":"Thunderclap: An indexed object database for Cloudflare","engines":{"node":"10.x"},"license":"SSPL v1","scripts":{"thunderclap":"webpack"},"repository":{"type":"git","url":"git+https://github.com/eventscope/thunderclap.git"},"keywords":[],"author":{"name":"Simon Y. Blackwell","email":"syblackwell@anywhichway.com","url":"http://app.github.com/anywhichway"},"bugs":{"url":"https://github.com/eventscope/thunderclap/issues"},"homepage":"https://github.com/eventscope/thunderclap#readme","devDependencies":{"chai":"^4.2.0","live-server":"^1.2.1","mocha":"^5.2.0","terser-webpack-plugin":"^1.3.0","webpack":"^4.33.0","webpack-cli":"^3.3.5","webpack-shell-plugin":"^0.5.0"},"dependencies":{"node-fetch":"^2.6.0"},"gitHead":"f74410aed972f65f6fcdb8e947064f4e45bcc285","_id":"thunderclap@0.0.15-a","_nodeVersion":"11.13.0","_npmVersion":"6.7.0","dist":{"integrity":"sha512-4m5CBV/8MEGqmULLzg5oBVJE2iB1AiyRn8sE7pqKo4AS3kNr0W37PcxMPBtMzCXcocid9+ZvX1A/DKjSd9KnBA==","shasum":"cda44fde29704a7e7b01619aa0cbcad0f6d4fb61","tarball":"https://registry.npmjs.org/thunderclap/-/thunderclap-0.0.15-a.tgz","fileCount":44,"unpackedSize":1102457,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdG9QKCRA9TVsSAnZWagAAWjIP/1H8mT3uzH+mOOoylWSe\nyELBV4hKIQJpiDxSqxlkelXmuRHy84QOwfj+hvLGhHiCO6yV0ORo3+gYjWSn\ns5YrvdgGXIn9yH23icB4MqWESdvotQEyskwbjgoFF7LTsygEf/9Tm+w/UcdO\nOmtpZ+0/hvrIVVcM7Ka5Z215XrPjE+LH20D1Pa8UP+Rfj6am3gJ9m9gFAtkI\ni/Wno9tXabP+OCZWJeN8ilrltAO9wpJ9dX8pt2SBwk/bnKCWxZoTRLYkoI9l\npWNS3BDbo+33dpDTUrlXFpBgIVD2UK7h92BOFx1sehbJptj3Tk1e2ZHpz5xM\nnLrq7hrqsji4fnPuy8swde8eXRYBWT125XoRYMrW8bCURXgc6yKETd482efI\nPWmC9eHGnmlr+2Y4XLWSg0z5JGgr+MES15edxM2On7VkNd1SaKJCJvG8llFT\nQvxBu7XEZcczqmiG18HbMvK1tvLajipTnQtDIoyt3SYSX41WInw4mQz13GAh\npOfvxF157800h1f67l4/YC5+AYYFuDpGL16D+aNz0QWUzotxZwSHwnWNxED+\nblChxCeWdmxiR/1RNf/nUq3ZAxxgpLRRwoA76kTrX5j1E5nD5/zLzg8iIqpV\ni97wp6u2uO44gozSEiBXcKlD397Veca9pKfqc48TdI3g0tviUx6XV692UUB7\nGIH6\r\n=Nkh6\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDwuNHUjJMvaT5Ku2AhjMVv7g116D8hXQZ4uczkKpcxngIhAKh5C1DtHjv4JU0OVZDHgLMnlWTjitnKaaGwn8bUhBEO"}]},"maintainers":[{"name":"anywhichway","email":"syblackwell@anywhichway.com"}],"_npmUser":{"name":"anywhichway","email":"syblackwell@anywhichway.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/thunderclap_0.0.15-a_1562104841323_0.7565429342866181"},"_hasShrinkwrap":false},"0.0.16-a":{"name":"thunderclap","version":"0.0.16-a","description":"Thunderclap: An indexed object database for Cloudflare","engines":{"node":"10.x"},"license":"SSPL v1","scripts":{"thunderclap":"webpack"},"repository":{"type":"git","url":"git+https://github.com/eventscope/thunderclap.git"},"keywords":[],"author":{"name":"Simon Y. Blackwell","email":"syblackwell@anywhichway.com","url":"http://app.github.com/anywhichway"},"bugs":{"url":"https://github.com/eventscope/thunderclap/issues"},"homepage":"https://github.com/eventscope/thunderclap#readme","devDependencies":{"chai":"^4.2.0","live-server":"^1.2.1","mocha":"^5.2.0","terser-webpack-plugin":"^1.3.0","webpack":"^4.33.0","webpack-cli":"^3.3.5","webpack-shell-plugin":"^0.5.0"},"dependencies":{"node-fetch":"^2.6.0"},"gitHead":"28cafabe0a19cd328c04ac3458d1ed2a97031e06","_id":"thunderclap@0.0.16-a","_nodeVersion":"11.13.0","_npmVersion":"6.7.0","dist":{"integrity":"sha512-IGqAe6EGo/sAC0XLr992W4ur9EC3EyomloKQPKSeSp7+EVY1j4rD8Ciu5aKp+z2o9HGQTYI2PEOWgj1yahGsgw==","shasum":"aadc9641bcf5613ac6dc243be957078d0da4b6e2","tarball":"https://registry.npmjs.org/thunderclap/-/thunderclap-0.0.16-a.tgz","fileCount":44,"unpackedSize":1103617,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdHI2UCRA9TVsSAnZWagAAb9gP/RDRbSHBT0GZpALuGEtZ\nLfib+8AjAdXOaVADFXkYCDyoVLEeqE/mRQvcFaydRYcUEo3rlnPolVNN9TI0\nmiA/WlKm5S1g1AFLISaG+vrS6gMwgjmzYj54iNkGnTTcDWp3k+xvGCfz7/Ng\nap5jYQYeWWUMoHiBje08q3Jzvb8MLAMgBHXrc6ap0piuasuzF/jTtV0vaTrD\nsXEcXkcmJjiJ9C+OZLp2o1/aRE1Wl/cm+jTRcNG7sCzFYY6MBPI8alCUkBw3\nYK0mA9TfXLAyoWvtBmS/9WBOkBvgcnKhe0xyZmxA1X89U8Sjbc/KDWzYFhon\nUaGoZmwABlVooloeVl66CliPAF43NmxfbNZ91CL8Q6cUqviLwv45EB5YBDI8\ndxRZLfRi+acjBRxswjZVg/FSiLyNxa9M5vtbseCXgqBqD5559rrMqbcH9Qp4\nEjscsY2Sv2edvZ/MgNS5NO5R60fzZyiYr0if5Ry8NSoMuC22kxy0TggEkoEl\nz3CDSw5zvSzqrnKSrkPU1RQzEE5qRCBNY0XjLGzLISjWz1fCgy6W0rTPNTKX\nVtH7yKZ0y5bnovayQQdyl5H/V2hcuFJslRTDxRZAU2942RKx9ej9Up3r/d0e\nDZaQ9wZrV4SbnEVczms1HZ9b97lEYPXJY0zvD/6prVA0FB+KHvAy/niqz3PI\nXTxN\r\n=akCw\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCID4UnkjFsr536LV8lTtXpvo4J/24ixmjzehKZeN4kYpOAiBxN9kakS90cps59gtG7CxE0gF4MkMIF3Fb4PXHfzZcaw=="}]},"maintainers":[{"name":"anywhichway","email":"syblackwell@anywhichway.com"}],"_npmUser":{"name":"anywhichway","email":"syblackwell@anywhichway.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/thunderclap_0.0.16-a_1562152339291_0.7042940729280838"},"_hasShrinkwrap":false},"0.0.17-a":{"name":"thunderclap","version":"0.0.17-a","description":"Thunderclap: An indexed object database for Cloudflare","engines":{"node":"10.x"},"license":"SSPL v1","scripts":{"thunderclap":"webpack"},"repository":{"type":"git","url":"git+https://github.com/eventscope/thunderclap.git"},"keywords":[],"author":{"name":"Simon Y. Blackwell","email":"syblackwell@anywhichway.com","url":"http://app.github.com/anywhichway"},"bugs":{"url":"https://github.com/eventscope/thunderclap/issues"},"homepage":"https://github.com/eventscope/thunderclap#readme","devDependencies":{"chai":"^4.2.0","live-server":"^1.2.1","mocha":"^5.2.0","terser-webpack-plugin":"^1.3.0","webpack":"^4.33.0","webpack-cli":"^3.3.5","webpack-shell-plugin":"^0.5.0"},"dependencies":{"node-fetch":"^2.6.0"},"gitHead":"9cb530602d9ffd9feaf00609adc5d8b66f492dbf","_id":"thunderclap@0.0.17-a","_nodeVersion":"11.13.0","_npmVersion":"6.7.0","dist":{"integrity":"sha512-P74cgeWKoLg+RlBdmhVjzm5GfSzOcPXUrlgoQPiIiB40xc4/BeAplWa40S+TPmpgO/jWRsBA4z7NiDrfqgV1ag==","shasum":"439b0f4da2e5ece044f5d66f3e603cdab24c497b","tarball":"https://registry.npmjs.org/thunderclap/-/thunderclap-0.0.17-a.tgz","fileCount":44,"unpackedSize":997061,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdHeQDCRA9TVsSAnZWagAA140P/jpMTWCRqU/nSOJlEnUd\nySEdD2Ip68ic69QZPlqdR0t9actcorWzmz7rNhncUZoihwzcPJ7amZJOdj5d\nL8rZGYFWmqpu7IiXInsvZihfHnKbqHrpHAOv+b5uVJilqllec2++Spc/Rbh/\nWS9QGDXPifFMtu/VXl5DUN6g7sfwN54h6RlYzmTg20863jtdQCClNIG6Z04V\noJq83ke8KquY5YJZ5RK8nRmRXj+Ah2vgQ7oom0I6dazUVUsRaopvE7zysU4O\nZna6NtSmpEPlZyvb8dd15OrkDLn2xL0emUWH9tcznCFCbC4gl9RmCzoDFFDw\nX97rONl7OnTmuEaEnyh4UMB/gnv0bEC86oZrL36E3gg4njK7AA0qHv7QAlF7\nz+m+1aWLpqHTz5//EKwWwcB6MY5Z4hUIB70nVkXoI+pvX9mFLNWqGsjB65DC\neajQVhC0uNIZ/h6Qch2EfFleEjVQrQeb/kbuqVqCa9Ar2OzUqblj5hVE0L91\nBY/pN/a/DLvxfViXRro0IOsuRdTeey0OqHiINVhyyYX0i4yW1D+iNLZv3jRR\nDk2x470q/2Cph3hkpIPuChE0sAsCAU3uxVi/WB1ZyOkRwgvzxonKlLP7Wy7Y\niNB3zgXqeQRbsigUqhwfTQNl3ZZHxH0E3wW++WwTrY2npFFuq+d+s1J7QCdd\nxfN4\r\n=6TVK\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCDF3kfxm9ROWZi2DFenKsxdLQwDV8qohZfKgH6QVKKngIgVTgNEYtBFdHYx7EySJsUwFIfJlq/P8/iwvWkyVb3L6U="}]},"maintainers":[{"name":"anywhichway","email":"syblackwell@anywhichway.com"}],"_npmUser":{"name":"anywhichway","email":"syblackwell@anywhichway.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/thunderclap_0.0.17-a_1562240002281_0.5915632507626443"},"_hasShrinkwrap":false},"0.0.19-a":{"name":"thunderclap","version":"0.0.19-a","description":"Thunderclap: An indexed object database for Cloudflare","engines":{"node":"10.x"},"license":"SSPL v1","scripts":{"thunderclap":"webpack"},"repository":{"type":"git","url":"git+https://github.com/eventscope/thunderclap.git"},"keywords":[],"author":{"name":"Simon Y. Blackwell","email":"syblackwell@anywhichway.com","url":"http://app.github.com/anywhichway"},"bugs":{"url":"https://github.com/eventscope/thunderclap/issues"},"homepage":"https://github.com/eventscope/thunderclap#readme","devDependencies":{"chai":"^4.2.0","live-server":"^1.2.1","mocha":"^5.2.0","terser-webpack-plugin":"^1.3.0","webpack":"^4.33.0","webpack-cli":"^3.3.5","webpack-shell-plugin":"^0.5.0"},"dependencies":{"node-fetch":"^2.6.0"},"gitHead":"383cc530ac24ce030e90f92a8039d8605fde3812","_id":"thunderclap@0.0.19-a","_nodeVersion":"11.13.0","_npmVersion":"6.7.0","dist":{"integrity":"sha512-R5fK7Jzr4tBywXsx8U1hzO8KBobKq5StsEsBk9xX3P5nBKVhTO9I8O+w50VoXdBBanURfzULDFcSVHA9dSWATQ==","shasum":"cffa2c27e53b61f19f80d733ec2dc4965102cadb","tarball":"https://registry.npmjs.org/thunderclap/-/thunderclap-0.0.19-a.tgz","fileCount":46,"unpackedSize":999992,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdJNtjCRA9TVsSAnZWagAApkkP+we2EWxHsKLVUias9wEp\nVIQRISw9dXieSc2vB118acb0OLOyswZNTecKqWJg/OOcg4qelQsb17A5bDtf\n5ezGnyIN1RnCSP+DW3qlizT/OwLYeArrSSL+PYSMnmGUkZ9J4FrAPQ1DU1PW\nZmhjDHo+tCfg4dqa//57Bs99pKO+3vhVT7C9THVZaGreerU4zdOmrKKCBG2A\nC6UMEOl134S9ZYv0rJfbp6wJAh1FDaiwTvluzb/zcEZYfmbudzE9Dlk5JJXt\n1IXzlEM9ah3IQ/0fmM8w5smnHgebb8H8OSry/H2h9KsDe+yFiOY6+ISDt/IP\nzXd9yZPKE69jeNPA/LwJqRVfHCfQxf29KDwrsC/5cLlQLwCNtjNkmcWRCbf2\nq37UMKStr9BVtGJ+FBbMI++w3VDJ7Z+w72RtWbHKnqx1nsRJVNA2Bdqy8pDF\nc1BcK+wnAXqvUEjYxYWPe93WhZaLQskkAFpOiMTHgNCq+VUcGP184CPDwVWP\nIXRv4/xPSxjCt6uCTMjrImPD/kZ9TQllc0d7bhSOczZvW9nt//4HaZ6wPsnP\nt+bDVYXvBMbbSG8O+QElYYk+ZdgHDf+KNrW/paMkKwiWiRQtAP68KyC88fhq\nmWFAKBDvVSnDchgyFWeWQIwiblcDZmAtnquZrh8EyUUNgfE6Fpzn+1wo7sGc\nHZ4k\r\n=RQ8/\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIEFLoE1M3Ad/xJ4Mb4SPt2oZ/OnmE/IC03DlDFo6P27GAiBcL5TERFK+Y6381sF52soeX/ueIpn36HixrEK639rMsA=="}]},"maintainers":[{"name":"anywhichway","email":"syblackwell@anywhichway.com"}],"_npmUser":{"name":"anywhichway","email":"syblackwell@anywhichway.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/thunderclap_0.0.19-a_1562696546382_0.7531075343100455"},"_hasShrinkwrap":false},"0.0.20-a":{"name":"thunderclap","version":"0.0.20-a","description":"Thunderclap: An indexed object database for Cloudflare","engines":{"node":"10.x"},"license":"SSPL v1","scripts":{"thunderclap":"webpack"},"repository":{"type":"git","url":"git+https://github.com/eventscope/thunderclap.git"},"keywords":[],"author":{"name":"Simon Y. Blackwell","email":"syblackwell@anywhichway.com","url":"http://app.github.com/anywhichway"},"bugs":{"url":"https://github.com/eventscope/thunderclap/issues"},"homepage":"https://github.com/eventscope/thunderclap#readme","devDependencies":{"chai":"^4.2.0","live-server":"^1.2.1","mocha":"^5.2.0","terser-webpack-plugin":"^1.3.0","webpack":"^4.33.0","webpack-cli":"^3.3.5","webpack-shell-plugin":"^0.5.0"},"dependencies":{"node-fetch":"^2.6.0"},"gitHead":"69bb571cb7dfe35e6d9cce153eb31be1412776e1","_id":"thunderclap@0.0.20-a","_nodeVersion":"11.13.0","_npmVersion":"6.7.0","dist":{"integrity":"sha512-52uKEUos6aVAdjRKmcJy2f3xx6MeC597aN9A9D/UOcycXRmHs62GV0sxS68yidJYMp5M8PGb8CC7Uw83MvonTA==","shasum":"0bb577ed8339f3787b4ce9bf22b7cb90074452bb","tarball":"https://registry.npmjs.org/thunderclap/-/thunderclap-0.0.20-a.tgz","fileCount":48,"unpackedSize":1006078,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdJmr0CRA9TVsSAnZWagAAWE0P/iM7kKSqr//pLtODCFiv\n1Xo8b2bxR7D/cIEFGTeCAlJeIJsrVFclGmOuDU57v7edkx0WKIu8MHWQnS0P\nIpbvbI9iT9T3uSikDkY+QngOBKiNvSyM3joUT3oN+J1bQ4whOGbFTKRbnYT0\ns4Nt8wknlytddxxIRg5y26ZRTrVWl/0bsvQM6yu2KiC1xHGB0m/+ezh0sZks\nhJECok5MTf45J1vOdZdP1JyWQxGYCiNszCKlSyQH02tVrCeef4CECLLM5VCi\nf0Fjj8yBWa9wULp1tzrcGD7+gXY0OqIfrznmQqWQ0jd7usHhmH+YobLmKNvU\ndIVywU6RS+6OQXp6k09Xgi1E7E0rX0rd4NutRvkmS867AQRdYi3OTXulsGmL\nLwMcS/M4wKjBY+YbCB89p7Gn4o/fJ8AuJyxGNHzGRDSnX+14XuMFuk34HeOI\nWiX/VF0GPbpGhD+WLIrzlirusGWnz2keQU/5+ISnATPVSSQxddqGqnwtB1IU\nh6wYEQpgXRZhg+wNkgElTzAvFEK0qwEq2TF8rJ1xoBwL3WWBLYEQe0SsUUQD\na+OUMBSBKaqRxfCtRyoKkXvCqMnzmPsbnljrg9zs63OblGjL9A1Ok6wq2Owm\n1EaqP+ztvIm3z155ao5Z63imuLm6w5lbTiQmaJhoTGVtnmMP+G1jC3erj8ID\noA7F\r\n=cY9m\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIBAFqIWO9f58cykuPu1jNEx6xCfkG3I9e3x/nxp9HLiKAiBgHiuY3ybwpf1lY2iIXp4LNBtiBk57lKV1U8Xo73VKQQ=="}]},"maintainers":[{"name":"anywhichway","email":"syblackwell@anywhichway.com"}],"_npmUser":{"name":"anywhichway","email":"syblackwell@anywhichway.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/thunderclap_0.0.20-a_1562798835828_0.3133043497519712"},"_hasShrinkwrap":false},"0.0.21-a":{"name":"thunderclap","version":"0.0.21-a","description":"Thunderclap: An indexed object database and function oriented server for Cloudflare","engines":{"node":"10.x"},"license":"SSPL v1","scripts":{"thunderclap":"webpack"},"repository":{"type":"git","url":"git+https://github.com/eventscope/thunderclap.git"},"keywords":[],"author":{"name":"Simon Y. Blackwell","email":"syblackwell@anywhichway.com","url":"http://app.github.com/anywhichway"},"bugs":{"url":"https://github.com/eventscope/thunderclap/issues"},"homepage":"https://github.com/eventscope/thunderclap#readme","devDependencies":{"chai":"^4.2.0","live-server":"^1.2.1","mocha":"^5.2.0","terser-webpack-plugin":"^1.3.0","webpack":"^4.33.0","webpack-cli":"^3.3.5","webpack-shell-plugin":"^0.5.0"},"dependencies":{"node-fetch":"^2.6.0"},"gitHead":"4785c14b81e29ac48a7eb0393d61e9ec89bd24b2","_id":"thunderclap@0.0.21-a","_nodeVersion":"11.13.0","_npmVersion":"6.7.0","dist":{"integrity":"sha512-dVtDjridXvEqHEuDgbeas+6/5bZ89h3eAiTutwrSlmWJ3MxLEvsqM9Lc16vJHflRM9wtA22Yw1ftneGZ6uMzeg==","shasum":"d06a1bc2cb349d0cdac80750c436411816270dc7","tarball":"https://registry.npmjs.org/thunderclap/-/thunderclap-0.0.21-a.tgz","fileCount":48,"unpackedSize":1012068,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdJ07CCRA9TVsSAnZWagAAmIUP/iMLv7A0ffx3W8AK8HaJ\nVPDyl5raP9Sn80XX4rKI5uU6HxJScp7b0sKWKFXKuvLBYt8dEZ/bCp8NP6ih\nxNxjYlMeIEZMGQgESg1n46lZoOQAZJ6O3yl5VY9lCKhNbbuQ04IM67ylBxDv\nHqC3xN6JAT7ieAyELVkHl9Z6DrkK+ju0gd2OAZJmgxolTVCk7pMSWqpcUXBZ\ne/cvlNrlRFB96PWMFECh/Pe/uKLi/GdX7lBmp1VNHZElknlGP+pGilTCv18u\ndVvhgtQVUzUqn6YOB1DODJIKMm1bxZfRTWHd4qemPaCyLWy9kEY2i0nPPs9D\n3whFamN43/ThWErofOf0NYzzcsuFlTh3MDg2xN+EGHjQaRqWNFUYEWtqhwc1\nTt6wcLZ0KSm1B9DVVj+fcUFwPm3+9iweORGpV+oXboecVw9jnX5ajEDVIh4t\niU2I5zeywYHIXpmcamkABtm/YGO376d2luWCbREQ7fqh+12OUWhhTaKiSC52\nYUH5qLCRhMj6GIcLq1pML3kw7yKNrIh3K2MOcZBaPWvYihwhid0obTomws3A\nGnOoRUIXypNrI1fOuWiMiH5L5svdzTesHlI7C6CeDDiVlqpeUkrkWtZinomN\nAnJrDCvaOyVaG8yQU/uqkFA7y/FHJZnWM39lfP2x+p2N9vxNl55wuIHiikYI\nAgZq\r\n=kktN\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIATC/AvKDOsPPCENJq1WPwNfa3QAaWVb63znUf3rJLw2AiAh/QS9W/X72l4OCiSD48dmicAWCc1Iy/UeNeiWCxUDgw=="}]},"maintainers":[{"name":"anywhichway","email":"syblackwell@anywhichway.com"}],"_npmUser":{"name":"anywhichway","email":"syblackwell@anywhichway.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/thunderclap_0.0.21-a_1562857153382_0.15314763785388474"},"_hasShrinkwrap":false},"0.0.22-a":{"name":"thunderclap","version":"0.0.22-a","description":"Thunderclap: An indexed object database and function oriented server for Cloudflare","engines":{"node":"10.x"},"license":"SSPL v1","scripts":{"thunderclap":"webpack"},"repository":{"type":"git","url":"git+https://github.com/eventscope/thunderclap.git"},"keywords":[],"author":{"name":"Simon Y. Blackwell","email":"syblackwell@anywhichway.com","url":"http://app.github.com/anywhichway"},"bugs":{"url":"https://github.com/eventscope/thunderclap/issues"},"homepage":"https://github.com/eventscope/thunderclap#readme","devDependencies":{"chai":"^4.2.0","live-server":"^1.2.1","mocha":"^5.2.0","terser-webpack-plugin":"^1.3.0","webpack":"^4.33.0","webpack-cli":"^3.3.5","webpack-shell-plugin":"^0.5.0"},"dependencies":{"node-fetch":"^2.6.0"},"gitHead":"26b6add774ce68dfa1852ecc9aecbdd4f9227b9a","_id":"thunderclap@0.0.22-a","_nodeVersion":"11.13.0","_npmVersion":"6.7.0","dist":{"integrity":"sha512-8JFao9xSEkgK74DXm2vuZ+9cIY8tGX4q2rVmz+yfFOvzt6GH1eiVdfIssSXDS1gwt89bjcEW2t1FZmqDSEx+lQ==","shasum":"9516ceb32bcebf762bf7e3fd9e4f3a908936740a","tarball":"https://registry.npmjs.org/thunderclap/-/thunderclap-0.0.22-a.tgz","fileCount":48,"unpackedSize":1008619,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdKCXoCRA9TVsSAnZWagAAaXoP+QAuA0gvdd/qkilLBo4v\njEV0ydPhwb+mUioaDNwC+ZaS7iYJghSLAYkH79PtcHX7NuZs9YPMWqOuTr0T\nk0OjkDuOt0LNFVw5rFWwbQt2Uv0wEPt/Hl8ArGOjeSkb9LvIEd0b20gB88HB\n/VJfeZw3eCeBaPOPeJ7KMUG52ymzDc17VutbFrPTORvdFQf0BFkyVbSf64Q0\nSgEN7fm40VvMPBhI3jlh7C1v0l3NkgPaKsraExT6jbWIJzVzMJ32m3UjpN5e\nip5yTztW3l/ejX1K63p1fF4zeh1b2JHtvuW8U2GUJXju2UsQuXFWkIRziS6+\nbyLh1pu6NjHcefTmdhq2rxRAv76kneK34fKE4w/41BhcwJi/8ncxulOCeEi+\nTwACunHX3pibzFOsD+qfiBrdysD4Il+voyMWfTixAZ3Sx6T6xbZqMDC97oHH\noQoI3Oc+tPmSoKpS+HMlwDIpZmI7jmPP4CjFkvQTipzBqzZ6XHAAXow041PU\ns0a01GjRWv/mQeg7ll/K95OldGJDdqR+Unwx8GxqguNSub/a4jB1DsJc/EYc\nnRDl9Dbkf6LokWSrHxM3F41kHjfEPVCRD0wwA9Bo0348Sk+ftC7oeHbOnpJb\no9akqPr84+GkdjjMC/uLZFUIp/nMTsSlUcrteJR0f+0vDcMvfM49b/dgoGOM\ndRYx\r\n=H0hf\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIDwNYPnpp+pN+EHcIAQjlNI5DM30IJFpl6WOvRjEbwHKAiACK9GOMJ13Kl3tLF6UA5+Y7Ldlds97KlkxS8kphUYehg=="}]},"maintainers":[{"name":"anywhichway","email":"syblackwell@anywhichway.com"}],"_npmUser":{"name":"anywhichway","email":"syblackwell@anywhichway.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/thunderclap_0.0.22-a_1562912231230_0.021624719687014515"},"_hasShrinkwrap":false},"0.0.23-a":{"name":"thunderclap","version":"0.0.23-a","description":"Thunderclap: An indexed object database and function oriented server for Cloudflare","engines":{"node":"10.x"},"license":"SSPL v1","scripts":{"thunderclap":"webpack"},"repository":{"type":"git","url":"git+https://github.com/eventscope/thunderclap.git"},"keywords":[],"author":{"name":"Simon Y. Blackwell","email":"syblackwell@anywhichway.com","url":"http://app.github.com/anywhichway"},"bugs":{"url":"https://github.com/eventscope/thunderclap/issues"},"homepage":"https://github.com/eventscope/thunderclap#readme","devDependencies":{"chai":"^4.2.0","live-server":"^1.2.1","mocha":"^5.2.0","terser-webpack-plugin":"^1.3.0","webpack":"^4.33.0","webpack-cli":"^3.3.5","webpack-shell-plugin":"^0.5.0"},"dependencies":{"node-fetch":"^2.6.0"},"gitHead":"635928d4deeab6d805280b4931c0e5e22ac3b339","_id":"thunderclap@0.0.23-a","_nodeVersion":"11.13.0","_npmVersion":"6.7.0","dist":{"integrity":"sha512-BFTlB5vIwUIXGQfjwZ6wBNQ3g+SIpGlZKuRKrOJVAugF0xFCvjo5v3R+yPE6/bLCfN1oO9ONci+ziUwLxofnZg==","shasum":"ed8428283e49c106c94faba0e7a3d851a9042b4d","tarball":"https://registry.npmjs.org/thunderclap/-/thunderclap-0.0.23-a.tgz","fileCount":48,"unpackedSize":1010490,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdKPARCRA9TVsSAnZWagAABX8P/RC9luJsSY8z0QH/avi3\nOg6eSIF0y9CxKBH47gmfP6zhiEhQBWxlA690/uHwDcEayanm63/9aaQL2K6F\nbdHqGNCg8BO2evaiysZWAOb5X5IvGzcGVq8pM4sUik+iY0+V37C9G3xHGNv5\n1doJlKRQT7H9SDySrUjPqnrvpTrRl7TzG8mKgUR3Bt3dvhPe0/ur8sewdAyf\nJFO/p0JcOFd2LXcX6ffs7TNork43gv0xJwnmS33GXsP6VDL3hquT50hd2nj6\n5V/RINEmxZoghYX29Wbg/+/G4mAw21FoAjIOwuA4b1QS2IHOHJ6kAfswEB1G\n0Dgt838Gp2qytCgMQhR8cPDi7QQcfyGZ/KRGLBaD1YObwln6RKnsJSKHdsh6\nw0SVPzD0QmOCXtW0DQ94fe2/1qn65gun1eHZWL55K2Ruh7FAfMU/C+A6T5/C\nTiRA81qWPaLAwU3gPTJnBf6WwHeljvv2kttUC6XNSl7Zy0t1Nh8CkUFkW3VY\nf4jWNogd3VOJlVU/SL01QcbsfJHnqDnG4NmX8xXYa09651oT1LpxVuaUW+Sm\n0KXdlElg6giYskjDnGsqdMzPVxP1k1pq2xhxa8pKe4dBWwm0YPQvCqioaa9c\nCl0haW3vY7rEGmAzl8WM0YJeVuCddiTBASLaC82YqNOiXpQAKuCRIzA6Wzqv\nV4JI\r\n=mrbS\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIHLeHuOkneStFXJSnyMLxNkW+0iV+i7mK8Tb9lO1gZWsAiEA2SlXQzif68LW5dhorZlpLC+6gV1RB7XuSY3g1AYXsfo="}]},"maintainers":[{"name":"anywhichway","email":"syblackwell@anywhichway.com"}],"_npmUser":{"name":"anywhichway","email":"syblackwell@anywhichway.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/thunderclap_0.0.23-a_1562963984356_0.9124025085794187"},"_hasShrinkwrap":false},"0.0.24-a":{"name":"thunderclap","version":"0.0.24-a","description":"Thunderclap: An indexed object database and function oriented server for Cloudflare","engines":{"node":"10.x"},"license":"SSPL v1","scripts":{"thunderclap":"webpack"},"repository":{"type":"git","url":"git+https://github.com/eventscope/thunderclap.git"},"keywords":[],"author":{"name":"Simon Y. Blackwell","email":"syblackwell@anywhichway.com","url":"http://app.github.com/anywhichway"},"bugs":{"url":"https://github.com/eventscope/thunderclap/issues"},"homepage":"https://github.com/eventscope/thunderclap#readme","devDependencies":{"chai":"^4.2.0","live-server":"^1.2.1","mocha":"^5.2.0","terser-webpack-plugin":"^1.3.0","webpack":"^4.33.0","webpack-cli":"^3.3.5","webpack-shell-plugin":"^0.5.0"},"dependencies":{"node-fetch":"^2.6.0"},"gitHead":"3a2e5f90ad20fae6fc54049e6fde0c8f8a1b511d","_id":"thunderclap@0.0.24-a","_nodeVersion":"11.13.0","_npmVersion":"6.7.0","dist":{"integrity":"sha512-EzadRObpk5qHQqB0oTXSN7aoaxpQCtBEyRlwnhebVU9Mdmzkm3m97grO4ymlldbJ+wGpTTI8nCGe/yZP9g1qNg==","shasum":"5ed5d669738101c61cfd32208b6e8ff046520838","tarball":"https://registry.npmjs.org/thunderclap/-/thunderclap-0.0.24-a.tgz","fileCount":49,"unpackedSize":1017459,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdKe4JCRA9TVsSAnZWagAAC1oP/jcxQ7LA+tCSdjPXGqMj\npFlV5oUGdOQbt0sHpN0QeitIkeO7B03FT5b2w7xitn+9lI1n4E3pOC7YYJQ7\nT3viBSQutTfPAQZdWjJ3K8t9hCPVjeSmqJN/Ed9Moify/NcD46krd7Xir8IK\ngzaV36U4jkb8aqvUpx75WB6j/6KMd+zpHCoyOqKVDGqiFkVIZLqjwjiGaaa3\nbPsvfYv5XIqyapFs4DRq4QAfZptTHFXl/AWCqPYmqFhUyH+FHoCHHJcc6r8C\nLB5ho1WBwYC/PX5p84xGnpP6bcTwLvxYdn84yuaT3gvA66mqMS+z4ROUX9oZ\n2GErQJLmSxfOHJbRtNLnNt7kkB9CRGUd+QnYCK4Vyl2+daFohXw3dvqg+VvE\nMG0KMNctuqsw1eDbNwFC1HnEOCdc1nt7/Zl4DjKiM2VIgznUtu2v78zJ7dAC\n6t6mjqhSkp7vJVFrEYlo3lQZYqpxd6bJQe26FJrMGpaQHrC+k29jfZ5TKx8U\nTFACETRi1pQdGZjlYD1iKq3EApUVHE3ELho3c41Pj+eZnshh6hdPcV5GaNxD\nfuc9HM7YrI2Ash7w1GaZchpH+3x6lswke91awVU9mckF0BXATRSCxmxzTIcd\nHSf82waNgRpZ/y61HbTBnfx78eybTooY8zfX2EtWmni2aXbwdGgitjhXUbN0\n6UcG\r\n=TLNX\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQC9Q2WImM+CjJtdYBOyGyoV0iJ6i8/oTNbN7fi0jqQ9agIgGgFXQ5LZ2cT0kmTIri5RpeFFmUqppjvOkeXqM8Y7Hn8="}]},"maintainers":[{"name":"anywhichway","email":"syblackwell@anywhichway.com"}],"_npmUser":{"name":"anywhichway","email":"syblackwell@anywhichway.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/thunderclap_0.0.24-a_1563029000482_0.2342144315627328"},"_hasShrinkwrap":false},"0.0.25-a":{"name":"thunderclap","version":"0.0.25-a","description":"Thunderclap: An indexed object database and function oriented server for Cloudflare","engines":{"node":"10.x"},"license":"SSPL v1","scripts":{"thunderclap":"webpack"},"repository":{"type":"git","url":"git+https://github.com/eventscope/thunderclap.git"},"keywords":[],"author":{"name":"Simon Y. Blackwell","email":"syblackwell@anywhichway.com","url":"http://app.github.com/anywhichway"},"bugs":{"url":"https://github.com/eventscope/thunderclap/issues"},"homepage":"https://github.com/eventscope/thunderclap#readme","devDependencies":{"chai":"^4.2.0","live-server":"^1.2.1","mocha":"^5.2.0","terser-webpack-plugin":"^1.3.0","webpack":"^4.33.0","webpack-cli":"^3.3.5","webpack-shell-plugin":"^0.5.0"},"dependencies":{"node-fetch":"^2.6.0"},"gitHead":"d824ab803679cc134f0dbf024759569eed73298d","_id":"thunderclap@0.0.25-a","_nodeVersion":"11.13.0","_npmVersion":"6.7.0","dist":{"integrity":"sha512-aumzY5W07pZdPFDRUftbhxP3cWxG+tJpqLIilCb/9FW80rQ86PnHmwE7Fmdj+PyfhrU1jkUGureubeDcqZACSA==","shasum":"1188214dee9da9583613f3276bc030f6a3a43d48","tarball":"https://registry.npmjs.org/thunderclap/-/thunderclap-0.0.25-a.tgz","fileCount":49,"unpackedSize":1018294,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdKmwNCRA9TVsSAnZWagAAM6EP/3loObeYstd4CideWgQJ\n32xFvOJjS5xLHPlJxw9w3cKitmpFDyKrLApCvp1rQgHNMPTmlr6LObXnBu17\no8heEVnVl+qHBfGC5znnfJeZAxBHFbxM2KQ7lEeGF27dU9FkJEjpbZQW6iJI\nmteVD5zzRr/IqYL1/krfW3J9MQvNpDuH5NTNGHbkSZEVXUJNBUHRI/UpNbsk\nr19JFd/23Yr1BXbJ1nHpDA1ScrVhknTaPKuTCfo8ikonHiLry9nuw6vKdWq/\nCyWZsGd1tQlPsLn73M+HSkVzyE9yxSZC2m60eJcqNcmtZo3UI4D47O65c3oj\nFnQEc9pHIeV0RzzMFIw8Whrzqc7ChVOg/8o7JRx/PJnvWkWHZj/20DUVzJ55\nRCz88mHwcSITgHf9+kyeINYdJS+TNL9z4aVc35esL1+cI89d7H7zqYECOH6v\nbUyWjU5VZJOYdNhwTWc5Oem9Qs2X/vOFNmiC7eO12N2dyjk0bm5VUo92uHh1\nQsM0QhlzxE2oAor+c0wQGyPcW4QQMY55CFqkXJhQmgjKoPen8ZL7O6CcFfB/\nXaOlI+t9XQQ2jsSnv656ShRKJvdbnfNlv2NYIbsvhBxpWpC1uutQYfiYKOoW\nvtPSTSHmfNutbryKMGyHBNSlFj5Rlax31wdHxf33NEvljH9b7Gn+DXKY9KwA\nO2g2\r\n=m2a2\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIEpToO2Iqh0WVpaLkxOyvYpe5bjCB21FXeOyBTXk6jQLAiAfjsJ22FmcWN4olwcdq/WPY3coUERSiXt69WQ3Rc7Sfg=="}]},"maintainers":[{"name":"anywhichway","email":"syblackwell@anywhichway.com"}],"_npmUser":{"name":"anywhichway","email":"syblackwell@anywhichway.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/thunderclap_0.0.25-a_1563061260310_0.8276219156029485"},"_hasShrinkwrap":false},"0.0.26-a":{"name":"thunderclap","version":"0.0.26-a","description":"Thunderclap: An indexed object database and function oriented server for Cloudflare","engines":{"node":"10.x"},"license":"SSPL v1","scripts":{"thunderclap":"webpack"},"repository":{"type":"git","url":"git+https://github.com/eventscope/thunderclap.git"},"keywords":[],"author":{"name":"Simon Y. Blackwell","email":"syblackwell@anywhichway.com","url":"http://app.github.com/anywhichway"},"bugs":{"url":"https://github.com/eventscope/thunderclap/issues"},"homepage":"https://github.com/eventscope/thunderclap#readme","devDependencies":{"chai":"^4.2.0","live-server":"^1.2.1","mocha":"^5.2.0","terser-webpack-plugin":"^1.3.0","webpack":"^4.33.0","webpack-cli":"^3.3.5","webpack-shell-plugin":"^0.5.0"},"dependencies":{"node-fetch":"^2.6.0"},"gitHead":"86173c13f4dab2e01b2c9fd7518074510562e268","_id":"thunderclap@0.0.26-a","_nodeVersion":"11.13.0","_npmVersion":"6.7.0","dist":{"integrity":"sha512-JJ0+q4kJu8Awb/ravatDahf7pumvv1QWeYCzG+ALwpgsn42MnkQtl4pkowwaOuz/pEJsZ9YPg86JUvvtZlccWg==","shasum":"182148f78399bf3ac649f6fcfb6f4aa65169b397","tarball":"https://registry.npmjs.org/thunderclap/-/thunderclap-0.0.26-a.tgz","fileCount":49,"unpackedSize":1028375,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdKwJkCRA9TVsSAnZWagAAKhgP/1o8DYG5Ai9GFuINW0qz\nMqe5zpou4RShsHx5oLbj9zsYhjvPyjiKTtBxxZQ5Ghf1XOGwpunJ4rc3osDM\nYqxtzYHb2fyXe2mujoPDh/QKchybRaXThNKq04jaIWrmUobfYlcBnUT+vICD\n5ClJE0OiVTH5DVSoA2tdJ4vRxHn4C9035gQ38YLbcPGeu7sQJAy9UgcOx5sZ\njoJjpZUU+UeOSaCQ+FexaW7gaVXowobv1VFpqiKWTUgHH7MlCaYRZsJm7fbt\nJD0OODCvUmDHU2lqwfpftcqwYScSxmmC9I5lYg7PNNAUaH8NRMxSZWj4Lu7o\nVH2MZ7I5Inl57po+KRG5n8Zv2BvvUB2nGKE8GItw2RTUkhpxzEmhU9NR0xrk\n57ronf5HB77fSR4aMUyiVHu3mDkwcB9yjJEtIsIy1Dnakdlgp3+XZcZ4ryW0\nt1wu3zWwxkAHjsKbsox/JrDUzOa0QZAwPAEUutbfQG43RcmTRY2vPpDsdrXI\nHvYpseR1dgRDNMhwyAN0L1vg3Ke2Jm9l9eC3HIIrYUToRqkAfF0HqKMZUFpl\n6Qiq/K9zspwPx5DgjBha4s9R/StfPU5nnkvalNNQwACQ4UfBih6+WPZI+cXd\nLv20SZVH9XVh7B9lglD6detEdtLHeE6JmjOJ+eWVdVGa/7huA1iVxRpGbzub\n4a+8\r\n=BPuS\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIHNOoWcYNnh/c+VSUOxrZh0rq7N0Q6qNVkA4uHRd1yGVAiEAwFCKmqoVQnJwgv82egKLPA/fM8CmkMPP0OVDchcilSw="}]},"maintainers":[{"name":"anywhichway","email":"syblackwell@anywhichway.com"}],"_npmUser":{"name":"anywhichway","email":"syblackwell@anywhichway.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/thunderclap_0.0.26-a_1563099747003_0.7407434885454005"},"_hasShrinkwrap":false},"0.0.27-a":{"name":"thunderclap","version":"0.0.27-a","description":"Thunderclap: An indexed object database and function oriented server for Cloudflare","engines":{"node":"10.x"},"license":"SSPL v1","scripts":{"thunderclap":"webpack"},"repository":{"type":"git","url":"git+https://github.com/eventscope/thunderclap.git"},"keywords":[],"author":{"name":"Simon Y. Blackwell","email":"syblackwell@anywhichway.com","url":"http://app.github.com/anywhichway"},"bugs":{"url":"https://github.com/eventscope/thunderclap/issues"},"homepage":"https://github.com/eventscope/thunderclap#readme","devDependencies":{"chai":"^4.2.0","live-server":"^1.2.1","mocha":"^5.2.0","terser-webpack-plugin":"^1.3.0","webpack":"^4.33.0","webpack-cli":"^3.3.5","webpack-shell-plugin":"^0.5.0"},"dependencies":{"node-fetch":"^2.6.0"},"gitHead":"16fb7bb289d0ca005e3f9e69628c6a8bce10e721","_id":"thunderclap@0.0.27-a","_nodeVersion":"11.13.0","_npmVersion":"6.7.0","dist":{"integrity":"sha512-vicwTBWKKc5Zpcn9hi5womW9jq62wb7uv5Clrxd0V3iQZOjP5obHqMS96pd/Y8c8k5Nh5dHW8uT9ueNgAsVbqw==","shasum":"a20f88e7892248d81df76f66ba11be3d5893e6f8","tarball":"https://registry.npmjs.org/thunderclap/-/thunderclap-0.0.27-a.tgz","fileCount":49,"unpackedSize":1027890,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdLHKaCRA9TVsSAnZWagAAy70QAJOcoL9Nc2auofqqWINn\ndNuNpdVI2h4s+EgiPunzVpDhe9Hd6ZcnayOgVj4biSFVGsrFxeDgFQAaQQt8\nuC4aHNPn7SlyPkdBba9ecCvhddK8ucQaKRavO783CrV6mSB8AqVwKhxlM6pN\nIdUkkzJFGYmIMi3bgJ98UbxK5rlFPl33bWumLScBs27h3jN0a4vx8MDVS69F\noTnJNQzcEtGu+MER8KalJUZuQxl9BfSFhH2cd5XQmk2leb1BkmTMNzo/uxBN\ncEXCzQ0aY7CeBze6sNW53lkRx420xQ1X7+Hk8tFRCUiLvaDCtD25cD0mNueg\n/JuYiSdmUnWvU5IrvpUcv16fChO4kreiV9FLqTNKP8VFX6PRFRh5iWwF6wp0\nLBYaG/X+tyN/tBG85EsDGZwTBGNewDI74Lj59R9iH6WO4quS5uxBHPypcIX2\nPO98wKhA2TzvJEAG2jpTcsg0W+gy263KUONqIB/vZgU/zBiOJuIC4EOt4v3i\nhStj8MKtAzcHnZ6VsvcyXaNS6ImGFA90EBy1w6F4PzKYBz3rVcNaYrlrzsK+\nTo0lZh3lKj65BqgkQQyfstk/Sqt9YTGdmk8e8oFk+FRC2TZBlPHnf6ochvi/\nKR8tfMBkJ6ej9Z3LOY8TJJof3MlIT1bKTEeIU8n6nBCZKoljKnWTh1WhzjW0\nPHA4\r\n=z8gn\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCICwKWMbUbfrGJC20HSauBVzloZDGpr8SDQchhW4b7c5tAiBQJn8EucnCrP5K2QbiV4gsSYwlrtKifUHf6HljmHeeqQ=="}]},"maintainers":[{"name":"anywhichway","email":"syblackwell@anywhichway.com"}],"_npmUser":{"name":"anywhichway","email":"syblackwell@anywhichway.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/thunderclap_0.0.27-a_1563194009835_0.6181041064993162"},"_hasShrinkwrap":false},"0.0.28-a":{"name":"thunderclap","version":"0.0.28-a","description":"Thunderclap: An indexed object database and function oriented server for Cloudflare","engines":{"node":"10.x"},"license":"SSPL v1","scripts":{"thunderclap":"webpack"},"repository":{"type":"git","url":"git+https://github.com/eventscope/thunderclap.git"},"keywords":[],"author":{"name":"Simon Y. Blackwell","email":"syblackwell@anywhichway.com","url":"http://app.github.com/anywhichway"},"bugs":{"url":"https://github.com/eventscope/thunderclap/issues"},"homepage":"https://github.com/eventscope/thunderclap#readme","devDependencies":{"chai":"^4.2.0","live-server":"^1.2.1","mocha":"^5.2.0","terser-webpack-plugin":"^1.3.0","webpack":"^4.33.0","webpack-cli":"^3.3.5","webpack-shell-plugin":"^0.5.0"},"dependencies":{"node-fetch":"^2.6.0"},"gitHead":"a66b402a080491d790e215031dbbfe7327b1fc50","_id":"thunderclap@0.0.28-a","_nodeVersion":"11.13.0","_npmVersion":"6.7.0","dist":{"integrity":"sha512-DliSs++ik88hi7mkHKimFCvRHtuK+32LB7qlMGAtBVKcH/BiabYhsm0YOCTL3dKG5ZVcjH/Ga7brGYSvH7BuNw==","shasum":"a7fc4ac1e37b7947211c90168a667c2b6676ab4e","tarball":"https://registry.npmjs.org/thunderclap/-/thunderclap-0.0.28-a.tgz","fileCount":49,"unpackedSize":1028472,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdLbOVCRA9TVsSAnZWagAA3ZQQAJsiqEP6lQzBD5ZqQchD\ne4OjhTdfVaS9lJT2Fd8nMV8VnB98/b1XdHUcLUWWjA1YYVnLXviYnj1u/hX1\nKX6e/bQN34lTzjWxhWabGbxfFc/dKoDsxHU2/IgzT6zrLNeLEJhUBrynhVDB\nrl6zWlFrH886yWCDquDhCSWvmwh/Ghj9C/3ppgeHP8K+mEZfVdcNCU/QCsu0\nFT7OmqbV+8AVdMeTVm3h0dWTPWCHxv/SgO89Bxo2fXOpMMZ4fzJK9axZtz7E\naPn1hFBRzGIB252JvHBqoeM8Vxtx6u+p1zFLwXMGos60om8T3e5CPv+GCGq3\n3gbRP7O0Zdyv/sCc4Jnap1E8QY8zWSq7bCOO+1/bU7daykrX3KWi/er1Jdgr\n2ZtPsJbjkkZcAZSsW0I0R7LjqO9BdrtPwBIrtAflayuCi9Su+8rDj+SBvLUJ\n/d3rQsFh6AHoXfRlQfHHc3MBuC1h4GTFLo/RMGIy/U92ik8D70pWphxI4oEw\nuo4KzolYojIzEvT7+iRw9D56JaavxOvKCuOm99JVyA+mNE1j1/Q6MD+A9vxh\nI/EUA4Md4PJ2WJH9g2MQlwgbCLk6E99nrRhuTFYbDF1YdjLp2kE44N3l5tD2\nYYtk0PVzI6QsDsd4kJ6fJUVbWCD0FOSQAJctjwjy0F5LVthZL8wIJERRO1zC\nAKDw\r\n=mvPS\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCID16QYWowtFDJrfxvoaOu9yK5EYGCRSOPsBfx4RbUaroAiAQFH0qUAiuW9fpyfOSPs5wDpNJY8j9WUzbL703z6zRlw=="}]},"maintainers":[{"name":"anywhichway","email":"syblackwell@anywhichway.com"}],"_npmUser":{"name":"anywhichway","email":"syblackwell@anywhichway.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/thunderclap_0.0.28-a_1563276179975_0.4780311340172523"},"_hasShrinkwrap":false},"0.0.29-a":{"name":"thunderclap","version":"0.0.29-a","description":"Thunderclap: An key-value, indexed JSON, and graph database plus function oriented server for Cloudflare","engines":{"node":"10.x"},"license":"SSPL v1","scripts":{"thunderclap":"webpack"},"repository":{"type":"git","url":"git+https://github.com/eventscope/thunderclap.git"},"keywords":[],"author":{"name":"Simon Y. Blackwell","email":"syblackwell@anywhichway.com","url":"http://app.github.com/anywhichway"},"bugs":{"url":"https://github.com/eventscope/thunderclap/issues"},"homepage":"https://github.com/eventscope/thunderclap#readme","devDependencies":{"chai":"^4.2.0","live-server":"^1.2.1","mocha":"^5.2.0","terser-webpack-plugin":"^1.3.0","webpack":"^4.33.0","webpack-cli":"^3.3.5","webpack-shell-plugin":"^0.5.0"},"dependencies":{"node-fetch":"^2.6.0"},"gitHead":"ad52ef0d533c4d0138319f4d300f54f5335bb84c","_id":"thunderclap@0.0.29-a","_nodeVersion":"11.13.0","_npmVersion":"6.7.0","dist":{"integrity":"sha512-sgXLLOFkM3ybMVnO0Ll9xQBz8y47X/+DXASFYjfC6hB0a/b2Bih2Mr4Ac94dLNwTvAqm1czVyJ9pSheK7jUNhQ==","shasum":"9d968564cac56ddcb2a9cdbd6113cf1c7ad48ee2","tarball":"https://registry.npmjs.org/thunderclap/-/thunderclap-0.0.29-a.tgz","fileCount":55,"unpackedSize":1042672,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdNgWCCRA9TVsSAnZWagAADNwP/RETf8BJXlyiL71SRgq3\nrphT2Xmwrseh1tQLezloiuuXkCFxUItFxST43RCxUnPq7CMN6ynoAXI0JRZO\n2vV75iKQrACegD4krA+Holfw9kh+MdmOQqpGY6Jo3uELr85Nl20XgWO5+ROv\ncW38xzhAeTUZnj/jjXTsFkQWk2J9eQb92Ow+er45x1ik9/6vjJz83dc/dwLk\nK6hsqL8APNHy6Lb3bjfFdx2P5gaHILwSdERbhTLhZXoCll4aVJ/hoQ/fyVvA\nQfGcUwC/XbHuNdzTWnVEQyTffPlEf2VTNg3/lYF0WAPI4trFo3hQBrRnkswA\ndZG/JjrWd+EwEHAHpClBvTghyT2PeiNOpHYTDXW2r8cM7dBLfrA7Kbh0puPk\nvV0qUe0JjYlPQy75B++dbtt7bmZpGQ5xhmRXZmu8Oh3xNh9u8SThMuX3LNcg\np8gDdI0cLfo4XAhnJGN4f2sdCmAhU7SRNcFKD+8Aw7XBKAmq+KM3BY5464Uy\nqz28Y/3OVyKShJjkmV+9adulEvFVsnik2mlmZQWu+W2P/gyU2MZMPGCrwHLE\nFX/oEgpBZI+eMmPqey+vf1bg01YPM1NmNxznTLDDkO+LCc0h0vG3on8ctnA9\nFk+rOyoAOUelcmhJQqS/G8w6nogXO9XQChMJvnhHCRr7ctosW2jzIGoNDgLA\nvaxW\r\n=jcZG\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIDJkq0DUVTaE0RdFYjI54zz4MOVs9kOyJUesCocWz3l9AiBUtomYWXHV1LDcSHeiqghctgz26E3uAxhQeyVnBHWcxg=="}]},"maintainers":[{"name":"anywhichway","email":"syblackwell@anywhichway.com"}],"_npmUser":{"name":"anywhichway","email":"syblackwell@anywhichway.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/thunderclap_0.0.29-a_1563821441627_0.1922042792780656"},"_hasShrinkwrap":false},"0.0.31-a":{"name":"thunderclap","version":"0.0.31-a","description":"Thunderclap: An key-value, indexed JSON, and graph database plus function oriented server for Cloudflare","engines":{"node":"10.x"},"license":"SSPL v1","scripts":{"thunderclap":"webpack"},"repository":{"type":"git","url":"git+https://github.com/eventscope/thunderclap.git"},"keywords":[],"author":{"name":"Simon Y. Blackwell","email":"syblackwell@anywhichway.com","url":"http://app.github.com/anywhichway"},"bugs":{"url":"https://github.com/eventscope/thunderclap/issues"},"homepage":"https://github.com/eventscope/thunderclap#readme","devDependencies":{"chai":"^4.2.0","live-server":"^1.2.1","mocha":"^5.2.0","terser-webpack-plugin":"^1.3.0","webpack":"^4.33.0","webpack-cli":"^3.3.5","webpack-shell-plugin":"^0.5.0"},"dependencies":{"node-fetch":"^2.6.0"},"gitHead":"6573ef46c18ca8ccebd3a89be8c792214906fe30","_id":"thunderclap@0.0.31-a","_nodeVersion":"11.13.0","_npmVersion":"6.7.0","dist":{"integrity":"sha512-NbT5e5t/Wnh5wNpWEeMgXwJQxtUh1rPv1cJlry8C+OkYUCmbleotF+Ycp5BPWn0W94C9ptRw+JOQtINNFSgdog==","shasum":"a9db169f7f18374fe72076ad349a820a9b464a47","tarball":"https://registry.npmjs.org/thunderclap/-/thunderclap-0.0.31-a.tgz","fileCount":55,"unpackedSize":1040509,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdNzO0CRA9TVsSAnZWagAAZ+cP/jlFDbfR/y1SoSItyL5K\nfcAtNrAQF0T06kqY7s7Q4uR3GO8l2qNbxoxbpyevwWucixV1Kuzm5yUQYrHS\ndYS5GHzvwtoY11KsFcJ67VPwL2g7NkTy4YqNbRyIGmkVgTEmCY9Zz/mJKDHf\nGAscg5kTHqX17uDWAPZCg/cGioSBbx4OnKoJZOva2kd/wDLavWVbXTNibHcC\nN3xIit1zANS9XZn6oGGKDFyLG1pokJ/8r4EiHIs9502fGi9pI9cLFhBxik9U\nX75E93hWBHbdJyZEHmzlseUB6U3T3gZSBtmKvsDFwDtg9+CyhSzC46RW1bd8\nWabbCc922wmIvd9Cd+XiRW+UINRHM9fWOMpvffCr5I26NLBi54Y6/kwrfYpe\nXtG+tIok+Vlf7YyJDHVfGGMTgYiyp3MrC1w+LWDNT6H0jd4bBn5FeTHaYhKj\nHZRrpYdyqkXtRq16eZnOweFFhpbDiEr90Ieo+7BzfPPUTPjB76aGksj/wK1Y\nd8oySKZ9nAtLWr/taVwBVLzqnh0dKHuQ5vKKWbYNui2N9lDkH3gxWFGkM27U\n9fzDXvf/p/HDzJh2h/nZuBvi1qZ5BCz2Sup22T42KHwGQtKpLLOM9/9h/TGI\nW0Qfo6atJEoSqzHb5sNgbPq0C3I6LfLBdCHnEFexHYA8aKAKj4xCSXCxRMSX\nZxvB\r\n=V37A\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDabiQVItvNYEaHO+L0HRhY+mShYboYlzVRDo7QNbrUpwIhAPbb7Ip7/JcMwN5YXGEwSnR5UONheY78O8sC751zLqIj"}]},"maintainers":[{"name":"anywhichway","email":"syblackwell@anywhichway.com"}],"_npmUser":{"name":"anywhichway","email":"syblackwell@anywhichway.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/thunderclap_0.0.31-a_1563898803575_0.9391780137027923"},"_hasShrinkwrap":false},"0.0.32-a":{"name":"thunderclap","version":"0.0.32-a","description":"Thunderclap: An key-value, indexed JSON, and graph database plus function oriented server for Cloudflare","engines":{"node":"10.x"},"license":"SSPL v1","scripts":{"thunderclap":"webpack"},"repository":{"type":"git","url":"git+https://github.com/eventscope/thunderclap.git"},"keywords":["MongoDB","ArrangoDB","Redis","Cloudflare","Hbase"],"author":{"name":"Simon Y. Blackwell","email":"syblackwell@anywhichway.com","url":"http://app.github.com/anywhichway"},"bugs":{"url":"https://github.com/eventscope/thunderclap/issues"},"homepage":"https://github.com/eventscope/thunderclap#readme","devDependencies":{"chai":"^4.2.0","live-server":"^1.2.1","mocha":"^5.2.0","terser-webpack-plugin":"^1.3.0","webpack":"^4.33.0","webpack-cli":"^3.3.5","webpack-shell-plugin":"^0.5.0"},"dependencies":{"node-fetch":"^2.6.0"},"gitHead":"81135ae67c5d385ba6bdf3b62f0c41eb7b22b4ce","_id":"thunderclap@0.0.32-a","_nodeVersion":"11.13.0","_npmVersion":"6.7.0","dist":{"integrity":"sha512-b1kDUnIx105etdo2zR3jZRsztYLrzzFRtumlFqJ3mSG2mSt3Rbn4YMB97whK5s9vebvRQo7ZsH7abp6orjiCqw==","shasum":"ab94f5e915076aaf6122467ebe92ea437c410cc6","tarball":"https://registry.npmjs.org/thunderclap/-/thunderclap-0.0.32-a.tgz","fileCount":55,"unpackedSize":1040614,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdOQPHCRA9TVsSAnZWagAAQ/IP/3J3c4WdIzqFDzVajG1n\nk/qkJOEyVfknIv6up6j5lm9+CklbmoxmbzlLPhrjqPPL2u+dc+BGrRIvEGHK\nmjWtcqIt0JSlcg7nSvaR+B0K4eZeMbgxmNLMoX8EFDvC+eTFVPeuhLAuz4rH\njIrWlAZokmNVXQjBwuwKqqk7B75RM8nw9qlx4mem7GFH28SYjEHEHf8kl7TX\noe3EMnuJGXo4ACm5Q/NDhk7rlmueP33318fSoVk1Fk7l5/C3XoO9vn8xQ1L0\nCNUNallv+QhXMnUrqp3wmtQIj7XuBppwm137T2+SaDJzdb50KTNXojhpcKyD\ntQoa5F2R/G9w0w+NqDEb3F8zkc5PrIupSPKC0gu7i/q+XRqmZfjl+lzwal3B\nnuLKaBFjItcsdSzAVpSHXU/za/flGBogKvGebFsCdunShlWNF4zlcs6iqm4f\nDjvNRCUCWyjgXUO+cSqE57UYG+JPlOhTxgd4SnPfNm0sd8056IqdeIfO2KXn\nIIXk7CjZsAmPeFupgHjsJAVd85iaESwVyrTXLOi33P0WgDg1sna2HivB6cx1\nq1koQvLSoeVBVNWJXqsrgENgpmhdp69Qp9Y0HnsR1io86awp7xYHIuumsRLn\nJsQ36TImx4Bx/9em55mUk6Ucg9mUAJDM9UZ2xOLfa9UwJL27SA0Iw1IVqyr5\nl5+0\r\n=Pt/M\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIGxqjmx+l3dRNVP/yhr6Aw0iyDTIMmLKtRqDp1hKDwuvAiB1XzdD18D5bg/fG2wPUqdj5I7yH6krgcqGI/F1fvo62A=="}]},"maintainers":[{"name":"anywhichway","email":"syblackwell@anywhichway.com"}],"_npmUser":{"name":"anywhichway","email":"syblackwell@anywhichway.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/thunderclap_0.0.32-a_1564017605951_0.6358197743406102"},"_hasShrinkwrap":false},"0.0.33-a":{"name":"thunderclap","version":"0.0.33-a","description":"Thunderclap: An key-value, indexed JSON, and graph database plus function oriented server for Cloudflare","engines":{"node":"10.x"},"license":"SSPL v1","scripts":{"thunderclap":"webpack"},"repository":{"type":"git","url":"git+https://github.com/eventscope/thunderclap.git"},"keywords":["MongoDB","ArrangoDB","Redis","Cloudflare","Hbase"],"author":{"name":"Simon Y. Blackwell","email":"syblackwell@anywhichway.com","url":"http://app.github.com/anywhichway"},"bugs":{"url":"https://github.com/eventscope/thunderclap/issues"},"homepage":"https://github.com/eventscope/thunderclap#readme","devDependencies":{"chai":"^4.2.0","live-server":"^1.2.1","mocha":"^5.2.0","terser-webpack-plugin":"^1.3.0","webpack":"^4.33.0","webpack-cli":"^3.3.5","webpack-shell-plugin":"^0.5.0"},"dependencies":{"node-fetch":"^2.6.0"},"gitHead":"fb898fbbb9055da04b84fed3af002cbf1f798c71","_id":"thunderclap@0.0.33-a","_nodeVersion":"11.13.0","_npmVersion":"6.7.0","dist":{"integrity":"sha512-M+MaME+5sgvvcMi7+oTRgPab7dKhmfV6FSmMnECq6hpUNI01u4TV47tcm3b12gkBzFBdEmzQ1ZmvUEHQb0KaQA==","shasum":"89de6c64fd629e4db6e0d69a6d23f54527920ddd","tarball":"https://registry.npmjs.org/thunderclap/-/thunderclap-0.0.33-a.tgz","fileCount":56,"unpackedSize":1043827,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdO1tPCRA9TVsSAnZWagAAjBUP/i8qzH/vaj2r6VK+nhl+\nSQgCh42o0WbY/qnYHMT0Qra8mJZ5dJbkhtQDRlrcD1Qekt2wIToEzb3cLYZW\nRHNt4MepGIsNVODW2VCQinXhM5dgi4pSikK1UMEqBZtd3HREYfnj32FUFBHu\nhMMdAEvHXHtjLKs1wy+Z1Y+wg35XgB5suAq2i4SOxvckFKpUi7o2HKf6wKO0\n7ONIyDgHmwkbGYvZBUP7tzLbM9UzDWo/VjkfNpexRydmqhwcAfTz78Xk31hb\nsOSPJH4hUlDEUGeMt5D0nu6MWUNV5WTHHZ6WUMZzvS9bxEoNLp75077mC0cJ\nex573yMLHvFNQJrTQa5oskAdP79JVTEqaBQ40tdqJIk06rvMaF3xItbzW39n\n8UoPsekZn8yFfowBr2Du51cnqU9epL4iKF0W79Abc1y1298qBEhwomRkCnvZ\ng9eeOYZh3gF98/xBlSQ3EtGXwp5aTJH6zVdRi9cMatGYEtNWw/vAs5xpccDY\nKBddNuA/FMCvQeLrSktExcIdFCaZBud1seblUzf39EcfRdxvfhSPZLdHqWfB\nGeVs155SnjNJqmRYSB4yWAcSSZr5tQPu5Zj9bEnX/GEarzlkxZyc5LbODbFN\nGqORELgokodkz4KzKU55bWBi+Drq/eWO9yrvfW9Fb9KwsL2xZ5MMecbdfTEf\nRu61\r\n=uQDL\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCuF6zz+nYc8010z7KIsFjib1vXjaFeNCi6708T7RyO4AIhAMqsMi8BtcBM/3vriVod69yUvBi/C4nTAjzxDL2j0AGw"}]},"maintainers":[{"name":"anywhichway","email":"syblackwell@anywhichway.com"}],"_npmUser":{"name":"anywhichway","email":"syblackwell@anywhichway.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/thunderclap_0.0.33-a_1564171086140_0.3868366075333389"},"_hasShrinkwrap":false}},"time":{"created":"2019-06-20T02:27:48.631Z","0.0.1-a":"2019-06-20T02:27:48.829Z","modified":"2022-05-21T19:43:10.966Z","0.0.3-a":"2019-06-20T11:50:33.043Z","0.0.4-a":"2019-06-21T02:21:54.412Z","0.0.5-a":"2019-06-21T12:49:22.335Z","0.0.9-a":"2019-06-23T14:32:12.932Z","0.0.10-a":"2019-06-24T14:52:34.445Z","0.0.11-a":"2019-06-25T06:28:35.574Z","0.0.12-a":"2019-06-26T04:42:38.469Z","0.0.14-a":"2019-07-01T13:56:09.689Z","0.0.15-a":"2019-07-02T22:00:41.506Z","0.0.16-a":"2019-07-03T11:12:19.456Z","0.0.17-a":"2019-07-04T11:33:22.525Z","0.0.19-a":"2019-07-09T18:22:26.524Z","0.0.20-a":"2019-07-10T22:47:16.028Z","0.0.21-a":"2019-07-11T14:59:13.597Z","0.0.22-a":"2019-07-12T06:17:11.357Z","0.0.23-a":"2019-07-12T20:39:44.541Z","0.0.24-a":"2019-07-13T14:43:20.697Z","0.0.25-a":"2019-07-13T23:41:00.466Z","0.0.26-a":"2019-07-14T10:22:27.214Z","0.0.27-a":"2019-07-15T12:33:29.999Z","0.0.28-a":"2019-07-16T11:23:00.231Z","0.0.29-a":"2019-07-22T18:50:41.837Z","0.0.31-a":"2019-07-23T16:20:03.756Z","0.0.32-a":"2019-07-25T01:20:06.214Z","0.0.33-a":"2019-07-26T19:58:06.246Z"},"maintainers":[{"name":"anywhichway","email":"syblackwell@anywhichway.com"}],"description":"Thunderclap: An key-value, indexed JSON, and graph database plus function oriented server for Cloudflare","homepage":"https://github.com/eventscope/thunderclap#readme","keywords":["MongoDB","ArrangoDB","Redis","Cloudflare","Hbase"],"repository":{"type":"git","url":"git+https://github.com/eventscope/thunderclap.git"},"author":{"name":"Simon Y. Blackwell","email":"syblackwell@anywhichway.com","url":"http://app.github.com/anywhichway"},"bugs":{"url":"https://github.com/eventscope/thunderclap/issues"},"license":"SSPL v1","readme":"<a name=\"top\"></a>\n# thunderclap\n\nThunderclap is a key-value, indexed JSON, and graph database plus function oriented server designed specifically for Cloudflare. It runs on top of the\nCloudflare KV store. Its [query capability](#joqular) is supported by [JOQULAR](https://medium.com/@anywhichway/joqular-high-powered-javascript-pattern-matching-273a0d77eab5) \n(JavaScript Object Query Language), which is similar to, but more extensive than, the query language associated with MongoDB. \nIn addition to having more predicates than MongoDB, JOQULAR extends pattern matching to object properties, e.g.\n\n```javascript\n// match all objects with properties starting with the letter \"a\" containing the value 1\ndb.query({Object:{[/a.*/]:{$eq: 1}}}) \n```\n\nThunderclap uses a [JavaScript client](#javascript) client to support:\n\n1) [Special storage for Infinity, NaN, Dates](#special-storage)\n\n2) [Built in User, Edge, Position, and Coordinate Classes](#built-in-classes)\n\n3) [role based access control mechanisms](#access-control)\n\n4) [inline analytics and hooks](#analytics)\n\n5) [triggers](#triggers)\n\n6) [custom functions (with access control)](#functions)\n\n7) [full text indexing and search](#full-text) in addition to [regular property indexing](#indexing)\n\n8) [schema based or schemaless operation](#schema)\n\n9) [an admin UI](#admin)\n\nA [URL fetch (CURL)](#curl) capability is also supported.\n\nLike MongoDB, Thunderclap is open-sourced under the Server Side Public License. This means licencees are free to use and \nmodify the code for internal applications or public applications that are not primarily a means of providing Thunderclap\nas a hosted service. In order to provide Thunderclap as a hosted service you must either secure a commercial license from \nAnyWhichWay or make all your source code available, including the source of non-derivative works that support the \nmonitoring and operation of Thunderclap as a service.\n\n# Important Notes\n\nThunderclap is currently in ALPHA because:\n\n1) Workers KV from Cloudflare recently came out of beta and is missing a few key features that are \"patched\" by \nThunderclap.\n\n2) Security measures are incomplete and have not yet been vetted by a third party.\n\n3) Although there are many unit tests, application level functional testing has been limited.\n\n4) The source code could do with a lot more comments.\n\n5) Project structure does not currently have a clean separation between what people might want to change\nfor their own use vs submit as a pull request. In general, changes to file in the `src` directory are\ncandidates for pull requests and with the exception of this README those outside are not.\n\n6) It has not been performance tuned.\n\n7) It is highly likely you will need to re-create your NAMESPACES with every new ALPHA release.\n\n8) APIs are not yet stable.\n\n9) It could do with contributors!\n\n# Installation and Deployment\n\nClone the repository https://www.github.com/anywhichway/thunderclap.\n\nRun `npm install`.\n\n## Production\n\nNOTE: While the software is in ALPHA state, you should probably not deploy to a production Cloudflare server that\nis not behind Cloudflare's paid Access management interface.\n\nWhen Thunderclap is running in production, it will be available at `thunderclap.<your-domain>`. When it is running in \n[development mode](#development), it will be available at `<dev-host-prefix>-thunderclap.<your-domain>`. You can choose\nthe `dev-host-prefix`.\n\nYou can deploy and use Thunderclap immediately after creating and populating a `thunderclap.json` configuration file,\ncreating a KV namespace, and establishing a CNAME alias `thunderclap` in the Cloudflare DNS control panel. This can \njust point to your root, you do not need a distinct IP address, Cloudflare's smart routers will send requests to the \nThunderclap Cloudflare Worker.\n\nCreate a Cloudflare Workers KV namespace using the Cloudflare Workers control panel. By convention, the following \nname form is recommended so that the name parallels the name of thw worker script generated by Thunderclap.\n\n`thunderclap-<primaryHostName>-<com|org|...>`\n\ne.g. `thunderclap-mydomain-com` is the KV namespace and script name associated with `thunderclap.mydomain.com`\n\nYou will need to populate a file `thunderclap.json` with many of your Cloudflare ids or keys. Copy the file \n`thunderclap.template.json` to `thunderclap.json` and replace the placeholder values. This will contain secret keys,\nso you may want to move it out of your project directory to avoid having it checked-in. The `thunderclap` script in\n`webpack.config.js` assumes the file is up one level in the directory tree. If you do leave it in the project\ndirectory .gitignore is configured to not check it in. But, you will need to edit `webpack.config.js` so that it can\nfind `thunderclap.json`.\n\nThe .gitignore is also set to ignore `dbo.js`, which contains the default `dbo` password and `keys.js` which contains\na function definition for iterating over keys on the server that requires special credentials. None of this data is \nbuilt into the browser software.\n\nYou will need to place the file `db.json` at the root of your web server's public directory and `thunderclap.js` \nin your normal JavaScript resources directory. For convenience, `db.json` and `thunderclap.js` are located in the `docs` \nsubdirectory of the repository so you can host them using GitHub Pages if you wish.\n\nYou can use Thunderclap without making any modifications by setting the `mode` in `thunderclap.json` to `production`\nand running `npm run thunderclap`. This will deploy the Thunderclap worker and a route. Don't forget to deploy `db.json`\nand `thunderclap.js` also.\n\nSee the files in `docs` and `docs/test` for examples of using Thunderclap.\n\n<a name=\"javascript\"></a>\n# Data Manipulation [top](#top)\n\nData in Thunderclap can be manipulated using a JavaScript client or CURL.\n\n## JavaScript Client [top](#top)\n\n```javascript\n<script src=\"thunderclap.js\"></script>\n<script>\nconst endpoint = \"https://thunderclap.mydomain.com/db.json\",\n\tusername = \"<get from somewhere>\", \n\tpassword = \"<get from somewhere>\",\n\t// there is a default user `dbo`, with a default password `dbo`.\n\tdb = new Thunderclap({endpoint,user:{username,password}});\n</script>\n```\n\n`boolean async addRoles(string userName,Array [string role,...]=[])` - Assigns roles to the named user. Returns `true` on success. By default,\nonly a user with the role `dbo` can call this function.\n\n`undefined async clear(string prefix=\"\")` - Deletes items whose keys start with `prefix`. By default it can only be \ncalled by a user with the `dbo` role. See the section on [Access Control](#access-control) to change this.\n\n`string async changePassword(string userName,string password,string oldPassword)` - Changes the password from\n`oldPassword` to `password` for the user with name `userName` and old password `oldPassword`. If `password` is not \nprovided, a random 10 character password is generated and returned. If the currently authenticated user has the role \n`dbo` and is not the user for whom the password was being changed, `oldPassword` can be omitted. If a password\nreset process has been inititiated with `resetPassword`, then `oldPassword` should be the temporary password or mobile\ncode.\n\n`User async createUser(string userName,string password,object extras={},reAuth)` - Creates a user. The password is \nstored on the server as an SHA-256 hash and salt. `createUser` can be called even if Thunderclap is started without \na username and password. If this is done and `createUser` succeeds, the Thunderclap instance is bound to the new user \nfor immediate authenticated use. The `extras` argument can be any additional data to be stored in the user object except roles. \nIf `reAuth` is truthy and the Thunderclap instance was already authenticated, the Thunderclap instance will also be re-bound \nto the new user. You can implement access control and account creation logic on the server to prevent the creation of \nun-authorized accounts. See the section on [Access Control](#access-control).\n\n`boolean async deleteUser(string userName)` - Deletes a user. Returns `true` if user was deleted or did not exist. By default,\nonly a user with the role `dbo` can call this function.\n\n`Array async entries(string prefix=\"\",{number batchSize,string cursor})` - Returns an array or arrays for keys,\nvalues and optionally expirations of data with keys that start with `prefix`.  By default,\nonly a user with the role `dbo` can call this function. Expirations are in Unix epoch milliseconds,\ne.g. `entries(\"Person@\")` might return:\n\n```javascript\n[[\"Person@jxmc9cc1kswqak4ga\",{\"name\":\"joe\"},1562147669820],[\"Person@jxmcnqkx9irjhrz4p\",{\"name\":\"joe\"}]]\n```\n\nEntries can be used in a loop just like `keys` below.\n\n`Array entry(string key)` - Returns the entry for a key as a two or three element array or `undefined`. By default,\nonly a user with the role `dbo` can call this function. For example, `entry(\"Person@jxmc9cc1kswqak4ga\")` \nmight return:\n\n```javascript\n[\"Person@jxmc9cc1kswqak4ga\",{\"name\":\"joe\"},1562147669820]\n``` \n\n`Edge async get(string|Array path)` - Returns an `Edge` in a graph data store. The `path` can be an Array or a dot delimited string, e.g.\n`[\"people\",\"joe\"]` is the same as \"people.joe\".\n\n`User async getUser(string userName)` - Returns the User with the `userName` or `undefined`. By default can only be executed \nby a user with the role `dbo` or the named user itself.\n\n`any async getItem(string key)` - Gets the value at `key`. Returns `undefined` if no value exists.\n\n`boolean async hasKey(string key)` - Returns `true` if `key` exists.\n\n`Array async keys(prefix=\"\",{number batchSize=1000,string cursor,boolean expanded})` - Returns an Array of the next `batchSize`\nkeys in database than match the `prefix` every time it is called. By convention, the last value in the array is the cursor.\nBy default it can only be called by a user with the `dbo` role. A loop can be used to process all keys:\n\n```javascript\n\tlet cursor;\n\tdo {\n\t\tkeys = await mythunder.keys(\"\",{cursor});\n\t\tcursor = keys.pop();\n\t\tkeys.forEach((key) => dosomething(key));\n\t} while(cursor && keys.length>0)\n```\n\n`any async putItem(object instance,options={})` - Adds a unique id on property \"#\" of `instance`, if one does not exist, \nindexes the object and stores it with `setItem` using the id as the key. In most cases, the unique id will be of the form \n`<className>@xxxxxxxxxxxxx`. The `options` can be one of: `{expiration: secondsSinceEpoch}` or `{expirationTtl: secondsFromNow}`.\n\n`boolean async removeItem(string|object keyOrObject)` - Removes the keyOrObject. If the argument is an indexed object \nor a key that resolves to an indexed object, the index entries are also removed from the database so long as the user has \nthe appropriate privileges. If the key exists but can't be removed, the function returns `false`. If the key does not exist\nor removal succeeds, the function returns `true`.\n\n`boolean async removeRoles(string userName,Array [string role,...]=[])` - Removes roles from the named user. Returns `true` on success. By default,\nonly a user with the role `dbo` can call this function.\n\n`string async resetPassword(string userName,string method=\"email\"||\"mobile\")` - COMING SOON. Initiates a password reset process for \nthe `userName`. `method` defaults to \"email\". The `User` object stored in the database must have an `email` or `mobile` property. The \"mobile\" \noption requires Neutrino keys in `thunderclap.json` and \"email\" requires Mailgun keys. You must build a UI that calls `changePassword` \nwith the code sent to the user as the `oldPassword` argument. Mobile codes are good for 5 minutes. Email codes are good for 30 minutes. The\ncurrent password on the user is not changed until `changePassword` is called. By default `resetPassword` can only be executed by a `dbo` or\nthe current user for for themself.\n\n`boolean async sendMail({to:Array [string emailAddress,...],{cc:Array},{bcc:Array},{subject:string},{body:string})` - \nSend's email. Requires providing Mailgun keys in `thunderclap.json`. The `from` for the e-mail is always the currently authenticated user's e-mail. \nThis function should be access controlled in `secure.js`. By default, only users with the role `dbo` can send mail. Developers might\nconsider adding a role `mailsenders`. Returns `true` if mail was successfuly sent, `false` if there was no e-mail address for the\nautheticated user, and error text with a 500 HTTP status if there was some other cause of failure.\n\n`any async setItem(string key,any value,options={})` - Sets the `key` to `value`. If the `value` is an object it is \nNOT indexed. Options can one of: `{expiration: secondsSinceEpoch}` or `{expirationTtl: secondsFromNow}`.\n\n`Array async query(object {<className>:JOQULARPattern},{boolean partial,number limit)` - Query the database using `JOQULARPattern`. \nIf `partial` is truthy, then only those properties used in the query will actuall be returned. The `limit` defaults internally to\n1000 items. See [JOQULAR](#joqular) below.\n\n`boolean async unique(object|string cnameOrIdOrObject,property,value)` - Returns true if the `value` on `property` is or will be unique for\nthe provided `cnameOrIdOrObject`. If a string class name is provided and true is returned, the the `value` will be unique for the class name\nand property when added to the database. If a full object id, e.g. `Object@jy34s5bz1fkqseh8j` is provided, then either the value will\nbe unique when the object is added or the object exists and has the unique value. Passing in an actuall object just has its id pulled\nfor use in the call to the server.\n\n`User async updateUser(string userName,properties={})` - COMING SOON. Update the user with the provided properties. The currently \nautheticated user must be a `dbo` or the target user. To delete values, use a value of `undefined` for a property. The properties\n`role`, `password`, `hash`, and `salt` properties are ignored. By default `resetPassword` can only be executed by a `dbo` or\nthe current user for for themself.\n\n`any async value(string|Array path [,any value [,object options={}])` - With no optional arguments, returns the value stored at \nthe edge found at `path` in a graph data store. The `path` can be an Array or a dot delimited string, e.g. `[\"people\",\"joe\"]` \nis the same as \"people.joe\". With the optional argument `value`, sets the value at the edge. The `options` can be one \nof: `{expiration: secondsSinceEpoch}` or `{expirationTtl: secondsFromNow}`.\n\n`Array async values(string prefix=\"\",{number batchSize,string cursor})` - Returns all the data associated with keys that\nstart with `prefix`. By default it can only be called by a user with the `dbo` role. It can be used in a loop just like \n`keys` above.\n\n<a name=\"curl\"></a>\n## CURL Requests [top](#top)\n\nTo be written\n\n<a name=\"special-storage\"></a>\n# Special Storage [top](#top)\n\nMost JavaScript data stores do not support special values like `undefined`, `Infinity` and `NaN`. Thunderclap \nserializes these as special strings, e.g. `@Infinity`. However, this is transparent to API calls via the JavaScript\nclient and should only be of concern to those who are customizing or extending Thuderclap.\n\nThe Thunderclap client also serializes dates as `Date@<timestamp>` and restores them to full-fledged dates after\ntransport.\n\n<a name=\"built-in-classes\"></a>\n# Built-in Classes [top](#top)\n\n## User [top](#top)\n\nThunderclap provides a basic `User` class accessable via `new Thunderclap.User({string userName,object roles={user:true}})` \nand `createUser(string userName,string password,[object extras],[boolean reauth])`. Developers are free to add other \nproperties and values to the constructor argument or `extras` object. Additional role keys may also be added to the roles \nsub-object. The only built-in roles are `user` and `dbo`. See Access Control(#access-control) for more detail. To actually \ncreate a user and store it in the database use `createUser`.\n\n## Edge [top](#top)\n\nThe `Edge` object is used to support graph database options. The graph API is similar to, but no identical to, the \nGunDB graph API. It has a number of methods:\n\n`Edge async add(string|Array path,any data[,options={}])` - Adds data to a Set at `path`.\n\n`number async delete(string|Array path)` - Deletes the sub-graph, if any, at `path`. Returns the number of nodes deleted.\n\n`Edge async get(string|Array path)` - Gets the sub-edge at `path`.\n\n`object async put(object data)` - Explodes the object into a sub-graph on the current Edge.\n\n`Edge async remove(string|Array path,any data)` - Removes data from a Set at `path`.\n\n`any async value(string|Array path [,any value [,object options={}])` - Get's or sets the value associated with the Edge.\n\n## Coordinates [top](#top)\n\nFor convenience, Thunderclap exposes a Coordinates object with the same properties as the [JavaScript browser standard\ninterface](https://developer.mozilla.org/en-US/docs/Web/API/Coordinates) `{latitude,longitude,altitude,accuracy,altitudeAccuracy,heading,speed}`. Coordinates can be created directly with:\n\n```javascript\nnew Thunderclap.Coordinates({Coordinates coords,number timestamp});\n```\nThere is also an asynchronous `Thunderclap.Coordinates.create([Coordinates coords])`. If the\noptional argument is not provided, then the browser `navigator.geolocation.getCurrentPosition` will be called\nto get the values to create the Coordinates. This makes it easy to deploy clients that automatically collect and store\nlocation data.\n\n## Position [top](#top)\n\nFor convenience, Thunderclap exposes a Position object with the same properties as the [JavaScript browser standard\ninterface](https://developer.mozilla.org/en-US/docs/Web/API/Position) `coords` and `timestamp`. Positions can be created \ndirectly with:\n\n```javascript\nnew Thunderclap.Position({Coordinates coords,number timestamp});\n```\n\nThere is also an asynchronous `Thunderclap.Position.create([{Coordinates coords,number timestamp}])`. If the\noptional argument is not provided, then the browser \n[navigator.geolocation.getCurrentPosition](https://developer.mozilla.org/en-US/docs/Web/API/Geolocation/getCurrentPosition) \nwill be called to get the values to create the Position. This makes it easy to deploy clients that automatically collect and store\nlocation data.\n\n<a name=\"joqular\"></a>\n# JOQULAR [top](#top)\n\nThunderclap supports a subset of JOQULAR. It is simlar to the MongoDB query language but more extensive. You can see many\nexamples in the unit test file `test/index.js`. \n\nHere is a basic query that returns all Users of age 21 or greater in zipcode 98101:\n\n```javascript\nconst db = new Thunderclap({endpoint,user:{username:\"<username>\",password:\"<password>\"}}),\n\tresults = await db.query({User:{age:{$gte: 21},address:{zipcode:98101}}});\n```\n\nThuderclap also suppport pattern matching on property names:\n\n```javascript\ndb.query({Object:{[/a.*/]:{$eq: 1}}}) // match all Objects with properties starting with the letter \"a\" containing the value 1\n```\n\nYou may have noted above, the top level property names in a query should be class names. In MongoDB, these would \nbe collections. Using different top level keys you can query multiple \"collections\" at the sam etime. If you use the\ntop leve wild card key `_`, all \"collections\" will be searched.\n\nThe supported patterns are described below. All examples assume these two objects exist in the database:\n\n```javascript\nconst o1 = {\n\t\t#:\"User@jxxtlym2fxbmg0pno\",\n\t\tuserName:\"joe\",\n\t\tage:21,\n\t\temail: \"joe@somewhere.com\",\n\t\tSSN: \"555-55-5555\",\n\t\tregisteredIP: \"127.0.0.1\",\n\t\taddress:{city:\"Seattle\",zipcode:\"98101\"},\n\t\tregistered:\"Tue, 15 Jan 2019 05:00:00 GMT\",\n\t\tfavoritePhrase:\"to be or not to be, that is the question\"\n\t},\n\to2 = {\n\t\t#:\"User@jxxviym2fxbmg0pcr\",\n\t\tuserName:\"mary\",\n\t\tage:20,\n\t\taddress:{city:\"Bainbridge Island\",zipcode:\"98110\"},\n\t\tregistered:\"Tue, 15 Jan 2019 10:00:00 GMT\",\n\t\tfavoritePhrase:\"premum non nocere\"\n\t};\n\n```\n\nThe supported patterns include the below. (If a pattern is not documented, it may not have been tested yet. See the\nunit test file `docs/test/index.js` to confirm.):\n\n## Math and String Comparisons [top](#top)\n\n`{$lt: number|string value}` - A value in a property is less than the one provided, e.g. `{age:{$lt:21}}` matches o2.\n\n`{$lte: number|string value}` - A value in a property is less or equal the one provided, e.g. `{age:{$lte:21}}` matches o1 and o2.\n\n`{$eq: number|string value}` - A value in a property is relaxed equal the one provided, e.g. `{age:{$eq:21}}` and `{age:{$eq:\"21\"}}` match o1.\n\n`{$eeq: number|string value}` - A value in a property is exactly equal the one provided, e.g. `{age:{$eeq:21}}` matches o1 but and `{age:{$eeq:\"21\"}}` does not.\n\n`{$neq: number|string value}` - A value in a property is relaxed equal the one provided, e.g. `{age:{$neq:21}}` matches o2.\n\n`{$gte: number|string value}` - A value in a property is greater than or equal the one provided, e.g. `{age:{$gte:20}}` matches o1 and o2.\n\n`{$gt: number|string value}` - A value in a property is greater than the one provided, e.g. `{age:{$gt:20}}` matches o1 and o2.\n\n## String Tests\n\n`{$startsWith: string value}` - A value in a property starts with the one provided.\n\n`{$endsWith: string value}` - A value in a property ends with the one provided.\n\n## Logical Operators [top](#top)\n\n`{$and: Array}` -  Ands multiple conditions, e.g. `{age:{$and:[{$gt:20},{$lt: 30}]}` matches o1 and o2. Typically not required\nbecause this produces the same result, `{age:{$gt:20,$lt: 30}}`.\n\n`{$not: JOQULARExpression}` - Negates the contained condition, e.g. `{age:{$not:{$gt:20}}}` matches o2.\n\n`{$or: Array}` - Ors multiple conditions, e.g. `{age:{$or:[{$eq:20},{$eq: 21}]}` matches o1 and o2. Allow repeating\nthe same predicate for a single property. The nested form is also supported, `{age:{$eq:20,$or:{$eq: 21}}}`\n\n`{$xor: Array}` - Exclusive ors multiple conditions.\n\n## Date and Time [top](#top)\n\nThe full range of methods available for extracting parts from Date on a native JavaScript Date instance are also \navailable as predicates:\n\n`{$date: number dayOfMonth}` - `{$date: 14}` matches o1 in EST.\n\n`{$day: number dayOfWeek}` - `{$day: 2}` matches o1 in EST.\n\n`{$fullYear: number fourDigitYear}` - `{$fullYear: 2019}` matches o1 in EST.\n\n`{$hours: number hours}` - `{$hours: 5}` matches o1 in EST.\n\n`{$milliseconds: number ms}` - `{$milliseconds: 0}` matches o1.\n\n`{$minutes: number minutes}` - `{$minutes: 0}` matches o1.\n\n`{$month: number month}` - `{$month: 0}` matches o1.\n\n`{$seconds: number seconds}` - `{$seconds: 0}` matches o1.\n\n`{$time: number time}` - `{$time: 1547528400000}` matches o1.\n\n`{$UTCDate: number dayofMonth}` - `{$date: 14}` matches o1.\n\n`{$UTCDay: number dayOfWeek}` -  `{$day: 2}` matches o1.\n\n`{$UTCFullYear: number fourDigitYear}` - `{$fullYear: 2019}` matches o1.\n\n`{$UTCHours: number hours}` - `{$hours: 5}` matches o1.\n\n`{$UTCMilliseconds: number ms}` - `{$milliseconds: 0}` matches o1.\n\n`{$UTCMinutes: number minutes}` - `{$minutes: 0}` matches o1.\n\n`{$UTCMonth: number month}` - `{$month: 0}` matches o1.\n\n`{$UTCSeconds: number seconds}` - `{$seconds: 0}` matches o1.\n\n`{$year: number 2digitYear}` - `${year: 19}` matches o1.\n\n\n## Membership [top](#top)\n\n`{$in: Array|string container}` - A value in a property is in the provided container, e.g. `{age:{$in:[20,21,22]}}` matches o1 and o2.\n\n`{$nin: Array|string container}`  - A value in a property is not in the provided container, e.g. `{age:{$nin:[21,22,23]}}` matches o2.\n\n`{$includes: boolean|number|string included}` - A value in a property (Array or string) includes `included`.\n\n`{$intersects: Array|string container}` - A value in a property (Array or string) intersects `container`.\n\n`$disjoint` -\n\n## Ranges [top](#top)\n\n`{$between: Array [number|string bound1,number|string bound2,inclusive]}` - A value in a property in between the two provided \nlimits. The limits can be in any order, e.g. `{age:{$between:[19,21]}}` or `{age:{$between:[21,19]}}` matches o2. Optionally, \nthe limits can be inclusive, e.g. `{age:{$between:[19,21,true]}}` matches o1 and o2.\n\n`{$outside: Array [number|string bound1, number|string bound2]}` - A value in a property in outside the two provided limits. \nThe limits can be in any order, e.g. `{age:{$outside:[19,20]}}` or `{age:{$between:[20,19]}}` matches o1.\n\n`{$near: Array [number target,number|string absoluteOrPercent]}` - A value in a property is near the provided number either \nfrom an absolute or percentage perspective, e.g. `{age:{$near:[21,1]}}` matches both o1 and o2 as does \n`{age:{$near:[21,\"5%\"]}}` since 1 is 4.7% of 21.\n\n## Regular Expression [top](#top)\n\n`{$matches: RegExp|string pattern}` - A value in a property matches the provided regular expression. The regular expression \ncan be a string that looks like a regular expression or an actual regular expression, e.g. `{userName:{$matches:/a.*/}}`\nor `{userName:{$matches:\"/a.*/\"}}`\n\n## Special Tests [top](#top)\n\n`{$instanceof: string className}` - A value in a property is an instanceof the class denoted by the string argument. The \nclass must  be registered on the server. Currently this includes Object, Array, Data, User, Schema, Position, and Coordinates.\nYou can add more classes by modifying the file `classes.js`.\n\n`{$isa: string className}` - A value in a property is of the class provided by the string argument. Note, this is not \nan `instanceof` test, it does not walk the inheritance tree.\n\nNote that other special tests typically take `true` as an argument. This is an artifact of JSON format that does not allow\nempty properties. Passing anything else will cause them to fail. You may occassionaly want to pass `false` to match\nthings that do not satisfy the test.\n\n`{$isCreditCard: boolean value}` - A value in a property is a valid credit card based on a regular expression and Luhn algorithm.\n\n`{$isEmail: boolean value}` - A value in a property is a valid e-mail address by format, e.g. `{email:{$isEmail: true}}`. Note:\ne-mail addresses are remarkably hard to validate without actually trying to send and e-mail. This will address\nall reasonable cases.\n\n`{$isEven: boolean value}` - A value in a property is even, e.g. `{age:{$isEven: true}}` matches o2.\n\n`{$isFloat: boolean value}` - A value in a property is a float, e.g. `{age:{$isFloat: true}}` will not match either o1 or o2. Note,\n0 and 0.0 are both treated as 0 by JavaScript, so 0 will never satisfy $isFloat.\n\n`{$isIPAddress: boolean value}` - A value in a property is a dot delimited IP address, e.g. `{registeredIP:{$isIPAddress: true}}\n\n`{$isInt: boolean value}` - A value in a property is a dot delimited IP address, e.g. `{registeredIP:{$isIPAddress: true}} matches o1.\n\n`{$isNaN: boolean value}` - A value in a property is a not a number, e.g. `{address:{zipcode:{$isNaN: true}}} matches o1. Note, $isNaN\nwill fail when there is no value since it is no known whether the target is a number or not.\n\n`{$isOdd: boolean value}` - A value in a property is odd, e.g. `{age:{$isOdd: true}}` matches o1.\n\n`{$isSSN: boolean value}` - A value in a property looks like a Social Security Number, e.g. `{SSN:{$isSSN: true}}` matches o1. Note,\nunlike `$isCreditCard` no validation is done beyond textual format.\n\n## Text Search [top](#top)\n\n`{$echoes: string soundALike}` - A value in a property sounds like the provided value, e.g. `{userName:{$echoes: \"jo\"}}` matches o1.\n\n<a name=\"search\"></a>\n`{$search: string searchPhrase}` - Does a full text trigram based search, e.g. `{favoritePhrase:{$search:\"question\"}}` matches o1. \nIf no second argument is provided, the search is fuzzy at 80%, e.g. `{favoritePhrase:{$search:\"questin\"}}` also\nmatches o1 whereas `{favoritePhrase:{$search:[\"questin\",.99]}}`, which requires a 99% match does not. The search\nphrase can contain multiple space separated words.\n\n## Special Predicates\n\n`{$_:any value}` - Matches any property that has `value`.\n\n`{\"$.\":[string functionName,...args]}` - Calls the `functionName` on the value in the property, e.g. `{name:{$startsWith:\"ma\"}}`\nis the same as `{name:{\"$.\":[\"startsWith\",\"ma\"]}}`. By default, queries that use this predicate will return a HTTP status code 403\nfor users that do not have a `dbo` role.\n\n`{\"$.<functionName>\":[...args]}` - Similar to `$.`, except the function name is part of the property. By default, queries that\nuse this predicate will return a HTTP status code 403 for users that do not have a `dbo` role.\n\n<a name=\"access-control\"></a>\n# Access Control [top](#top)\n\nThe Thunderclap security mechanisms support the application of role based read and write access rules for functions,\nobjects, properties, keys, and edges. \n\nIf a user is not authorized read access to an object, key value or edge, it will not be returned. If a user is not \nauthorized access to a particular property, the property will be stripped from the object before the\nobject is returned. Additionally, a query for an object using properties to which a user does not have access\nwill automatically drop the properties from the selection process to prevent data leakage through inference.\n\nIf a user is not authorized write access to specific properties on an object, update attempts will \nfall back to partial updates on just those properties for which write access is allowed. If write access to a\nkey, entire object, or edge is not allowed, the write will simply fail and return `undefined`.\n\nAt the moment, by default, all keys, objects, and properties are available for read and write unless specifically\ncontrolled in the `secure.js` file in the root of the Thunderclap repository. A future release will support defaulting\nto prevent read and write unless specifically permitted.\n\nIf the user is not authorized to execute a function a 403 status will be returned.\n\nThe default `secure.js` file is show below.\n\n```javacript\n(function() {\n\tmodule.exports = {\n\t\t\"Function@\": {\n\t\t\tsecuredTestFunction: { // for testing purposes\n\t\t\t\texecute: [] // no execution allowed\n\t\t\t},\n\t\t\taddRoles: { // only dbo can add roles to a user\n\t\t\t\texecute: [\"dbo\"]\n\t\t\t},\n\t\t\tclear: { // only dbo can clear\n\t\t\t\texecute: [\"dbo\"]\n\t\t\t},\n\t\t\tdeleteUser: {\n\t\t\t\texecute: [\"dbo\"]\n\t\t\t},\n\t\t\tentries: { // only dbo can list entries\n\t\t\t\texecute: [\"dbo\"]\n\t\t\t},\n\t\t\tentry: {\n\t\t\t\texecute: [\"dbo\"]\n\t\t\t},\n\t\t\tkeys: { // only dbo can list keys\n\t\t\t\texecute: [\"dbo\"]\n\t\t\t},\n\t\t\tremoveRoles: {\n\t\t\t\texecute: [\"dbo\"]\n\t\t\t},\n\t\t\tresetPassword: { // only user themself or dbo can start a password reset\n\t\t\t\texecute({argumentsList,user}) {\n\t\t\t\t\treturn user.roles.dbo || argumentsList[0]===user.userName\n\t\t\t\t}\n\t\t\t},\n\t\t\tsendMail: { // only dbo can send mail\n\t\t\t\texecute: [\"dbo\"]\n\t\t\t},\n\t\t\tupdateUser: {  // only user themself or dbo can update user properties\n\t\t\t\texecute({argumentsList,user}) {\n\t\t\t\t\treturn user.roles.dbo || argumentsList[0]===user.userName\n\t\t\t\t}\n\t\t\t},\n\t\t\tvalues: { // only dbo can list values\n\t\t\t\texecute: [\"dbo\"]\n\t\t\t}\n\t\t},\n\t\t\"User@\": { // key to control, use <cname>@ for classes\n\t\t\t\n\t\t\t// read: [\"<role>\",...], // array or map of roles to allow get, not specifying means all have get\n\t\t\t// write: {<role>:true}, // array or map of roles to allow set, not specifying means all have set\n\t\t\t// a filter function can also be used\n\t\t\t// action with be \"get\" or \"set\", not returning anything will result in denial\n\t\t\t// not specifying a filter function will allow all get and set, unless controlled above\n\t\t\t// a function with the same call signature can also be used as a property value above\n\t\t\tfilter({action,user,data,request}) {\n\t\t\t\t// very restrictive, don't return a user record unless requested by the dbo or data subject\n\t\t\t\tif(user.roles.dbo || user.userName===data.userName) {\n\t\t\t\t\treturn data;\n\t\t\t\t}\n\t\t\t},\n\t\t\tkeys: { // only applies to objects\n\t\t\t\troles: {\n\t\t\t\t\t// only dbo's and data subject can get roles\n\t\t\t\t\tget({action,user,object,key,request}) { return user.roles.dbo || object.userName===user.userName; }, \n\t\t\t\t},\n\t\t\t\thash: {\n\t\t\t\t\t// only dbo's can get password hashes\n\t\t\t\t\tread: [\"dbo\"],\n\t\t\t\t\t// only the dbo and data subject can set a hash\n\t\t\t\t\tset({action,user,object,key,request}) { return user.roles.dbo || object.userName===user.userName; },\n\t\t\t\t},\n\t\t\t\tsalt: {\n\t\t\t\t\t// example of alternate control form, only dbo's can get password salts\n\t\t\t\t\tread: {\n\t\t\t\t\t\tdbo: true\n\t\t\t\t\t},\n\t\t\t\t\t// only the dbo and data subject can set a salt\n\t\t\t\t\tset({action,user,object,key,request}) { return user.roles.dbo || object.userName===user.userName; },\n\t\t\t\t},\n\t\t\t\tname({action,user,data,request}) { return data; } // example, same as no access control\n\t\t\t}\n\t\t\t/* keys could also be a function\n\t\t\tkeys({action,user,data,key,request})\n\t\t\t */\n\t\t},\n\t\tsecuredTestReadKey: { // for testing purposes\n\t\t\tread: [] // no gets allowed\n\t\t},\n\t\tsecuredTestWriteKey: { // for testing purposes\n\t\t\twrite: [] // no sets allowed\n\t\t},\n\t\t[/\\!.*/]: { // prevent direct index access by anyone other than a dbo, changing this may create a data inference leak\n\t\t\tread: [\"dbo\"],\n\t\t\twrite: [\"dbo\"]\n\t\t}\n\t\t/* Edges are just nested keys or wildcards, e.g.\n\t\tpeople: {\n\t\t\t_: { // matches any sub-edge\n\t\t\t\tsecretPhrase: { // matches secrePhrase edge\n\t\t\t\t\tread(...) { ... },\n\t\t\t\t\twrite(...) { ... }\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\t*/\n\t}\n}).call(this);\n```\n\nRoles can also be established in a tree that is automatically applied at runtime. See the file `roles.js`.\n\nWhen Thunderclap is first initialized, a special user `User@dbo` with the user name `dbo` the role `dbo` and the\ndbo password defined in `thunderclap.json` is created. It also has the unique id `User@dbo`.\n\nYou can create additional accounts with the `createUser` method and change passwords with the `changePassword` \nmethod.\n\n<a name=\"analytics\"></a>\n# Inline Analytics & Hooks [top](#top)\n\nInline analytics and hooks are facilitated by the use of JOQULAR patterns or edge specficications and tranform or hook \ncalls in the file `when.js`. The transforms and hooks can be invoked from the browser, a service worker, or in the cloud. \nThey are not currently access controlled in the browser or a service worker. In the cloud, transforms are invoked after \nit is determined primary key access is allowed but before data property access is assesed and the data is written. \nThis security is applied to the transformed data. Hooks are called after the data is written. If you need to transform \nsomething and call a hook, but not write to the database either call the hook as the last action in the transform and \nreturn nothing, or use a before trigger.\n\nBelow is an example.\n\n```javascript\n(function() {\n\tmodule.exports = {\n\t\tclient: [\n\t\t\t{\n\t\t\t\twhen: {testWhenBrowser:{$eq:true}},\n\t\t\t\ttransform({data,pattern,user,request}) {\n\t\t\t\t\tObject.keys(data).forEach((key) => { if(!pattern[key]) delete data[key]; });\n\t\t\t\t\treturn data;\n\t\t\t\t},\n\t\t\t\tcall({data,pattern,user,request}) {\n\t\t\t\t\t\n\t\t\t\t}\n\t\t\t}\n\t\t],\n\t\tworker: [\n\t\t\t// not yet implemented\n\t\t],\n\t\tcloud: [\n\t\t\t{\n\t\t\t\twhen: {testWhen:{$eq:true}},\n\t\t\t\ttransform({data,pattern,user,request}) {\n\t\t\t\t\tObject.keys(data).forEach((key) => { if(!pattern[key]) delete data[key]; });\n\t\t\t\t\treturn data;\n\t\t\t\t},\n\t\t\t\tcall({data,pattern,user,request,db}) {\n\t\t\t\t\t\n\t\t\t\t}\n\t\t\t}\n\t\t]\n\t}\n}).call(this);\n\n```\n\n<a name=\"triggers\"></a>\n# Triggers [top](#top)\n\nTriggers can get invoked before and after key value or indexed object properties change or get deleted. The triggers are configured\nin the file `on.js`. Any asynchronous triggers will be awaited. `before` triggers must return truthy for execution to\ncontinue, i.e. a before on set that returns false will result in the set aborting. `before` triggers are fired immediately\nbefore security checks. Triggers are not access controlled.\n\nTriggers can be executed in the browser, a service worker, or the cloud.\n\n```javascript\n(function() {\n\tmodule.exports = {\n\t\tclient: {\n\t\t\t\n\t\t},\n\t\tworker: {\n\n\t\t},\n\t\tcloud: {\n\t\t\t\"User@\": {\n\t\t\t\tread({value,key,user,request}) {\n\t\t\t\t\t; // called after get\n\t\t\t\t},\n\t\t\t\twrite({value,key,oldValue,user,request}) {\n\t\t\t\t\t// if value!==oldValue it is a change\n\t\t\t\t\t// if oldValue===undefined it is new\n\t\t\t\t\t// if value===undefined it is delete\n\t\t\t\t\t; // called after set\n\t\t\t\t},\n\t\t\t\texecute({value,key,args,user,request}) {\n\t\t\t\t\t; // called after execute, value is the result, key is the function name\n\t\t\t\t},\n\t\t\t\tkeys: {\n\t\t\t\t\tpassword: {\n\t\t\t\t\t\twrite({value,key,oldValue,user,request}) {\n\t\t\t\t\t\t\t; // called after set\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\t/* Edges are just nested keys or wildcards, e.g.\n\t\t\tpeople: {\n\t\t\t\t_: { // matches any sub-edge\n\t\t\t\t\tsecretPhrase: { // matches secrePhrase edge\n\t\t\t\t\t\tread(...) { ... },\n\t\t\t\t\t\twrite(...) { ... }\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\t*/\n\t\t}\t\n\t}\n}).call(this);\n```\n<a name=\"functions\"></a>\n# Functions [top](#top)\n\nExposing server functions to the JavaScript client in the browser is simple. Just define the functions in \nthe file `functions.js`. Any asynchronous functions will be awaited.\n\n```javascript\n(function() {\n\tmodule.exports = {\n\t\tclient: { // added only to the client and invoked only there\n\t\t\n\t\t},\n\t\tworker: {\n\t\t\n\t\t}\n\t\tcloud: { // added to the client, but invoked on the server\n\t\t\tsecuredTestFunction() {\n\t\t\t\treturn \"If you see this, there may be a security leak\";\n\t\t\t},\n\t\t\tgetDate() {\n\t\t\t\treturn new Date();\n\t\t\t}\n\t\t}\n\t}\n}).call(this);\n```\n\nThe functions will automatically become available in the admin client `docs/thunderclap`. Function execution in the cloud can\nbe access controlled in `secure.js`.\n\n<a name=\"indexing\"></a>\n# Indexing [top](#top)\n\nAll properties of objects inserted using `putItem` are indexed for direct match, with the exception of properties \ncontaining strings over 64 characters in length. Strings longer than 64 characters can be matched use `$search`.\nObjects that are just a value to `setItem` are not indexed. The index partitioned per class, but searches can be conducted\nacross all classes by the use of the wildcard key `_`.\n\nThe root index node can be accessed via `keys(\"!\")`. Direct access is restricted to users with the role `dbo`.\n\nIndexes in Thunderclap consume very little RAM, they are primarily composed of specially formed and partitioned keys \npointing to just the value `1`. This means the performance of Thunderclap is heavily dependent on the performance of \nthe Cloudflare KV with respect to iterating keys. It also means that Thunderclap can have an unlimited number of objects \nindexed. The largest object that can be stored is 2MB (the same as Cloudflare KV).\n\n<a name=\"full-text\"></a>\n## Full Text Indexing [top](#top)\n\nAny strings containg spaces are automatically added to a full-text index based on [trigrams](https://en.wikipedia.org/wiki/Trigram_search)\nafter stop words such as `and`, `but`, `or` have been removed. These can be searched using the [`{$search: <phrase>}`](#search) pattern.\n\n\n<a name=\"schema\"></a>\n# Schema [top](#top)\n\nThe use of schema is optional with Thunderclap. They can be used to validate data in all tiers of an application: browser,\nworker, or cloud. The built in classes `User`, `Position`, and `Coordinates` all have schema. If schema are present, they\nare automatically used to validate data prior to insert in the cloud. They can be optionally applied in the browser. \n\nBelow is an example for `User`. Note, by convention Schema are attached to classes as a static property.\n\n```javascript\nUser.schema = {\n\tuserName: {required:true, type: \"string\", unique:true},\n\troles: {type: \"object\"}\n}\n```\n\nThe following constraints are supported:\n\n`matches:RegExp` - Checks to see if a property value matches the provided regular expression.\n\n`noindex:boolean` - If present and `truthy`, prevents indexing of a property.\n\n`oneof:Array` - Checks to see if a property value is in the provided array.\n\n`required:boolean` - Ensures the property has a value.\n\n`unique:boolean` - Does a database look-up to ensure no other entity of the same class has the same property value. (Not yet implemented).\n\n`validate:function` - Calls a custom validation function with the signature `(object object,string key,any value,Array errors,Thunderclap db)`. \nThe function is responsible for pushing any errors into the provided errors array.\n\n\n<a name=\"development\"></a>\n# Development [top](#top)\n\nIf you wish to modify Thunderclap, you must subscribe to the Cloudflare Argo tunneling service on the domain where \nyou wish to use Thunderclap.\n\nCreate a Cloudflare Workers KV namespace using the Cloudflare Workers control panel. By convention the following \nname form is recommended so that the name parrallels the name of the worker script generated by the Thunderclap.\n\n`<devHost>-thunderclap-<primaryHostName>-<com|org|...>`\n\ne.g. `myname-thunderclap-mydomain-com` is the KV namespace and script name associated with `myname-thunderclap.mydomain.com`\n\nYou do not need a CNAME record for your dev host, Argo manages this for you.\n\nRun the thunderclap script:\n\n`npm run thunderclap`\n\nIf the 'mode' in 'thunderclap.json` is set to `development`, then in addition to deploying the worker script to\n`<devHost>-thunderclap-<primaryHostName>-<com|org|...>` with a route, a local web server is started with an Argo tunnel \nto access `<dev-host-prefix>-thunderclap.<your-domain>` via your web browser.\n\nIf you access `https://<dev-host-prefix>-thunderclap.<your-domain>/test/` via your web browser, the unit test file \nwill load. \n\nWhen in dev mode, files are watched by webpack and any changes cause a re-bundling and deployment of the worker script\nto Cloudflare.\n\n<a name=\"development\"></a>\n## Admin UI [top](#top)\n\nWhen in development mode, there is a primitive UI for making one-off requests at \n`https://<dev-host-prefix>-thunderclap.<your-domain>/thunderclap.html`. This UI exposes all of the functions\navailable via the [Javascript](#javascript) client.\n\n# History and Roadmap [top](#top)\n\nMany of the concepts in Thunderclap were first explored in ReasonDB. ReasonDB development has been suspended for now, \nbut many features found in ReasonDB will make their way into Thunderclap if interest is shown in the software. \n\n# Change Log (reverse chronological order) [top](#top)\n\n2019-07-24 v0.0.33a Added graph `add` and `remove` for set operations on values.\n\n2019-07-24 v0.0.32a Minor documentation fixes.\n\n2019-07-23 v0.0.31a Slight performance inmprovements. Fixed broken `$search`.\n\n2019-07-22 v0.0.30a Security now works on graph paths.\n\n2019-07-22 v0.0.29a Started adding graph database capability. Not yet tied to triggers, security, etc. Reworked triggers, \nsecurity, so that they will work across all of key-value, JSON, and graph storage. If you are using any, they will \nneed substantive re-work.\n\n2019-07-16 v0.0.28a Multiple classes can now be queried at the same time.\n\n2019-07-15 v0.0.27a Added many user management functions.\n\n2019-07-14 v0.0.26a Modified indexing and query approach to use classes at top level, i.e. `{<cname>:<pattern>}`\ninstead of `<pattern>`. NAMESPACES must be recreated. The ability to query across classes will be re-introduced in \na subsequent release using {_:<pattern>}. This change will improve performance is real-world cases by further\npartitioning keys and also making unique key look-up/verification much faster.\n\n2019-07-13 v0.0.25a Added `unique(cnameOrIdOrObject,property,value`).\n\n2019-07-13 v0.0.24a Fixed `$instanceof` and added `$isa`. Eliminated gloabal leak in unit test for Schema validation.\n\n2019-07-12 v0.0.23a Full text search repaired. Optimized inserts and deletes. NAMESPACES must be recreated.\n\n2019-07-12 v0.0.22a Ehanced documentation. Completely re-worked indexing to allow for more object storage. Full text search\ncurrently broken. NAMESPACES must be re-created.\n\n2019-07-11 v0.0.21a Ehanced documentation.\n\n2019-07-10 v0.0.20a Ehanced documentation. Added `Position` and `Coordinates`.\n\n2019-07-09 v0.0.19a Server was throwing errors on date predicates. Fixed. Added support for un-indexing nested objects.\nUnindexing full-text not yet implemented. Added a short term cache to improve performance. Unit tests for removeItem are\nfailing as a result. Not sure why.\n\n2019-07-06 v0.0.18a Added nested object indexing (unindex does not yet work).\n\n2019-07-04 v0.0.17a Added full text indexing with `{$search: string terms}` or `{$search: [string terms, number pctMatch]}`\n\n2019-07-03 v0.0.16a Added `changePassword(userName,password,oldPassword)`.\n\n2019-07-02 v0.0.15a Added `clear(prefix)`, `entries(prefix,options)`, `hasKey(key)`, `values(prefix,options)`.\nAll are limited to dbo access. Reverted to two level index for now to address performance. Limits number of \nentries per index due to 128MB limit of Cloudflare Workers.\n\n2019-06-30 v0.0.14a Ehanced triggers and functions to allow browser, service worker, or cloud execution. \nAdded `when` capability. Service worker support will operate once service workers are generated during the\nbuild process.\n\n2019-06-26 v0.0.13a Indexing optimized to reeuce RAM usage. Substantive performance drop.\n\n2019-06-26 v0.0.12a Indexing now extends to 3 levels to provide more data spread. Sub-objects still not \nindexed as direct paths. Added support for expiring keys and listing keys.\n\n2019-06-25 v0.0.11a Code optimizations and bug fixes.\n\n2019-06-24 v0.0.10a Custom function support added.\n\n2019-06-22 v0.0.9a Triggers on put, update, remove.\n\n2019-06-22 v0.0.8a Triggers now working for `putItem`.\n\n2019-06-22 v0.0.7a Added JOQULAR pattern `$near:[target,range]`. Range can be a number, in which case it is \nadded/substracted or a string ending in the `%` sign, in which case the percentage is add/substracted. Added \nstress tests up to 1000 items. Started support for RegExp as acl keys. Enhanced doucmentation.\n\n2019-06-21 v0.0.6a Documentation improvements.\n\n2019-06-21 v0.0.5a ACL improvements. More of unit tests.\n\n2019-06-20 v0.0.4a Added a large number of unit tests\n\n\n","readmeFilename":"README.md"}