{"_id":"@giraphql/plugin-dataloader","_rev":"63-7e0c3114a9856efeb7733aa872f38ee6","name":"@giraphql/plugin-dataloader","dist-tags":{"latest":"2.20.0","preview":"0.0.0-preview-202181322430"},"versions":{"2.0.0-alpha.1":{"name":"@giraphql/plugin-dataloader","version":"2.0.0-alpha.1","description":"A GiraphQL plugin for attaching dataloader to object types","main":"lib/index.js","scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"author":{"name":"Michael Hayes"},"license":"ISC","keywords":["giraphql","graphql","schema","typescript","dataloader"],"publishConfig":{"access":"public"},"peerDependencies":{"dataloader":"2","graphql":">=15.1.0"},"devDependencies":{"apollo-server":"^2.22.2","dataloader":"^2.0.0","graphql-tag":"^2.11.0"},"gitHead":"acde9b0298596958f6955618e0e0f5d0fb790162","_id":"@giraphql/plugin-dataloader@2.0.0-alpha.1","_nodeVersion":"14.15.5","_npmVersion":"lerna/4.0.0/node@v14.15.5+x64 (darwin)","dist":{"integrity":"sha512-fym/2dTF7ck7+T8PEo8QCKmDLsWHAnF3ji7AlyrlTRBy4WRplQga/lHLiVq31XcF0XgScv0zZU3zGzbuRse5Sg==","shasum":"9bc0986c1878a373b5434f5efdb835825458a910","tarball":"https://registry.npmjs.org/@giraphql/plugin-dataloader/-/plugin-dataloader-2.0.0-alpha.1.tgz","fileCount":44,"unpackedSize":253772,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJglxojCRA9TVsSAnZWagAAMUUP/AyI/IT7i/aH/aEimyP3\ngM9ZLSodLXTLIK7OJjHp0WXLRpwIwI0E69rHgnJeXg2Drt40y9s7kdlEUY/2\nG0+bvQNwZPCt28kv+DKqo2LDypsQZVbocnXhgKTVA4qdgmIfgk6SdJxGk1c/\nnhTDPCv8eyoTTII2TLrCE9NgUnbYaJHbQPPb9XogW/MDTaERsVXVCDeem2PH\n0J2TTmvE98l75epF/UNQV1ARIxLdKD7DrI42rqAnC2C7H14NBoQQRcJl6kKX\nMeDR2UU8sVjuNFhwB9CUcgaHJUT9oMhQjYF7Tf7xFzr/DQGbVSSljMgcRoRr\nQEKgcs4YPhztCB8BtVqk5wwK6hw+3pLUXCA1pQ7cdlBMgYo7KhwvrL8YPkwJ\nDRrNzMWNKqE+5ChzYXiOgY/fSbvZ4pjK6jh7X7V+vAcfpez0pgLgWubYXuGs\n3jxcjnhhC/UaQEYEviReqLQGWObhOX9nvBCMoz+jzU7VSX8SYi21sKZUaQLs\nIWcgJraVvO1hpYOPkOKMqPu+r/pGkQiFj4CinIeuFNIRUBlgqi+4k1jMBTnp\nq4KTq0sddteA3mWBnHXEwF1DaJXg/vQkw4cc9O4mwFzl57uwUSdkCUMaHCeg\n22topluoff71+VMN4dJhcZiz26pyG7iOWvaLvDZ5lP0TrbOfCyoCViPV/SpW\nl/xP\r\n=EmwF\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCKRC10ceS7oW1Uw/GRQHf5dxiIdvl0P9IdsQoZ7Yr67QIgMPsKLFZ2Dqb9KUT7WbCqnNu+Wvr938qJq4O9UgzMzUM="}]},"_npmUser":{"name":"hayes","email":"michael@hayes.io"},"directories":{},"maintainers":[{"name":"hayes","email":"michael@hayes.io"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/plugin-dataloader_2.0.0-alpha.1_1620515363482_0.7129395662343372"},"_hasShrinkwrap":false},"2.0.0-alpha.2":{"name":"@giraphql/plugin-dataloader","version":"2.0.0-alpha.2","description":"A GiraphQL plugin for attaching dataloader to object types","main":"lib/index.js","scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"author":{"name":"Michael Hayes"},"license":"ISC","keywords":["giraphql","graphql","schema","typescript","dataloader"],"publishConfig":{"access":"public"},"peerDependencies":{"dataloader":"2","graphql":">=15.1.0"},"devDependencies":{"apollo-server":"^2.22.2","dataloader":"^2.0.0","graphql-tag":"^2.11.0"},"gitHead":"f294a52b8f9b737fd5199505ddcab1756a97cf82","_id":"@giraphql/plugin-dataloader@2.0.0-alpha.2","_nodeVersion":"14.15.5","_npmVersion":"lerna/4.0.0/node@v14.15.5+x64 (darwin)","dist":{"integrity":"sha512-wmuc/qVHhlOFQ7pb330zdjhL0UgIchP/6Gu3AQyojXG6Ol5zzFkA8xq26nwC0LgXwe4+55kMNL+lQwG1agt0/w==","shasum":"39dceb81f3686030cb1d3bec4ecbeb707c776d60","tarball":"https://registry.npmjs.org/@giraphql/plugin-dataloader/-/plugin-dataloader-2.0.0-alpha.2.tgz","fileCount":44,"unpackedSize":253961,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJglxw4CRA9TVsSAnZWagAAd10P/iTY0sDRq3JM12D0R4wF\npzp8R5Fs1Y3t8oKBEHuQ9+iP8JLZsgDickCO9xZ+kdzquKyLbSBn3CVp6y/6\ngsp/cXaNwNC5NssV3bq3EnFDkgYynZ+nJG6rK247C1T3Bmr6EBnZurYmyvz8\nu1CEVQYDvX+bmA39hWmuvs9oSHwtKD/fVMSY+YTlKW5iYJSZyJHP4GD9nzlt\nCZd7cbl6res4Gd6iAOdhAQ1UNcdmHS4m888qoNvfTQzta7TK8mAppe8yaget\n3DbT2O4AyJI52Qw0heU8SMDii1ZpyfoCOQyTLV8hkt2Ry6xSOo9C0epp4+72\nTf47ifm312bu4gQ01VRxRVxyoOkCHgLuGxs/TS+dM4Y15TeR6w/XLFCCEL7v\nMW0OHz3Z2jNDtAT2+IQkgKdr+s2KiNFuw0ZAfnR+u8g9Iki4W1TnyCXd0Jdp\nMauZ21Ifao49Uoxi2cwJ4cAInityQ3FKgoptK25v/7LIDRmr5u5okaX8blqG\nN/fA0DYRqkSm6iAZpA7+cEljdjz9vYYoPJ16N2cXs5PJbBmZO4bBzA8lB0vH\n627dUif62/11gqgeHFMF2XqpsiXp/2xqIpYbynFVYXKwosOzNmW3ps6bgqmc\nrrbUyDgZ2ekoTgwQOjtH9tzrFQ2s9vCG4VL21/SfScmkzuAPZlDmz0CXHE7a\n7Rf+\r\n=tdGM\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQD/8kBHs6OfJLCzJfP5VzdJpKpf8C/S2kJd1jCyyYjlxAIhAKdnDh6t+MRg0IuysGbeytwTXqoh0rfr2Ahy95g0MWXW"}]},"_npmUser":{"name":"hayes","email":"michael@hayes.io"},"directories":{},"maintainers":[{"name":"hayes","email":"michael@hayes.io"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/plugin-dataloader_2.0.0-alpha.2_1620515896331_0.8482346591071603"},"_hasShrinkwrap":false},"2.0.0":{"name":"@giraphql/plugin-dataloader","version":"2.0.0","description":"A GiraphQL plugin for attaching dataloader to object types","main":"lib/index.js","scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"author":{"name":"Michael Hayes"},"license":"ISC","keywords":["giraphql","graphql","schema","typescript","dataloader"],"publishConfig":{"access":"public"},"peerDependencies":{"dataloader":"2","graphql":">=15.1.0"},"devDependencies":{"apollo-server":"^2.22.2","dataloader":"^2.0.0","graphql-tag":"^2.11.0"},"gitHead":"374e3a0f24845832d68a8ca1097d2928ab7a30c5","_id":"@giraphql/plugin-dataloader@2.0.0","_nodeVersion":"14.15.5","_npmVersion":"lerna/4.0.0/node@v14.15.5+x64 (darwin)","dist":{"integrity":"sha512-895wzkCIusplQ/JPkQia278zfWJY1SzQM5U77z/a/3BwP5puMgpdl9NYkP3zqCXpeA6HJsIS2PQrKzgkihB8Bg==","shasum":"66efca09593e1ba57c49b045bf1d92e28865f84b","tarball":"https://registry.npmjs.org/@giraphql/plugin-dataloader/-/plugin-dataloader-2.0.0.tgz","fileCount":44,"unpackedSize":261638,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJglyf5CRA9TVsSAnZWagAA86wP/0W5qokNNwGm6p12cwH8\ntzC8Lw2uUNnGs2Wg/Y+7oLV18Es6O7lHG6iDzdBxnpDQTZYp/VoKQUt6bLqg\nKpFyjW9M6YlPZ12OkzRoAv7TTgVSn0tCr3hjIa7Q0y+9LO/GsU56SiwQuQNo\ndHERC2TCrIn/EAV4nEuRRPzZTix6ZsWoNom94iGF0/iH3fU573bl14pXM0aO\nBlxuaXt1cMrUptsV2HVci4mJrmgiIjYjn10D5M/3hFkwAm5T0dwP9QBnoHAs\nF1tWFbB9iDjTmhDATT+ZwFKT7ECC0QeMiO5pBE0ZLC0dQHnpdxp0LEtR5K2q\nVQlG8pO01lIbY0/jCQY3PFpvPqneIQbvYeRg3Cr1GF6aFd4EqT9/bl/R4+zt\nG5qy1vdlmmOu8SqnfW9iB6+eXcwdlPg8LuBwJ1lwzD3IiEPmYQl3MLVRWHPX\nYN01op4xhU1VH3BqR8DF9zHL2PIGWZnPKZz+Ax2gBm9Bvv8XmmjmQddNaEOH\neuUuqdKaRaXYFMCXb6qz3Y9Sz0PTCenrnPHI8GX1f2/fcdQ80KZYASLVod5v\n611sPg/DjvYgg8A2p3yuHy01xY18DR5rnVk1hWEaCO/ZDkK6RL4GyNjejENX\nWePJT9/da6fv+9byaLTPstvTOV+l8ruzppMcY3iaOBofc93TQc1Rtm7TCUB1\nXNrK\r\n=hwxD\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCICybt5037EQPoT4r1kMEjFxFQpxZ9jLJShgzeWEUmzduAiEAxRRxo1jnzKjo5n0EF0ocQrN7z5yROOcIYO7OFDCiQT4="}]},"_npmUser":{"name":"hayes","email":"michael@hayes.io"},"directories":{},"maintainers":[{"name":"hayes","email":"michael@hayes.io"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/plugin-dataloader_2.0.0_1620518904574_0.18872514907141769"},"_hasShrinkwrap":false},"2.1.0":{"name":"@giraphql/plugin-dataloader","version":"2.1.0","description":"A GiraphQL plugin for attaching dataloader to object types","main":"./lib/index.js","module":"./esm/index.js","scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"author":{"name":"Michael Hayes"},"license":"ISC","keywords":["giraphql","graphql","schema","typescript","dataloader"],"publishConfig":{"access":"public"},"peerDependencies":{"dataloader":"2","graphql":">=15.1.0"},"devDependencies":{"apollo-server":"^2.22.2","dataloader":"^2.0.0","graphql-tag":"^2.11.0"},"gitHead":"eee407d1ce2277f8aeabdab91972d9aaa31e70d6","_id":"@giraphql/plugin-dataloader@2.1.0","_nodeVersion":"14.15.5","_npmVersion":"lerna/4.0.0/node@v14.15.5+x64 (darwin)","dist":{"integrity":"sha512-mjE/vTDOFwdvAUKlQ55ORQfdo8NjXKxdusqqt6c4hTn9SlnMKcC2cyLvdPyADOM1gdSN5Gja/2LXfWWj6pvzlA==","shasum":"a46279aa670d7efb4b4a28c14e19ee75a345cb96","tarball":"https://registry.npmjs.org/@giraphql/plugin-dataloader/-/plugin-dataloader-2.1.0.tgz","fileCount":44,"unpackedSize":262846,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJgmXUCCRA9TVsSAnZWagAAxn0P/ReglGhZ0mRLPidZUhsF\nX/YdQ9esXHHJ4HDMMA8NDwR7KmqwDl9kNJzJ5/TEaipv8sQF3mbDQ7Np1KEu\nzHDVeuL4Q4OukmNLix6D509GBtFMOS4LSWTF7rtgUfGCVb2uVglDndoPuOQC\nuJ5xDflsfHyFwGXJGg0bV0xGlnYikyuiSzoHryCWO/1kLArWBggmGcVoqfMb\nyx49L1dvCGT6St1dTaZZ0OzOxtvPE9reKRyApB2eGy4udnyOLGbFN6ckYrCA\nkgfmmiFdSqV6oCCSVehjewkIuTlYjnNQstUiCItlE3M7gLslx039Pt02aCG9\nET+60xZu1f/xwPgCotBIkBDaOJDSTk5MCtiM5HcwsNRFuhuJW/5vkeuF31fG\n94AGXYccKsPxXj4db4n5WUaKf4t7TUeWNxQareK3MAYx6k2qIt3ket6ePCsp\nX2CJZiogR1XQ3Kowx2booGmInUZqLUsH6nfNRjiCvlvBoZUGORCaTIEBFRWI\nhv83+8rKIB5v6xt6pgoFATpELZzgaKa106pql2rVYfOHZcmuqN96iniGDvO/\njYwLIe7DaP+DKCGRBv5INxH+2K0TwoLjZLZ7Mj7kYCUlxPCOzwFZiXsHGIaC\n4RKalwWRdV1PJPztB8b/HzHZFeMXapr/zc2B2PU/kPNiK/LWNnbLY9pfmw9t\nCZ3C\r\n=+dtT\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIGyIzdYy55ysK9GoMfAYC6AixQ1QwSZGLuFDMeTI1u6qAiBaWX9QRU/xAQIUNCGgQjcCAqgl6rKODM1j/0K4ANwugA=="}]},"_npmUser":{"name":"hayes","email":"michael@hayes.io"},"directories":{},"maintainers":[{"name":"hayes","email":"michael@hayes.io"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/plugin-dataloader_2.1.0_1620669697493_0.6090370796435312"},"_hasShrinkwrap":false},"2.1.1":{"name":"@giraphql/plugin-dataloader","version":"2.1.1","description":"A GiraphQL plugin for attaching dataloader to object types","main":"./lib/index.js","module":"./esm/index.js","scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"author":{"name":"Michael Hayes"},"license":"ISC","keywords":["giraphql","graphql","schema","typescript","dataloader"],"publishConfig":{"access":"public"},"peerDependencies":{"dataloader":"2","graphql":">=15.1.0"},"devDependencies":{"apollo-server":"^2.22.2","dataloader":"^2.0.0","graphql-tag":"^2.11.0"},"gitHead":"3ba24d9c3fc96c7ea54f3a967019b638519b4f8a","_id":"@giraphql/plugin-dataloader@2.1.1","_nodeVersion":"14.15.5","_npmVersion":"lerna/4.0.0/node@v14.15.5+x64 (darwin)","dist":{"integrity":"sha512-34P8UCyY548EDTpUNf88Pevsolm9XTH7FMt1oTk4fDypW9hViI4V2p+v5BaDdmnNP8ByQQtwOSlz9K6TFQnbXA==","shasum":"b355aabdf76db9c20aa8720005cab710921f8385","tarball":"https://registry.npmjs.org/@giraphql/plugin-dataloader/-/plugin-dataloader-2.1.1.tgz","fileCount":44,"unpackedSize":263066,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJgmagzCRA9TVsSAnZWagAAKX4P+wYFt2x2qUI4uKoMjfvJ\neIOg7R+i0oHZGAOHpvs3DhRMfZ2nnfm6svQmlREPMlc5vQkApI5RLznhovxD\nYRQ4kZn5/cBFbwu5fkZVVPGek/nrlmveYNWJP1FzZ8tE5HudVe0fIAkbd2vI\n9e7AJb2/rdBupfK1KxJyVC8yKy5IrNyoOvHU1wrU2m7r97E8RoMxN61Exkl2\nTI6qVBCOD4YtTTX5KYg63j8Z/iuMyzM0bTLVJpwdtB8/1Q2+5uRn+TH1VBAw\nPFDQN2D3YFWhtXaq1J4Nsb31EqQCwhqM5Ql6vPoX47aQQVnD3EmYfRp0ORoS\nkVaOV2mHbOIOs6sqAaDZAsXdmvr/J20SRa35LTSNASDpMoShF5W+9KfBm8Pu\nurTqA6WMHllnyAgS4dYbJEO/MrrBXKWESH0vSEYVhXdrxZMyBdpRWLV1TGoI\nOILuC9c2uZCCkv7NQ0gicUGy2cFehccTPkDKAejhR3s6HxiSEWAl9XWntyCD\nGvLH+tOgUHG0K80/Q4avmbXbLLjXhrs6kKTR0DZ87bbxxHoRS7ralpozC85f\nrnin/ZdhkYwjDPjqkTiQ53YLOD4TwngLetoNkQTj+CiOYCbW5ALPrXPOobeB\nIL8E5w2UCaRdVNPQdegEChm4VtgNW+V/Qak/PSDnWiK34f1PTEkRCe7Ugyhn\nMRzh\r\n=cAel\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIEq+k4Oh/QgXXbbVpX3pqu1GhC93W9K1egsE1KP0ztMzAiEAnSRP5chDqmStQFmJ7Vn/q9VaktTaoYn3n4FjaLRxGjo="}]},"_npmUser":{"name":"hayes","email":"michael@hayes.io"},"directories":{},"maintainers":[{"name":"hayes","email":"michael@hayes.io"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/plugin-dataloader_2.1.1_1620682802796_0.8040970595839898"},"_hasShrinkwrap":false},"2.1.2":{"name":"@giraphql/plugin-dataloader","version":"2.1.2","description":"A GiraphQL plugin for attaching dataloader to object types","main":"./lib/index.js","module":"./esm/index.js","scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"author":{"name":"Michael Hayes"},"license":"ISC","keywords":["giraphql","graphql","schema","typescript","dataloader"],"publishConfig":{"access":"public"},"peerDependencies":{"dataloader":"2","graphql":">=15.1.0"},"devDependencies":{"apollo-server":"^2.22.2","dataloader":"^2.0.0","graphql-tag":"^2.11.0"},"gitHead":"51dd6c62d6bf639e105709bb0ab3cbc0a3f149df","_id":"@giraphql/plugin-dataloader@2.1.2","_nodeVersion":"14.15.5","_npmVersion":"lerna/4.0.0/node@v14.15.5+x64 (darwin)","dist":{"integrity":"sha512-twoSv26l70hYvCHwqudOVPQ23qMd/xwr26cSKLQlgUNnvyTr437Rptbrj/Vm7MfBMgjEHJ+xGS/FobX9903VYQ==","shasum":"63d04c0a9baace624fd655939090948a800c4e5d","tarball":"https://registry.npmjs.org/@giraphql/plugin-dataloader/-/plugin-dataloader-2.1.2.tgz","fileCount":68,"unpackedSize":282090,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJgmanfCRA9TVsSAnZWagAA6jMP/A6cJ9SlIXCPiD5Efmm4\nFtZmnbcy7tb/HgX/dBvyw5+yOMy/hof9Hyc+rP+kFQvE8zKfyIsNtOT+daO3\nyAVTkL0iNcm+vDHjJXo7s8H9TDC7r9ElyzupNusCVPo+fbHunh8X1j2RTIZo\nNfsY92kEt7BJCpo1169quzc5dqZf1sMo7xPH+5yExkGvTcWcVk/TlVOPx4c3\nVW2hNjuJ+bU0ZDiXA/gU4nEPz7ym/i5rFls07RRV/FqJ5ms9QpZUXZ1u0F2C\n4ccpiD5t4dxmI7dJMqeQSg//IQRWURvlKBfBXxyv8CCYQ6RiME2jI5QUA+ZH\nPKrUUQXvB7Wh3qQkEsI/WncSUGoBPjbfdm81IhOLPhvPD9d/NfdJI+odD4L/\na/t7H+a2wXEA30yrZ3jZOj+PORMlL4GOOy+79P15bLyRJmxwiQ3oQHFM+O9i\nJnFU5PZ/g2oXQy2PO8HfVuPhSu4qhd7D87ihlelngOTFVL3jySIlW/GphuUW\nozemKUZ0PaJIH9+cQjRPGokYrg8lu9u1kpdpn7QwNmCAIprdNHgN4LIjrryP\natFVudcgm2Rfv3xuUu1SLIrlpD014e/ioUdJjO3TQDlhqqIuYGI/y6z3Jibe\n7h/Yp8o2nVoyx48j4Du9Pwig8rz3AZ8kwT7HJy3d5K5UaIQv/sMNYz8oVWU+\nz+1g\r\n=F9xu\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIH0YA1CoY3RidnEIVVcFNU42UjTGCfSdOUixfaNMnLN1AiAlnciGx0D1JlqQDG0wa1ZjlUlYApHZPiyCHsKiQ//zhw=="}]},"_npmUser":{"name":"hayes","email":"michael@hayes.io"},"directories":{},"maintainers":[{"name":"hayes","email":"michael@hayes.io"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/plugin-dataloader_2.1.2_1620683231221_0.47501161342540654"},"_hasShrinkwrap":false},"2.1.3":{"name":"@giraphql/plugin-dataloader","version":"2.1.3","description":"A GiraphQL plugin for attaching dataloader to object types","main":"./lib/index.js","module":"./esm/index.js","scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"author":{"name":"Michael Hayes"},"license":"ISC","keywords":["giraphql","graphql","schema","typescript","dataloader"],"publishConfig":{"access":"public"},"peerDependencies":{"dataloader":"2","graphql":">=15.1.0"},"devDependencies":{"@giraphql/core":"2.4.0","apollo-server":"^2.22.2","dataloader":"^2.0.0","graphql-tag":"^2.11.0"},"_id":"@giraphql/plugin-dataloader@2.1.3","_nodeVersion":"15.14.0","_npmVersion":"7.7.6","dist":{"integrity":"sha512-kCQZfNIPFrfNgX9vzST32CZeYCDPNNzZu4TrmHxFMwlUT33FpLwIoapsCkrOlklxoTreP3eUfpTkPdcyQ0kbsA==","shasum":"be944820cd2d77ec40f0afb1be5fe4536a5a79bc","tarball":"https://registry.npmjs.org/@giraphql/plugin-dataloader/-/plugin-dataloader-2.1.3.tgz","fileCount":68,"unpackedSize":282404,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJgnF8TCRA9TVsSAnZWagAANF0P/if83JLxO8Kjlt43QAn5\noAPezUpiJ/rM3IRRny2QA/9IWh13G5fv47LTDJg/Mqt84/fTbEw6cejjzr4i\n/XlwKkIfCP7qTtlu6ZGOapj4IokKgJVwQku5U743iindlCuSoblBiJFXr9LT\nH6QsKf8lHWXqxADcGos7QTME5nyCZzAylc7XTPCMK04HRPef5n0AFnIu3zSY\nxUXrzqzlmyPH5HhoRN9lhkgBpOQCLiJ8wayLpdUbVO47rucEHjywVPKZZMVl\nXRDXfCU2ADE/fo5FjF6cx3cniILMLyE+fc8Aud5OTCosDcl+YX6ubkom6jYI\nGcHyTxz+OD23rc99uovI+RMrKAb8KbS273V5ecyhCGbvFO1Gki3ayFe1wyJY\nHPeLCioI7hIj2pG3d2CugHxaThe55qjkfN7rV16UUhpfLEAYPJfnPfTVEeAH\nRGmuED1o/CFF6ruTFzgY8LStBSJmu8ctxM4zB9gOIZ1fZNq09fMvHmE8+2eA\nbGZyARFr8eD9UaUQUB08zTkmX1wS1xq/CNFUrhIiizPXDKYNrNJbis3aKTAu\nOiQcCWmI2xlPhvTFq6vEfoE0jnfb2dc1kfNdv/JQ5crKq9qdzc+XH+cIAgcp\naish509jpazAned4kS7/WXOX06KtGzyPPcyoVIdQBrrQJ6YXbfNHm5sAAy/l\njixy\r\n=527n\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIGNOUwfi9EMK6hAMwLVquUMCJIv2IOFuANdu7JMJvqSjAiBshKyt9M6+OcbMfSdK+SvpEJP5AIIGFtXCgdd4H/9p9Q=="}]},"_npmUser":{"name":"hayes","email":"michael@hayes.io"},"directories":{},"maintainers":[{"name":"hayes","email":"michael@hayes.io"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/plugin-dataloader_2.1.3_1620860690955_0.832773874287815"},"_hasShrinkwrap":false},"2.2.0":{"name":"@giraphql/plugin-dataloader","version":"2.2.0","description":"A GiraphQL plugin for attaching dataloader to object types","main":"./lib/index.js","module":"./esm/index.js","scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"author":{"name":"Michael Hayes"},"license":"ISC","keywords":["giraphql","graphql","schema","typescript","dataloader"],"publishConfig":{"access":"public"},"peerDependencies":{"dataloader":"2","graphql":">=15.1.0"},"devDependencies":{"@giraphql/core":"*","@giraphql/plugin-relay":"^2.2.4","apollo-server":"^2.22.2","dataloader":"^2.0.0","graphql-tag":"^2.11.0"},"gitHead":"e4d683db03b2e9430487a6ff332884e1e6d2fd2b","_id":"@giraphql/plugin-dataloader@2.2.0","_nodeVersion":"15.14.0","_npmVersion":"lerna/4.0.0/node@v15.14.0+x64 (darwin)","dist":{"integrity":"sha512-vh1imOwufJJ8oz81oImaC+Y7yveknh0PsbTMNRuX96yTcdCFS+Q0h0XkqhLJ6VdCgp23jjcK2BZJhjEaBPpLlA==","shasum":"c3fe682ac3a438980babfd2857d9f4b563ae9842","tarball":"https://registry.npmjs.org/@giraphql/plugin-dataloader/-/plugin-dataloader-2.2.0.tgz","fileCount":68,"unpackedSize":297078,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJgnH7DCRA9TVsSAnZWagAAczoP/13zvcaWJl/v+ZQrmGVd\nwQToxMUT/9AFQhgkC8/nZ2/I8RxjktYGw6vWqXqqB9JwYMDBc9eOVKFaLUe4\nneoPCY22eXkwkjLwD0MSm3iuSjneZpFIIhDwfLwq3rVOeTDbaqd+3OC2QlM4\n3DrWH+WaiPefol+sGkuQKmmTOcWLvgu13UFqN7iZUY4khHYvVKZ7Vk61y/eQ\nkIIou5KnKyPdphe1GPToGqyRL0wC3Se8biGALKq56RGcRVYp3hWYSZudN+yk\ntZdz98P/pfMM/ZGQIM7KqPZM2tNOB04tQr5ZmEgLV2iXGyXKA0Dvwp+9SjXf\npOwzShfYsUCSMz34mj2kt0zxHsR9Hw7mn4GLRf1FOQG6fgiBlXK7HS2gGvpV\nf0otFahCRNYIbZB2VvJq+qJUgBH0hqP/PB4Ri958PLfOGPmQ/O93PDSe5OuR\nO63/ZmNRrx2KUNGci8LYV64Vz7hShJc3ttrShb0Ja6ENRYF3nPGeNlhMuxcG\niI9Gh07RlRN4AZUfhEdaZfAvj2+Zv3RLwrLW8uzzBbb3+3EU6pR2x3AKxYej\nTo8iwrlICT+jOi6ZBJDM3KV8wxwhSI2qMCherB1NRvF/VkSoV7cTwX6PzhmM\nuyS+sBjW+OHvY5EsBmAta8/XVZRV8crd6v/gmOnUO+ovzc2CMQCax+kVqqQu\nrav/\r\n=ftf6\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCz/vNe135O9qMK/EW1zdFTUcUMIyv6O+JVL+OMQGYAiQIhAKpRLBh+b4hA88ACyFUf3/VdsQ1ONCm9KWweicWDtErZ"}]},"_npmUser":{"name":"hayes","email":"michael@hayes.io"},"directories":{},"maintainers":[{"name":"hayes","email":"michael@hayes.io"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/plugin-dataloader_2.2.0_1620868803302_0.7736185300472489"},"_hasShrinkwrap":false},"2.2.1":{"name":"@giraphql/plugin-dataloader","version":"2.2.1","description":"A GiraphQL plugin for attaching dataloader to object types","main":"./lib/index.js","module":"./esm/index.js","scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"author":{"name":"Michael Hayes"},"license":"ISC","keywords":["giraphql","graphql","schema","typescript","dataloader"],"publishConfig":{"access":"public"},"peerDependencies":{"dataloader":"2","graphql":">=15.1.0"},"devDependencies":{"@giraphql/core":"^2.6.0","@giraphql/plugin-relay":"^2.2.5","apollo-server":"^2.22.2","dataloader":"^2.0.0","graphql-tag":"^2.11.0"},"gitHead":"fcbc90aae49e195ef84d1cc5aca3f62fccd4dc43","_id":"@giraphql/plugin-dataloader@2.2.1","_nodeVersion":"15.14.0","_npmVersion":"lerna/4.0.0/node@v15.14.0+x64 (darwin)","dist":{"integrity":"sha512-8lS0LuJ+q853yIvarxZUagdWNmuS8HmIIGr2cWVTBUgAaCVa57vutazBlT/n4cr6D0BfE8ZgRg/gw0dKg0mYPw==","shasum":"af16f6bdc1e83eefb77282520bff2b23d85a301f","tarball":"https://registry.npmjs.org/@giraphql/plugin-dataloader/-/plugin-dataloader-2.2.1.tgz","fileCount":68,"unpackedSize":297180,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJgpEAbCRA9TVsSAnZWagAAtrUP+wemv19ZIsFizw30gV2Z\nNt+trZJIdC5MDSQ8cbAABtJi7BCRfP3FV1WlzKW1rtFXHK028N3lHI6XK29p\n9Mz7cJWSQkMMukDvFjMDUxNQfeXyc3eZFHhVtB8w0s/AWYAAulMNE06ukK7l\nLoLQ3vWpXB518Dl9UGPs2UUnEOGQSZavNzaHEThtEtmQID+YbXR8KgRwNS46\nWsMZIev8tWcre+bXFqCr9050Jo4knrg9Y1t+wp5sqM1TjbpISgdEQN/bXNHy\nA4kjbjCPSYOEz33aLlEdevh54gThGhR3SeSYwVJAYFXFOD43xCzYG9zaE/8m\n0/+pUWOWo0pj7A5yt9YbhuUH+JjD78Q12lCKQKwXUHseGlRpEjde0+jQgkPx\nQBs/nmLPLSC3CV1eBu2ckNtc0FCYBYHRRLCPM6IWNWKhilXSIInnDCyLEBFm\ne3lFLLpY8BX0Odog9ox7mvSfiHyffll+GsDSUkQeMqLPApdTDfUg7mTQgLKL\nF9BN1D/N10PaUoSxoHruJOPhjYxCxBsQB7FrHt+Bkig3qzCJlPjBtb1pT9+J\nECzyYaDHMDEVZfjDX+ef3msyrvvTvHtd5xTgoUiU558Fi3KrkxrRKksA0/2s\n5EcrtQQfXR1FrrwrRueA1B8aKaHjU6p8HvvTgZyhYqAejFVEq0LuDWrB0Qcl\nlW6K\r\n=ffhM\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIGKqvcskbor/giNOwSrt6gSHI+2DlRyPVGMb4lhY63jmAiBMM2LceVDoEXCLSH9Ci3jN9bQYa4vSGwe2J838dOCRYg=="}]},"_npmUser":{"name":"hayes","email":"michael@hayes.io"},"directories":{},"maintainers":[{"name":"hayes","email":"michael@hayes.io"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/plugin-dataloader_2.2.1_1621377050948_0.6811711020327582"},"_hasShrinkwrap":false},"2.2.2":{"name":"@giraphql/plugin-dataloader","version":"2.2.2","description":"A GiraphQL plugin for attaching dataloader to object types","main":"./lib/index.js","module":"./esm/index.js","scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"author":{"name":"Michael Hayes"},"license":"ISC","keywords":["giraphql","graphql","schema","typescript","dataloader"],"publishConfig":{"access":"public"},"peerDependencies":{"dataloader":"2","graphql":">=15.1.0"},"devDependencies":{"@giraphql/core":"^2.6.0","@giraphql/plugin-relay":"^2.2.6","apollo-server":"^2.22.2","dataloader":"^2.0.0","graphql-tag":"^2.11.0"},"gitHead":"3781761e3301a61edfc9dae9560373c2ababdd95","_id":"@giraphql/plugin-dataloader@2.2.2","_nodeVersion":"15.14.0","_npmVersion":"lerna/4.0.0/node@v15.14.0+x64 (darwin)","dist":{"integrity":"sha512-8KqqLSej3Rlzw+XchgFbViS57BgRpMvnztyyV6lMJlPZnYCdXdyWalHlhMCxOaCMAgFCfG7z+SvubOSVJWGAVg==","shasum":"16c66c1f249c93b0eedfb9ed038dc8ad13b1dcfa","tarball":"https://registry.npmjs.org/@giraphql/plugin-dataloader/-/plugin-dataloader-2.2.2.tgz","fileCount":68,"unpackedSize":297277,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJgruDaCRA9TVsSAnZWagAATc8P/1qMxW2tYRUKEsloPS3S\nVGO+K2BKHlT0frSL2O9gDzd+J0ofDqgjIhc9C8VB8KPhw6HtuVkxMJfu3ZDB\nTR2iZ1X5YPi/K2TrTLY883ez1LStaGZ4c62sRmAMzbqa/OxKDyMbVNIyAjOg\nKJMBUFZ7VUzLkU8U+R/tq/MHsF4hkQHGKL3wgh+3yWSLZJ47NBuuUzc0VqHw\n6Pyc34/yy2sGYOvQk+MW05xO1keUITRjbNpmYd0124TRle6KMLmkyZRqvG6N\np1cl05zivHdBaqF9K8rivYPGKeeMaF3s2yhzTNK2R2xCDpdfB98QUUp+leJi\nY1APgDINUgvTxgamYhXPLcmVT0dE/kBHwm6kDJDUEzoTfPJuPdMy6BBnMXPr\n1KFLPDtP0sSiq2Eb5d10f6fNzLH3uZ9LV9cqcuXRIq4rrCh4UNcyKYs5Oy71\n/cB9Cj0dIZIOJRf0Nq46m1MVgqejXsRT9wDggpdqHByv71CilQFtqKhIpUkl\n+CpkOUHuNJnB2twTkMzYB1uClosbARpgnICNdGDszN8LU0zRgemLvfx6/tPA\netj8Mpekh/a3e+Zb0GcZZUg93h8T+Ek0GmWDiyURPoT3BnBsHqEOvAYBMpqK\nnAa6Tkaj8poHjaXnYKaVv9BftK7yWNZoSHfrO5I7aDpwyXfbrQKXWvM3RTHm\nbbni\r\n=CU51\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIEl7qPZB8IU6vB1/BYM5zGGukEHWJLw6W5Rjz52tLcWYAiBt1wvx3v0swqV9ITlvrfrw9lRVOXKhUBcjtNOB6i7cLA=="}]},"_npmUser":{"name":"hayes","email":"michael@hayes.io"},"directories":{},"maintainers":[{"name":"hayes","email":"michael@hayes.io"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/plugin-dataloader_2.2.2_1622073562361_0.08784211598420111"},"_hasShrinkwrap":false},"2.2.3":{"name":"@giraphql/plugin-dataloader","version":"2.2.3","description":"A GiraphQL plugin for attaching dataloader to object types","main":"./lib/index.js","module":"./esm/index.js","scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"author":{"name":"Michael Hayes"},"license":"ISC","keywords":["giraphql","graphql","schema","typescript","dataloader"],"publishConfig":{"access":"public"},"peerDependencies":{"dataloader":"2","graphql":">=15.1.0"},"devDependencies":{"@giraphql/core":"^2.6.0","@giraphql/plugin-relay":"^2.3.0","apollo-server":"^2.22.2","dataloader":"^2.0.0","graphql-tag":"^2.11.0"},"gitHead":"987b78e9195d1cbfc4c6f31e6b7f37cf8f869bb2","_id":"@giraphql/plugin-dataloader@2.2.3","_nodeVersion":"15.14.0","_npmVersion":"lerna/4.0.0/node@v15.14.0+x64 (darwin)","dist":{"integrity":"sha512-kPo3OuFw/kZNE/oFqO7ujyZWcdsoWRrHDKjMtRyCKObk9JT6riU0XSQzL5S6xVBDrt4h2UKjeLrd37yc8lMCPA==","shasum":"144b2ef966a12fd0034d47b6294f100233089f20","tarball":"https://registry.npmjs.org/@giraphql/plugin-dataloader/-/plugin-dataloader-2.2.3.tgz","fileCount":68,"unpackedSize":297374,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJgsEsMCRA9TVsSAnZWagAACx4P+wZwT4hgfzZ8LMpPEszb\nKgVYNQ8D1079jOODdVIxgNUKDti5a+MtlqNuw1yhC31x89g+YgmZ7hIU8edN\nlbe5cUZyecFy1JQXWQzrtvsaFyXTAvpOZYbK5TSpXPT3ZqCkGKunCoMEqggu\nIb9z7SMyWOW2PFjCRLVBpYFNnqw0Sjh250SpOzYDzlSfNjVWc7L2DUMjT4Tc\n6aWThSkc6l957/yWM/oEAghztv75Pw9AYe3YsfeKZYmLUS71H2ps2UPkJMkO\nCBRl5VG2l5b0p610j+QZepZ3h4cd7AsMTvEd1qYTtcguBegy28/9BzVLmh+Y\n/BPFFfGtUKQxZyCkwKaFqkjlbHhF/ymB7KCyBLQREuHHVoJWitw81jlkm3a7\nAIPH7NL+Oc8aBzv6ozXmC36dtuDBQ5MAlPN2GeLkaEfEaH9n6AlS6gT/zHvK\na/iKQbcGZsl6k0kcbyO42ht+G+gis0AS1/g0LxnYEGmkV5vCVwtZ1n62yLCY\n9eAJrYd8A+c1M1Ut1VIpjK7tD/cjE/B/YakJ/yi+f2Eqm5+1SvsOl0/Yn8Gh\n1JGOw6yA2B9MlPSzLAs1qAgBZCHfYmOJidwhKOlodsvs5rGB7U/91MCSDtov\nn4d26X7YQtNXTPBAVnW9GrX6bemkelajKvPpPuhLHICzU19Ruy7J9PEyGmH+\nINMX\r\n=rjKX\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCH3ft/VH3G2VGCpjffIQ57nJQDG5vDhaWl7P4XkfnsAQIgFg7JDsSuerExcSB7dqrY3dIWNJmdLLKaZuAXSYNZHiY="}]},"_npmUser":{"name":"hayes","email":"michael@hayes.io"},"directories":{},"maintainers":[{"name":"hayes","email":"michael@hayes.io"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/plugin-dataloader_2.2.3_1622166284017_0.27113936628765156"},"_hasShrinkwrap":false},"2.2.4-alpha.0":{"name":"@giraphql/plugin-dataloader","version":"2.2.4-alpha.0","description":"A GiraphQL plugin for attaching dataloader to object types","main":"./lib/index.js","module":"./esm/index.js","scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"author":{"name":"Michael Hayes"},"license":"ISC","keywords":["giraphql","graphql","schema","typescript","dataloader"],"publishConfig":{"access":"public"},"peerDependencies":{"dataloader":"2","graphql":">=15.1.0"},"devDependencies":{"@giraphql/core":"^2.6.0","@giraphql/plugin-relay":"^2.4.0-alpha.0","apollo-server":"^2.22.2","dataloader":"^2.0.0","graphql-tag":"^2.11.0"},"gitHead":"31e6cc2c8c6df723e7a246058d32356ca065247e","_id":"@giraphql/plugin-dataloader@2.2.4-alpha.0","_nodeVersion":"15.14.0","_npmVersion":"lerna/4.0.0/node@v15.14.0+x64 (darwin)","dist":{"integrity":"sha512-7QYLI6bUTygTr2Ma8gU4DVPr9oK17f+dy86XdmQ0QX8YFnCZPzVvjtmL/aGxV50XTfdIPkMNzuCWUOnimfcBkA==","shasum":"baf1db54fc8f1c237425f21aee9b55d9ff012427","tarball":"https://registry.npmjs.org/@giraphql/plugin-dataloader/-/plugin-dataloader-2.2.4-alpha.0.tgz","fileCount":68,"unpackedSize":297495,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJgseNYCRA9TVsSAnZWagAA9GgP/3+0kjqqWLaIM5DW4jTf\ncp3PXAaUKT5xP4DhigPXbA2yNOEIWUun9qm/C0MM0tES6MZ1AMrc0BZsCgKG\n4QEtE9zdtqCZKreV2GX0Zrwqs0LVBiEQVJt6wxh/cN6/rWzmSApx0gwf2m34\nl+m1C1Y3qjh4FwuLm2L8brQk9+l4RytIDIzQcODkgsyhBdKV2A2upEySNS08\nJLEE7t/zSrCofyQTFC1vmBwLKrhjKBgHCoSTC4ubJ0e5s9/z5vJIQzFiAjgm\n02VkZnt96+d1vSifEWHWpcPmzNqIUU2hUsfTBlIrsBfE6okGuG/5+1q8yOu2\nYkQMapa0TDT+lfRb562AXmeeqIP46Trna7dfh4jC/aYnx98C4zzQAw+YNqOI\nmbcLCeImjw0laQRdETDfoc7dB60e/o3txifa8HUw71PL8oAgoV/JOPShWlTU\npOS3EigOHaFRQcCKmtl4rPo6twlZD5cE8MpsW6ka/OyDJrEyg5QHUkz5IiWW\nNNMW/FLURam0DjTsdcw8n1OYR/Vg7j+vlJhOLacAO50VMOvGdmNbi7uLiTST\nzlLqnK1eYXQBmU4ySNaF8ZGh5xRiNgmJSJR1tMkKthNZIc5oORgN0DZ1p1ga\nOJ7ZuguRiFqZAJibI++cismwETLHYFKfckHJVbxc8DN4obBvGzaIIC2ul4XY\nGNuw\r\n=B2uU\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDIZ5knhCVqn0s61+8EH9iqj/++6mb+SKbnwpKgDBB6aAIgRHW51Mz/7i6wixo1q6tOr4jB7aWU9qh+qUKmjUTCFQ8="}]},"_npmUser":{"name":"hayes","email":"michael@hayes.io"},"directories":{},"maintainers":[{"name":"hayes","email":"michael@hayes.io"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/plugin-dataloader_2.2.4-alpha.0_1622270807967_0.33856903208575484"},"_hasShrinkwrap":false},"2.2.4-alpha.1":{"name":"@giraphql/plugin-dataloader","version":"2.2.4-alpha.1","description":"A GiraphQL plugin for attaching dataloader to object types","main":"./lib/index.js","module":"./esm/index.js","scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"author":{"name":"Michael Hayes"},"license":"ISC","keywords":["giraphql","graphql","schema","typescript","dataloader"],"publishConfig":{"access":"public"},"peerDependencies":{"dataloader":"2","graphql":">=15.1.0"},"devDependencies":{"@giraphql/core":"^2.6.0","@giraphql/plugin-relay":"^2.4.0-alpha.1","apollo-server":"^2.22.2","dataloader":"^2.0.0","graphql-tag":"^2.11.0"},"gitHead":"c1ffb541ae8f1b71ef389abf29e6b5413b01d58f","_id":"@giraphql/plugin-dataloader@2.2.4-alpha.1","_nodeVersion":"15.14.0","_npmVersion":"lerna/4.0.0/node@v15.14.0+x64 (darwin)","dist":{"integrity":"sha512-KLukfNy/hUl/8cMs7dmiEikobBYFa+tUxYLCgKwK3Ke11vOnsWtp5Dqf5SQN1Sx2K7b8Z4q3R8Qf9KNQnrZHZw==","shasum":"c0e1593eeb087a3e025f020a32efaf8e12057fee","tarball":"https://registry.npmjs.org/@giraphql/plugin-dataloader/-/plugin-dataloader-2.2.4-alpha.1.tgz","fileCount":68,"unpackedSize":297600,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJgseUiCRA9TVsSAnZWagAAspEQAJ7XFpobRiaLMCJzaf4f\novh8AoSAfy2bxkC4wCBmKCv6E5v72/BRMj+XApXnbbMb/hecXYY3ivyhL3eP\n5qhq2VZaS9nyE1Ijqt9l/j+2oi9+oEJkKQk1BxGJdcbJuVBxJTDCQhp8h4d0\nDy6Orw8fC+mPfS4RZf/rrFNyyCZjCPtbsqBzBiCpmjsIYW5D3QbIe1x5QJLq\ndgENo/dFfpa0BIHgBBGomqHW63M2BHy6JuChFbk2DWd4mg1xDqFDSV9YnFNR\nUtW97uDQRQ/Fp8JdE4wj4SgQd7n3nRUR1/fiOBCV8505u73FdnJBZ80DDScS\n5JsEUEu1yTNzd2XuBdLtP8vnpNB6e/yVkMvfqL1BEx0NATIo3FfOweCn7LZ9\ni7RnyiahV380fbtLZcf0VMr2vQF0ewQAqxrlUH+rrLUYM7lTQvVH26H2S6b3\nXUemQ51JwPjvV+Hnw5bgdl4ptksuHHmuHZUHgWHDbl+oSOLDKzQS1yU20jh4\nqN/HCM38cVWO9OnnLm4c9r2nFK8EsoWyDqBD2DFV+fHDQTlFMcqdRy5J+4zk\nrStOusJS+LI0DV3dVh8kqmCbV802MPfdMJqrKUGnHmtbfrBZUkc3i/BOqHgn\nKoTgiQzXf6Jh75y0pZfxoBpFBRZ4C8p8RqjKXeZVNIZNBajAUOA5JuU3slhl\nM8Hx\r\n=4vCo\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDDrG9oVyLxhsrahz9KiaG+QxGNu6fu7OloU+d7wPwUIgIgd9LRIM0WNmKkOX+riB+C4VaPpIstg+io8IsWzeZ39zw="}]},"_npmUser":{"name":"hayes","email":"michael@hayes.io"},"directories":{},"maintainers":[{"name":"hayes","email":"michael@hayes.io"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/plugin-dataloader_2.2.4-alpha.1_1622271265801_0.3193200078455012"},"_hasShrinkwrap":false},"2.2.4-alpha.2":{"name":"@giraphql/plugin-dataloader","version":"2.2.4-alpha.2","description":"A GiraphQL plugin for attaching dataloader to object types","main":"./lib/index.js","module":"./esm/index.js","scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"author":{"name":"Michael Hayes"},"license":"ISC","keywords":["giraphql","graphql","schema","typescript","dataloader"],"publishConfig":{"access":"public"},"peerDependencies":{"dataloader":"2","graphql":">=15.1.0"},"devDependencies":{"@giraphql/core":"^2.6.0","@giraphql/plugin-relay":"^2.4.0-alpha.2","apollo-server":"^2.22.2","dataloader":"^2.0.0","graphql-tag":"^2.11.0"},"gitHead":"233b2092f4ef2b18e4005b367d2e1fea7c85e108","_id":"@giraphql/plugin-dataloader@2.2.4-alpha.2","_nodeVersion":"15.14.0","_npmVersion":"lerna/4.0.0/node@v15.14.0+x64 (darwin)","dist":{"integrity":"sha512-VnlZQONqUU8Dy/ldVK9DmmUtXsfaZhdJCLDWBPo4cOZt3HGfPKaGRkZQYyYDtIzwUK6u6PBk0IC0r3qC11f0dA==","shasum":"3fd65a2f23258585463e591578d28d4b1d6dd406","tarball":"https://registry.npmjs.org/@giraphql/plugin-dataloader/-/plugin-dataloader-2.2.4-alpha.2.tgz","fileCount":68,"unpackedSize":297705,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJgssMzCRA9TVsSAnZWagAA5rAP/0Nf4qSzh5XhUxlFgY5O\nuaNAS9KicMc3u9ORJ94pTE5jBMbWOOn3JMzWc1aDqzSiiUJpHog41868oePE\nZ9BLLZPQ2DRNbegJLGoVoZEWJ6mb2HlhVbNdqTOYY91GLreOPjOzKmwlxCvY\nhXfGNBfF3wyWYGzvt8s0ZlBH0HSSHmD8z0WBmHdxx4Y86CS3hHVtwVu2wA2w\nvEfvoBU2HnS3i4eCcF2mqjS+7gYp3ocJBC/Xcfrx4guN6PN+hYhtGd7rPlAY\nrWGO9Lb1BE4XpzdYRdZ5FgFGpeR81y3aMlZYk/m77iwHD0utiq0iDVPsasZm\nrhrzmmSkbsfljgsqQjk+VeGqtupNgHg2uRKputRihC2xKKOXsIivjByEwuLR\ng0D351An2KkWVAdbibHsGR7Jh/YAy20bv3NjnnROF4222FVKHy+4Ny3yy29w\nt4MiKLa8/P/husapKAl+dgVodhwbgrPDUfT08hBpolmGXgBIADS8kLd4ifWO\ncztnaReXkGcd3l172Bc5yW9Qg2vLtOkY8wrN7EqAE351k5JoBIamiVOvnY2y\ncxBscucK0MY0l3q+BWTdWPJzHA6mIe8adTKb/aVjbyO6ZhuOVaQh90oQJYfz\nc8N3cvINx8Xnby7jsNGnPYFHjdlkz+igUQGY2DBDj+wKdkH/7IK2xOV/AfRs\nUv5K\r\n=pHi9\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIBZ5+UzGdc/yqwszLrBBLzGhjfJXFA3ecDS7gFqy/HHsAiA8cCIeazfKpLdtEr04M2m1xLoPvaHQm1VtalJlvFwxUg=="}]},"_npmUser":{"name":"hayes","email":"michael@hayes.io"},"directories":{},"maintainers":[{"name":"hayes","email":"michael@hayes.io"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/plugin-dataloader_2.2.4-alpha.2_1622328115395_0.28465062153997356"},"_hasShrinkwrap":false},"2.2.4":{"name":"@giraphql/plugin-dataloader","version":"2.2.4","description":"A GiraphQL plugin for attaching dataloader to object types","main":"./lib/index.js","module":"./esm/index.js","scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"author":{"name":"Michael Hayes"},"license":"ISC","keywords":["giraphql","graphql","schema","typescript","dataloader"],"publishConfig":{"access":"public"},"peerDependencies":{"dataloader":"2","graphql":">=15.1.0"},"devDependencies":{"@giraphql/core":"^2.6.0","@giraphql/plugin-relay":"^2.4.0","apollo-server":"^2.22.2","dataloader":"^2.0.0","graphql-tag":"^2.11.0"},"gitHead":"f5d851ea7794d399e0afa571c1a1b30f604e1ac3","_id":"@giraphql/plugin-dataloader@2.2.4","_nodeVersion":"15.14.0","_npmVersion":"lerna/4.0.0/node@v15.14.0+x64 (darwin)","dist":{"integrity":"sha512-EcsxR79bnw8ADbqn3h47gDrFFw3b6lazFhK2H8NQAjt5NH4ONZSC3Kx4QIK5e6XiutBTH7Oo/rtN4Eqt9bFFFQ==","shasum":"b3db559ab978bca16a710619cc2250c8bc2ee122","tarball":"https://registry.npmjs.org/@giraphql/plugin-dataloader/-/plugin-dataloader-2.2.4.tgz","fileCount":68,"unpackedSize":300127,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJgtIlVCRA9TVsSAnZWagAA38wP/iFiUvHvs2pZtKDQwrGT\ny+F54KvOGeDDDe1hzjAuKjESgLiYdamW2iExwiW2Jn59e86BHSbVwhPEybiU\nG48C8b5QJcYN0EYY47PqP1NZ5EhHjkoL1yxSgs50qBH2GPfQ0JMFAYhXQCMd\nCwCH2iUrrWYycFjQ1eddlJbQqVKdPpYbTgF6sHyza3Os6u2cRZWgroeImEGM\nmUWTkZvzFHV69I0wjkDY5d9RHC61S4HSGB3GUMFwQTM5ElBbGX6olTQZFJlO\ntiZo+a/9tRvXeUZdXnBINiHTnVSNGpFcNqx1iYWN9MWOpBcNgVkb7RQ4deWN\nDfRlDZTw8GuYmqjNqAv0UAe9zIqvw6OJRv+kxVjyqPElKuEqto2H1+jGYqaR\nbm6MaMVj/+sry7tzaRsADUWnYx6VUCNjB3XNniFr0ZK5IPWmsEC9uGxW7zHD\nasv89rNFszi2F7cQmgQspy49cZmFynXFDZHIxpW5Sty+QfEKdjvFbDDZV4Z2\nBiC0I6M24FVCAVc08o5AwFu8+e7rMEX3qXBNZVZrXJIRbgr4iyKOlb8d6g2n\nRbO/CPLh8WrVzpp8ReJi9i7AS1+yR2Dw9zGcOBjE93+GQH1dvtXvOGI+AVIW\nKv7Wfo6xeSmhIny8jyqPgl9tA7nF6Fk2AErKl3nfY074rgr7T9MECdUrbeFd\nD2qt\r\n=+VwU\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIGhqYm0JgtR2A6HL1t0dS4w4YKNSj62Ts/OriLHzaE6zAiBnCMNlSicQZa8yXIwfs9yfrxCg9WUdZDjc5lENF7aZww=="}]},"_npmUser":{"name":"hayes","email":"michael@hayes.io"},"directories":{},"maintainers":[{"name":"hayes","email":"michael@hayes.io"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/plugin-dataloader_2.2.4_1622444373370_0.5703034375994025"},"_hasShrinkwrap":false},"2.3.0-alpha.0":{"name":"@giraphql/plugin-dataloader","version":"2.3.0-alpha.0","description":"A GiraphQL plugin for attaching dataloader to object types","main":"./lib/index.js","module":"./esm/index.js","scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"author":{"name":"Michael Hayes"},"license":"ISC","keywords":["giraphql","graphql","schema","typescript","dataloader"],"publishConfig":{"access":"public"},"peerDependencies":{"dataloader":"2","graphql":">=15.1.0"},"devDependencies":{"@giraphql/core":"^2.7.0-alpha.0","@giraphql/plugin-relay":"^2.5.0-alpha.0","apollo-server":"^2.22.2","dataloader":"^2.0.0","graphql-tag":"^2.11.0"},"gitHead":"3abf8003277f8ae7f13ab018ffe896ea1a8dd7e8","_id":"@giraphql/plugin-dataloader@2.3.0-alpha.0","_nodeVersion":"15.14.0","_npmVersion":"lerna/4.0.0/node@v15.14.0+x64 (darwin)","dist":{"integrity":"sha512-ehUtef1QB9I59lclEu/91eA5hiNF3azlBoOCYiEQR8E0g1Sq7+2hG8vuGewvDtabd3LbJBYRiXWngLtSI1OaYQ==","shasum":"edcea35a412852f212c4a80ef751eb13c7cfda2e","tarball":"https://registry.npmjs.org/@giraphql/plugin-dataloader/-/plugin-dataloader-2.3.0-alpha.0.tgz","fileCount":68,"unpackedSize":300225,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJgwSBXCRA9TVsSAnZWagAANy8P/RFM0KFlmbhdCVvppHza\nl+gZXLOXsnzlA0RqLK2IgUoFqAKxzLpZYz071DDQtFFl2JpFQieNQh8jNvwv\nhX13gJxhWlH4fdDnxbzU/xPQ6WudqYmfN9+UzO4R2KrJHQi2waFu3cjmlviO\nqECkp8j/68TLyEmkxCgK92WUGIs0uMF2h+VfYmLQQP7Zv95Wlv6QSoZ5fmV4\nxJuW+o7dTpRjhBUX7FlvBgsIdjkGg5FPAj5zNx8rwCyx9VapWf8DexzdB5bm\np4mNTrftcyRzeyi2aqPUgimm10hY2SFv8FiiSRd0deZkFHH/Tw9fl1+fMh4g\nlSlC/QJrr/a6rMfuGoLKu1SeNeEiq0GhCZPLqyDklAWYpl42MJY+/Xv6m9Oz\nkw7j9V75SBb913yAOoQNS3VfMT7QzY1fXtT0mnzOlVg4o2NJh0ShZ9jD3IYz\nhtBIC985xG55JAkUisTyw+60mIfPRrUViz1uWGgDSrpxR8JLR5PT29CAO8pP\nufoOijWkB0ocWENHeDpfYF9TX7wh2WiBvOaZQ1MKQE/rO51Hr1lGETrloa5f\n0Krv8jl5nEYgELDwS0XcDN3AEJ75Q7fgKWqu59sFYK3Gz04EN3ogNQD6GPqW\ntVvj56ld8zC0zSKZcOXIner/xgJ5cL5ejOU7qOHypceYAsu6Kc+FIDyRUS0J\neww4\r\n=Fzn5\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCfRkLd5lUNEWBZPvihB/F5zKhIWScslYv7tmBTXZ+gXgIgHiWJHKJyGe3acs0OUEMC14tiYNMyHJco8coyQ7Wb7nY="}]},"_npmUser":{"name":"hayes","email":"michael@hayes.io"},"directories":{},"maintainers":[{"name":"hayes","email":"michael@hayes.io"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/plugin-dataloader_2.3.0-alpha.0_1623269463275_0.48416957718888765"},"_hasShrinkwrap":false},"2.3.0":{"name":"@giraphql/plugin-dataloader","version":"2.3.0","description":"A GiraphQL plugin for attaching dataloader to object types","main":"./lib/index.js","module":"./esm/index.js","scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"author":{"name":"Michael Hayes"},"license":"ISC","keywords":["giraphql","graphql","schema","typescript","dataloader"],"publishConfig":{"access":"public"},"peerDependencies":{"dataloader":"2","graphql":">=15.1.0"},"devDependencies":{"@giraphql/core":"^2.7.0","@giraphql/plugin-relay":"^2.5.0","apollo-server":"^2.22.2","dataloader":"^2.0.0","graphql-tag":"^2.11.0"},"gitHead":"ebc9e62b7a38089be3a46e83683f89d187d9649d","_id":"@giraphql/plugin-dataloader@2.3.0","_nodeVersion":"15.14.0","_npmVersion":"lerna/4.0.0/node@v15.14.0+x64 (darwin)","dist":{"integrity":"sha512-g6EZv9CFY+/pNvN9aBh57UxNd9xUhC0Uqn/FQtyAchmZoAxqheIu9cLEeECrQN0k67W9g6QMJX55SYr0ZW7xFA==","shasum":"d774ac730adb772a4996af398b391ba9414ed35d","tarball":"https://registry.npmjs.org/@giraphql/plugin-dataloader/-/plugin-dataloader-2.3.0.tgz","fileCount":68,"unpackedSize":300298,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJgwWMaCRA9TVsSAnZWagAAFycP/RoweWXpzr0v8YXJTieg\n0CByKZ8bBkIU0muyBWW7brmk9zwWZsPMNOIvgk3Jlq4sVwbWyMyO56J+iZsx\nTzPWFTlk1/l2CIaGtmghBw/YSKZPDoxw8Wf0q1B/3/0dRNIXaphhLNpakM7E\npevpwZLUKVIEyyQoABshT++coFaV/tfKhMzOcALEaMBsY+1aXVw3P6IPIWzS\nsPvKPkCj1ZbC08Fnu3Kal40MIsvzJ9MkZdOFY3gF7P3qYEeKyp3GBYHLyVXA\n7yqa+5T5daJJosv7X+siJ2jScfUdQefUIx3Vpy+sE3tXdXjnD+ivcW/AXEGN\nJI/x1Bm6dWzDe8kOdbEbwt9nb7py8E+bz6apwrnIW2qB0oHBP/U6S7ayKtDX\n08acg40vo6PelBYX8XXfoz1Nv1e14StEr/BaP0QAvgoPRrKeQi+D+OE4ztHD\naEywqo6CpozqFpHiGn2989EK1DPYJnxru9rVyO3joRIb7+06qecvpfD8GYms\nY0IkwyVZa7s1faqVDtb0sfjtZbP4ppPCyUZVHTzHD6fzY2x28ni44efWPouh\nZfGamTfGDkcRO16XpbttuX6FbwG97eBZk+3RenTjJVzAo+Hv/dmgwKvmZ/5s\nUszbO13T4Ow5gf1nI/BVgVGvf24GCMqMsxz2E/GKbwNCQ8InfOsmk4hShuwY\n65Js\r\n=ugB2\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIHpSjiTQB6IgaqERjD0VOUYe4yPN7yN8OchdbzPSscIVAiEA6Ql/QdWBr9ruj0uQ4KnOVUDpRD0DwEr9k+D/Lsj5Ctk="}]},"_npmUser":{"name":"hayes","email":"michael@hayes.io"},"directories":{},"maintainers":[{"name":"hayes","email":"michael@hayes.io"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/plugin-dataloader_2.3.0_1623286554649_0.5549958181595636"},"_hasShrinkwrap":false},"2.4.0":{"name":"@giraphql/plugin-dataloader","version":"2.4.0","description":"A GiraphQL plugin for attaching dataloader to object types","main":"./lib/index.js","module":"./esm/index.js","scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"author":{"name":"Michael Hayes"},"license":"ISC","keywords":["giraphql","graphql","schema","typescript","dataloader"],"publishConfig":{"access":"public"},"peerDependencies":{"dataloader":"2","graphql":">=15.1.0"},"devDependencies":{"@giraphql/core":"^2.8.0","@giraphql/plugin-relay":"^2.6.0","apollo-server":"^2.25.0","dataloader":"^2.0.0","graphql-tag":"^2.11.0"},"gitHead":"3a064a83c75af2fac8d499356fda26dfe6a9fd20","_id":"@giraphql/plugin-dataloader@2.4.0","_nodeVersion":"15.14.0","_npmVersion":"lerna/4.0.0/node@v15.14.0+x64 (darwin)","dist":{"integrity":"sha512-5ZBcRbGfjOA6X/zVKvcKX0+05eRa+oYloW4Pjs6icfXl6YS4OQjlwjwRAsXzxQuAocmT/lFnohJNWYHQ0WPy4A==","shasum":"8f44c3eefd8d44075837fd4c6e5dcb12f48b0039","tarball":"https://registry.npmjs.org/@giraphql/plugin-dataloader/-/plugin-dataloader-2.4.0.tgz","fileCount":68,"unpackedSize":297273,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJgww86CRA9TVsSAnZWagAA1AIP/ie3zPe0VzUWNUambQ91\n4a6W1/4Grphckoj3rsx5svd8gx98M70sTmLP0rEj5oufJqynnkeRFUEjaBVV\natS/n+wh8Ibz0j4kVFV3y5U0FKOmCszJbGiAV5X8DN2ZvjN58IHHB0A6Hjw0\nz42cwEulWBcYGrwOXD0oYRhGVssbA9B3k40ZuJby0xZG7LIt+WQUJYp+5U4v\naDDyWGmWRmrOX6PLNuuhSWdCdXy01rLHsBUylgEJW97opYRGk8bxKQooqDal\n/A3+qmP5gtYB1Bxtx0PtqB9O4WcsVjgARkyAUG9I8SRuMhxZAeCqh7wWWYpX\nMX/GYSbov6GHDO3+4OTQMybpuBswObwZbNFdhtkBRUHIEHMrgICwjn1oyYRH\nF6nvovuBhyz38VSSg/OHqCF/yobXYxEpxIwkcq65OBcxw+CIBuEHXeDxURuy\nYMXij8ZvrnolqFpmuht+jtleWAq6n6zYnF8hSThNucwR7k9puxzzih1E/IeR\nzE/3Hpc2tiND08BYY1jQmPSuvf2c42QTDCwVdh/CeV/G6iFB1NukoudZGOrf\nAYdrUBaKi5medxcLJR9tK+bodSxfyDruVRQ8WAOw8GNTCdM8AnobYew96J6h\nR5KyYn5sUNGZAfv0pf+im29nsZrY2JWFmVKhLp2apDu8E4eucG+1vbHKp1tu\n3abm\r\n=7GCX\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDXRCkUHrvWDiDGydFeBUboVmvTM1NYq7xv2yYOOwIsJwIhAP8MZUIfUEPiwBQbGQSlGr5eyJ33RZgRya2u0irhz76G"}]},"_npmUser":{"name":"hayes","email":"michael@hayes.io"},"directories":{},"maintainers":[{"name":"hayes","email":"michael@hayes.io"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/plugin-dataloader_2.4.0_1623396153931_0.367781712307756"},"_hasShrinkwrap":false},"2.5.0-alpha.0":{"name":"@giraphql/plugin-dataloader","version":"2.5.0-alpha.0","description":"A GiraphQL plugin for attaching dataloader to object types","main":"./lib/index.js","module":"./esm/index.js","scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"author":{"name":"Michael Hayes"},"license":"ISC","keywords":["giraphql","graphql","schema","typescript","dataloader"],"publishConfig":{"access":"public"},"peerDependencies":{"dataloader":"2","graphql":">=15.1.0"},"devDependencies":{"@giraphql/core":"^2.9.0-alpha.0","@giraphql/plugin-relay":"^2.7.0-alpha.0","apollo-server":"^2.25.2","dataloader":"^2.0.0","graphql-tag":"^2.12.5"},"gitHead":"b93f5e4f5541062c8edde4b82852af5e54f91e16","_id":"@giraphql/plugin-dataloader@2.5.0-alpha.0","_nodeVersion":"15.14.0","_npmVersion":"lerna/4.0.0/node@v15.14.0+x64 (darwin)","dist":{"integrity":"sha512-sf9jL5130+UhspKB6t7RlxG8zm7vhVKZPdo87XtRZwc3yHaN5bH4/gvR+s1bpOgvOVIlRsnr0WgDiwnhkBJfxQ==","shasum":"e2c922b252e3a92b2c63821276b8eb980b466485","tarball":"https://registry.npmjs.org/@giraphql/plugin-dataloader/-/plugin-dataloader-2.5.0-alpha.0.tgz","fileCount":68,"unpackedSize":297910,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJg2SIdCRA9TVsSAnZWagAAOIgP/023zxOIINlkZ3HHhnWL\nWsYDOxZ/vQT1LzpnPJrRr5TgkTSdym2lIduiZiSHChHtweEHyOOsKV0tPBvE\nb8VNPf9wbPcPIjxYZ0h14a2YpHVHMUzUU5xBfH1uqRRVQyhFuazQgvCWufep\nnB5P90dX99pN82AnctpqF30aC3qt006mnOaKOBhz7BGHf0kATOK65kjYhtiw\nqlqdM4XsTAoHxKIxrYnVHcJh2C+aRI3qT+TVEm+nvmAGtsE6GElXCoh5o2cF\nfUhn/0zOaHel0+jbtTisbcid9k/hA1oh5od+8BK+1AsmCqRnygLZ8HVrkK1+\nIzFiEzrbHih9HQznu/T3fEAZirzClXcQ+HAlA6ynS4tBM/NGBy+AAvSFsLar\nyJCV0ughfENBPtH6t922IRL6Km8hoNLYtrjLF/SE2ALWzsE2Iub2SYNSZJ+f\nh7LC2Fge926+lQ44zMWCyvtWx3jUF4xdM0tBbQpb+k42Muq6X4eXM/Ka+hbb\nFRvqSiP9GhWNTNsOVI1EaksvvUpGWJyCxhi9MUnkapDgYYdeQHqZvU6fBhUJ\nWz1+z9Nalg9stv2Li124RuK1HOaEBlKbJPBkSS60NFAIIxDiMesn8Jh/x+oi\nl9Put27Oja/4TINwPfESpuOLWfntF9SHCcRd+rMOG/zI+yjejG9gHaPQnT51\nR52D\r\n=CJrr\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCeyie6kcok4QiCkLn/+paqIVZ+NDzLbBTCYdk/bw2IcgIgeM7Ya98qUJZYdvOM0fbsydBeARpXKBTv+c7OCyLQ6Vo="}]},"_npmUser":{"name":"hayes","email":"michael@hayes.io"},"directories":{},"maintainers":[{"name":"hayes","email":"michael@hayes.io"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/plugin-dataloader_2.5.0-alpha.0_1624842781411_0.8368765371137976"},"_hasShrinkwrap":false},"2.5.0-alpha.1":{"name":"@giraphql/plugin-dataloader","version":"2.5.0-alpha.1","description":"A GiraphQL plugin for attaching dataloader to object types","main":"./lib/index.js","module":"./esm/index.js","scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"author":{"name":"Michael Hayes"},"license":"ISC","keywords":["giraphql","graphql","schema","typescript","dataloader"],"publishConfig":{"access":"public"},"peerDependencies":{"dataloader":"2","graphql":">=15.1.0"},"devDependencies":{"@giraphql/core":"^2.9.0-alpha.1","@giraphql/plugin-relay":"^2.7.0-alpha.1","apollo-server":"^2.25.2","dataloader":"^2.0.0","graphql-tag":"^2.12.5"},"gitHead":"042e0b1b98acbe84f4761f028eefd25d178bf736","_id":"@giraphql/plugin-dataloader@2.5.0-alpha.1","_nodeVersion":"15.14.0","_npmVersion":"lerna/4.0.0/node@v15.14.0+x64 (darwin)","dist":{"integrity":"sha512-dR0xKGjXLmBhiyDMjr405rYsYjrwnMOfruJsunFKmisUSfrWhJop33mdVaH1kg7VsLJePqoscVQP5QyVeuKY3w==","shasum":"bde06034cfa8e50647fd7267710f368c13397cd5","tarball":"https://registry.npmjs.org/@giraphql/plugin-dataloader/-/plugin-dataloader-2.5.0-alpha.1.tgz","fileCount":68,"unpackedSize":298015,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJg2hFzCRA9TVsSAnZWagAA6MgQAI4P/s09bcQK2B7KU4fh\nK7tfirHz19K3Vw1NDZyTFBIJbEblgyjKoAOEIGWiSjKj16CKE1ydm7yW9Bbd\n8DAs/FHqY9OxXeB3ugiZWAqeORIgPbOK7nqAW3lO4QbCrBixtdiVghCHQZvt\nLLuRrZRzT5iRE1Lvn94vSTYSYS6Ixp38eRVNurHLuZYH/8l+FzUpBMSnP/tc\nngYRyBzHaMuAzpQzNgdpbfoNHUzksLmoGbCh0YJn2CaEI4Oldx1QWwAEkKW6\niclgfpeyAVf/Rks0f1QgZtA15hTug/ZCi+TAmZSU2VQPUIVZUtc7RlsGKL9d\nUE95TUsYnJ2iIyZxFPdHxkUwmJkNZ2h3DorJXctcMfiEuuA8vYwadddu5OaE\nAQI7trrxl6FuMHKHBIxg8zVh9HBCuA2joPoQLRksVzmEkeZQG6kakdfM2uMt\nkecU/Ln/xoVVoIauqEUE+8IuaADATPz/dqA+zNS8M7e1ptakkRihinxZoWEG\n8tnB5UkA/7L9SBQbclfuI+mxjleF36VKqEmmrqDPIpO1yula6AhEZnORYnr5\nBDJ5OUilCXwOEdyNu3FQHjHm2rDgXgEdrSAsIq+Mh06SrFyCf/GLVTPvDn0T\nBQqUw6nGWYZndd7qqWwBrFMcTdUuU0OfhW4f/n0VzRmr9N5WhKA+eqeMen0s\npZxl\r\n=4FCg\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIEBp2LeRNQW5ENhOpBeleLHFH8sqxZm2t2hZwyO4qRXiAiEAyWtDQ57nIqReq3QMKm3YPoI8iF0dVhVh0dNzZgNLRFE="}]},"_npmUser":{"name":"hayes","email":"michael@hayes.io"},"directories":{},"maintainers":[{"name":"hayes","email":"michael@hayes.io"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/plugin-dataloader_2.5.0-alpha.1_1624904051356_0.041042881006776444"},"_hasShrinkwrap":false},"2.5.0":{"name":"@giraphql/plugin-dataloader","version":"2.5.0","description":"A GiraphQL plugin for attaching dataloader to object types","main":"./lib/index.js","module":"./esm/index.js","scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"author":{"name":"Michael Hayes"},"license":"ISC","keywords":["giraphql","graphql","schema","typescript","dataloader"],"publishConfig":{"access":"public"},"peerDependencies":{"dataloader":"2","graphql":">=15.1.0"},"devDependencies":{"@giraphql/core":"^2.9.0","@giraphql/plugin-relay":"^2.7.0","apollo-server":"^2.25.2","dataloader":"^2.0.0","graphql-tag":"^2.12.5"},"gitHead":"2b03d2b65225d9c6662e41aa859729343ea24c78","_id":"@giraphql/plugin-dataloader@2.5.0","_nodeVersion":"15.14.0","_npmVersion":"lerna/4.0.0/node@v15.14.0+x64 (darwin)","dist":{"integrity":"sha512-DCh100uEUby3cvyH8317LfX5N0RNakpQsCNMUSbg5cQRo1fwE0R2OTjg/R28ssoMPwl1v90DATuirxaLLomw9w==","shasum":"05acc42e37f72c573ba8b3201487dee2819cbd31","tarball":"https://registry.npmjs.org/@giraphql/plugin-dataloader/-/plugin-dataloader-2.5.0.tgz","fileCount":68,"unpackedSize":298088,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJg2hTUCRA9TVsSAnZWagAA1sEQAJymnTjXbP50t4v8poBX\nQdFjv/8FuZ0JKOGJuYUaS+Kau2rjudSiwossBChFjOccZb/OWTpI6Bf7rLg4\nbK1xCxA7Jdi6JPu/mqpEhtuIlCgO2dlObKPV7J3TCNQuafBhcHbHnqAcv7uR\nX5vwmU8GnlA3oR3du88hfca3xCYYY82ZBeeSABgv67ZX/D8Imz/GnerkAwTi\nFEvrAAQeLM1bHs9zDBBbF2RWr78NmlC5G0r+7Kbuh+GdIJtqOEIhMUcozxD8\nbh2YOE7zua9qUIPvfe8ZKDpuBr8nJM82OU3CqRT/SsZx3R8imHylgwBbN06r\nbzjqo2mkdegKla9VcdEPlcqX7q00IsWK9Ir1eR/vbYuNhjT5MMOJcx12RRa5\nrLTXLH3SOgczWGgiPOPesiMk9wlu3BLbcxYiu6QHE5ut1M/ziYHzFUYbY+kL\ndC+pDUwdRBBAVY6y7xXlaB0U9Hgbh4LOs+3O4v4PhaQex19X3AtV/7b19PWv\nxsVut3+lka1AZGx1pGK8wPxoldeIZ7k8v2gBe86Nb1RUUh7MA35KqILALafR\nmBltfcWnYa33AUPB3gZh85nEf5/2fl/rf1YO4KoU23hp9Nft3FXFOOMbrCVl\nD6oQaNZG4o9+TTid6gkbqg0RoOUw7w73omV2/TgTQhF775nFeS9GD1Z0YvSO\nHhsn\r\n=8hAW\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCICRAle5hkoIpHHC9206lAFCimCQ/3bucO/6LOZZ/euT5AiEAyuREB0Ns8Ux3z12aBpWEMw4sQaGL6ijr3pOQmK3NxRQ="}]},"_npmUser":{"name":"hayes","email":"michael@hayes.io"},"directories":{},"maintainers":[{"name":"hayes","email":"michael@hayes.io"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/plugin-dataloader_2.5.0_1624904916325_0.7747580504415088"},"_hasShrinkwrap":false},"2.5.1":{"name":"@giraphql/plugin-dataloader","version":"2.5.1","description":"A GiraphQL plugin for attaching dataloader to object types","main":"./lib/index.js","module":"./esm/index.js","scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"author":{"name":"Michael Hayes"},"license":"ISC","keywords":["giraphql","graphql","schema","typescript","dataloader"],"publishConfig":{"access":"public"},"peerDependencies":{"dataloader":"2","graphql":">=15.1.0"},"devDependencies":{"@giraphql/core":"^2.9.0","@giraphql/plugin-relay":"^2.7.0","apollo-server":"^2.25.2","dataloader":"^2.0.0","graphql-tag":"^2.12.5"},"gitHead":"4885a275422769d45bf9bb28e97f8d37e6aee5aa","_id":"@giraphql/plugin-dataloader@2.5.1","_nodeVersion":"15.14.0","_npmVersion":"lerna/4.0.0/node@v15.14.0+x64 (darwin)","dist":{"integrity":"sha512-JV5lmz8e9emJ+rtzyAeVP6TR0K3Z+Db1neCYlPI9eDnO++hmXc0aI/bkMq0+F5pJd8tWcSEL69R+RSYIzmF8MA==","shasum":"fe9a83d7c3345e656ebcc8ed448cf3cc3eb6c840","tarball":"https://registry.npmjs.org/@giraphql/plugin-dataloader/-/plugin-dataloader-2.5.1.tgz","fileCount":68,"unpackedSize":298693,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJg2saZCRA9TVsSAnZWagAAeXUP/i2oAKa44I/SCrwqGpMn\nVyItU4xCt7kRGRdufnJoWw7dEl3CTjRMjGjpk5iBjP6qAi3mvW+cHCIsPCCy\nP8TYIEfjLd9xQKN4bP3JOLR1vOEgprjdmPhBJxQDr92cB5UoWMhj8KZ3Eoym\nWStCRXCjLjuHTOF0OhMsCYn8ASzAtUlZo+G5ULoqCSSwqi7+DILT9bEcqd29\nNFXM5DXBCFzzkiKLwg+YeU4+crkN62I6WxmVe0ZOuZpB6t4bmjI2Q0KEDAyX\nUSF8MDiC6JPYG7VGIQ5+Czeo9fRekOGL3t7OG848/CJI9z0kFkh4lLZT1gpu\nMU3pKwdUJPutGfPpaMe1DqxgELd8f64Wz7SIkd+ifbhKMvxKX1M5lgzoWTcb\nN+HJjbKv1QOElShujzadKE82wTJDMhsDwKL4/KYaqz9cxnMiiWzr4W34h0W7\nA9dh6/R/Z7/5UJXCzpHGG1i+vntGuFTiiBoxibnazEkD8kLA9V7sUar0qDcZ\njuyWhHkFM1dtEuuHgqjxtzHyc8lR3CzrM7liGErSeVXdTQexNwYKIirMbIui\n0dwZFIxcd7TBedKOWc0KRU7FBfNXUWP7EHTGi+2PJbsxtTZthbTaAWlkO4N6\nmueSHnOlfltsFNE6MZGFuu0kwbEcTgKHFu88vvaDChlxqigxpkPeKEcHvyjh\nQ2Z8\r\n=PxaU\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIBPeLJ8O9882cqqHrycyu8BffUdoEcp65BJ+vLVMpsLPAiEAgr30SfCKMsnpBZ0nZ6z6dxhrHjeyOrL85CTMC25dzQI="}]},"_npmUser":{"name":"hayes","email":"michael@hayes.io"},"directories":{},"maintainers":[{"name":"hayes","email":"michael@hayes.io"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/plugin-dataloader_2.5.1_1624950424460_0.43601563846012503"},"_hasShrinkwrap":false},"2.5.2":{"name":"@giraphql/plugin-dataloader","version":"2.5.2","description":"A GiraphQL plugin for attaching dataloader to object types","main":"./lib/index.js","module":"./esm/index.js","scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"author":{"name":"Michael Hayes"},"license":"ISC","keywords":["giraphql","graphql","schema","typescript","dataloader"],"publishConfig":{"access":"public"},"peerDependencies":{"dataloader":"2","graphql":">=15.1.0"},"devDependencies":{"@giraphql/core":"^2.9.0","@giraphql/plugin-relay":"^2.8.0","apollo-server":"^2.25.2","dataloader":"^2.0.0","graphql-tag":"^2.12.5"},"gitHead":"9cb5a53ea71297009ef96447de04bd7ceff64ce8","_id":"@giraphql/plugin-dataloader@2.5.2","_nodeVersion":"15.14.0","_npmVersion":"lerna/4.0.0/node@v15.14.0+x64 (darwin)","dist":{"integrity":"sha512-1Sxc1k1OBGplE6ZTFCwi3WWctaT0rya9LBBlZ6A14ubWl44SfqiPscQoDDCtvP/VylAT1fUrE0jo/Gh+b0xWHg==","shasum":"ea60e717c4d142e0a8342d23d465a75f59b19f31","tarball":"https://registry.npmjs.org/@giraphql/plugin-dataloader/-/plugin-dataloader-2.5.2.tgz","fileCount":68,"unpackedSize":298790,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJg31v3CRA9TVsSAnZWagAA8OAP/iiGmDK2CHLeKzYrsP7p\n1IDp1ydWO41jZbpSXGFekkfOT5NjH9oWVSD4FKM51wAurQBdCWDdVcn9lihB\naCbAHD2Tm5Aq5f+hwVGEVGhSJRuMYyGc//uHgXBP5dk0HVU+bLJK+GtiY4rp\naSrpkWW6bQon8kyP2HYFenmNkCD7DvsfjAASPPOInThlfCkJf8i87+7QNo3/\ncO3zUxrMeABJ7+qFFE3R+7G5eqIwS9yKRKlTtVHgCCRDxHJZ3jTUiCj0dlW9\n1ylx9O+0AHKbJ3oq1K1wxvjKYTXNpWPgLRO1/XvWkiNFWEb4mmqv0zcHteDn\nF84WjQC1KQ2pCaswdXu4n+hf9XCsV5Vmosxi2RpAtF07RST0WX9yBN/hixXq\njVvv2a6zk9zwaNd9A8+8UKqPic9yOjsRd5GVmVGPqAfU4WwX7Lwbuq6OEgW0\n/u3xwhppAwqjDcXQv1EOh/FmfLkw1cJc6lyj4W04oLrILCqMbvQcvWGCMCaR\nuNUN6UYSc9+t64nkVFF1kbyC+xF+4giGTHhGesD4NkfKd1OPw10JV3dpOvz6\n9OjxZOLsoMxWpba5BzkrycgxqZQcGk/VThiKdo/HbxaJalElhiAGq3tHyceg\n1s0xqT+PltnCL7IQzEVZHqUd7uuw/JJxYM2XeDytK+nWyw6AAT6Ly1F4Yli3\nUuvX\r\n=IHtP\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCXy75kbz+cHKfaXUEXNJpQsLqBXBLaa0ok/vecK3Q1EwIgWIW8TaFFnsSJ65FER5RWmUYxC2th1qddQrWvEVnkut8="}]},"_npmUser":{"name":"hayes","email":"michael@hayes.io"},"directories":{},"maintainers":[{"name":"hayes","email":"michael@hayes.io"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/plugin-dataloader_2.5.2_1625250806465_0.9157596542025994"},"_hasShrinkwrap":false},"2.5.3":{"name":"@giraphql/plugin-dataloader","version":"2.5.3","description":"A GiraphQL plugin for attaching dataloader to object types","main":"./lib/index.js","module":"./esm/index.js","scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"author":{"name":"Michael Hayes"},"license":"ISC","keywords":["giraphql","graphql","schema","typescript","dataloader"],"publishConfig":{"access":"public"},"peerDependencies":{"dataloader":"2","graphql":">=15.1.0"},"devDependencies":{"@giraphql/core":"^2.9.1","@giraphql/plugin-relay":"^2.8.1","apollo-server":"^2.25.2","dataloader":"^2.0.0","graphql-tag":"^2.12.5"},"gitHead":"1b71ada86ca1fc5b2cedd4cc24a6433ca19ecc54","_id":"@giraphql/plugin-dataloader@2.5.3","_nodeVersion":"15.14.0","_npmVersion":"lerna/4.0.0/node@v15.14.0+x64 (darwin)","dist":{"integrity":"sha512-lxY9sev2yerV/i57MmUANex3+Z/Zveyeo0zHPPCVcSbqpY5rtNOhJ4pxGOoDrkZcyAM59/e1jvL3+iR8Y567iw==","shasum":"c6989b113e429b3121f15dd45866cab1eaae8d86","tarball":"https://registry.npmjs.org/@giraphql/plugin-dataloader/-/plugin-dataloader-2.5.3.tgz","fileCount":68,"unpackedSize":298887,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJg33JXCRA9TVsSAnZWagAAeAUP/0t8RL04e2t6wGVF1+zX\nHo/6M4mNfI5JfZ8qj6TOvibkugcGKSvdKg+U5fGHVHOy1yVjaUi4o9JkPY04\nm9tSieREizVw4HQlxPDbZdEYsit6EIelk8EJZwpl0g5LzS6pUFAi6DOfjVgW\nduGbk058H+7L5hztB8g4Rwc0yuXiGN6TlSjX36c399WurSEbC6CZBzUC/WgM\nmue9uH/dxvBin5OOROQK0KTfkgyzgR7PEgSUyyzCqL50Tj3kZQkvhNhv6hEU\nejH1vVGst4gbYq0SEd2KybIrpo4Vw5bYBnF8z5/DItj8n4Bblr5IWWvg/6lp\nRO2HXzqPC6RmvYb1hgpa7L6uWwiQ6jLb2HiKOJqCKDrMWLaRb3Z7lrOf4OMK\nnj6Csh7oQO3TrmOl2uuhQLzpjJKmFbfp0pb67xnljKRgCXoA1RfO+PTXPYa7\nUyqk9fIpdegLVb8uJ+0tXJRmsbsN6RWQcvr8VBHaC6RWU/rBrP/Vvpa8zuYz\nchG2uD+pWgLkc3cirXd32OVy1TIspvTh3v9mKKr6RxddZukfoYnNOTXa1gPl\nL2MzNKp3KBL8LEzE2sN8GUK+xw9CEZRScg+HVyUKh3INCebavG3A3h/d5zVp\nVXdRw39/GwhZgupehPNVaUddRsHU/AuPPrBLxWfa631nwbSBLB4SNh4r9XKG\nfc2o\r\n=Y5qM\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCY5tMiYAacxNF2kfIA6TLOR/Oyj8DwZUtmThlzdAutHQIgBcV3OuvVKdJLegAL6n7p6q7Bfcx2FY3zpvq1V5yLhuM="}]},"_npmUser":{"name":"hayes","email":"michael@hayes.io"},"directories":{},"maintainers":[{"name":"hayes","email":"michael@hayes.io"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/plugin-dataloader_2.5.3_1625256535244_0.5076229508344716"},"_hasShrinkwrap":false},"2.5.4-alpha.0":{"name":"@giraphql/plugin-dataloader","version":"2.5.4-alpha.0","description":"A GiraphQL plugin for attaching dataloader to object types","main":"./lib/index.js","module":"./esm/index.js","scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"author":{"name":"Michael Hayes"},"license":"ISC","keywords":["giraphql","graphql","schema","typescript","dataloader"],"publishConfig":{"access":"public"},"peerDependencies":{"dataloader":"2","graphql":">=15.1.0"},"devDependencies":{"@giraphql/core":"^2.9.1","@giraphql/plugin-relay":"^2.9.0-alpha.0","apollo-server":"^2.25.2","dataloader":"^2.0.0","graphql-tag":"^2.12.5"},"gitHead":"52bc19d151afd5b495dc896098fa8b84c09cfc5d","_id":"@giraphql/plugin-dataloader@2.5.4-alpha.0","_nodeVersion":"15.14.0","_npmVersion":"lerna/4.0.0/node@v15.14.0+x64 (darwin)","dist":{"integrity":"sha512-IVAu1qslNLAcqLWlC+i0UtBombCwTi99ip6hVzgIW9z3+yBcPrBhZxOObOfaaUSEuZJRMNAjaUW1tr+tZajMUQ==","shasum":"80a164570896e21665f5cf374e285e80d8bea96b","tarball":"https://registry.npmjs.org/@giraphql/plugin-dataloader/-/plugin-dataloader-2.5.4-alpha.0.tgz","fileCount":68,"unpackedSize":299008,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJg37bhCRA9TVsSAnZWagAAbZsP/0WVOFXOZPjXYA8vdFTW\nBwR8VG1DuwUxwmGm8VCBDjk8KXc/0e6Y0bMS0/nKF5mluail5hLUOVyO25Bw\nSsoCUNjXPj823NbxDbsnTuNDjBd8Y9RQzvOFehQz0RdNLylQ5yHS0mdOPmn1\nY/7ztMJsPFIwsuFACOLLfPNfjLoONXctjDPqgVM+7Ez/uXPwVdUH5v/lrE1J\nhQrkeiuoIr2ku0Wn+CHQWqkgF1PJNBYdwTIlg4jNvq615Y4xNTLn2yOKe/cA\nchjWg312ilcZR11q/FxN+A2pLMbHWDDeUltGLzgjelxpx1cCAA58kDMd+94q\nzHj33EfKpKqtXiexBz8CDfSXxisdZ5srKm3XYkthD+kI01nOb9rSOzE7LJoK\na+6iroudTtUl24TXZRo/A+c12r6bkd0wPw2pE1qj0cPvz1jNlAPnUd4gXHEQ\nox2vENXOoP0570PZGuR0P5FkIa+CakNmW9S5S7NgyYDuN8sWYl3iFKqQrynq\n4mpLTT9lIq8Khdo6+UPi5Go1if6pigPpHuoQwDz/sS+7IEE4j5ly8odjd7hO\n1jPN1nvQHjwZjltkvXa9XYgpr4wh7Jhvxprm6kljnf5CDsLIrXxBLYVI6djc\nF9IJ6QTrQHLPoaHpT4sy756i/5hNEOWCHupPVgzeNdeQ7sJDDBEg0obJliM8\nQjWX\r\n=aUoq\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCRRUcRK/OwsFyiOag1On+5oDfHdBKfsrhnj6cwafXAsAIgL5zxOI+Y1/09jWMYMf2+9oj/yGFF9jj80cBsNr+PLmw="}]},"_npmUser":{"name":"hayes","email":"michael@hayes.io"},"directories":{},"maintainers":[{"name":"hayes","email":"michael@hayes.io"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/plugin-dataloader_2.5.4-alpha.0_1625274080475_0.7837021095538497"},"_hasShrinkwrap":false},"2.5.4-alpha.1":{"name":"@giraphql/plugin-dataloader","version":"2.5.4-alpha.1","description":"A GiraphQL plugin for attaching dataloader to object types","main":"./lib/index.js","module":"./esm/index.js","scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"author":{"name":"Michael Hayes"},"license":"ISC","keywords":["giraphql","graphql","schema","typescript","dataloader"],"publishConfig":{"access":"public"},"peerDependencies":{"dataloader":"2","graphql":">=15.1.0"},"devDependencies":{"@giraphql/core":"^2.10.0-alpha.0","@giraphql/plugin-relay":"^2.9.0-alpha.1","apollo-server":"^2.25.2","dataloader":"^2.0.0","graphql-tag":"^2.12.5"},"gitHead":"f04bb0d741042985bd6fb8a5659b7c72b297979c","_id":"@giraphql/plugin-dataloader@2.5.4-alpha.1","_nodeVersion":"15.14.0","_npmVersion":"lerna/4.0.0/node@v15.14.0+x64 (darwin)","dist":{"integrity":"sha512-55/clDSYduN9Gu4WTajqw4bsCT47NVUYpSGFOFR7z5faAvQrNSPQy+0IEXckUeOML535GYhheAss9WnRpLnjuw==","shasum":"f81245ddddfed4bc07a4fa21f490f785892fae2a","tarball":"https://registry.npmjs.org/@giraphql/plugin-dataloader/-/plugin-dataloader-2.5.4-alpha.1.tgz","fileCount":68,"unpackedSize":140141,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJg4SvMCRA9TVsSAnZWagAAWZkP/2PE1Ibb4fUVzvSi1xwf\n63VD+0H4EgvDavIJRh+pPmxull3qeRMUE0y56MeXoIBLSOuejCwhoWbUhyJF\nRs3oKbMN8PB3HGlHw/zzCPsGesC0nFN1FSe9JAIqq0wG/5nZ2AXuHO4SZS24\nPHf/FBvxFLk9MEFSaIKJjx37Sy8mDV22rAOqzQxScdhgvhcVgtGnrGLrUlJh\nvLucbaaO0B2+/p4D12nazkCKaRc5GHy8bom7NK0qSQPOhUjBILem14SGxvRp\nCRO0IX5+Kpxj8ziX66E0RezibqG9x8aMx2j6BN6lIxoSXhFhk52AedFHPE/H\nmLLJoqIHMJk9LY2M0PDcbk+XuCLV2CDr5+7jyISK9CjBl76VhsHkIVM+NqyT\n8bly1KgkEQAVLF73x+n7aWvmO16bPV2rggZFMqbb3CKNM7yfMDuVK20xMvob\nsuRh2vQppY2g2w+xUqoQDVjT7bo+wQr78rVgevv8w9I7me+XGIxLxdqZcp2r\ni3yY4uS0nwVFC7txq9Wmnwa2R2QJuPi7v4yZUIuHnrYvMJE40qYP0lAItG7D\nQDov/dHltmaFbb/wQYaOZNC6pwxrJOiLHUz7QUyym1xt6NZHTpBWHny22NCS\nzHBrHVZodWXLtCAJsQiveIbHoXEYV8sqFRJUUbhFA+q8GeRW2mJ50QRTuJOB\nNFzu\r\n=H8/4\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIBLi3SW4UrfI0H+Sc2lQxSvqIbYsj6WSwwEoS6yW8HPfAiEA2D8r/h0HakI6pBZduwxQiMcOlyuZNLTtZmZgIsJiq2o="}]},"_npmUser":{"name":"hayes","email":"michael@hayes.io"},"directories":{},"maintainers":[{"name":"hayes","email":"michael@hayes.io"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/plugin-dataloader_2.5.4-alpha.1_1625369548218_0.25653525087129947"},"_hasShrinkwrap":false},"2.5.4":{"name":"@giraphql/plugin-dataloader","version":"2.5.4","description":"A GiraphQL plugin for attaching dataloader to object types","main":"./lib/index.js","module":"./esm/index.js","scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"author":{"name":"Michael Hayes"},"license":"ISC","keywords":["giraphql","graphql","schema","typescript","dataloader"],"publishConfig":{"access":"public"},"peerDependencies":{"dataloader":"2","graphql":">=15.1.0"},"devDependencies":{"@giraphql/core":"^2.10.0","@giraphql/plugin-relay":"^2.9.0","apollo-server":"^2.25.2","dataloader":"^2.0.0","graphql-tag":"^2.12.5"},"gitHead":"9dfe52f1975f41a111e01bf96a20033a914e2acc","_id":"@giraphql/plugin-dataloader@2.5.4","_nodeVersion":"15.14.0","_npmVersion":"lerna/4.0.0/node@v15.14.0+x64 (darwin)","dist":{"integrity":"sha512-QG75Z5SWaB09KNRkO8b2P1PxRSmkP/MdCINNOgEKsuQryJKFDk5E5ZhfgbLxqtO15tXp0Q4r44Z9opBALAGCBg==","shasum":"22d0fdf55fd43814fe644ad66afc34c659f51931","tarball":"https://registry.npmjs.org/@giraphql/plugin-dataloader/-/plugin-dataloader-2.5.4.tgz","fileCount":68,"unpackedSize":140214,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJg4TaPCRA9TVsSAnZWagAAt7wP/ApM/FSe3CooEVHvm+I2\n6Ly6HJ/Qk8b0f6NfdPywpiWNdz1qo8xXQDlzryXhZncPY3ExNbICePoSZWEc\nMc9U989YxM6UjRlMdiRdmauwnqUEX9e5KwUmeqMNPWaStrqWKSMcygi2cixA\nuhEO8gXVdnxUSTFjGibLJ+iY1SqLcjR8gN9DxnQvXZpvRGqz6A2CRtufho+F\n1zuCVKn4NPEQvBKLQJuAjya9/WZmpiqiITm7/xJ2HVSJbdE8k0LQzPhQzW8q\nLRUo4SJlucr4RipM0lLeV6knvVrSk+S+8FEgb+byQmhiXtFvA5ehH70pcDQF\ns+7E13Uf+jrrdFEQXsUjJbzdxLrgxzIov8vLx1FSm2h/KBkNXvjym/zYIZBu\nqSOl9Z/J6vDUncsAAtZCHrFvSp94gEC89PXOpWW6Lm51bdWJKcDIZ2g3+icp\nDLIeEEs5LSImAk8VPEqI+FGqNV/j1bH0ZeKofVVMYC8gfGB/SkGa+AeGjjNa\nY7CYYw4WsOqxdPadOQdYCTvjdOpQH50pL08uaxf3nbRBAGtgm5VxW9QzzvXU\nQ/5egaD1EUgL1GwDXq0dOhCtipp2gOoRiojl1MhKBwMqvHPJaegmNRUBwI5U\nPq3g/5/JN1z8tqh9drygodLq7UFOIufjDGVtVcAFY8Q2++3Sy4oLHS0ZTMMN\n/6nq\r\n=VlbL\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQD5AUrRl7x1DMo5rxsEgO24oqV+hO8SL+bl9gPL6546EQIgbNr1c61Il1/zR3wqSrNGyf2W8XvI1IyD/AitJi052yk="}]},"_npmUser":{"name":"hayes","email":"michael@hayes.io"},"directories":{},"maintainers":[{"name":"hayes","email":"michael@hayes.io"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/plugin-dataloader_2.5.4_1625372302668_0.6955049141536191"},"_hasShrinkwrap":false},"2.5.5":{"name":"@giraphql/plugin-dataloader","version":"2.5.5","description":"A GiraphQL plugin for attaching dataloader to object types","main":"./lib/index.js","module":"./esm/index.js","scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"author":{"name":"Michael Hayes"},"license":"ISC","keywords":["giraphql","graphql","schema","typescript","dataloader"],"publishConfig":{"access":"public"},"peerDependencies":{"dataloader":"2","graphql":">=15.1.0"},"devDependencies":{"@giraphql/core":"^2.10.1","@giraphql/plugin-relay":"^2.9.1","apollo-server":"^2.25.2","dataloader":"^2.0.0","graphql-tag":"^2.12.5"},"gitHead":"15509521ab5b20ba1a0cdaf5ae17e21c307f288a","_id":"@giraphql/plugin-dataloader@2.5.5","_nodeVersion":"12.22.3","_npmVersion":"lerna/4.0.0/node@v12.22.3+x64 (darwin)","dist":{"integrity":"sha512-0LLi9s0xic2cGSsP0rgO90Z+DN6VWfPnHnx4mn6Nw4eITpyLlI0sS8FIp0DeIg4PEtZThjsNGX5TlfwWqQ5X/g==","shasum":"3de01a20fb49dfa276bba4ccf9296e9eb2383d7a","tarball":"https://registry.npmjs.org/@giraphql/plugin-dataloader/-/plugin-dataloader-2.5.5.tgz","fileCount":68,"unpackedSize":140311,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJg6Rd0CRA9TVsSAnZWagAAQ1QP/iw25dHDUP8pZuX4AWm6\nwDWrrai90hmuuKKIYXkVP9965vinpEqWaI6Jidgg0a3WEBghDEgDXkWyWOso\n9WTBC55EtIuI+TmcktCc8OseB96wUBOaa87CMG+iYgn6bx83GA2HVxakZtcY\nLF2H1B119ZfoPpJMDznwr1dCFBgvVQCdrn0qSFFpF/vm1QMA+d0ZzgxXa/JZ\nTZHaX4fM/fiR2RSM7SRHm4G4g5t9NDz4bNBFQ8nAyO7LsBQ7mHHeVjoF5oJH\nLLTw2elx7ZS9UI4mIBsgGb/e+Z3i1OpRxqSZlKvoSkdr0hTleRTMZQsG1spm\nMEmfnLoSg1cRo342mDCdP5uXm9DRkNvAkhaD7md/g1677mTZxCmeUPYEtwQ9\n8bNbzZ/ksNy+agt9yjvnscSPG7FGltKkl/rGvV9eTRnHfkILjg/EE+qk+2zM\nO3rH64pihfsQKbTj10oAeMkMjpkkBBltySwdMBufg4Eemz9A5W8WDlI6UL/M\nk8+pQmX8Bl6nj99GaJAWu2CCJJoXT0RBbyCCK9ASn/i7o/6fxJsjAh0LHpur\nlmxQkIozOqy2q7TgR3i2SfBQ9jUTpIUMmBsSECMiHR9joxnjDqBJhY9IsLsL\nsPF+kPhPNop3CcqI/1MFKlHMxOKI/xAQkOUmyqRdd/gp6gD8DqB8Ni0KH+BK\n7ueh\r\n=tYnw\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDXTX/1bq0+eCOOawlRnnTK8g0tEyO0B9/n1QyGji77cQIgAn0dF0cIrce/TU/1coH6RtBqwSs+Ex82kBDg1rSpOF8="}]},"_npmUser":{"name":"hayes","email":"michael@hayes.io"},"directories":{},"maintainers":[{"name":"hayes","email":"michael@hayes.io"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/plugin-dataloader_2.5.5_1625888628426_0.3805895182674721"},"_hasShrinkwrap":false},"2.5.6-alpha.0":{"name":"@giraphql/plugin-dataloader","version":"2.5.6-alpha.0","description":"A GiraphQL plugin for attaching dataloader to object types","main":"./lib/index.js","module":"./esm/index.js","scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"author":{"name":"Michael Hayes"},"license":"ISC","keywords":["giraphql","graphql","schema","typescript","dataloader"],"publishConfig":{"access":"public"},"peerDependencies":{"dataloader":"2","graphql":">=15.1.0"},"devDependencies":{"@giraphql/core":"^2.10.2-alpha.0","@giraphql/plugin-relay":"^2.9.2-alpha.0","apollo-server":"^2.25.2","dataloader":"^2.0.0","graphql-tag":"^2.12.5"},"gitHead":"b42fce4efd2c4567c08615ab58f3dcd4a756f745","_id":"@giraphql/plugin-dataloader@2.5.6-alpha.0","_nodeVersion":"14.17.3","_npmVersion":"lerna/4.0.0/node@v14.17.3+x64 (darwin)","dist":{"integrity":"sha512-J8LccBkVeIs5fyWb5xp8Z580wyRb4QE7f2DebMAI13ufTXJZE7umueyK5b/SqpN1zPiUL55LBzZThyt5MwtEuw==","shasum":"111be2e901b4c1feb403934919c6f29beed2ca95","tarball":"https://registry.npmjs.org/@giraphql/plugin-dataloader/-/plugin-dataloader-2.5.6-alpha.0.tgz","fileCount":68,"unpackedSize":140440,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJg8lOYCRA9TVsSAnZWagAAIFIQAKRPjWEorVjfd1CWrlct\n4TKS3gPaYQ8lJkYsyyE/kCbRyAkl4deOg1xAlg47Mc8a+4PDT8Mp7ENqqtyd\nkvzjG4JLfdTssDptjS1O9FAdmW4101cJg20TTLOhu3gDTOEOUceqMnwBPFTa\n00y4k97HOvi6Zghe3mQ+ooNPVAs31FPVcl7ZLoYbVxY6/FuSWfq07giAYPVY\njD8Oe2unRHcZrMJY3ahHaIq0WrbC6Ohmwh+40E+4/mVcLvWF+vz7aRe1OLOS\n/pAX1xIUvWA89MI9C0X0dlQRu28H5EHxi/1/yZ1+nddN66DgVFpXL1yEuNAo\nOpdL2OoUqsB/u38aP6kWfH+jz03ikywnAU+TKTPB4B99cK3BnTqWYEjGTAs8\nl2Lhz/dih4Yd2od7V/+aGUHMHLuGh/GbkgtiRcdwaZayia9AwPT3PnzGIKCb\nxnh3EDIWWcngNP9fczV/ruinyFHglT/CLZRznhwSH35yJW3Cjqjiyo35L8CX\nee5Y5wLZQmN8jprS9OCuDlQvAJ7TxVgoAGj2b0T6MFSbxUay3PkKO+nd7HA6\ndfoJIRppocABofFtHbkjW4+f67x2gThrunyuyhxasXjG9dS01fO3uOrUu/qs\ncko6FHVM1LYcRd84h9y4l/NOKPMBjeVGrWl2hnHlvvqIkCTjOZ24Kg/w+cD8\nmTKj\r\n=AxwS\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIGk9mCDY7tq98rUeF9Akw09bkAqGqScQwx7M/odxUMEwAiBF1x3nthGcrQ8y2hMgRkdKftpaE1ZpORkQnjY15kcD8g=="}]},"_npmUser":{"name":"hayes","email":"michael@hayes.io"},"directories":{},"maintainers":[{"name":"hayes","email":"michael@hayes.io"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/plugin-dataloader_2.5.6-alpha.0_1626493848644_0.4904487215426794"},"_hasShrinkwrap":false},"2.5.6":{"name":"@giraphql/plugin-dataloader","version":"2.5.6","description":"A GiraphQL plugin for attaching dataloader to object types","main":"./lib/index.js","module":"./esm/index.js","scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"author":{"name":"Michael Hayes"},"license":"ISC","keywords":["giraphql","graphql","schema","typescript","dataloader"],"publishConfig":{"access":"public"},"peerDependencies":{"dataloader":"2","graphql":">=15.1.0"},"devDependencies":{"@giraphql/core":"^2.10.2","@giraphql/plugin-relay":"^2.9.2","apollo-server":"^2.25.2","dataloader":"^2.0.0","graphql-tag":"^2.12.5"},"gitHead":"fbab24dd5a3d379ac992bce22773f40196c1fdb5","_id":"@giraphql/plugin-dataloader@2.5.6","_nodeVersion":"14.17.3","_npmVersion":"lerna/4.0.0/node@v14.17.3+x64 (darwin)","dist":{"integrity":"sha512-bMIVONrWcN0CtuvgaXk3KDO7w21KofYiOwml6SVfg52gRsXJvzF6UGr+x1DJ7y1oWFDXBiTXnqQ6thabi7ICFg==","shasum":"3747fabc68fc4f7395b4fa0a2448627d9c1188eb","tarball":"https://registry.npmjs.org/@giraphql/plugin-dataloader/-/plugin-dataloader-2.5.6.tgz","fileCount":68,"unpackedSize":140513,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJg+w10CRA9TVsSAnZWagAAzMkP/RO10gzCsuxVIzXAY1Ux\ngMwg2Ybhsaj2CQNC3Zwn4e1p4JK7sI77CODfDqcios1ZtBtNtP/JTtOZOEtE\nlVbRAqTQPIyLRftTpuIxo7S5ATTQbJCf041vBu+xU4AtB+nwLPB9re+h+KM3\nbPf0dFYz6bgX5eT1nN1qIL29fe/A64D7Y4OASkPtliaxJDL/h5msPNceclXd\nbbkN+13odo/CkvHRXKpIJhKsu/wtW+213PIVP4fkc9Q4G9Akq04zgliaRWt1\nIuUrVSthmuEEQmvhFdAVGFqqs0dO3th/geUbBM/NvXzukPsOqBW52DQ6KQco\no7UapL+YO3AlOYHFtFYJJX5jUx0L86sRlwCZO4GZro3IXXA9nCIIL+ZmdT+9\nDLBv9Au7dUk2yThc95ZNEEpptu6e1e9rRISkhJD5k/4BVwW6u/E/JUpn2tbb\n+j1ChsSjgxWOO6JLAs6GlzfY0+o3Z65A0rVWJnnHPuJbf6kk0S8SshaT1r2O\nmEjFYiWTUWfCV/fbxi6ffbwtk3hY6btox4xRAM/6P63XsWsokTHoHjd8jQAm\nTVugrEke+K4DYRNwZaTAk73qNGujy9r6XCx7ba8dUYR5KFwfCguNrtwWzQZ/\n6EUEkOc0DkzN4lg9UEmSIDsi3p43W3CHgw51NWGLThkb7Pi66ALHR8EBKyz8\nvLW9\r\n=MJ10\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCID4E/1ufbEre4/hrovOzXXxeqi4yXfsoDnQpCUPWRjM8AiACxMNeS394CXj+tmRs3b25YQnHP/FAMTPtEf9ecaA5Yg=="}]},"_npmUser":{"name":"hayes","email":"michael@hayes.io"},"directories":{},"maintainers":[{"name":"hayes","email":"michael@hayes.io"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/plugin-dataloader_2.5.6_1627065716073_0.23725299100634278"},"_hasShrinkwrap":false},"2.6.0-alpha.0":{"name":"@giraphql/plugin-dataloader","version":"2.6.0-alpha.0","description":"A GiraphQL plugin for attaching dataloader to object types","main":"./lib/index.js","module":"./esm/index.js","scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"author":{"name":"Michael Hayes"},"license":"ISC","keywords":["giraphql","graphql","schema","typescript","dataloader"],"publishConfig":{"access":"public"},"peerDependencies":{"dataloader":"2","graphql":">=15.1.0"},"devDependencies":{"@giraphql/core":"^2.10.2","@giraphql/plugin-relay":"^2.10.0-alpha.0","apollo-server":"^2.25.2","dataloader":"^2.0.0","graphql-tag":"^2.12.5"},"gitHead":"bd4b2857692810948ce2c8386eae92d3c642a8a8","readme":"# Dataloader Plugin for GiraphQL\n\nThis plugin makes it easy to add fields and types that are loaded through a dataloader.\n\n## Usage\n\n### Install\n\nTo use the dataloader plugin you will need to install both the `dataloader` package and the\nvalidation plugin:\n\n```bash\nyarn add dataloader @giraphql/plugin-dataloader\n```\n\n### Setup\n\n```typescript\nimport DataloaderPlugin from '@giraphql/plugin-dataloader';\n\nconst builder = new SchemaBuilder({\n  plugins: [DataloaderPlugin],\n});\n```\n\n### loadable objects\n\nTo create an object type that can be loaded with a dataloader use the new `builder.loadableObject`\nmethod:\n\n```ts\nconst User = builder.loadableObject('User', {\n  // load will be called with ids of users that need to be loaded\n  // Note that the types for keys (and context if present) are required\n  load: (ids: string[], context: ContextType) => context.loadUsersById(ids),\n  fields: (t) => ({\n    id: t.exposeID('id', {}),\n    username: t.string({\n      // the shape of parent will be inferred from `loadUsersById()` above\n      resolve: (parent) => parent.username,\n    }),\n  }),\n});\n```\n\nWhen defining fields that return `User`s, you will now be able to return either a `string` (based in\nids param of `load`), or a User object (type based on the return type of `loadUsersById`).\n\n```ts\nbuilder.queryType({\n  fields: (t) => ({\n    user: t.field({\n      type: User,\n      args: {\n        id: t.arg.string({ required: true }),\n      },\n      // Here we can just return the ID directly rather than loading the user ourselves\n      resolve: (root, args) => args.id,\n    }),\n    currentUser: t.field({\n      type: User,\n      // If we already have the user, we use it, and the dataloader will not be called\n      resolve: (root, args, context) => context.currentUser,\n    }),\n    users: t.field({\n      type: [User],\n      args: {\n        ids: t.arg.stringList({ required: true }),\n      },\n      // Mixing ids and user objects also works\n      resolve: (_root, args, context) => [...args.ids, context.CurrentUser],\n    }),\n  }),\n});\n```\n\nGiraphQL will detect when a resolver returns `string`, `number`, or `bigint` (typescript will\nconstrain the allowed types to whatever is expected by the load function). If a resolver returns an\nobject instead, GiraphQL knows it can skip the dataloader for that object.\n\n### loadable fields\n\nIn some cases you may need more granular dataloaders. To handle these cases there is a new\n`t.loadable` method for defining fields with their own dataloaders.\n\n```ts\n// Normal object that the fields below will load\ninterface PostShape {\n  id: string;\n  title: string;\n  content: string;\n}\n\nconst Post = builder.objectRef<PostShape>('Post').implement({\n  fields: (t) => ({\n    id: t.exposeID('id', {}),\n    title: t.exposeString('title', {}),\n    content: t.exposeString('title', {}),\n  }),\n});\n\n// Loading a single Post\nbuilder.objectField(User, 'latestPost', (t) =>\n  t.loadable({\n    type: Post,\n    // will be called with ids of latest posts for all users in query\n    load: (ids: number[], context) => context.loadPosts(ids),\n    resolve: (user, args) => user.lastPostID,\n  }),\n);\n// Loading multiple Posts\nbuilder.objectField(User, 'posts', (t) =>\n  t.loadable({\n    type: [Post],\n    // will be called with ids of posts loaded for all users in query\n    load: (ids: number[], context) => context.loadPosts(ids),\n    resolve: (user, args) => user.postIDs,\n  }),\n);\n```\n\n### dataloader options\n\nYou can provide additional options for your dataloaders using `loaderOptions`.\n\n```ts\nconst User = builder.loadableObject('User', {\n  loaderOptions: { maxBatchSize: 20 },\n  load: (ids: string[], context: ContextType) => context.loadUsersById(ids),\n  fields: (t) => ({ id: t.exposeID('id', {}) }),\n});\n\nbuilder.objectField(User, 'posts', (t) =>\n  t.loadable({\n    type: [Post],\n    loaderOptions: { maxBatchSize: 20 },\n    load: (ids: number[], context) => context.loadPosts(ids),\n    resolve: (user, args) => user.postIDs,\n  }),\n);\n```\n\nSee [dataloader docs](https://github.com/graphql/dataloader#api) for all available options.\n\n### Manually using dataloader\n\nDataloaders for \"loadable\" objects can be accessed via their ref by passing in the context object\nfor the current request. dataloaders are not shared across requests, so we need the context to get\nthe correct dataloader for the current request:\n\n```ts\n// create loadable object\nconst User = builder.loadableObject('User', {\n  load: (ids: string[], context: ContextType) => context.loadUsersById(ids),\n  fields: (t) => ({\n    id: t.exposeID('id', {}),\n  }),\n});\n\nbuilder.queryField('user', (t) =>\n  t.field({\n    type: User,\n    resolve: (parent, args, context) => {\n      // get data loader for User type\n      const loader = User.getDataloader(context);\n\n      // manually load a user\n      return loader.load('123');\n    },\n  }),\n);\n```\n\n### Errors\n\nCalling dataloader.loadMany will resolve to a value like `(Type | Error)[]`. Your `load` function\nmay also return results in that format if your loader can have parital failures. GraphQL does not\nhave special handling for Error objects. Instead GiraphQL will map these results to something like\n`(Type | Promise<Type>)[]` where Errors are replaced with promises that will be rejected. This\nallows the normal graphql resolver flow to correctly handle these errors.\n\nIf you are using the `loadMany` method from a dataloader manually, you can apply the same mapping\nusing the `rejectErrors` helper:\n\n```ts\nimport { rejectErrors } from '@giraphql/plugin-dataloader';\n\nbuilder.queryField('user', (t) =>\n  t.field({\n    type: [User],\n    resolve: (parent, args, context) => {\n      const loader = User.getDataloader(context);\n\n      return rejectErrors(loader.loadMany(['123', '456']));\n    },\n  }),\n);\n```\n\n### (Optional) Adding loaders to context\n\nIf you want to make dataloaders accessible via the context object directly, there is some additional\nsetup required. Below are a few options for different ways you can load data from the context\nobject. You can determine which of these options works best for you or add you own helpers.\n\nFirst you'll need to update the types for your context type:\n\n```ts\nimport { LoadableRef } from '@giraphql/plugin-dataloader';\n\nexport interface ContextType {\n  userLoader: DataLoader<string, { id: number }>; // expose a specific loader\n  getLoader: <K, V>(ref: LoadableRef<K, V, ContextType>) => DataLoader<K, V>; // helper to get a loader from a ref\n  load: <K, V>(ref: LoadableRef<K, V, ContextType>, id: K) => Promise<V>; // helper for loading a single resource\n  loadMany: <K, V>(ref: LoadableRef<K, V, ContextType>, ids: K[]) => Promise<(Error | V)[]>; // helper for loading many\n  // other context fields\n}\n```\n\nnext you'll need to update your context factory function. The exact format of this depends on what\ngraphql server implementation you are using.\n\n```ts\nimport { initContextCache } from '@giraphql/core';\nimport { LoadableRef, rejectErrors } from '@giraphql/plugin-dataloader';\n\nexport const createContext = (req, res): ContextType => ({\n  // Adding this will prevent any issues if you server implementation\n  // copies or extends the context object before passing it to your resolvers\n  ...initContextCache(),\n\n  // using getters allows us to access the context object using `this`\n  get userLoader() {\n    return User.getDataloader(this);\n  },\n  get getLoader() {\n    return <K, V>(ref: LoadableRef<K, V, ContextType>) => ref.getDataloader(this);\n  },\n  get load() {\n    return <K, V>(ref: LoadableRef<K, V, ContextType>, id: K) => ref.getDataloader(this).load(id);\n  },\n  get loadMany() {\n    return <K, V>(ref: LoadableRef<K, V, ContextType>, ids: K[]) =>\n      rejectErrors(ref.getDataloader(this).loadMany(ids));\n  },\n});\n```\n\nNow you can use these helpers from your context object:\n\n```ts\nbuilder.queryFields((t) => ({\n  fromContext1: t.field({\n    type: User,\n    resolve: (root, args, { userLoader }) => userLoader.load('123'),\n  }),\n  fromContext2: t.field({\n    type: User,\n    resolve: (root, args, { getLoader }) => getLoader(User).load('456'),\n  }),\n  fromContext3: t.field({\n    type: User,\n    resolve: (root, args, { load }) => load(User, '789'),\n  }),\n  fromContext4: t.field({\n    type: [User],\n    resolve: (root, args, { loadMany }) => loadMany(User, ['123', '456']),\n  }),\n}));\n```\n","readmeFilename":"README.md","_id":"@giraphql/plugin-dataloader@2.6.0-alpha.0","_nodeVersion":"14.17.3","_npmVersion":"lerna/4.0.0/node@v14.17.3+x64 (darwin)","dist":{"integrity":"sha512-TxjDYJgQFdXrZsCWKY0Ak21BHSgiYOBrn44kdlJnhHGLo4HN0fiaShyhOYJoUhijjBborPyiOajCVqOZPt5LEw==","shasum":"25efdfc9c4f1027d0a6119a9f095c4ef9856bb0d","tarball":"https://registry.npmjs.org/@giraphql/plugin-dataloader/-/plugin-dataloader-2.6.0-alpha.0.tgz","fileCount":68,"unpackedSize":141055,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJhAbegCRA9TVsSAnZWagAAMPYP/0AB6FhBcrrwhByziOh8\nz3c76hxrdjr+HtUhGW7q3UMYQwysx6EmZLcW+fpR1wo7fvJ5qM71nyH5/UzO\ny/pao06KoWgRjat1qoqEWiLUv755/2vAJOdyG1dH9wO+rbJRDr1cX2Ctbc/j\n9+YV2ATlkNl/qcCD27A4r2OIvEsxrkWrClaJHcsCENj4HWHiKzG/Coo0zLnm\nCBcRNht799p3XHX+a08Je3Olq3+CjxQFR6kZGeTiMNg8T33SfFWR5ruSstbv\ns+oCWba+qJZehw35dqkEPpfjLTVRl4rVHuIIQy3bNgvUYjmXjRLGRJnSybCi\nb5JG5/GAvmxU9D+sASsyUA3yW4ClcfKIls84AX5QGVg/XzUQnQOG888TC/px\neRCXV4pGLtwTLkxhVM57legN1Mk/T8Bqk5K3DQ1JHg0rNPiTUnKsio6hp7jZ\nX4/K8UkHLnbYNiVw5EBvhTda8fQ+CJWVbZRsCPKP8uW/2wQfAVwc0HSC0Woj\nJvrWFJug5ByTGaaSfbsOLwxR+0DA1ged2QJHN3xvw9pnImGj4RCquoQ0oDot\nROmeatCUalPhpJm+iAhthEsmRm38lZO3VW7WFuZRJfp8WzuoVkkheaDMUX9U\nfi+QciEmdAl0XSzjz2b9WBW0jv/bXUt7OgVKX/456bNPR52usV2u+E8O7npR\nrr2T\r\n=2BQf\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDavEn7loxn+h5fj18IaDYCSJO5o5pQ9m2LGE7jtVFkqQIhAL9Egi9vZaHlAby0g9OCUKhhuYG222eysXT2x72QkPa+"}]},"_npmUser":{"name":"hayes","email":"michael@hayes.io"},"directories":{},"maintainers":[{"name":"hayes","email":"michael@hayes.io"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/plugin-dataloader_2.6.0-alpha.0_1627502495984_0.4521889883576522"},"_hasShrinkwrap":false},"2.6.0":{"name":"@giraphql/plugin-dataloader","version":"2.6.0","description":"A GiraphQL plugin for attaching dataloader to object types","main":"./lib/index.js","module":"./esm/index.js","scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"author":{"name":"Michael Hayes"},"license":"ISC","keywords":["giraphql","graphql","schema","typescript","dataloader"],"publishConfig":{"access":"public"},"peerDependencies":{"dataloader":"2","graphql":">=15.1.0"},"devDependencies":{"@giraphql/core":"^2.10.2","@giraphql/plugin-relay":"^2.10.0","apollo-server":"^2.25.2","dataloader":"^2.0.0","graphql-tag":"^2.12.5"},"gitHead":"7ab83edfab61785ec10ce1b7a7beebcff34b4477","_id":"@giraphql/plugin-dataloader@2.6.0","_nodeVersion":"14.17.3","_npmVersion":"lerna/4.0.0/node@v14.17.3+x64 (darwin)","dist":{"integrity":"sha512-o1d74MGul8akvotBTok5AB0rAUCvkKzdiEx8mpiKOUGo1s2g2q+kBqSMVC5C9WNyX2+0J6VsH+ZDsHij/7Jk7w==","shasum":"a39e7eaa15eecc0e71266d515fa4232e4ec7d1fa","tarball":"https://registry.npmjs.org/@giraphql/plugin-dataloader/-/plugin-dataloader-2.6.0.tgz","fileCount":68,"unpackedSize":141136,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJhAy/yCRA9TVsSAnZWagAAl8wQAI1Q1cL/YnuQeFaowRD6\nKXNj92G7YyCD0JZnyCanDumuOmKR7ed3B15EMfmfHWCaJGGTwipW3bbOxv52\nbcQDBFmy29/6BTRdqzBmcBnIsuAmA6DOLtQY7Nf3SqvntgbqHsXSLwDWz3RV\nSeHexQ56FkgwlucRERlT88JGbULLhJYrZiRuaPGpgIGTqZ25qTvww56/YD+B\naA2hvied6kjHwNkOnuMK4SkP2riDUN11qHDrrgaNCdSxGvcdDj3wk+gpNjGs\nHMHPPFAjUAMuUgd3e2Y1gcOBcJP+1kWFVrS03WgmyUXY94e4jfu2+6/Ti7BO\ntCZybkipsMpmKzWxFov2pU9g/9W5yAxmnY6o3+8uuIyrz2f+a1hHwqaZTsWo\nw3vW8pCAvqw2G2paQClCyqzX5yv4gV1bxtlocdwcEJRLrkDdeu5kz1/1fHBT\nCdpVqNqtawJFvx2dfHA1N5i4wpdLk+pN825nkOdO25A5aAOXK3PWcLh41dez\nTkv0teloJt+MHgjNkBrfhJ9C/LlraHpAY7bmpD8qB4qd+3Q6H9O2N9Y31u3Y\nVRj66ZQx9uEAEVQOjlP/IHvoTikw4W+XH2TcwLwVFOel6cj33zl/83udWYdu\n/ahU+n14sH9y8RxQfw2LRVsRZnpKG3kqm6eGZx2wuLOnspBzeViXdkEx3E6Q\n3STk\r\n=5jmn\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIEysNch5HV7Fb4/wuItC7x+jInC0RRgAQJCjvdXosXQJAiEA+wX+h+VsmNSHlO6viglCWwdRQ8SsUWAdY+nbJOsKQyY="}]},"_npmUser":{"name":"hayes","email":"michael@hayes.io"},"directories":{},"maintainers":[{"name":"hayes","email":"michael@hayes.io"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/plugin-dataloader_2.6.0_1627598834716_0.03829115385231163"},"_hasShrinkwrap":false},"2.7.0":{"name":"@giraphql/plugin-dataloader","version":"2.7.0","description":"A GiraphQL plugin for attaching dataloader to object types","main":"./lib/index.js","module":"./esm/index.js","scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"author":{"name":"Michael Hayes"},"license":"ISC","keywords":["giraphql","graphql","schema","typescript","dataloader"],"publishConfig":{"access":"public"},"peerDependencies":{"dataloader":"2","graphql":">=15.1.0"},"devDependencies":{"@giraphql/core":"^2.11.0","@giraphql/plugin-relay":"^2.11.0","apollo-server":"^2.25.2","dataloader":"^2.0.0","graphql-tag":"^2.12.5"},"gitHead":"220b996dbac73ebc4de820931bbe8dff60c7cad9","_id":"@giraphql/plugin-dataloader@2.7.0","_nodeVersion":"14.17.3","_npmVersion":"lerna/4.0.0/node@v14.17.3+x64 (darwin)","dist":{"integrity":"sha512-Ie+N6yBshYLnLt5cFQn/oN0hURn8768yY9KyPlIJodGCMjKvfBd90cbC0yiAJTYaeP1+8xcHl9fflSHP8+4O5A==","shasum":"d7b22b1ae565aa4265863951c18b7e1ba4a5c461","tarball":"https://registry.npmjs.org/@giraphql/plugin-dataloader/-/plugin-dataloader-2.7.0.tgz","fileCount":61,"unpackedSize":124522,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJhBIs3CRA9TVsSAnZWagAAlb4QAI7ysXEFLFtSAN2cCoO9\nEbE9qLvE248p8jUTMWe4ewXAqqFhmvscbjdvSa4zY8uwjZvWyvMS36CLijEo\n4oKd11zV3cCIOGUbWlw7SOd2hmrGz6XgM28KfxaJ9ThoM4t+zQm0SV5yWR8B\nY4LJzyC3YeU174RDJPsNu//V1ZLYlbMzjw98gsyuxsSOSbg+bV9bTr5oXgJg\n+aQz0runCgyXZEdwvvCTBelKWyRnbCsmRjPBSFLXfMcY8rHBZYGymZVHBOOU\ncme1CxWHV9+QYtBByIxeuqktWP7q47Ho5LH5dhEeBEzK/qQJUvyDDjaBzsf1\nc2VxMCPEv6JVWIcl53uJoPMLKafkF8j99RuXA8RH4+tMs6xBmfRnSBBuP9Al\na90vE4EkstksKGJgoFToF5180d+AS0v8FAJ9B/Hy9ZSsYvTMqLfquRBesM5Q\ngsjKq8C1pZDw+AoEleZPOFXqDzUW7erbPsLmMnZJJCqL9zz+ZbHsU8nB/HaN\nVKBjPVn+/mTCTAv8JCV1Rr7tSaoNG+Za7ba1nz7R+vkiSR/07ToJRAesXxly\nk4Lx4BehjuxVwlJG/AdXIhnUstygyy0qaHqkBv2+w9EgQjfy18iePSfqWqAa\nlT3z+q5eyFuMgNYJP/bnMQN+mQqbGGS9hYWHrsapYfoiobnDvjWW2WiGwCRX\nFqYc\r\n=FcZO\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIDUJvC3sm5BNHpRk6eTsmOBJaSLnOV69w/Syh46OereJAiEA8yYwBNCJwNryVn2kGDbUujExMBDuuqDSbnm4IFblZNQ="}]},"_npmUser":{"name":"hayes","email":"michael@hayes.io"},"directories":{},"maintainers":[{"name":"hayes","email":"michael@hayes.io"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/plugin-dataloader_2.7.0_1627687735376_0.6982126398123731"},"_hasShrinkwrap":false},"2.7.1-alpha.0":{"name":"@giraphql/plugin-dataloader","version":"2.7.1-alpha.0","description":"A GiraphQL plugin for attaching dataloader to object types","main":"./lib/index.js","module":"./esm/index.js","scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"author":{"name":"Michael Hayes"},"license":"ISC","keywords":["giraphql","graphql","schema","typescript","dataloader"],"publishConfig":{"access":"public"},"peerDependencies":{"dataloader":"2","graphql":">=15.1.0"},"devDependencies":{"@giraphql/core":"^2.12.0-alpha.0","@giraphql/plugin-relay":"^2.12.0-alpha.0","apollo-server":"^2.25.2","dataloader":"^2.0.0","graphql-tag":"^2.12.5"},"gitHead":"9f586f4146acf7841706aba3ce84826d6e4f7cdf","readme":"# Dataloader Plugin for GiraphQL\n\nThis plugin makes it easy to add fields and types that are loaded through a dataloader.\n\n## Usage\n\n### Install\n\nTo use the dataloader plugin you will need to install both the `dataloader` package and the\nvalidation plugin:\n\n```bash\nyarn add dataloader @giraphql/plugin-dataloader\n```\n\n### Setup\n\n```typescript\nimport DataloaderPlugin from '@giraphql/plugin-dataloader';\n\nconst builder = new SchemaBuilder({\n  plugins: [DataloaderPlugin],\n});\n```\n\n### loadable objects\n\nTo create an object type that can be loaded with a dataloader use the new `builder.loadableObject`\nmethod:\n\n```ts\nconst User = builder.loadableObject('User', {\n  // load will be called with ids of users that need to be loaded\n  // Note that the types for keys (and context if present) are required\n  load: (ids: string[], context: ContextType) => context.loadUsersById(ids),\n  fields: (t) => ({\n    id: t.exposeID('id', {}),\n    username: t.string({\n      // the shape of parent will be inferred from `loadUsersById()` above\n      resolve: (parent) => parent.username,\n    }),\n  }),\n});\n```\n\nWhen defining fields that return `User`s, you will now be able to return either a `string` (based in\nids param of `load`), or a User object (type based on the return type of `loadUsersById`).\n\n```ts\nbuilder.queryType({\n  fields: (t) => ({\n    user: t.field({\n      type: User,\n      args: {\n        id: t.arg.string({ required: true }),\n      },\n      // Here we can just return the ID directly rather than loading the user ourselves\n      resolve: (root, args) => args.id,\n    }),\n    currentUser: t.field({\n      type: User,\n      // If we already have the user, we use it, and the dataloader will not be called\n      resolve: (root, args, context) => context.currentUser,\n    }),\n    users: t.field({\n      type: [User],\n      args: {\n        ids: t.arg.stringList({ required: true }),\n      },\n      // Mixing ids and user objects also works\n      resolve: (_root, args, context) => [...args.ids, context.CurrentUser],\n    }),\n  }),\n});\n```\n\nGiraphQL will detect when a resolver returns `string`, `number`, or `bigint` (typescript will\nconstrain the allowed types to whatever is expected by the load function). If a resolver returns an\nobject instead, GiraphQL knows it can skip the dataloader for that object.\n\n### loadable fields\n\nIn some cases you may need more granular dataloaders. To handle these cases there is a new\n`t.loadable` method for defining fields with their own dataloaders.\n\n```ts\n// Normal object that the fields below will load\ninterface PostShape {\n  id: string;\n  title: string;\n  content: string;\n}\n\nconst Post = builder.objectRef<PostShape>('Post').implement({\n  fields: (t) => ({\n    id: t.exposeID('id', {}),\n    title: t.exposeString('title', {}),\n    content: t.exposeString('title', {}),\n  }),\n});\n\n// Loading a single Post\nbuilder.objectField(User, 'latestPost', (t) =>\n  t.loadable({\n    type: Post,\n    // will be called with ids of latest posts for all users in query\n    load: (ids: number[], context) => context.loadPosts(ids),\n    resolve: (user, args) => user.lastPostID,\n  }),\n);\n// Loading multiple Posts\nbuilder.objectField(User, 'posts', (t) =>\n  t.loadable({\n    type: [Post],\n    // will be called with ids of posts loaded for all users in query\n    load: (ids: number[], context) => context.loadPosts(ids),\n    resolve: (user, args) => user.postIDs,\n  }),\n);\n```\n\n### dataloader options\n\nYou can provide additional options for your dataloaders using `loaderOptions`.\n\n```ts\nconst User = builder.loadableObject('User', {\n  loaderOptions: { maxBatchSize: 20 },\n  load: (ids: string[], context: ContextType) => context.loadUsersById(ids),\n  fields: (t) => ({ id: t.exposeID('id', {}) }),\n});\n\nbuilder.objectField(User, 'posts', (t) =>\n  t.loadable({\n    type: [Post],\n    loaderOptions: { maxBatchSize: 20 },\n    load: (ids: number[], context) => context.loadPosts(ids),\n    resolve: (user, args) => user.postIDs,\n  }),\n);\n```\n\nSee [dataloader docs](https://github.com/graphql/dataloader#api) for all available options.\n\n### Manually using dataloader\n\nDataloaders for \"loadable\" objects can be accessed via their ref by passing in the context object\nfor the current request. dataloaders are not shared across requests, so we need the context to get\nthe correct dataloader for the current request:\n\n```ts\n// create loadable object\nconst User = builder.loadableObject('User', {\n  load: (ids: string[], context: ContextType) => context.loadUsersById(ids),\n  fields: (t) => ({\n    id: t.exposeID('id', {}),\n  }),\n});\n\nbuilder.queryField('user', (t) =>\n  t.field({\n    type: User,\n    resolve: (parent, args, context) => {\n      // get data loader for User type\n      const loader = User.getDataloader(context);\n\n      // manually load a user\n      return loader.load('123');\n    },\n  }),\n);\n```\n\n### Errors\n\nCalling dataloader.loadMany will resolve to a value like `(Type | Error)[]`. Your `load` function\nmay also return results in that format if your loader can have parital failures. GraphQL does not\nhave special handling for Error objects. Instead GiraphQL will map these results to something like\n`(Type | Promise<Type>)[]` where Errors are replaced with promises that will be rejected. This\nallows the normal graphql resolver flow to correctly handle these errors.\n\nIf you are using the `loadMany` method from a dataloader manually, you can apply the same mapping\nusing the `rejectErrors` helper:\n\n```ts\nimport { rejectErrors } from '@giraphql/plugin-dataloader';\n\nbuilder.queryField('user', (t) =>\n  t.field({\n    type: [User],\n    resolve: (parent, args, context) => {\n      const loader = User.getDataloader(context);\n\n      return rejectErrors(loader.loadMany(['123', '456']));\n    },\n  }),\n);\n```\n\n### (Optional) Adding loaders to context\n\nIf you want to make dataloaders accessible via the context object directly, there is some additional\nsetup required. Below are a few options for different ways you can load data from the context\nobject. You can determine which of these options works best for you or add you own helpers.\n\nFirst you'll need to update the types for your context type:\n\n```ts\nimport { LoadableRef } from '@giraphql/plugin-dataloader';\n\nexport interface ContextType {\n  userLoader: DataLoader<string, { id: number }>; // expose a specific loader\n  getLoader: <K, V>(ref: LoadableRef<K, V, ContextType>) => DataLoader<K, V>; // helper to get a loader from a ref\n  load: <K, V>(ref: LoadableRef<K, V, ContextType>, id: K) => Promise<V>; // helper for loading a single resource\n  loadMany: <K, V>(ref: LoadableRef<K, V, ContextType>, ids: K[]) => Promise<(Error | V)[]>; // helper for loading many\n  // other context fields\n}\n```\n\nnext you'll need to update your context factory function. The exact format of this depends on what\ngraphql server implementation you are using.\n\n```ts\nimport { initContextCache } from '@giraphql/core';\nimport { LoadableRef, rejectErrors } from '@giraphql/plugin-dataloader';\n\nexport const createContext = (req, res): ContextType => ({\n  // Adding this will prevent any issues if you server implementation\n  // copies or extends the context object before passing it to your resolvers\n  ...initContextCache(),\n\n  // using getters allows us to access the context object using `this`\n  get userLoader() {\n    return User.getDataloader(this);\n  },\n  get getLoader() {\n    return <K, V>(ref: LoadableRef<K, V, ContextType>) => ref.getDataloader(this);\n  },\n  get load() {\n    return <K, V>(ref: LoadableRef<K, V, ContextType>, id: K) => ref.getDataloader(this).load(id);\n  },\n  get loadMany() {\n    return <K, V>(ref: LoadableRef<K, V, ContextType>, ids: K[]) =>\n      rejectErrors(ref.getDataloader(this).loadMany(ids));\n  },\n});\n```\n\nNow you can use these helpers from your context object:\n\n```ts\nbuilder.queryFields((t) => ({\n  fromContext1: t.field({\n    type: User,\n    resolve: (root, args, { userLoader }) => userLoader.load('123'),\n  }),\n  fromContext2: t.field({\n    type: User,\n    resolve: (root, args, { getLoader }) => getLoader(User).load('456'),\n  }),\n  fromContext3: t.field({\n    type: User,\n    resolve: (root, args, { load }) => load(User, '789'),\n  }),\n  fromContext4: t.field({\n    type: [User],\n    resolve: (root, args, { loadMany }) => loadMany(User, ['123', '456']),\n  }),\n}));\n```\n","readmeFilename":"README.md","_id":"@giraphql/plugin-dataloader@2.7.1-alpha.0","_nodeVersion":"14.17.3","_npmVersion":"lerna/4.0.0/node@v14.17.3+x64 (darwin)","dist":{"integrity":"sha512-uOFnfjLOOnZIR65FOw4XAQmwCGJZDiZdKnBgxwCkK9Ef29qiWWdnWY72BZfee+Fxs2C8AzGZTH19D+UBotfIuw==","shasum":"2435bb5dfe58a68c76db0dc3e65a3a7458957b1f","tarball":"https://registry.npmjs.org/@giraphql/plugin-dataloader/-/plugin-dataloader-2.7.1-alpha.0.tgz","fileCount":61,"unpackedSize":124655,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJhB314CRA9TVsSAnZWagAA3k4P/3BPU2lxJXkQpfypyJ6B\nfCVzL6DZ6w8gpjeNKESI/EGkyzC2e0AtPsz7w6DJdzmwmKZzM5KtF3ce9sQp\nOFVZ1/HYyrdN/NKkbFu582qAGBubKNRs1k3iqvRJSRFq1v8/cuwcv8o7m0g6\nqFr5blTC1v6AOU2BZ+PmFdEKi+oYGqKxEPi5iZzTD4L2SPLvpCObw2d75O29\nFR8V9de0bp7a/d2wat5SN0EPIQBxbb/30q0FP5G/85LhKl0H8c3MeIhOly3w\nz5BoniVIl5mP7uTHfaNU5sEGpvqb26FfSz43orHobzqoo+sSLWuk8Qh/544+\nrbq8ZWyPMourDKU34n+MFCcbsFBdfQn6bol9hp91ePmg0m52gjNw5kpsTciI\nRjrtPT5iFt0AnFaVIlVx9jr1+sbkP0ABlcBNb/CsMAZdorFBZCjrwSAR1npI\n6q/H0PAIBqN3Tpkk7EdxYT2JNgA65+bNQKworKg5UcfHUQOKEK3tzZfP74v9\nTVwb9ubGSPKPbX78H3cWcOi8sn2O+t1eTKtQl1ffUnkCGy+koMWevMSkhFD+\ncywqjWv7PauUXtQYSArkmukqVkbxGomfR5R9mm5z9DxGNkFAu+gixMgp8eJg\nmp74CgR2Apj6p7g4FotRO50CSxpnzdoQeahFmON2F+4O8RRBYC32+8D+OVG1\nRLhv\r\n=wHI7\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIA3cQiKPiPrVL0noqEaI8El4Mrq6IAfKhSTVV1Lr7KUhAiEAnbRxAB/wa3whHA6xm2Ebbi8fMCe5GFgbcRwzoiYKpTM="}]},"_npmUser":{"name":"hayes","email":"michael@hayes.io"},"directories":{},"maintainers":[{"name":"hayes","email":"michael@hayes.io"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/plugin-dataloader_2.7.1-alpha.0_1627880824009_0.3240659089068889"},"_hasShrinkwrap":false},"2.8.0":{"name":"@giraphql/plugin-dataloader","version":"2.8.0","description":"A GiraphQL plugin for attaching dataloader to object types","main":"./lib/index.js","module":"./esm/index.js","scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"author":{"name":"Michael Hayes"},"license":"ISC","keywords":["giraphql","graphql","schema","typescript","dataloader"],"publishConfig":{"access":"public"},"peerDependencies":{"dataloader":"2","graphql":">=15.1.0"},"devDependencies":{"@giraphql/core":"^2.12.0","@giraphql/plugin-relay":"^2.12.0","apollo-server":"^2.25.2","dataloader":"^2.0.0","graphql-tag":"^2.12.5"},"gitHead":"c28e5daa0ddb0e240b97113013790586e858f49f","_id":"@giraphql/plugin-dataloader@2.8.0","_nodeVersion":"14.17.3","_npmVersion":"lerna/4.0.0/node@v14.17.3+x64 (darwin)","dist":{"integrity":"sha512-bF7xdePKYMCHVHZQcRpqqWXuk/QECrvfB5fQZEBID2t1PUCtheHjuQNC5JXrZg85NpiGbxtT5SQQorv0dQdctg==","shasum":"f2ca951fbc0921018d15d345e91b38e8defddb7e","tarball":"https://registry.npmjs.org/@giraphql/plugin-dataloader/-/plugin-dataloader-2.8.0.tgz","fileCount":60,"unpackedSize":124967,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJhCMA1CRA9TVsSAnZWagAAJM8P/0saoUlbD61HHbBIibCW\nfkCGnSSYAKfuqB8eeLlYky3tyE9HgbCgSBIgxAMQkwdqFF7G3tJvUZ0yRDxi\ni3doV3ZGJopMzo1V3Ep6vW4gOVik6gZ/rtv+qN/mnT/gcv6Wn69r0kEOtqqG\niebPdM3KmkYP2+ULoqrauABjYT/T759p1uOzysu0WBdksWnz2UJgYzx2qOwT\njxziIosYAsSDd88aDXO9bHaJZfj1MMVbonupCW6DurIlWV4mzIFr3EMIEjjb\nFPMsMLBbRmFVvhv/HQ1qGx5YFGXmYFohP7v4g8iVbH+r6QrVIHuiLm8Jw32c\nl9a4N8bjqB5ESThZ+dCmhEpylab2PI/oHIRRmdpE5xPyqhD8bvLjzLXeGks6\nH3T/NRssRnibSVClAX7XGAP5hg1y6MS6xD6xeqxS4FSCTu3SuUB0xan0qf0a\n4aznhIeJvxmJHSzp6nGM/7CmeWydicMMzQ/YY1Q0hw64j7fp0KCZS4wS6Pr+\nfDrc7Zx8ogMdi4rF8MyJqILww/29PLaS1MSm0AE2cgQgfruILxSnAWOdmXcZ\nr7q+i1l/kVCsNtGdZZsDybuazGxusczP0xUrRDjeAjGx6fqCuWadzBAKCfZW\n3X3fR/43oBE201rJTf9xoLKJlMkW+X3lFTy2MLdW4IZE75kejsY85Uh2uPDa\nSMkE\r\n=aVMC\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCpknSaLVir8EmQJq1c8yNhcDNwLaqYFkOQzpWQ2upmUgIgKnQlfQYsoa8wi2R8Vw8TrBBW4eIH+xFrZDaSaXJ6jVo="}]},"_npmUser":{"name":"hayes","email":"michael@hayes.io"},"directories":{},"maintainers":[{"name":"hayes","email":"michael@hayes.io"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/plugin-dataloader_2.8.0_1627963445257_0.06142581175809392"},"_hasShrinkwrap":false},"2.8.1":{"name":"@giraphql/plugin-dataloader","version":"2.8.1","description":"A GiraphQL plugin for attaching dataloader to object types","main":"./lib/index.js","module":"./esm/index.js","scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"author":{"name":"Michael Hayes"},"license":"ISC","keywords":["giraphql","graphql","schema","typescript","dataloader"],"publishConfig":{"access":"public"},"peerDependencies":{"dataloader":"2","graphql":">=15.1.0"},"devDependencies":{"@giraphql/core":"^2.12.0","@giraphql/plugin-relay":"^2.12.1","apollo-server":"^2.25.2","dataloader":"^2.0.0","graphql-tag":"^2.12.5"},"gitHead":"9061aace829ba9bea7a68eb77a350737844527c4","_id":"@giraphql/plugin-dataloader@2.8.1","_nodeVersion":"14.17.4","_npmVersion":"lerna/4.0.0/node@v14.17.4+x64 (darwin)","dist":{"integrity":"sha512-mR2QwMtxfqGZfzycvMjxMP8espocetD05PgJc+iEH56bFsYwBmt9Qe1hj+cyY9biwwonN+anZbd9smIOMagweg==","shasum":"56c6776eb811d18cc39280687e48e4ec9006b955","tarball":"https://registry.npmjs.org/@giraphql/plugin-dataloader/-/plugin-dataloader-2.8.1.tgz","fileCount":60,"unpackedSize":125064,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJhC2wdCRA9TVsSAnZWagAA3akP/jU0r5xN8Y5eOFWFWtxc\nlZD2E/xIRnBBcXVqgnNajw72xnW8Tbcam0aZeWCFZyklpf0mYXj6v11bjoE7\nmWFbpTCZAH3IPHtviyDH8xrdOLbqSi5vxSoRx40h4HlnsqREN7DQdGjdfTio\n1EfrcQedTefgibJCjweEcnhwekCZOTg3MZApvdl8RvAGlEDm1fsv+wPu07RV\n7PwETuYzMd+jYjDQQkb8BG+w/LKPGhvzIztyU4CJ9hg7JbUYPehd0/2OrYME\nDcioxeAVfCp3HahWpTNv5QNf5njiYKTaQLZNPEnv0Yd6zopA6O8TG8yApadj\niquTnBBANkYkYNPiOrHbi0ObDZMYUqwXtClH0WkieOUWywp0Suv8xP/pUEWA\nAkC7f3OiSjp3LU+MI1UnaLFZjbmxiobL+rxUmsFtTHlrwA6AY4OiCu0UQUp+\nZU/PolcENh9NbKfJB/suvKS/0uY4APlOucRTJWWZmjMWP3PLE2LCJx7U5Cjn\n3miGoxFY8cqWfwaqyE9rwcH0lK0653uScJ3GzpSr9xxLysgOvlhjCmvZ0Qcz\nZ4hDetOtT91quAe+eTDo32AXdjxdPR9SnRpr9eqHB8LYy3TWAG8i5IINtP2U\nk2BuSBD3LxSl6kGj5dM+0ArvwwfTLciMR6sWG1rbmPcyIdFlISfTHWZBTsJt\naaSz\r\n=qZ2c\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDaVzfxVKvpBBTs7nQpHBaQWKNbQgVyHWXYi8pyjmHmCwIhAJxwfOJDZuvjcLQ+B6j/sc7ivR2PFoBFaPJeilUN5FDM"}]},"_npmUser":{"name":"hayes","email":"michael@hayes.io"},"directories":{},"maintainers":[{"name":"hayes","email":"michael@hayes.io"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/plugin-dataloader_2.8.1_1628138525630_0.22087581920266053"},"_hasShrinkwrap":false},"2.9.0":{"name":"@giraphql/plugin-dataloader","version":"2.9.0","description":"A GiraphQL plugin for attaching dataloader to object types","main":"./lib/index.js","module":"./esm/index.js","author":{"name":"Michael Hayes"},"license":"ISC","keywords":["giraphql","graphql","schema","typescript","dataloader"],"publishConfig":{"access":"public"},"peerDependencies":{"dataloader":"2","graphql":">=15.1.0"},"devDependencies":{"@giraphql/core":"^2.13.0","@giraphql/plugin-relay":"^2.13.0","apollo-server":"^2.25.2","dataloader":"^2.0.0","graphql-tag":"^2.12.5"},"gitHead":"9dfe52f1975f41a111e01bf96a20033a914e2acc","scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"_resolved":"","_integrity":"","_from":"file:giraphql-plugin-dataloader-2.9.0.tgz","_id":"@giraphql/plugin-dataloader@2.9.0","_nodeVersion":"14.17.4","_npmVersion":"6.14.14","_npmUser":{"name":"hayes","email":"michael@hayes.io"},"dist":{"integrity":"sha512-8Zl5Dj6dvP+L3jJkxTFtERrRtaydnB/SpXizGiZ7uD7UOwqzcHwZIxSmdlbcKQK/wHo4hSiRTBfch8+MOP2wdA==","shasum":"408115403531914a6f20284b4ec162887be9feb4","tarball":"https://registry.npmjs.org/@giraphql/plugin-dataloader/-/plugin-dataloader-2.9.0.tgz","fileCount":11,"unpackedSize":30496,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJhC5AgCRA9TVsSAnZWagAA5agP/RxDX9m99np2tIEM1c5p\nlOVvBXRhz2WMEAmpqZMvZjpDl+W2UsK2P8/9tsquerIIVFkSFYkBjpStSRE7\nAxbLp1KrOUpAAeYEO5K6aQSxoZPfIanp0MEZq+Ir+mx0cAw4W2AVlqH2HusK\nyIYeoVcHzyM2vOdbg3gH1K9VlYdDtBNO4d9HXTre4/zYp0BfyZ50b4HuD7IB\nY9JO0NzwQRLczPASePUvUnKTPrYIprPnPM4i3DxXXXmQh7XzDVPk59LuvWeB\nZwPewD3c0eFN6JsWCp4y0RvWqoifcruUW1HO8psWwP5qM9pLnDfMvoBuRal7\na6UOVyT/9wg8nShf/wvy3/UjKN1lo6ajvrSU+VgtF24wu+OltFPG1SfumRAs\nyQNbM/5Nkl1IimVj8eDUbRBpUfU6v6nVbnZiKbXmM/ZVqiOED5S6vITE58vz\nA4MjqVoHHGAmVzM9jV0Cuu2LeVVNEM9ZtXhdnZOwYY91eyNtIgSuOlNK0BIX\nMYfokmNWXu8RDfsBkp9LHlwilQl4gmwsPrq253y4xGFONNdE3qxQJIcnH6k3\nTShF05PdiTzDllv4wmUjEavK5XEhRhaPSH1LNHcrQE68xedAdVKUHUiPb1ya\ntl/JlLamtrQEsj90qy+aHfRz7VXUzBluWJObuiKarnyU3/rEALxC+MuFQkgz\nlwxO\r\n=HSEx\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQD96U3vXqASKa2DN96GaU7Czicj02kXbktKdMvefTNkhAIhAPa5p1b1+njEUiMAupvUADDPUFt93+BBtbMiRD6Npf1+"}]},"directories":{},"maintainers":[{"name":"hayes","email":"michael@hayes.io"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/plugin-dataloader_2.9.0_1628147744206_0.923998475247338"},"_hasShrinkwrap":false},"2.9.1":{"name":"@giraphql/plugin-dataloader","version":"2.9.1","description":"A GiraphQL plugin for attaching dataloader to object types","main":"./lib/index.js","module":"./esm/index.js","author":{"name":"Michael Hayes"},"license":"ISC","keywords":["giraphql","graphql","schema","typescript","dataloader"],"publishConfig":{"access":"public"},"peerDependencies":{"dataloader":"2","graphql":">=15.1.0"},"devDependencies":{"@giraphql/core":"^2.13.1","@giraphql/plugin-relay":"^2.13.1","apollo-server":"^2.25.2","dataloader":"^2.0.0","graphql-tag":"^2.12.5"},"gitHead":"9dfe52f1975f41a111e01bf96a20033a914e2acc","scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"_resolved":"","_integrity":"","_from":"file:giraphql-plugin-dataloader-2.9.1.tgz","_id":"@giraphql/plugin-dataloader@2.9.1","_nodeVersion":"14.17.4","_npmVersion":"6.14.14","_npmUser":{"name":"hayes","email":"michael@hayes.io"},"dist":{"integrity":"sha512-Asxd/vxcqT6SaJUg8Snbxi9iKwbZq6nmvPRBwSLrhmh/nRFIzLD527QFgQYfbllcLIFGJFUy4HWPhiDWgQgBKA==","shasum":"39a1475e1214d3ee441b1bd5eaaa5a7f3e7681c4","tarball":"https://registry.npmjs.org/@giraphql/plugin-dataloader/-/plugin-dataloader-2.9.1.tgz","fileCount":60,"unpackedSize":136704,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJhC5HCCRA9TVsSAnZWagAAWO8P/Rgm5RuGs5egmoZNf/RH\neIQyyL5zQRs5toAIDu4mUaLa5XmbBl2FpjwOyCf+Ek4LmeZfB+32hdjmjBY5\nCa/Edhi3kvkvgEFrJEyji78blN00gqw2JaO5UWkpNPQBHimHBLnuIWnWW1fA\nUWtefCEUStWj2Jx/ggdMDfkdI3sVnOJBEIIz2cGi2YY53LoLI5qRFLU96uv5\n+3/oNh8lln2SJ5E8OAcVBh5qog/pjGTkbLHkA9H7E++lgPIrci7/Y5/VBBnR\nfpPDKt8RLvcQBR9HNe6LV0vmeR9FxJyTItvbzs9LwCCHl1T8gp9ka0ondKFU\n7FCOAetBhjlWkajj5dmHnJA7cn7tjXn6yoHUrCuDqBtFXSDu61aXb7xj7exe\nyq7DEMcpWRU2v5nD4MQUpfZhP9X7YdZ3vKlGpcl79sbrlez3flF7SzaKFM9N\n0YCuB2UAGO/pPi7LiGW3csec9o685ESXZcyAS0VUQAD/+ORxbO0mV6u8HYPD\nZkBln1Q/2IQFti0Mjws7wrMJvQGKp/E/GhI0D/LFpvsdNq24/bxImXc2+X7U\ncc5w5/hcaGiFQOWU7W51MkADCdpC7h25ummHXM6K4CoV3Sd2dVf6/jaB1dSb\n4AofgMFOZcGuIwj8Q8k4Qys331TeEecPPnRTETicN3cj+dVbDGtqtenl/LrV\nKgWa\r\n=VeQE\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQC03Id8YOYjRmwERQoeYlXy2I8+HxqExbdpYzzerRkeuAIgRCPLM5sSP3VxC2rA7g0+ZCMyqT1k8ff9+T1VFMD2n68="}]},"directories":{},"maintainers":[{"name":"hayes","email":"michael@hayes.io"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/plugin-dataloader_2.9.1_1628148162321_0.5136665813891821"},"_hasShrinkwrap":false},"0.0.0-preview-202177065":{"name":"@giraphql/plugin-dataloader","version":"0.0.0-preview-202177065","description":"A GiraphQL plugin for attaching dataloader to object types","main":"./lib/index.js","module":"./esm/index.js","exports":{"import":"./esm/index.js","require":"./lib/index.js"},"author":{"name":"Michael Hayes"},"license":"ISC","keywords":["giraphql","graphql","schema","typescript","dataloader"],"publishConfig":{"access":"public"},"peerDependencies":{"dataloader":"2","graphql":">=15.1.0"},"devDependencies":{"@giraphql/core":"^0.0.0-preview-202177065","@giraphql/plugin-relay":"^0.0.0-preview-202177065","apollo-server":"^2.25.2","dataloader":"^2.0.0","graphql-tag":"^2.12.5"},"gitHead":"9dfe52f1975f41a111e01bf96a20033a914e2acc","scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"_resolved":"","_integrity":"","_from":"file:giraphql-plugin-dataloader-0.0.0-preview-202177065.tgz","_id":"@giraphql/plugin-dataloader@0.0.0-preview-202177065","_nodeVersion":"14.17.4","_npmVersion":"6.14.14","dist":{"integrity":"sha512-CGjJjUppmkX8RJoj2dOpFuDpCjxIqusK5iKUqqI06yftJ86KK0XTyHRuc7ZVVod6AaU624Yd6o5D4pdEtIIgdA==","shasum":"81541f35cd1d434a71b78d6eb193fea6f077164e","tarball":"https://registry.npmjs.org/@giraphql/plugin-dataloader/-/plugin-dataloader-0.0.0-preview-202177065.tgz","fileCount":60,"unpackedSize":137171,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJhDc6mCRA9TVsSAnZWagAApvAP/jr8WRSwgio+GIA/Igt9\nvD9HnRyoNiB60MefZIRcWf/f+JvxWaxu8QA+JrXOW+IwhYbGOmgIQqladHRc\nxniuyKWiUI8H7tffz2kSV+TlcT8xfMasflKdy3ywzCTmXdsobzZjl/IfEszM\nIw3Fp71DBxPJU/mGGYGlXzX/uM1bi+BGxq3cJ4T9tc63qee+QGNQY4hukLXj\nxmT3mRyZfDbpjBhI3PJPIlJtVo4aXTm84ORjGZSr95ErON4KyONi8VS4lmJ0\n5lCrHhPE9+lJF5Sd1bNtgHLNou0EWPMiMJWXiNjfFO2cS7D8egrw2Ge8nCy9\nVfRGLy1F63NjKMal3Js16JxmpnjL2TxvDOfTgtCSapvgfUSWU+qf0pKvvAPq\niU5mv+oB+TgQG+0a0/JuxcX2qBMxBkOmk2HCF2W88Ezkfe/d1BELRn+O5qd7\nImf3/FTlA/SaS5GSgd/JkEqNW+8rwEd06xTnKTEiV57MkrkMdgbAsLLofVqr\n6cqgDvcZfIWsO0YJoXBPx8jNkPqiUVLMjT41PYscmEeSYY0mJlCwKbreJoeB\n9B1HRdXzZmzCpz1toH9WcKXC7+XkqKb7Xvq4CbgrRHWG4scnfZVz+g6XP0Wx\n9BCYc6rJlTF7zPaGOMtELr0y6dKnFn+PI/CBFIpSoRJPPDEeGvlgnAsVZxak\nvCsX\r\n=h9xh\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIC9Wm9FzJR/YM7CN4OBhO8Y/M8BDKF30bfeX+Ad4OlREAiAwk1dyhdAifhZHn9t3l4fY5QxeodfAfHxDVGOX2QuzRw=="}]},"_npmUser":{"name":"hayes","email":"michael@hayes.io"},"directories":{},"maintainers":[{"name":"hayes","email":"michael@hayes.io"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/plugin-dataloader_0.0.0-preview-202177065_1628294822156_0.30366485955487055"},"_hasShrinkwrap":false},"0.0.0-preview-20217701452":{"name":"@giraphql/plugin-dataloader","version":"0.0.0-preview-20217701452","description":"A GiraphQL plugin for attaching dataloader to object types","main":"./lib/index.js","module":"./esm/index.js","exports":{"import":"./esm/index.js","require":"./lib/index.js"},"author":{"name":"Michael Hayes"},"license":"ISC","keywords":["giraphql","graphql","schema","typescript","dataloader"],"publishConfig":{"access":"public"},"peerDependencies":{"dataloader":"2","graphql":">=15.1.0"},"devDependencies":{"@giraphql/core":"^0.0.0-preview-20217701452","@giraphql/plugin-relay":"^0.0.0-preview-20217701452","apollo-server":"^2.25.2","dataloader":"^2.0.0","graphql-tag":"^2.12.5"},"gitHead":"9dfe52f1975f41a111e01bf96a20033a914e2acc","scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"_resolved":"","_integrity":"","_from":"file:giraphql-plugin-dataloader-0.0.0-preview-20217701452.tgz","readme":"# Dataloader Plugin for GiraphQL\n\nThis plugin makes it easy to add fields and types that are loaded through a dataloader.\n\n## Usage\n\n### Install\n\nTo use the dataloader plugin you will need to install both the `dataloader` package and the\nvalidation plugin:\n\n```bash\nyarn add dataloader @giraphql/plugin-dataloader\n```\n\n### Setup\n\n```typescript\nimport DataloaderPlugin from '@giraphql/plugin-dataloader';\n\nconst builder = new SchemaBuilder({\n  plugins: [DataloaderPlugin],\n});\n```\n\n### loadable objects\n\nTo create an object type that can be loaded with a dataloader use the new `builder.loadableObject`\nmethod:\n\n```ts\nconst User = builder.loadableObject('User', {\n  // load will be called with ids of users that need to be loaded\n  // Note that the types for keys (and context if present) are required\n  load: (ids: string[], context: ContextType) => context.loadUsersById(ids),\n  fields: (t) => ({\n    id: t.exposeID('id', {}),\n    username: t.string({\n      // the shape of parent will be inferred from `loadUsersById()` above\n      resolve: (parent) => parent.username,\n    }),\n  }),\n});\n```\n\nWhen defining fields that return `User`s, you will now be able to return either a `string` (based in\nids param of `load`), or a User object (type based on the return type of `loadUsersById`).\n\n```ts\nbuilder.queryType({\n  fields: (t) => ({\n    user: t.field({\n      type: User,\n      args: {\n        id: t.arg.string({ required: true }),\n      },\n      // Here we can just return the ID directly rather than loading the user ourselves\n      resolve: (root, args) => args.id,\n    }),\n    currentUser: t.field({\n      type: User,\n      // If we already have the user, we use it, and the dataloader will not be called\n      resolve: (root, args, context) => context.currentUser,\n    }),\n    users: t.field({\n      type: [User],\n      args: {\n        ids: t.arg.stringList({ required: true }),\n      },\n      // Mixing ids and user objects also works\n      resolve: (_root, args, context) => [...args.ids, context.CurrentUser],\n    }),\n  }),\n});\n```\n\nGiraphQL will detect when a resolver returns `string`, `number`, or `bigint` (typescript will\nconstrain the allowed types to whatever is expected by the load function). If a resolver returns an\nobject instead, GiraphQL knows it can skip the dataloader for that object.\n\n### loadable fields\n\nIn some cases you may need more granular dataloaders. To handle these cases there is a new\n`t.loadable` method for defining fields with their own dataloaders.\n\n```ts\n// Normal object that the fields below will load\ninterface PostShape {\n  id: string;\n  title: string;\n  content: string;\n}\n\nconst Post = builder.objectRef<PostShape>('Post').implement({\n  fields: (t) => ({\n    id: t.exposeID('id', {}),\n    title: t.exposeString('title', {}),\n    content: t.exposeString('title', {}),\n  }),\n});\n\n// Loading a single Post\nbuilder.objectField(User, 'latestPost', (t) =>\n  t.loadable({\n    type: Post,\n    // will be called with ids of latest posts for all users in query\n    load: (ids: number[], context) => context.loadPosts(ids),\n    resolve: (user, args) => user.lastPostID,\n  }),\n);\n// Loading multiple Posts\nbuilder.objectField(User, 'posts', (t) =>\n  t.loadable({\n    type: [Post],\n    // will be called with ids of posts loaded for all users in query\n    load: (ids: number[], context) => context.loadPosts(ids),\n    resolve: (user, args) => user.postIDs,\n  }),\n);\n```\n\n### dataloader options\n\nYou can provide additional options for your dataloaders using `loaderOptions`.\n\n```ts\nconst User = builder.loadableObject('User', {\n  loaderOptions: { maxBatchSize: 20 },\n  load: (ids: string[], context: ContextType) => context.loadUsersById(ids),\n  fields: (t) => ({ id: t.exposeID('id', {}) }),\n});\n\nbuilder.objectField(User, 'posts', (t) =>\n  t.loadable({\n    type: [Post],\n    loaderOptions: { maxBatchSize: 20 },\n    load: (ids: number[], context) => context.loadPosts(ids),\n    resolve: (user, args) => user.postIDs,\n  }),\n);\n```\n\nSee [dataloader docs](https://github.com/graphql/dataloader#api) for all available options.\n\n### Manually using dataloader\n\nDataloaders for \"loadable\" objects can be accessed via their ref by passing in the context object\nfor the current request. dataloaders are not shared across requests, so we need the context to get\nthe correct dataloader for the current request:\n\n```ts\n// create loadable object\nconst User = builder.loadableObject('User', {\n  load: (ids: string[], context: ContextType) => context.loadUsersById(ids),\n  fields: (t) => ({\n    id: t.exposeID('id', {}),\n  }),\n});\n\nbuilder.queryField('user', (t) =>\n  t.field({\n    type: User,\n    resolve: (parent, args, context) => {\n      // get data loader for User type\n      const loader = User.getDataloader(context);\n\n      // manually load a user\n      return loader.load('123');\n    },\n  }),\n);\n```\n\n### Errors\n\nCalling dataloader.loadMany will resolve to a value like `(Type | Error)[]`. Your `load` function\nmay also return results in that format if your loader can have parital failures. GraphQL does not\nhave special handling for Error objects. Instead GiraphQL will map these results to something like\n`(Type | Promise<Type>)[]` where Errors are replaced with promises that will be rejected. This\nallows the normal graphql resolver flow to correctly handle these errors.\n\nIf you are using the `loadMany` method from a dataloader manually, you can apply the same mapping\nusing the `rejectErrors` helper:\n\n```ts\nimport { rejectErrors } from '@giraphql/plugin-dataloader';\n\nbuilder.queryField('user', (t) =>\n  t.field({\n    type: [User],\n    resolve: (parent, args, context) => {\n      const loader = User.getDataloader(context);\n\n      return rejectErrors(loader.loadMany(['123', '456']));\n    },\n  }),\n);\n```\n\n### (Optional) Adding loaders to context\n\nIf you want to make dataloaders accessible via the context object directly, there is some additional\nsetup required. Below are a few options for different ways you can load data from the context\nobject. You can determine which of these options works best for you or add you own helpers.\n\nFirst you'll need to update the types for your context type:\n\n```ts\nimport { LoadableRef } from '@giraphql/plugin-dataloader';\n\nexport interface ContextType {\n  userLoader: DataLoader<string, { id: number }>; // expose a specific loader\n  getLoader: <K, V>(ref: LoadableRef<K, V, ContextType>) => DataLoader<K, V>; // helper to get a loader from a ref\n  load: <K, V>(ref: LoadableRef<K, V, ContextType>, id: K) => Promise<V>; // helper for loading a single resource\n  loadMany: <K, V>(ref: LoadableRef<K, V, ContextType>, ids: K[]) => Promise<(Error | V)[]>; // helper for loading many\n  // other context fields\n}\n```\n\nnext you'll need to update your context factory function. The exact format of this depends on what\ngraphql server implementation you are using.\n\n```ts\nimport { initContextCache } from '@giraphql/core';\nimport { LoadableRef, rejectErrors } from '@giraphql/plugin-dataloader';\n\nexport const createContext = (req, res): ContextType => ({\n  // Adding this will prevent any issues if you server implementation\n  // copies or extends the context object before passing it to your resolvers\n  ...initContextCache(),\n\n  // using getters allows us to access the context object using `this`\n  get userLoader() {\n    return User.getDataloader(this);\n  },\n  get getLoader() {\n    return <K, V>(ref: LoadableRef<K, V, ContextType>) => ref.getDataloader(this);\n  },\n  get load() {\n    return <K, V>(ref: LoadableRef<K, V, ContextType>, id: K) => ref.getDataloader(this).load(id);\n  },\n  get loadMany() {\n    return <K, V>(ref: LoadableRef<K, V, ContextType>, ids: K[]) =>\n      rejectErrors(ref.getDataloader(this).loadMany(ids));\n  },\n});\n```\n\nNow you can use these helpers from your context object:\n\n```ts\nbuilder.queryFields((t) => ({\n  fromContext1: t.field({\n    type: User,\n    resolve: (root, args, { userLoader }) => userLoader.load('123'),\n  }),\n  fromContext2: t.field({\n    type: User,\n    resolve: (root, args, { getLoader }) => getLoader(User).load('456'),\n  }),\n  fromContext3: t.field({\n    type: User,\n    resolve: (root, args, { load }) => load(User, '789'),\n  }),\n  fromContext4: t.field({\n    type: [User],\n    resolve: (root, args, { loadMany }) => loadMany(User, ['123', '456']),\n  }),\n}));\n```\n","readmeFilename":"README.md","_id":"@giraphql/plugin-dataloader@0.0.0-preview-20217701452","_nodeVersion":"14.17.4","_npmVersion":"6.14.14","dist":{"integrity":"sha512-8Ov2FHQPuI1lH1hNblF9KzPB1BAI7FRyCGenQbzKamjkQbBz4pYAekzYBgoL1Lp2gqrV7ltBxgPBwlwuE9uk7g==","shasum":"4e22b67fcbea265c9ecf1e9a54cb053937dcf4e4","tarball":"https://registry.npmjs.org/@giraphql/plugin-dataloader/-/plugin-dataloader-0.0.0-preview-20217701452.tgz","fileCount":60,"unpackedSize":137179,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJhDdCKCRA9TVsSAnZWagAAHrMP/2pcfmv7joBr3GLOe1Ab\nmuaMQ/uJeI5ePgjfk+c5SGklLOYsQGnmVo0T3hrpt00r2BX/fsTvdSrr9t22\nrDKRSP+bf7Fj6LwK93VcwMk6YMh6Z1mpUfefpB9q12Xt8bJmQuwSXo3hXWTF\nbXQyxZmzAa2zOjuSZruXFnUso0g0LmvD5ye27Rcq7ChIgNpTVUHl/M6GvCJG\nsLnHCOSkx8CavDcpoF+GFwS7akNA2j0EfVHKylIZK0u7RsBOhOibc9r2lrde\nqg/PLE6n35MGjSKufdX/epSldfjwkVXvvo+j9hjAeFtrkJ9lMAoHtROVMM0K\npiHk1GhctQDqdbZXxANArqfyuZQPkCpR9eIbIK8/mmREuoSZt4MBtDbbpWuL\nF17BBZ5pjzMLySkEtmFy5aw6QdgKMtfBbEjR8LmoOzL6XGAvcbKt+YpeS8d3\nAGjJsvdTqzm0xdSHOlIAnAcVCdBeBCldr9wiydr/hKCxMTI6NEz4fvEXLr/w\n62VA4DDrab0Glq+giwbccFk4PI2buevFhbc4INYAVman2Kfke2dYPWSzW60u\nz0/4Bnl4gn+DD8RkHs7jC4rWpfL6drtCtB5Kq2BBMgfOOx40FZMrdGtPvGEl\ny6fpMMN0f+hzFNTygXqnnczb07Tu/iAnVn7tq0dziXgYOttYQwsZMoHeBHHA\nqgWc\r\n=MCgr\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQD5SJxYbqoDG+OLZn6o8S3tQsTsGRqPR0uV2G7O3rCAhQIgPsL3oQerlnXqYuTsv/pBpul2HKful7t8DZZHVMJn6uw="}]},"_npmUser":{"name":"hayes","email":"michael@hayes.io"},"directories":{},"maintainers":[{"name":"hayes","email":"michael@hayes.io"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/plugin-dataloader_0.0.0-preview-20217701452_1628295306003_0.915261723479841"},"_hasShrinkwrap":false},"2.9.2":{"name":"@giraphql/plugin-dataloader","version":"2.9.2","description":"A GiraphQL plugin for attaching dataloader to object types","main":"./lib/index.js","module":"./esm/index.js","author":{"name":"Michael Hayes"},"license":"ISC","keywords":["giraphql","graphql","schema","typescript","dataloader"],"publishConfig":{"access":"public"},"peerDependencies":{"dataloader":"2","graphql":">=15.1.0"},"devDependencies":{"@giraphql/core":"^2.13.2","@giraphql/plugin-relay":"^2.13.2","apollo-server":"^2.25.2","dataloader":"^2.0.0","graphql-tag":"^2.12.5"},"gitHead":"9dfe52f1975f41a111e01bf96a20033a914e2acc","scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"_resolved":"","_integrity":"","_from":"file:giraphql-plugin-dataloader-2.9.2.tgz","_id":"@giraphql/plugin-dataloader@2.9.2","_nodeVersion":"14.17.4","_npmVersion":"6.14.14","_npmUser":{"name":"hayes","email":"michael@hayes.io"},"dist":{"integrity":"sha512-nGIXd4wY/LZjltAznlf7Oc1DaqXN5i0DUSQmhuVb43auzFHBbjbG5c/T4mRb5jA8YhghB8AT2M/ya3/VDHAeXA==","shasum":"6e9d55426aa1827f813c3801c2dbf1fe77ff39df","tarball":"https://registry.npmjs.org/@giraphql/plugin-dataloader/-/plugin-dataloader-2.9.2.tgz","fileCount":60,"unpackedSize":136768,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJhDdCiCRA9TVsSAnZWagAAHZUP/iBm+Y9JmJOmj3+mKcjo\n8nnChiyXYHxrOB0o4oAgfrdWaoADdiFHqg5BKsHdmEcVQM227FJ2ErGWMQp5\n6UI6bveP9s3gql3DNTRNZidoJ59/xs+FazlqP0zXALGn78Yhx+rRXGl181I5\niIAM3gty2HoPYxOvIOFZzN9e5MS86n9RN8k06biAv76aBLZejx4C/WmARd8s\nRY96sIHpd2BuBLhGAwl8Fjy+3NB4Z33tjOa20VuPkbGduRTbO5ZQSSDNtasd\n93BdWHCTo/DSjhBsyljuvCF36sBYNgZt0a+6E0R9Faor/wN7I6GDwtFI/2xk\n2D9oBRtS8y352m9ZLNqdWPbhgvSV2AzqrQu1t/+Xyyo4xKeMzkdxA7O1X0jL\nFPVmNWSCI4uZcyLzrwuO9Rd+QfHrpXQ/KjtXQImexaETT3egzTLvkU6z4MZJ\nX5N506+P3D3ZPf28uV06nYTxHU+pBbNFPEO8YUZ+ynOozLMVcnj6JVV4gDYv\njHhEJrKcWLfI5Z2p1O7XJABxPH4AJEUh5tVQ24aO9HMa1W6VKaLjrrOVcQBk\nuV+dwzatawy0APFBI3N6cox4mORgZnH7LmqfTl6SM6O2glM0h/tTk8379L5k\nM5Cwv0ZrMG801vX0Lxz46s8qUahyQOllJI/Jls9sExn7qmmSjXdvHJZ3Gcv/\ny1qm\r\n=LC0n\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDYroOCeofmUc/ts166cQxT9wFcczuFnSAXdp958RyhygIgAXyNGr4rWW9gRACzOwq4VVKM2j86Ovm2tl7HDwmiDeE="}]},"directories":{},"maintainers":[{"name":"hayes","email":"michael@hayes.io"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/plugin-dataloader_2.9.2_1628295330202_0.14561997364499102"},"_hasShrinkwrap":false},"0.0.0-preview-20217752147":{"name":"@giraphql/plugin-dataloader","version":"0.0.0-preview-20217752147","description":"A GiraphQL plugin for attaching dataloader to object types","main":"./lib/index.js","module":"./esm/index.js","exports":{"import":"./esm/index.js","require":"./lib/index.js"},"author":{"name":"Michael Hayes"},"license":"ISC","keywords":["giraphql","graphql","schema","typescript","dataloader"],"publishConfig":{"access":"public"},"peerDependencies":{"dataloader":"2","graphql":">=15.1.0"},"devDependencies":{"@giraphql/core":"^0.0.0-preview-20217752147","@giraphql/plugin-relay":"^0.0.0-preview-20217752147","apollo-server":"^2.25.2","dataloader":"^2.0.0","graphql-tag":"^2.12.5"},"gitHead":"9dfe52f1975f41a111e01bf96a20033a914e2acc","scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"_resolved":"","_integrity":"","_from":"file:giraphql-plugin-dataloader-0.0.0-preview-20217752147.tgz","readme":"# Dataloader Plugin for GiraphQL\n\nThis plugin makes it easy to add fields and types that are loaded through a dataloader.\n\n## Usage\n\n### Install\n\nTo use the dataloader plugin you will need to install both the `dataloader` package and the\nvalidation plugin:\n\n```bash\nyarn add dataloader @giraphql/plugin-dataloader\n```\n\n### Setup\n\n```typescript\nimport DataloaderPlugin from '@giraphql/plugin-dataloader';\n\nconst builder = new SchemaBuilder({\n  plugins: [DataloaderPlugin],\n});\n```\n\n### loadable objects\n\nTo create an object type that can be loaded with a dataloader use the new `builder.loadableObject`\nmethod:\n\n```ts\nconst User = builder.loadableObject('User', {\n  // load will be called with ids of users that need to be loaded\n  // Note that the types for keys (and context if present) are required\n  load: (ids: string[], context: ContextType) => context.loadUsersById(ids),\n  fields: (t) => ({\n    id: t.exposeID('id', {}),\n    username: t.string({\n      // the shape of parent will be inferred from `loadUsersById()` above\n      resolve: (parent) => parent.username,\n    }),\n  }),\n});\n```\n\nWhen defining fields that return `User`s, you will now be able to return either a `string` (based in\nids param of `load`), or a User object (type based on the return type of `loadUsersById`).\n\n```ts\nbuilder.queryType({\n  fields: (t) => ({\n    user: t.field({\n      type: User,\n      args: {\n        id: t.arg.string({ required: true }),\n      },\n      // Here we can just return the ID directly rather than loading the user ourselves\n      resolve: (root, args) => args.id,\n    }),\n    currentUser: t.field({\n      type: User,\n      // If we already have the user, we use it, and the dataloader will not be called\n      resolve: (root, args, context) => context.currentUser,\n    }),\n    users: t.field({\n      type: [User],\n      args: {\n        ids: t.arg.stringList({ required: true }),\n      },\n      // Mixing ids and user objects also works\n      resolve: (_root, args, context) => [...args.ids, context.CurrentUser],\n    }),\n  }),\n});\n```\n\nGiraphQL will detect when a resolver returns `string`, `number`, or `bigint` (typescript will\nconstrain the allowed types to whatever is expected by the load function). If a resolver returns an\nobject instead, GiraphQL knows it can skip the dataloader for that object.\n\n### loadable fields\n\nIn some cases you may need more granular dataloaders. To handle these cases there is a new\n`t.loadable` method for defining fields with their own dataloaders.\n\n```ts\n// Normal object that the fields below will load\ninterface PostShape {\n  id: string;\n  title: string;\n  content: string;\n}\n\nconst Post = builder.objectRef<PostShape>('Post').implement({\n  fields: (t) => ({\n    id: t.exposeID('id', {}),\n    title: t.exposeString('title', {}),\n    content: t.exposeString('title', {}),\n  }),\n});\n\n// Loading a single Post\nbuilder.objectField(User, 'latestPost', (t) =>\n  t.loadable({\n    type: Post,\n    // will be called with ids of latest posts for all users in query\n    load: (ids: number[], context) => context.loadPosts(ids),\n    resolve: (user, args) => user.lastPostID,\n  }),\n);\n// Loading multiple Posts\nbuilder.objectField(User, 'posts', (t) =>\n  t.loadable({\n    type: [Post],\n    // will be called with ids of posts loaded for all users in query\n    load: (ids: number[], context) => context.loadPosts(ids),\n    resolve: (user, args) => user.postIDs,\n  }),\n);\n```\n\n### dataloader options\n\nYou can provide additional options for your dataloaders using `loaderOptions`.\n\n```ts\nconst User = builder.loadableObject('User', {\n  loaderOptions: { maxBatchSize: 20 },\n  load: (ids: string[], context: ContextType) => context.loadUsersById(ids),\n  fields: (t) => ({ id: t.exposeID('id', {}) }),\n});\n\nbuilder.objectField(User, 'posts', (t) =>\n  t.loadable({\n    type: [Post],\n    loaderOptions: { maxBatchSize: 20 },\n    load: (ids: number[], context) => context.loadPosts(ids),\n    resolve: (user, args) => user.postIDs,\n  }),\n);\n```\n\nSee [dataloader docs](https://github.com/graphql/dataloader#api) for all available options.\n\n### Manually using dataloader\n\nDataloaders for \"loadable\" objects can be accessed via their ref by passing in the context object\nfor the current request. dataloaders are not shared across requests, so we need the context to get\nthe correct dataloader for the current request:\n\n```ts\n// create loadable object\nconst User = builder.loadableObject('User', {\n  load: (ids: string[], context: ContextType) => context.loadUsersById(ids),\n  fields: (t) => ({\n    id: t.exposeID('id', {}),\n  }),\n});\n\nbuilder.queryField('user', (t) =>\n  t.field({\n    type: User,\n    resolve: (parent, args, context) => {\n      // get data loader for User type\n      const loader = User.getDataloader(context);\n\n      // manually load a user\n      return loader.load('123');\n    },\n  }),\n);\n```\n\n### Errors\n\nCalling dataloader.loadMany will resolve to a value like `(Type | Error)[]`. Your `load` function\nmay also return results in that format if your loader can have parital failures. GraphQL does not\nhave special handling for Error objects. Instead GiraphQL will map these results to something like\n`(Type | Promise<Type>)[]` where Errors are replaced with promises that will be rejected. This\nallows the normal graphql resolver flow to correctly handle these errors.\n\nIf you are using the `loadMany` method from a dataloader manually, you can apply the same mapping\nusing the `rejectErrors` helper:\n\n```ts\nimport { rejectErrors } from '@giraphql/plugin-dataloader';\n\nbuilder.queryField('user', (t) =>\n  t.field({\n    type: [User],\n    resolve: (parent, args, context) => {\n      const loader = User.getDataloader(context);\n\n      return rejectErrors(loader.loadMany(['123', '456']));\n    },\n  }),\n);\n```\n\n### (Optional) Adding loaders to context\n\nIf you want to make dataloaders accessible via the context object directly, there is some additional\nsetup required. Below are a few options for different ways you can load data from the context\nobject. You can determine which of these options works best for you or add you own helpers.\n\nFirst you'll need to update the types for your context type:\n\n```ts\nimport { LoadableRef } from '@giraphql/plugin-dataloader';\n\nexport interface ContextType {\n  userLoader: DataLoader<string, { id: number }>; // expose a specific loader\n  getLoader: <K, V>(ref: LoadableRef<K, V, ContextType>) => DataLoader<K, V>; // helper to get a loader from a ref\n  load: <K, V>(ref: LoadableRef<K, V, ContextType>, id: K) => Promise<V>; // helper for loading a single resource\n  loadMany: <K, V>(ref: LoadableRef<K, V, ContextType>, ids: K[]) => Promise<(Error | V)[]>; // helper for loading many\n  // other context fields\n}\n```\n\nnext you'll need to update your context factory function. The exact format of this depends on what\ngraphql server implementation you are using.\n\n```ts\nimport { initContextCache } from '@giraphql/core';\nimport { LoadableRef, rejectErrors } from '@giraphql/plugin-dataloader';\n\nexport const createContext = (req, res): ContextType => ({\n  // Adding this will prevent any issues if you server implementation\n  // copies or extends the context object before passing it to your resolvers\n  ...initContextCache(),\n\n  // using getters allows us to access the context object using `this`\n  get userLoader() {\n    return User.getDataloader(this);\n  },\n  get getLoader() {\n    return <K, V>(ref: LoadableRef<K, V, ContextType>) => ref.getDataloader(this);\n  },\n  get load() {\n    return <K, V>(ref: LoadableRef<K, V, ContextType>, id: K) => ref.getDataloader(this).load(id);\n  },\n  get loadMany() {\n    return <K, V>(ref: LoadableRef<K, V, ContextType>, ids: K[]) =>\n      rejectErrors(ref.getDataloader(this).loadMany(ids));\n  },\n});\n```\n\nNow you can use these helpers from your context object:\n\n```ts\nbuilder.queryFields((t) => ({\n  fromContext1: t.field({\n    type: User,\n    resolve: (root, args, { userLoader }) => userLoader.load('123'),\n  }),\n  fromContext2: t.field({\n    type: User,\n    resolve: (root, args, { getLoader }) => getLoader(User).load('456'),\n  }),\n  fromContext3: t.field({\n    type: User,\n    resolve: (root, args, { load }) => load(User, '789'),\n  }),\n  fromContext4: t.field({\n    type: [User],\n    resolve: (root, args, { loadMany }) => loadMany(User, ['123', '456']),\n  }),\n}));\n```\n","readmeFilename":"README.md","_id":"@giraphql/plugin-dataloader@0.0.0-preview-20217752147","_nodeVersion":"14.17.4","_npmVersion":"6.14.14","dist":{"integrity":"sha512-ar4BlSq+4w1IG0Fe42v06hX6pr23cF1xl/lRtuFIGyMpGLPDgAO9TQVvlbwXL92e/MiItvjWnSrjo/WSZ/pSXQ==","shasum":"aa19ab89fa540c9b1a985b5d0b920365d66a2d63","tarball":"https://registry.npmjs.org/@giraphql/plugin-dataloader/-/plugin-dataloader-0.0.0-preview-20217752147.tgz","fileCount":38,"unpackedSize":113876,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJhDhh5CRA9TVsSAnZWagAAGD0P/3vgUqrM8zXg94NdmObf\nwKazOBzNN+ncpwK6XDvIA3JzzAoefYk01k3TdcgcNgDfUbK4JXoMnGsjSR6p\nhHwrHxqOZFjKy0ey6PNNDu8Srf0m59szA4RpJDKWHJ0tOSLuFGRD6AG8za5y\nOCe9staukFw30JQ+w6EMjLCKWVTczODIDdCLEqprdsqO/PTfL3ire5nBo2Pm\nTqj/Y6QKbtIBUmZR1ZutOPd3UCCqA/+b3S7H4vmXRPDoF1r7yLG2K/95+xAS\nZrDLbkhY3K1xoxVfnrCcdmtVc8BqItIAaoQgxAwCPUTm3dAqk0praeSrh0VQ\n0DnNHoXtyc8vsf9Mi6kFEIOSLmN3BQIaseJ8kHkmaHZu4lqChClBJ0sCxdNL\n6a8bm58tTp9QDklX2iPZXLrrRjLqF7r6lD0hmJI7lxlhQ/wxrsBKqWw4YHY7\neADdaFom+8y8NoPbU09bsgzk0vXMqzMFbUZ63OzYK7OVQ0deUnRVHUyNrf+f\nF8A4RwHf3zEX1ewUQV4LMYtunvFdc+cZNOew2MLHa2OQTqFVqO6Vzu9spkgB\ne5E3k3nFMSxVGmwnchxYe5c4ul9dcoMQbu5Qsve0LpKHBq0ahXTgVnCDsZD5\nSwTrsw4NW4S+k8AT/Zh9c9HH2X+nUAEJ4i/sgCRhJo8Di11CpkSTcF70g+jp\naOW9\r\n=mBdZ\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQC/U9pssvWgnOLbiytphTzpbtAxxXZY66tGBtNvSIDZ3AIgewuhPto/yWGuawZhw15cMBuCPEYRpmKw/T9hGhOrQZA="}]},"_npmUser":{"name":"hayes","email":"michael@hayes.io"},"directories":{},"maintainers":[{"name":"hayes","email":"michael@hayes.io"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/plugin-dataloader_0.0.0-preview-20217752147_1628313721011_0.36294393669110336"},"_hasShrinkwrap":false},"0.0.0-preview-20217753333":{"name":"@giraphql/plugin-dataloader","version":"0.0.0-preview-20217753333","description":"A GiraphQL plugin for attaching dataloader to object types","main":"./lib/index.js","module":"./esm/index.js","exports":{"import":"./esm/index.js","require":"./lib/index.js"},"author":{"name":"Michael Hayes"},"license":"ISC","keywords":["giraphql","graphql","schema","typescript","dataloader"],"publishConfig":{"access":"public"},"peerDependencies":{"dataloader":"2","graphql":">=15.1.0"},"devDependencies":{"@giraphql/core":"^0.0.0-preview-20217753333","@giraphql/plugin-relay":"^0.0.0-preview-20217753333","apollo-server":"^2.25.2","dataloader":"^2.0.0","graphql-tag":"^2.12.5"},"gitHead":"9dfe52f1975f41a111e01bf96a20033a914e2acc","scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"_resolved":"","_integrity":"","_from":"file:giraphql-plugin-dataloader-0.0.0-preview-20217753333.tgz","readme":"# Dataloader Plugin for GiraphQL\n\nThis plugin makes it easy to add fields and types that are loaded through a dataloader.\n\n## Usage\n\n### Install\n\nTo use the dataloader plugin you will need to install both the `dataloader` package and the\nvalidation plugin:\n\n```bash\nyarn add dataloader @giraphql/plugin-dataloader\n```\n\n### Setup\n\n```typescript\nimport DataloaderPlugin from '@giraphql/plugin-dataloader';\n\nconst builder = new SchemaBuilder({\n  plugins: [DataloaderPlugin],\n});\n```\n\n### loadable objects\n\nTo create an object type that can be loaded with a dataloader use the new `builder.loadableObject`\nmethod:\n\n```ts\nconst User = builder.loadableObject('User', {\n  // load will be called with ids of users that need to be loaded\n  // Note that the types for keys (and context if present) are required\n  load: (ids: string[], context: ContextType) => context.loadUsersById(ids),\n  fields: (t) => ({\n    id: t.exposeID('id', {}),\n    username: t.string({\n      // the shape of parent will be inferred from `loadUsersById()` above\n      resolve: (parent) => parent.username,\n    }),\n  }),\n});\n```\n\nWhen defining fields that return `User`s, you will now be able to return either a `string` (based in\nids param of `load`), or a User object (type based on the return type of `loadUsersById`).\n\n```ts\nbuilder.queryType({\n  fields: (t) => ({\n    user: t.field({\n      type: User,\n      args: {\n        id: t.arg.string({ required: true }),\n      },\n      // Here we can just return the ID directly rather than loading the user ourselves\n      resolve: (root, args) => args.id,\n    }),\n    currentUser: t.field({\n      type: User,\n      // If we already have the user, we use it, and the dataloader will not be called\n      resolve: (root, args, context) => context.currentUser,\n    }),\n    users: t.field({\n      type: [User],\n      args: {\n        ids: t.arg.stringList({ required: true }),\n      },\n      // Mixing ids and user objects also works\n      resolve: (_root, args, context) => [...args.ids, context.CurrentUser],\n    }),\n  }),\n});\n```\n\nGiraphQL will detect when a resolver returns `string`, `number`, or `bigint` (typescript will\nconstrain the allowed types to whatever is expected by the load function). If a resolver returns an\nobject instead, GiraphQL knows it can skip the dataloader for that object.\n\n### loadable fields\n\nIn some cases you may need more granular dataloaders. To handle these cases there is a new\n`t.loadable` method for defining fields with their own dataloaders.\n\n```ts\n// Normal object that the fields below will load\ninterface PostShape {\n  id: string;\n  title: string;\n  content: string;\n}\n\nconst Post = builder.objectRef<PostShape>('Post').implement({\n  fields: (t) => ({\n    id: t.exposeID('id', {}),\n    title: t.exposeString('title', {}),\n    content: t.exposeString('title', {}),\n  }),\n});\n\n// Loading a single Post\nbuilder.objectField(User, 'latestPost', (t) =>\n  t.loadable({\n    type: Post,\n    // will be called with ids of latest posts for all users in query\n    load: (ids: number[], context) => context.loadPosts(ids),\n    resolve: (user, args) => user.lastPostID,\n  }),\n);\n// Loading multiple Posts\nbuilder.objectField(User, 'posts', (t) =>\n  t.loadable({\n    type: [Post],\n    // will be called with ids of posts loaded for all users in query\n    load: (ids: number[], context) => context.loadPosts(ids),\n    resolve: (user, args) => user.postIDs,\n  }),\n);\n```\n\n### dataloader options\n\nYou can provide additional options for your dataloaders using `loaderOptions`.\n\n```ts\nconst User = builder.loadableObject('User', {\n  loaderOptions: { maxBatchSize: 20 },\n  load: (ids: string[], context: ContextType) => context.loadUsersById(ids),\n  fields: (t) => ({ id: t.exposeID('id', {}) }),\n});\n\nbuilder.objectField(User, 'posts', (t) =>\n  t.loadable({\n    type: [Post],\n    loaderOptions: { maxBatchSize: 20 },\n    load: (ids: number[], context) => context.loadPosts(ids),\n    resolve: (user, args) => user.postIDs,\n  }),\n);\n```\n\nSee [dataloader docs](https://github.com/graphql/dataloader#api) for all available options.\n\n### Manually using dataloader\n\nDataloaders for \"loadable\" objects can be accessed via their ref by passing in the context object\nfor the current request. dataloaders are not shared across requests, so we need the context to get\nthe correct dataloader for the current request:\n\n```ts\n// create loadable object\nconst User = builder.loadableObject('User', {\n  load: (ids: string[], context: ContextType) => context.loadUsersById(ids),\n  fields: (t) => ({\n    id: t.exposeID('id', {}),\n  }),\n});\n\nbuilder.queryField('user', (t) =>\n  t.field({\n    type: User,\n    resolve: (parent, args, context) => {\n      // get data loader for User type\n      const loader = User.getDataloader(context);\n\n      // manually load a user\n      return loader.load('123');\n    },\n  }),\n);\n```\n\n### Errors\n\nCalling dataloader.loadMany will resolve to a value like `(Type | Error)[]`. Your `load` function\nmay also return results in that format if your loader can have parital failures. GraphQL does not\nhave special handling for Error objects. Instead GiraphQL will map these results to something like\n`(Type | Promise<Type>)[]` where Errors are replaced with promises that will be rejected. This\nallows the normal graphql resolver flow to correctly handle these errors.\n\nIf you are using the `loadMany` method from a dataloader manually, you can apply the same mapping\nusing the `rejectErrors` helper:\n\n```ts\nimport { rejectErrors } from '@giraphql/plugin-dataloader';\n\nbuilder.queryField('user', (t) =>\n  t.field({\n    type: [User],\n    resolve: (parent, args, context) => {\n      const loader = User.getDataloader(context);\n\n      return rejectErrors(loader.loadMany(['123', '456']));\n    },\n  }),\n);\n```\n\n### (Optional) Adding loaders to context\n\nIf you want to make dataloaders accessible via the context object directly, there is some additional\nsetup required. Below are a few options for different ways you can load data from the context\nobject. You can determine which of these options works best for you or add you own helpers.\n\nFirst you'll need to update the types for your context type:\n\n```ts\nimport { LoadableRef } from '@giraphql/plugin-dataloader';\n\nexport interface ContextType {\n  userLoader: DataLoader<string, { id: number }>; // expose a specific loader\n  getLoader: <K, V>(ref: LoadableRef<K, V, ContextType>) => DataLoader<K, V>; // helper to get a loader from a ref\n  load: <K, V>(ref: LoadableRef<K, V, ContextType>, id: K) => Promise<V>; // helper for loading a single resource\n  loadMany: <K, V>(ref: LoadableRef<K, V, ContextType>, ids: K[]) => Promise<(Error | V)[]>; // helper for loading many\n  // other context fields\n}\n```\n\nnext you'll need to update your context factory function. The exact format of this depends on what\ngraphql server implementation you are using.\n\n```ts\nimport { initContextCache } from '@giraphql/core';\nimport { LoadableRef, rejectErrors } from '@giraphql/plugin-dataloader';\n\nexport const createContext = (req, res): ContextType => ({\n  // Adding this will prevent any issues if you server implementation\n  // copies or extends the context object before passing it to your resolvers\n  ...initContextCache(),\n\n  // using getters allows us to access the context object using `this`\n  get userLoader() {\n    return User.getDataloader(this);\n  },\n  get getLoader() {\n    return <K, V>(ref: LoadableRef<K, V, ContextType>) => ref.getDataloader(this);\n  },\n  get load() {\n    return <K, V>(ref: LoadableRef<K, V, ContextType>, id: K) => ref.getDataloader(this).load(id);\n  },\n  get loadMany() {\n    return <K, V>(ref: LoadableRef<K, V, ContextType>, ids: K[]) =>\n      rejectErrors(ref.getDataloader(this).loadMany(ids));\n  },\n});\n```\n\nNow you can use these helpers from your context object:\n\n```ts\nbuilder.queryFields((t) => ({\n  fromContext1: t.field({\n    type: User,\n    resolve: (root, args, { userLoader }) => userLoader.load('123'),\n  }),\n  fromContext2: t.field({\n    type: User,\n    resolve: (root, args, { getLoader }) => getLoader(User).load('456'),\n  }),\n  fromContext3: t.field({\n    type: User,\n    resolve: (root, args, { load }) => load(User, '789'),\n  }),\n  fromContext4: t.field({\n    type: [User],\n    resolve: (root, args, { loadMany }) => loadMany(User, ['123', '456']),\n  }),\n}));\n```\n","readmeFilename":"README.md","_id":"@giraphql/plugin-dataloader@0.0.0-preview-20217753333","_nodeVersion":"14.17.4","_npmVersion":"6.14.14","dist":{"integrity":"sha512-SfhxwrF5vsFva1vaUE00kjr75MV20qZ1EfEAEkKrrtyqI6CohzO8ozFdJsonLmPtdtcCLqIdyjUXLcmpq2Eh6A==","shasum":"793871a45a134c71ab266f119dcb614c85ca369b","tarball":"https://registry.npmjs.org/@giraphql/plugin-dataloader/-/plugin-dataloader-0.0.0-preview-20217753333.tgz","fileCount":61,"unpackedSize":137202,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJhDhs8CRA9TVsSAnZWagAAKp4P/1LAUJwbYiOQhb5bxggk\nLjHeoCs0iWwhvJlUE4sSFJgSzG37E/0fpa/dY0UwWvHHl7R244vg0yeU9oRO\nLEKI1C+jc+m2oiKsTYN/XasS9K2FbP+D86n8WaAlkPRJsnymVBNBKphnOTEX\nXTez07AIY/AovROXIfHQL910ETUweYiKQ8f6I/C36apCk0Smy2w52eVQnEfj\n7yxNzfpWLUD78XCVe+hrpH1HVIsTDB9kFgt7/nN4z45UIbN26zg35bO+atMQ\nG0R6QRNrpUPUyWteLDD7kcReCRYEgV+pj9DyLKtfoL8TtiFxjhMIg6L8QWmP\nF1q3cXcN7gaI/s332k3TVKGxzSr1OeMkzuv0OiAGWw8+LRAoBpc/z7Wwv170\nt7eK8wmUnePigj8b0WoCB1eh6Ohi8v1c5RsBYOL8r+4FfLeBttL6rVKoaScW\nKRvIT8Sxe8NfhcIRtFOAlo89x2PRT952pgfslN714EpNHfEnpc/wJksY9wz9\npgQnLb8kqwzdvkGh6CAHRPuM8MrGZpfK3AEC+4b/tHvfjc0RJ9BU1TCcs14+\n3jFT16J6Wab1KSVTqre8N0rT5JvKnazxpYeADo3O83v4HQxon5/Ec5XYxFEC\niawmMiCdGwRhGnlvQ/CDDhVqIkzie3sfJOWoZZ6z5hTaL2tbKu++GqANB4DL\npwqH\r\n=TAgr\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDKgKUy5HPcg2ntfavlmZlEacEPYoQDWecV2T+JDWUW/gIhAPXAH5YXkfpAFKmfe+K0m6DKoKU3M9P7EnOnPAatodrd"}]},"_npmUser":{"name":"hayes","email":"michael@hayes.io"},"directories":{},"maintainers":[{"name":"hayes","email":"michael@hayes.io"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/plugin-dataloader_0.0.0-preview-20217753333_1628314427974_0.4955826027003265"},"_hasShrinkwrap":false},"0.0.0-preview-202178182932":{"name":"@giraphql/plugin-dataloader","version":"0.0.0-preview-202178182932","description":"A GiraphQL plugin for attaching dataloader to object types","main":"./lib/index.js","module":"./esm/index.js","exports":{"import":"./esm/index.js","require":"./lib/index.js"},"author":{"name":"Michael Hayes"},"license":"ISC","keywords":["giraphql","graphql","schema","typescript","dataloader"],"publishConfig":{"access":"public"},"peerDependencies":{"dataloader":"2","graphql":">=15.1.0"},"devDependencies":{"@giraphql/core":"^0.0.0-preview-202178182932","@giraphql/plugin-relay":"^0.0.0-preview-202178182932","apollo-server":"^2.25.2","dataloader":"^2.0.0","graphql-tag":"^2.12.5"},"gitHead":"9dfe52f1975f41a111e01bf96a20033a914e2acc","scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"_resolved":"","_integrity":"","_from":"file:giraphql-plugin-dataloader-0.0.0-preview-202178182932.tgz","readme":"# Dataloader Plugin for GiraphQL\n\nThis plugin makes it easy to add fields and types that are loaded through a dataloader.\n\n## Usage\n\n### Install\n\nTo use the dataloader plugin you will need to install both the `dataloader` package and the\nvalidation plugin:\n\n```bash\nyarn add dataloader @giraphql/plugin-dataloader\n```\n\n### Setup\n\n```typescript\nimport DataloaderPlugin from '@giraphql/plugin-dataloader';\n\nconst builder = new SchemaBuilder({\n  plugins: [DataloaderPlugin],\n});\n```\n\n### loadable objects\n\nTo create an object type that can be loaded with a dataloader use the new `builder.loadableObject`\nmethod:\n\n```ts\nconst User = builder.loadableObject('User', {\n  // load will be called with ids of users that need to be loaded\n  // Note that the types for keys (and context if present) are required\n  load: (ids: string[], context: ContextType) => context.loadUsersById(ids),\n  fields: (t) => ({\n    id: t.exposeID('id', {}),\n    username: t.string({\n      // the shape of parent will be inferred from `loadUsersById()` above\n      resolve: (parent) => parent.username,\n    }),\n  }),\n});\n```\n\nWhen defining fields that return `User`s, you will now be able to return either a `string` (based in\nids param of `load`), or a User object (type based on the return type of `loadUsersById`).\n\n```ts\nbuilder.queryType({\n  fields: (t) => ({\n    user: t.field({\n      type: User,\n      args: {\n        id: t.arg.string({ required: true }),\n      },\n      // Here we can just return the ID directly rather than loading the user ourselves\n      resolve: (root, args) => args.id,\n    }),\n    currentUser: t.field({\n      type: User,\n      // If we already have the user, we use it, and the dataloader will not be called\n      resolve: (root, args, context) => context.currentUser,\n    }),\n    users: t.field({\n      type: [User],\n      args: {\n        ids: t.arg.stringList({ required: true }),\n      },\n      // Mixing ids and user objects also works\n      resolve: (_root, args, context) => [...args.ids, context.CurrentUser],\n    }),\n  }),\n});\n```\n\nGiraphQL will detect when a resolver returns `string`, `number`, or `bigint` (typescript will\nconstrain the allowed types to whatever is expected by the load function). If a resolver returns an\nobject instead, GiraphQL knows it can skip the dataloader for that object.\n\n### loadable fields\n\nIn some cases you may need more granular dataloaders. To handle these cases there is a new\n`t.loadable` method for defining fields with their own dataloaders.\n\n```ts\n// Normal object that the fields below will load\ninterface PostShape {\n  id: string;\n  title: string;\n  content: string;\n}\n\nconst Post = builder.objectRef<PostShape>('Post').implement({\n  fields: (t) => ({\n    id: t.exposeID('id', {}),\n    title: t.exposeString('title', {}),\n    content: t.exposeString('title', {}),\n  }),\n});\n\n// Loading a single Post\nbuilder.objectField(User, 'latestPost', (t) =>\n  t.loadable({\n    type: Post,\n    // will be called with ids of latest posts for all users in query\n    load: (ids: number[], context) => context.loadPosts(ids),\n    resolve: (user, args) => user.lastPostID,\n  }),\n);\n// Loading multiple Posts\nbuilder.objectField(User, 'posts', (t) =>\n  t.loadable({\n    type: [Post],\n    // will be called with ids of posts loaded for all users in query\n    load: (ids: number[], context) => context.loadPosts(ids),\n    resolve: (user, args) => user.postIDs,\n  }),\n);\n```\n\n### dataloader options\n\nYou can provide additional options for your dataloaders using `loaderOptions`.\n\n```ts\nconst User = builder.loadableObject('User', {\n  loaderOptions: { maxBatchSize: 20 },\n  load: (ids: string[], context: ContextType) => context.loadUsersById(ids),\n  fields: (t) => ({ id: t.exposeID('id', {}) }),\n});\n\nbuilder.objectField(User, 'posts', (t) =>\n  t.loadable({\n    type: [Post],\n    loaderOptions: { maxBatchSize: 20 },\n    load: (ids: number[], context) => context.loadPosts(ids),\n    resolve: (user, args) => user.postIDs,\n  }),\n);\n```\n\nSee [dataloader docs](https://github.com/graphql/dataloader#api) for all available options.\n\n### Manually using dataloader\n\nDataloaders for \"loadable\" objects can be accessed via their ref by passing in the context object\nfor the current request. dataloaders are not shared across requests, so we need the context to get\nthe correct dataloader for the current request:\n\n```ts\n// create loadable object\nconst User = builder.loadableObject('User', {\n  load: (ids: string[], context: ContextType) => context.loadUsersById(ids),\n  fields: (t) => ({\n    id: t.exposeID('id', {}),\n  }),\n});\n\nbuilder.queryField('user', (t) =>\n  t.field({\n    type: User,\n    resolve: (parent, args, context) => {\n      // get data loader for User type\n      const loader = User.getDataloader(context);\n\n      // manually load a user\n      return loader.load('123');\n    },\n  }),\n);\n```\n\n### Errors\n\nCalling dataloader.loadMany will resolve to a value like `(Type | Error)[]`. Your `load` function\nmay also return results in that format if your loader can have parital failures. GraphQL does not\nhave special handling for Error objects. Instead GiraphQL will map these results to something like\n`(Type | Promise<Type>)[]` where Errors are replaced with promises that will be rejected. This\nallows the normal graphql resolver flow to correctly handle these errors.\n\nIf you are using the `loadMany` method from a dataloader manually, you can apply the same mapping\nusing the `rejectErrors` helper:\n\n```ts\nimport { rejectErrors } from '@giraphql/plugin-dataloader';\n\nbuilder.queryField('user', (t) =>\n  t.field({\n    type: [User],\n    resolve: (parent, args, context) => {\n      const loader = User.getDataloader(context);\n\n      return rejectErrors(loader.loadMany(['123', '456']));\n    },\n  }),\n);\n```\n\n### (Optional) Adding loaders to context\n\nIf you want to make dataloaders accessible via the context object directly, there is some additional\nsetup required. Below are a few options for different ways you can load data from the context\nobject. You can determine which of these options works best for you or add you own helpers.\n\nFirst you'll need to update the types for your context type:\n\n```ts\nimport { LoadableRef } from '@giraphql/plugin-dataloader';\n\nexport interface ContextType {\n  userLoader: DataLoader<string, { id: number }>; // expose a specific loader\n  getLoader: <K, V>(ref: LoadableRef<K, V, ContextType>) => DataLoader<K, V>; // helper to get a loader from a ref\n  load: <K, V>(ref: LoadableRef<K, V, ContextType>, id: K) => Promise<V>; // helper for loading a single resource\n  loadMany: <K, V>(ref: LoadableRef<K, V, ContextType>, ids: K[]) => Promise<(Error | V)[]>; // helper for loading many\n  // other context fields\n}\n```\n\nnext you'll need to update your context factory function. The exact format of this depends on what\ngraphql server implementation you are using.\n\n```ts\nimport { initContextCache } from '@giraphql/core';\nimport { LoadableRef, rejectErrors } from '@giraphql/plugin-dataloader';\n\nexport const createContext = (req, res): ContextType => ({\n  // Adding this will prevent any issues if you server implementation\n  // copies or extends the context object before passing it to your resolvers\n  ...initContextCache(),\n\n  // using getters allows us to access the context object using `this`\n  get userLoader() {\n    return User.getDataloader(this);\n  },\n  get getLoader() {\n    return <K, V>(ref: LoadableRef<K, V, ContextType>) => ref.getDataloader(this);\n  },\n  get load() {\n    return <K, V>(ref: LoadableRef<K, V, ContextType>, id: K) => ref.getDataloader(this).load(id);\n  },\n  get loadMany() {\n    return <K, V>(ref: LoadableRef<K, V, ContextType>, ids: K[]) =>\n      rejectErrors(ref.getDataloader(this).loadMany(ids));\n  },\n});\n```\n\nNow you can use these helpers from your context object:\n\n```ts\nbuilder.queryFields((t) => ({\n  fromContext1: t.field({\n    type: User,\n    resolve: (root, args, { userLoader }) => userLoader.load('123'),\n  }),\n  fromContext2: t.field({\n    type: User,\n    resolve: (root, args, { getLoader }) => getLoader(User).load('456'),\n  }),\n  fromContext3: t.field({\n    type: User,\n    resolve: (root, args, { load }) => load(User, '789'),\n  }),\n  fromContext4: t.field({\n    type: [User],\n    resolve: (root, args, { loadMany }) => loadMany(User, ['123', '456']),\n  }),\n}));\n```\n","readmeFilename":"README.md","_id":"@giraphql/plugin-dataloader@0.0.0-preview-202178182932","_nodeVersion":"14.17.4","_npmVersion":"6.14.14","dist":{"integrity":"sha512-nzmKxmjPUjjBIiWPAoFsdF4p+8xufAFWD3s/k8UDh4LAPX9+5OTfuBgcbULKLyE2UYR4gQEsgZovetGP2dHb9Q==","shasum":"7fc68f3fe9b1211116c95b323544842cb3a27f73","tarball":"https://registry.npmjs.org/@giraphql/plugin-dataloader/-/plugin-dataloader-0.0.0-preview-202178182932.tgz","fileCount":61,"unpackedSize":137270,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJhECKdCRA9TVsSAnZWagAAmrgP/2cIR+Q7QmwxpRfrlfuy\njovTO5rZn4s4lxz5Zke6ZlsCfPrqcI9zKiWvxACxYNG66Vf+sKUHLeR83Tef\nxkG2kn/WCUSwJgfSGlpmgwzByzcYHwgGaxMTAmxIqlvUXgMuk3PcMdgtJPat\nvhDZ0qzXacP+VIsRnFS5O+fuW0ziMlsyWhixQbkjIq5jY7I+eP3RDz3O+tMF\nkuARnmDJe1YOVEPyQ+6UM7yDOuTr7lkxTPBZsaLzLZKjcR2NKj4QjN1c2Kjv\ngpo1Fc+O9JdM153Tk9YwTo+LKrvdOrWDQWgwSpAUDxx1nT0a14gQA2ZD6uHC\nYhimgIUoF00Ag1iwbtZadM8f8LrNrXgEZ34XixOR7IY6nj4LG/sVlxin95SO\nZGfLWSlyu8fyZE2h1TQ1pavtoB239KsPo0nW67bPWra9PaisamuUpJ7+bIRW\nEjrsYfdw5kyhEinberOEM3e5ypPkBLEj65KGU/TdVIDaToYkpodCqsLpsnXv\nv/kPzqaJdf7mlcY/vWy51oT0HHpuPR42NTNVwj+VKzYtbpI2uer94RjOwUQs\nUz6vS7rU3I9sbU9KggDHY2fZ9RwCk/biQOyqfD5hHfe0MUya0dSlxMfGU3hM\n6gEmaMjYLYGzFMnNk9vMRP638GJTxau9Tx3QqH5blDel4vEiMti268xHq0kv\n7iZ5\r\n=6Uu9\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIHwjlhFH1MyQxpsAR59jAd3xtotDmFvRJKL00sz31g+5AiAFuu9gtY4jo+SgNtvu8B/ljW1IEI2+wTdsesJFSVCOEg=="}]},"_npmUser":{"name":"hayes","email":"michael@hayes.io"},"directories":{},"maintainers":[{"name":"hayes","email":"michael@hayes.io"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/plugin-dataloader_0.0.0-preview-202178182932_1628447388834_0.1713934603637306"},"_hasShrinkwrap":false},"0.0.0-preview-202178184810":{"name":"@giraphql/plugin-dataloader","version":"0.0.0-preview-202178184810","description":"A GiraphQL plugin for attaching dataloader to object types","main":"./lib/index.js","module":"./esm/index.js","exports":{"import":"./esm/index.js","require":"./lib/index.js"},"author":{"name":"Michael Hayes"},"license":"ISC","keywords":["giraphql","graphql","schema","typescript","dataloader"],"publishConfig":{"access":"public"},"peerDependencies":{"dataloader":"2","graphql":">=15.1.0"},"devDependencies":{"@giraphql/core":"^0.0.0-preview-202178184810","@giraphql/plugin-relay":"^0.0.0-preview-202178184810","apollo-server":"^2.25.2","dataloader":"^2.0.0","graphql-tag":"^2.12.5"},"gitHead":"9dfe52f1975f41a111e01bf96a20033a914e2acc","scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"_resolved":"","_integrity":"","_from":"file:giraphql-plugin-dataloader-0.0.0-preview-202178184810.tgz","readme":"# Dataloader Plugin for GiraphQL\n\nThis plugin makes it easy to add fields and types that are loaded through a dataloader.\n\n## Usage\n\n### Install\n\nTo use the dataloader plugin you will need to install both the `dataloader` package and the\nvalidation plugin:\n\n```bash\nyarn add dataloader @giraphql/plugin-dataloader\n```\n\n### Setup\n\n```typescript\nimport DataloaderPlugin from '@giraphql/plugin-dataloader';\n\nconst builder = new SchemaBuilder({\n  plugins: [DataloaderPlugin],\n});\n```\n\n### loadable objects\n\nTo create an object type that can be loaded with a dataloader use the new `builder.loadableObject`\nmethod:\n\n```ts\nconst User = builder.loadableObject('User', {\n  // load will be called with ids of users that need to be loaded\n  // Note that the types for keys (and context if present) are required\n  load: (ids: string[], context: ContextType) => context.loadUsersById(ids),\n  fields: (t) => ({\n    id: t.exposeID('id', {}),\n    username: t.string({\n      // the shape of parent will be inferred from `loadUsersById()` above\n      resolve: (parent) => parent.username,\n    }),\n  }),\n});\n```\n\nWhen defining fields that return `User`s, you will now be able to return either a `string` (based in\nids param of `load`), or a User object (type based on the return type of `loadUsersById`).\n\n```ts\nbuilder.queryType({\n  fields: (t) => ({\n    user: t.field({\n      type: User,\n      args: {\n        id: t.arg.string({ required: true }),\n      },\n      // Here we can just return the ID directly rather than loading the user ourselves\n      resolve: (root, args) => args.id,\n    }),\n    currentUser: t.field({\n      type: User,\n      // If we already have the user, we use it, and the dataloader will not be called\n      resolve: (root, args, context) => context.currentUser,\n    }),\n    users: t.field({\n      type: [User],\n      args: {\n        ids: t.arg.stringList({ required: true }),\n      },\n      // Mixing ids and user objects also works\n      resolve: (_root, args, context) => [...args.ids, context.CurrentUser],\n    }),\n  }),\n});\n```\n\nGiraphQL will detect when a resolver returns `string`, `number`, or `bigint` (typescript will\nconstrain the allowed types to whatever is expected by the load function). If a resolver returns an\nobject instead, GiraphQL knows it can skip the dataloader for that object.\n\n### loadable fields\n\nIn some cases you may need more granular dataloaders. To handle these cases there is a new\n`t.loadable` method for defining fields with their own dataloaders.\n\n```ts\n// Normal object that the fields below will load\ninterface PostShape {\n  id: string;\n  title: string;\n  content: string;\n}\n\nconst Post = builder.objectRef<PostShape>('Post').implement({\n  fields: (t) => ({\n    id: t.exposeID('id', {}),\n    title: t.exposeString('title', {}),\n    content: t.exposeString('title', {}),\n  }),\n});\n\n// Loading a single Post\nbuilder.objectField(User, 'latestPost', (t) =>\n  t.loadable({\n    type: Post,\n    // will be called with ids of latest posts for all users in query\n    load: (ids: number[], context) => context.loadPosts(ids),\n    resolve: (user, args) => user.lastPostID,\n  }),\n);\n// Loading multiple Posts\nbuilder.objectField(User, 'posts', (t) =>\n  t.loadable({\n    type: [Post],\n    // will be called with ids of posts loaded for all users in query\n    load: (ids: number[], context) => context.loadPosts(ids),\n    resolve: (user, args) => user.postIDs,\n  }),\n);\n```\n\n### dataloader options\n\nYou can provide additional options for your dataloaders using `loaderOptions`.\n\n```ts\nconst User = builder.loadableObject('User', {\n  loaderOptions: { maxBatchSize: 20 },\n  load: (ids: string[], context: ContextType) => context.loadUsersById(ids),\n  fields: (t) => ({ id: t.exposeID('id', {}) }),\n});\n\nbuilder.objectField(User, 'posts', (t) =>\n  t.loadable({\n    type: [Post],\n    loaderOptions: { maxBatchSize: 20 },\n    load: (ids: number[], context) => context.loadPosts(ids),\n    resolve: (user, args) => user.postIDs,\n  }),\n);\n```\n\nSee [dataloader docs](https://github.com/graphql/dataloader#api) for all available options.\n\n### Manually using dataloader\n\nDataloaders for \"loadable\" objects can be accessed via their ref by passing in the context object\nfor the current request. dataloaders are not shared across requests, so we need the context to get\nthe correct dataloader for the current request:\n\n```ts\n// create loadable object\nconst User = builder.loadableObject('User', {\n  load: (ids: string[], context: ContextType) => context.loadUsersById(ids),\n  fields: (t) => ({\n    id: t.exposeID('id', {}),\n  }),\n});\n\nbuilder.queryField('user', (t) =>\n  t.field({\n    type: User,\n    resolve: (parent, args, context) => {\n      // get data loader for User type\n      const loader = User.getDataloader(context);\n\n      // manually load a user\n      return loader.load('123');\n    },\n  }),\n);\n```\n\n### Errors\n\nCalling dataloader.loadMany will resolve to a value like `(Type | Error)[]`. Your `load` function\nmay also return results in that format if your loader can have parital failures. GraphQL does not\nhave special handling for Error objects. Instead GiraphQL will map these results to something like\n`(Type | Promise<Type>)[]` where Errors are replaced with promises that will be rejected. This\nallows the normal graphql resolver flow to correctly handle these errors.\n\nIf you are using the `loadMany` method from a dataloader manually, you can apply the same mapping\nusing the `rejectErrors` helper:\n\n```ts\nimport { rejectErrors } from '@giraphql/plugin-dataloader';\n\nbuilder.queryField('user', (t) =>\n  t.field({\n    type: [User],\n    resolve: (parent, args, context) => {\n      const loader = User.getDataloader(context);\n\n      return rejectErrors(loader.loadMany(['123', '456']));\n    },\n  }),\n);\n```\n\n### (Optional) Adding loaders to context\n\nIf you want to make dataloaders accessible via the context object directly, there is some additional\nsetup required. Below are a few options for different ways you can load data from the context\nobject. You can determine which of these options works best for you or add you own helpers.\n\nFirst you'll need to update the types for your context type:\n\n```ts\nimport { LoadableRef } from '@giraphql/plugin-dataloader';\n\nexport interface ContextType {\n  userLoader: DataLoader<string, { id: number }>; // expose a specific loader\n  getLoader: <K, V>(ref: LoadableRef<K, V, ContextType>) => DataLoader<K, V>; // helper to get a loader from a ref\n  load: <K, V>(ref: LoadableRef<K, V, ContextType>, id: K) => Promise<V>; // helper for loading a single resource\n  loadMany: <K, V>(ref: LoadableRef<K, V, ContextType>, ids: K[]) => Promise<(Error | V)[]>; // helper for loading many\n  // other context fields\n}\n```\n\nnext you'll need to update your context factory function. The exact format of this depends on what\ngraphql server implementation you are using.\n\n```ts\nimport { initContextCache } from '@giraphql/core';\nimport { LoadableRef, rejectErrors } from '@giraphql/plugin-dataloader';\n\nexport const createContext = (req, res): ContextType => ({\n  // Adding this will prevent any issues if you server implementation\n  // copies or extends the context object before passing it to your resolvers\n  ...initContextCache(),\n\n  // using getters allows us to access the context object using `this`\n  get userLoader() {\n    return User.getDataloader(this);\n  },\n  get getLoader() {\n    return <K, V>(ref: LoadableRef<K, V, ContextType>) => ref.getDataloader(this);\n  },\n  get load() {\n    return <K, V>(ref: LoadableRef<K, V, ContextType>, id: K) => ref.getDataloader(this).load(id);\n  },\n  get loadMany() {\n    return <K, V>(ref: LoadableRef<K, V, ContextType>, ids: K[]) =>\n      rejectErrors(ref.getDataloader(this).loadMany(ids));\n  },\n});\n```\n\nNow you can use these helpers from your context object:\n\n```ts\nbuilder.queryFields((t) => ({\n  fromContext1: t.field({\n    type: User,\n    resolve: (root, args, { userLoader }) => userLoader.load('123'),\n  }),\n  fromContext2: t.field({\n    type: User,\n    resolve: (root, args, { getLoader }) => getLoader(User).load('456'),\n  }),\n  fromContext3: t.field({\n    type: User,\n    resolve: (root, args, { load }) => load(User, '789'),\n  }),\n  fromContext4: t.field({\n    type: [User],\n    resolve: (root, args, { loadMany }) => loadMany(User, ['123', '456']),\n  }),\n}));\n```\n","readmeFilename":"README.md","_id":"@giraphql/plugin-dataloader@0.0.0-preview-202178184810","_nodeVersion":"14.17.4","_npmVersion":"6.14.14","dist":{"integrity":"sha512-efQjf7KzzTjdTe9Vp0BuXZKEtEu1/Igr7Nm6CDQgqM/Fr7S1Jjcla780oZgKocYzxnnC0E5riSwgGOTjH+iYqg==","shasum":"bc731de2328ded4b9121aa6348c313c111a6b512","tarball":"https://registry.npmjs.org/@giraphql/plugin-dataloader/-/plugin-dataloader-0.0.0-preview-202178184810.tgz","fileCount":61,"unpackedSize":137270,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJhECb4CRA9TVsSAnZWagAAQsgP/0M6a8Ua4ENNQduVf/DO\nNQkrRTYk9UJUq+BURGjgQpcAF01qKWWZbUSK0YWz3ystnv7EA5qSGvnaUwrW\nRyWtXLJaM6h7z8bc0Pmsk7GfGTIMlRedIw1+HdZfss+utQmXmoyP1Gj2Gews\nRbqm1TiKG4lMtVs1v6Fb2K+WvUnZrkHbx2PF/XT0O/LhhkbMzx3BveZGwdCC\nYdHUCWyuCwGgYSPw/VN+FPWGyRORJZHg7VlZffLr1ubiwQAX8nxwLe2KkPM8\neKgsDUGsP0xBU7gPCgS4vxyQMYBj9rTREF+W/UDXhFe4gtQLdIFcttZTMD/w\nYua+wrr2lLvyGjZ6WmloliMSy2tJyNuojxUw5y6B+R3HFqcVZDG7Sn3N9zUD\nUHXEaQUsB5C+pltTcuK7JLYUqAuWbux2N5+5tuNiRwfrfVhKMmM/qr6HpHMl\n/YrSxA23XFMSdmfPyGTlCICt1Un7JFz3Nu3BgN+FTqPvvsf4HzgFbjTsFxkg\no2afyGLpT2FM4r+Zi4Bx1q5RJowwb/pR12Ya7Z/86cu6qdBqmP77XtGxosaD\ntswX+D/pCpfbcYyPiR93foW5DzlPl16DRZvbKTotCNiMFlnMtJMcjexJsSoc\ncaNRH/HZ6iFf4RHEt7A2meNoyukqUU2GyWS6pjap1Z8jOxP0LjyHhdtBsq8m\nAeBR\r\n=g5nv\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCf7sCweotzGvcdfrzvLym4KHmjRwEF1WleEqGQzMFkgQIgcBc+ipKc7TV/qsw57F2ffBxXHr4N9zmrPGEgppy2kkQ="}]},"_npmUser":{"name":"hayes","email":"michael@hayes.io"},"directories":{},"maintainers":[{"name":"hayes","email":"michael@hayes.io"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/plugin-dataloader_0.0.0-preview-202178184810_1628448504268_0.7149637195819245"},"_hasShrinkwrap":false},"0.0.0-preview-202178194614":{"name":"@giraphql/plugin-dataloader","version":"0.0.0-preview-202178194614","description":"A GiraphQL plugin for attaching dataloader to object types","main":"./lib/index.js","module":"./esm/index.js","exports":{"import":"./esm/index.js","require":"./lib/index.js"},"author":{"name":"Michael Hayes"},"license":"ISC","keywords":["giraphql","graphql","schema","typescript","dataloader"],"publishConfig":{"access":"public"},"peerDependencies":{"dataloader":"2","graphql":">=15.1.0"},"devDependencies":{"@giraphql/core":"^0.0.0-preview-202178194614","@giraphql/plugin-relay":"^0.0.0-preview-202178194614","apollo-server":"^2.25.2","dataloader":"^2.0.0","graphql-tag":"^2.12.5"},"gitHead":"9dfe52f1975f41a111e01bf96a20033a914e2acc","scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"_resolved":"","_integrity":"","_from":"file:giraphql-plugin-dataloader-0.0.0-preview-202178194614.tgz","readme":"# Dataloader Plugin for GiraphQL\n\nThis plugin makes it easy to add fields and types that are loaded through a dataloader.\n\n## Usage\n\n### Install\n\nTo use the dataloader plugin you will need to install both the `dataloader` package and the\nvalidation plugin:\n\n```bash\nyarn add dataloader @giraphql/plugin-dataloader\n```\n\n### Setup\n\n```typescript\nimport DataloaderPlugin from '@giraphql/plugin-dataloader';\n\nconst builder = new SchemaBuilder({\n  plugins: [DataloaderPlugin],\n});\n```\n\n### loadable objects\n\nTo create an object type that can be loaded with a dataloader use the new `builder.loadableObject`\nmethod:\n\n```ts\nconst User = builder.loadableObject('User', {\n  // load will be called with ids of users that need to be loaded\n  // Note that the types for keys (and context if present) are required\n  load: (ids: string[], context: ContextType) => context.loadUsersById(ids),\n  fields: (t) => ({\n    id: t.exposeID('id', {}),\n    username: t.string({\n      // the shape of parent will be inferred from `loadUsersById()` above\n      resolve: (parent) => parent.username,\n    }),\n  }),\n});\n```\n\nWhen defining fields that return `User`s, you will now be able to return either a `string` (based in\nids param of `load`), or a User object (type based on the return type of `loadUsersById`).\n\n```ts\nbuilder.queryType({\n  fields: (t) => ({\n    user: t.field({\n      type: User,\n      args: {\n        id: t.arg.string({ required: true }),\n      },\n      // Here we can just return the ID directly rather than loading the user ourselves\n      resolve: (root, args) => args.id,\n    }),\n    currentUser: t.field({\n      type: User,\n      // If we already have the user, we use it, and the dataloader will not be called\n      resolve: (root, args, context) => context.currentUser,\n    }),\n    users: t.field({\n      type: [User],\n      args: {\n        ids: t.arg.stringList({ required: true }),\n      },\n      // Mixing ids and user objects also works\n      resolve: (_root, args, context) => [...args.ids, context.CurrentUser],\n    }),\n  }),\n});\n```\n\nGiraphQL will detect when a resolver returns `string`, `number`, or `bigint` (typescript will\nconstrain the allowed types to whatever is expected by the load function). If a resolver returns an\nobject instead, GiraphQL knows it can skip the dataloader for that object.\n\n### loadable fields\n\nIn some cases you may need more granular dataloaders. To handle these cases there is a new\n`t.loadable` method for defining fields with their own dataloaders.\n\n```ts\n// Normal object that the fields below will load\ninterface PostShape {\n  id: string;\n  title: string;\n  content: string;\n}\n\nconst Post = builder.objectRef<PostShape>('Post').implement({\n  fields: (t) => ({\n    id: t.exposeID('id', {}),\n    title: t.exposeString('title', {}),\n    content: t.exposeString('title', {}),\n  }),\n});\n\n// Loading a single Post\nbuilder.objectField(User, 'latestPost', (t) =>\n  t.loadable({\n    type: Post,\n    // will be called with ids of latest posts for all users in query\n    load: (ids: number[], context) => context.loadPosts(ids),\n    resolve: (user, args) => user.lastPostID,\n  }),\n);\n// Loading multiple Posts\nbuilder.objectField(User, 'posts', (t) =>\n  t.loadable({\n    type: [Post],\n    // will be called with ids of posts loaded for all users in query\n    load: (ids: number[], context) => context.loadPosts(ids),\n    resolve: (user, args) => user.postIDs,\n  }),\n);\n```\n\n### dataloader options\n\nYou can provide additional options for your dataloaders using `loaderOptions`.\n\n```ts\nconst User = builder.loadableObject('User', {\n  loaderOptions: { maxBatchSize: 20 },\n  load: (ids: string[], context: ContextType) => context.loadUsersById(ids),\n  fields: (t) => ({ id: t.exposeID('id', {}) }),\n});\n\nbuilder.objectField(User, 'posts', (t) =>\n  t.loadable({\n    type: [Post],\n    loaderOptions: { maxBatchSize: 20 },\n    load: (ids: number[], context) => context.loadPosts(ids),\n    resolve: (user, args) => user.postIDs,\n  }),\n);\n```\n\nSee [dataloader docs](https://github.com/graphql/dataloader#api) for all available options.\n\n### Manually using dataloader\n\nDataloaders for \"loadable\" objects can be accessed via their ref by passing in the context object\nfor the current request. dataloaders are not shared across requests, so we need the context to get\nthe correct dataloader for the current request:\n\n```ts\n// create loadable object\nconst User = builder.loadableObject('User', {\n  load: (ids: string[], context: ContextType) => context.loadUsersById(ids),\n  fields: (t) => ({\n    id: t.exposeID('id', {}),\n  }),\n});\n\nbuilder.queryField('user', (t) =>\n  t.field({\n    type: User,\n    resolve: (parent, args, context) => {\n      // get data loader for User type\n      const loader = User.getDataloader(context);\n\n      // manually load a user\n      return loader.load('123');\n    },\n  }),\n);\n```\n\n### Errors\n\nCalling dataloader.loadMany will resolve to a value like `(Type | Error)[]`. Your `load` function\nmay also return results in that format if your loader can have parital failures. GraphQL does not\nhave special handling for Error objects. Instead GiraphQL will map these results to something like\n`(Type | Promise<Type>)[]` where Errors are replaced with promises that will be rejected. This\nallows the normal graphql resolver flow to correctly handle these errors.\n\nIf you are using the `loadMany` method from a dataloader manually, you can apply the same mapping\nusing the `rejectErrors` helper:\n\n```ts\nimport { rejectErrors } from '@giraphql/plugin-dataloader';\n\nbuilder.queryField('user', (t) =>\n  t.field({\n    type: [User],\n    resolve: (parent, args, context) => {\n      const loader = User.getDataloader(context);\n\n      return rejectErrors(loader.loadMany(['123', '456']));\n    },\n  }),\n);\n```\n\n### (Optional) Adding loaders to context\n\nIf you want to make dataloaders accessible via the context object directly, there is some additional\nsetup required. Below are a few options for different ways you can load data from the context\nobject. You can determine which of these options works best for you or add you own helpers.\n\nFirst you'll need to update the types for your context type:\n\n```ts\nimport { LoadableRef } from '@giraphql/plugin-dataloader';\n\nexport interface ContextType {\n  userLoader: DataLoader<string, { id: number }>; // expose a specific loader\n  getLoader: <K, V>(ref: LoadableRef<K, V, ContextType>) => DataLoader<K, V>; // helper to get a loader from a ref\n  load: <K, V>(ref: LoadableRef<K, V, ContextType>, id: K) => Promise<V>; // helper for loading a single resource\n  loadMany: <K, V>(ref: LoadableRef<K, V, ContextType>, ids: K[]) => Promise<(Error | V)[]>; // helper for loading many\n  // other context fields\n}\n```\n\nnext you'll need to update your context factory function. The exact format of this depends on what\ngraphql server implementation you are using.\n\n```ts\nimport { initContextCache } from '@giraphql/core';\nimport { LoadableRef, rejectErrors } from '@giraphql/plugin-dataloader';\n\nexport const createContext = (req, res): ContextType => ({\n  // Adding this will prevent any issues if you server implementation\n  // copies or extends the context object before passing it to your resolvers\n  ...initContextCache(),\n\n  // using getters allows us to access the context object using `this`\n  get userLoader() {\n    return User.getDataloader(this);\n  },\n  get getLoader() {\n    return <K, V>(ref: LoadableRef<K, V, ContextType>) => ref.getDataloader(this);\n  },\n  get load() {\n    return <K, V>(ref: LoadableRef<K, V, ContextType>, id: K) => ref.getDataloader(this).load(id);\n  },\n  get loadMany() {\n    return <K, V>(ref: LoadableRef<K, V, ContextType>, ids: K[]) =>\n      rejectErrors(ref.getDataloader(this).loadMany(ids));\n  },\n});\n```\n\nNow you can use these helpers from your context object:\n\n```ts\nbuilder.queryFields((t) => ({\n  fromContext1: t.field({\n    type: User,\n    resolve: (root, args, { userLoader }) => userLoader.load('123'),\n  }),\n  fromContext2: t.field({\n    type: User,\n    resolve: (root, args, { getLoader }) => getLoader(User).load('456'),\n  }),\n  fromContext3: t.field({\n    type: User,\n    resolve: (root, args, { load }) => load(User, '789'),\n  }),\n  fromContext4: t.field({\n    type: [User],\n    resolve: (root, args, { loadMany }) => loadMany(User, ['123', '456']),\n  }),\n}));\n```\n","readmeFilename":"README.md","_id":"@giraphql/plugin-dataloader@0.0.0-preview-202178194614","_nodeVersion":"14.17.4","_npmVersion":"6.14.14","dist":{"integrity":"sha512-dvy7DyfBNeA1klkOgAglL7W5o5YUs1cMWN/7Ku5U3wMRFoccd1fgPd5FBs1D+23NYrRXnoCIH/ssW8gNT2Ahmw==","shasum":"8b9800f9245b8e086618c0fda9c0cfeb8674f325","tarball":"https://registry.npmjs.org/@giraphql/plugin-dataloader/-/plugin-dataloader-0.0.0-preview-202178194614.tgz","fileCount":61,"unpackedSize":144063,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJhEDSUCRA9TVsSAnZWagAAsPkP/iynYQilNWn9/uxwr8yJ\nNcJwwmhMiRygNDUS2Pe3w1rKNXzkc+N+GZUDk81lAiebKPp/eFeg3pZb+nA5\nG9AWeNHV/p19VIqy4mp/2Stm9HcX0WkbJkbyl09rXKud+HJU8Oa9WeO5tth1\nY7uLtDxC9H51G1Mt/3RFXbEh8C1DnRDZCzH+g++BIiBB0MYtq/jrHirURgS7\nBhns2EkV3J/jtTuLQEtQ5Vo0WO28TLQ7VEm5bf05yfYwi9r9H5OUGmyzGti+\nibZcYggwV4/U/5YGWvPTRdf783nZmjlX+s8aWbqX3r/BhbPqkCz1Nc0/Edwg\nzM1dlOMz99+TRTEWAyiXDBHpdP8PIHl/TZkXc3ddf478UPHnjKcI87l1kTHF\nvwk3pJOlSoKHq1w0aCS+BdrehiabFhq5MCxTGH0h6DsVh42LNCv89cwYo3jh\nbgYnXDi8zJp1SFL9H+f+sfRzVojIAtp+ga/83ME6HdQ2zZRXHBcjCWfuFH0E\nAWNFpvdQ3SSiFGM8sjPpuAq7lzp9SInslQMguKY2K8r349/pib48gWpYWQdY\ny9T8Yx5QUS1SnoLcAlZbik5COXb7qbqhtuLY1Rs2YJG+vddqHOsGaQqh/e3y\ncRpfgTEK2VP+A7pdDY4Aa1ASiZaGuFGv/W+aVQ4QDESUYgdr1iqSCsqtZpce\ndT71\r\n=7uEK\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCqp1Ovmve98zH9zQjzXwgMnJXtRHenl3Lb9qGjKZXC4gIgThqoaG3u5nQMBcKB8mTRR2RuI6XXyBgy0jO6n2ZiLbc="}]},"_npmUser":{"name":"hayes","email":"michael@hayes.io"},"directories":{},"maintainers":[{"name":"hayes","email":"michael@hayes.io"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/plugin-dataloader_0.0.0-preview-202178194614_1628451988619_0.6346729173272907"},"_hasShrinkwrap":false},"2.11.0":{"name":"@giraphql/plugin-dataloader","version":"2.11.0","description":"A GiraphQL plugin for attaching dataloader to object types","main":"./lib/index.js","module":"./esm/index.js","exports":{"import":"./esm/index.js","require":"./lib/index.js"},"author":{"name":"Michael Hayes"},"license":"ISC","keywords":["giraphql","graphql","schema","typescript","dataloader"],"publishConfig":{"access":"public"},"peerDependencies":{"dataloader":"2","graphql":">=15.1.0"},"devDependencies":{"@giraphql/core":"^2.14.0","@giraphql/plugin-relay":"^2.14.0","apollo-server":"^2.25.2","dataloader":"^2.0.0","graphql-tag":"^2.12.5"},"gitHead":"9dfe52f1975f41a111e01bf96a20033a914e2acc","scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"_resolved":"","_integrity":"","_from":"file:giraphql-plugin-dataloader-2.11.0.tgz","_id":"@giraphql/plugin-dataloader@2.11.0","_nodeVersion":"14.17.4","_npmVersion":"6.14.14","_npmUser":{"name":"hayes","email":"michael@hayes.io"},"dist":{"integrity":"sha512-f+l1r1TMkN8tcQzNDZMVkb7q/2XvzJ7D56sCMleJkXvthxuDTPh0ZdOrprJ9utnFnqnKV3I5yNAkCTUWDCKA6Q==","shasum":"84b52623e2cebe614c47e4f30296e01b60416439","tarball":"https://registry.npmjs.org/@giraphql/plugin-dataloader/-/plugin-dataloader-2.11.0.tgz","fileCount":61,"unpackedSize":144016,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJhEDcfCRA9TVsSAnZWagAALzgP/0MchIHRSEqrkDk51JQ1\nh0dhbAsCMMyD/uwV5zjQ0FJk/0ryAeSQUBwZKKoXRhSGzcO0SiROcVoljRGt\nROhjfQLhFiy7pU3cKeIvOrgjA0hDIV2Vt6RUchmLrt1XE+TLdFc8JSi5/oza\nogsEqNTMDrDUAlLEJxi56IqJw+b2+hJC371ccegItBy421IPEpe591rcX+rA\nfc4InWDVGuvriYMEmNhfLJ2gIAZKScqX/NTUtZ4iOqbb2fWvDEOm4mwRRto/\n53wA3xdF68NYgPnLGibP5d6UbyHszekOzAcqTTA1MwHidj1ULnzjxQokZ8cG\n3ji8xfgugnWhfOi63GgvVdZSCWUbVkD492ZfiPtwjz7JtaH3EsVxFswHV6EJ\noZxeqxptOIDn7aShiq7f2tEwqjunx2mqU+lcl1pZLlKf8pe8Xs7pMsFqS21f\ngGZEFCmsOMoKl40SCQFeVlyI5uiFnM0NODNRRJpAEX882815HM4kC/wMqO1M\noJolq0nfpr0tJejxi1DJBmgTK5yjThaoOZ5oEGMwh1cI9Qd8Svc0x92Zezah\n0W38RBodgnoWfmXT1o2R33fvsuL9s3WtruCcWzECzEvC9rhKONTD4JVj++fp\nuk4065e+LBNAo0tiSr5aFr14SP5mwf3R+cdXkhDZGv8yfXE8Yq+LBg33cxdO\n4BDx\r\n=f0rq\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIAMchoin1yhA4tzhFf1vOfyW1whrXR1yWsqnXyFWRS1yAiEArNIWUf5Hiwb/2Kik3BegV5pAkewQdCzymXzGgpHQaaU="}]},"directories":{},"maintainers":[{"name":"hayes","email":"michael@hayes.io"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/plugin-dataloader_2.11.0_1628452639403_0.4149007930359532"},"_hasShrinkwrap":false},"0.0.0-preview-202179204139":{"name":"@giraphql/plugin-dataloader","version":"0.0.0-preview-202179204139","description":"A GiraphQL plugin for attaching dataloader to object types","main":"./lib/index.js","module":"./esm/index.js","exports":{"import":"./esm/index.js","require":"./lib/index.js"},"author":{"name":"Michael Hayes"},"license":"ISC","keywords":["giraphql","graphql","schema","typescript","dataloader"],"publishConfig":{"access":"public"},"peerDependencies":{"dataloader":"2","graphql":">=15.1.0"},"devDependencies":{"@giraphql/core":"^0.0.0-preview-202179204139","@giraphql/plugin-relay":"^0.0.0-preview-202179204139","apollo-server":"^2.25.2","dataloader":"^2.0.0","graphql-tag":"^2.12.5"},"gitHead":"9dfe52f1975f41a111e01bf96a20033a914e2acc","scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"_resolved":"","_integrity":"","_from":"file:giraphql-plugin-dataloader-0.0.0-preview-202179204139.tgz","readme":"# Dataloader Plugin for GiraphQL\n\nThis plugin makes it easy to add fields and types that are loaded through a dataloader.\n\n## Usage\n\n### Install\n\nTo use the dataloader plugin you will need to install both the `dataloader` package and the\nvalidation plugin:\n\n```bash\nyarn add dataloader @giraphql/plugin-dataloader\n```\n\n### Setup\n\n```typescript\nimport DataloaderPlugin from '@giraphql/plugin-dataloader';\n\nconst builder = new SchemaBuilder({\n  plugins: [DataloaderPlugin],\n});\n```\n\n### loadable objects\n\nTo create an object type that can be loaded with a dataloader use the new `builder.loadableObject`\nmethod:\n\n```ts\nconst User = builder.loadableObject('User', {\n  // load will be called with ids of users that need to be loaded\n  // Note that the types for keys (and context if present) are required\n  load: (ids: string[], context: ContextType) => context.loadUsersById(ids),\n  fields: (t) => ({\n    id: t.exposeID('id', {}),\n    username: t.string({\n      // the shape of parent will be inferred from `loadUsersById()` above\n      resolve: (parent) => parent.username,\n    }),\n  }),\n});\n```\n\nWhen defining fields that return `User`s, you will now be able to return either a `string` (based in\nids param of `load`), or a User object (type based on the return type of `loadUsersById`).\n\n```ts\nbuilder.queryType({\n  fields: (t) => ({\n    user: t.field({\n      type: User,\n      args: {\n        id: t.arg.string({ required: true }),\n      },\n      // Here we can just return the ID directly rather than loading the user ourselves\n      resolve: (root, args) => args.id,\n    }),\n    currentUser: t.field({\n      type: User,\n      // If we already have the user, we use it, and the dataloader will not be called\n      resolve: (root, args, context) => context.currentUser,\n    }),\n    users: t.field({\n      type: [User],\n      args: {\n        ids: t.arg.stringList({ required: true }),\n      },\n      // Mixing ids and user objects also works\n      resolve: (_root, args, context) => [...args.ids, context.CurrentUser],\n    }),\n  }),\n});\n```\n\nGiraphQL will detect when a resolver returns `string`, `number`, or `bigint` (typescript will\nconstrain the allowed types to whatever is expected by the load function). If a resolver returns an\nobject instead, GiraphQL knows it can skip the dataloader for that object.\n\n### loadable fields\n\nIn some cases you may need more granular dataloaders. To handle these cases there is a new\n`t.loadable` method for defining fields with their own dataloaders.\n\n```ts\n// Normal object that the fields below will load\ninterface PostShape {\n  id: string;\n  title: string;\n  content: string;\n}\n\nconst Post = builder.objectRef<PostShape>('Post').implement({\n  fields: (t) => ({\n    id: t.exposeID('id', {}),\n    title: t.exposeString('title', {}),\n    content: t.exposeString('title', {}),\n  }),\n});\n\n// Loading a single Post\nbuilder.objectField(User, 'latestPost', (t) =>\n  t.loadable({\n    type: Post,\n    // will be called with ids of latest posts for all users in query\n    load: (ids: number[], context) => context.loadPosts(ids),\n    resolve: (user, args) => user.lastPostID,\n  }),\n);\n// Loading multiple Posts\nbuilder.objectField(User, 'posts', (t) =>\n  t.loadable({\n    type: [Post],\n    // will be called with ids of posts loaded for all users in query\n    load: (ids: number[], context) => context.loadPosts(ids),\n    resolve: (user, args) => user.postIDs,\n  }),\n);\n```\n\n### dataloader options\n\nYou can provide additional options for your dataloaders using `loaderOptions`.\n\n```ts\nconst User = builder.loadableObject('User', {\n  loaderOptions: { maxBatchSize: 20 },\n  load: (ids: string[], context: ContextType) => context.loadUsersById(ids),\n  fields: (t) => ({ id: t.exposeID('id', {}) }),\n});\n\nbuilder.objectField(User, 'posts', (t) =>\n  t.loadable({\n    type: [Post],\n    loaderOptions: { maxBatchSize: 20 },\n    load: (ids: number[], context) => context.loadPosts(ids),\n    resolve: (user, args) => user.postIDs,\n  }),\n);\n```\n\nSee [dataloader docs](https://github.com/graphql/dataloader#api) for all available options.\n\n### Manually using dataloader\n\nDataloaders for \"loadable\" objects can be accessed via their ref by passing in the context object\nfor the current request. dataloaders are not shared across requests, so we need the context to get\nthe correct dataloader for the current request:\n\n```ts\n// create loadable object\nconst User = builder.loadableObject('User', {\n  load: (ids: string[], context: ContextType) => context.loadUsersById(ids),\n  fields: (t) => ({\n    id: t.exposeID('id', {}),\n  }),\n});\n\nbuilder.queryField('user', (t) =>\n  t.field({\n    type: User,\n    resolve: (parent, args, context) => {\n      // get data loader for User type\n      const loader = User.getDataloader(context);\n\n      // manually load a user\n      return loader.load('123');\n    },\n  }),\n);\n```\n\n### Errors\n\nCalling dataloader.loadMany will resolve to a value like `(Type | Error)[]`. Your `load` function\nmay also return results in that format if your loader can have parital failures. GraphQL does not\nhave special handling for Error objects. Instead GiraphQL will map these results to something like\n`(Type | Promise<Type>)[]` where Errors are replaced with promises that will be rejected. This\nallows the normal graphql resolver flow to correctly handle these errors.\n\nIf you are using the `loadMany` method from a dataloader manually, you can apply the same mapping\nusing the `rejectErrors` helper:\n\n```ts\nimport { rejectErrors } from '@giraphql/plugin-dataloader';\n\nbuilder.queryField('user', (t) =>\n  t.field({\n    type: [User],\n    resolve: (parent, args, context) => {\n      const loader = User.getDataloader(context);\n\n      return rejectErrors(loader.loadMany(['123', '456']));\n    },\n  }),\n);\n```\n\n### (Optional) Adding loaders to context\n\nIf you want to make dataloaders accessible via the context object directly, there is some additional\nsetup required. Below are a few options for different ways you can load data from the context\nobject. You can determine which of these options works best for you or add you own helpers.\n\nFirst you'll need to update the types for your context type:\n\n```ts\nimport { LoadableRef } from '@giraphql/plugin-dataloader';\n\nexport interface ContextType {\n  userLoader: DataLoader<string, { id: number }>; // expose a specific loader\n  getLoader: <K, V>(ref: LoadableRef<K, V, ContextType>) => DataLoader<K, V>; // helper to get a loader from a ref\n  load: <K, V>(ref: LoadableRef<K, V, ContextType>, id: K) => Promise<V>; // helper for loading a single resource\n  loadMany: <K, V>(ref: LoadableRef<K, V, ContextType>, ids: K[]) => Promise<(Error | V)[]>; // helper for loading many\n  // other context fields\n}\n```\n\nnext you'll need to update your context factory function. The exact format of this depends on what\ngraphql server implementation you are using.\n\n```ts\nimport { initContextCache } from '@giraphql/core';\nimport { LoadableRef, rejectErrors } from '@giraphql/plugin-dataloader';\n\nexport const createContext = (req, res): ContextType => ({\n  // Adding this will prevent any issues if you server implementation\n  // copies or extends the context object before passing it to your resolvers\n  ...initContextCache(),\n\n  // using getters allows us to access the context object using `this`\n  get userLoader() {\n    return User.getDataloader(this);\n  },\n  get getLoader() {\n    return <K, V>(ref: LoadableRef<K, V, ContextType>) => ref.getDataloader(this);\n  },\n  get load() {\n    return <K, V>(ref: LoadableRef<K, V, ContextType>, id: K) => ref.getDataloader(this).load(id);\n  },\n  get loadMany() {\n    return <K, V>(ref: LoadableRef<K, V, ContextType>, ids: K[]) =>\n      rejectErrors(ref.getDataloader(this).loadMany(ids));\n  },\n});\n```\n\nNow you can use these helpers from your context object:\n\n```ts\nbuilder.queryFields((t) => ({\n  fromContext1: t.field({\n    type: User,\n    resolve: (root, args, { userLoader }) => userLoader.load('123'),\n  }),\n  fromContext2: t.field({\n    type: User,\n    resolve: (root, args, { getLoader }) => getLoader(User).load('456'),\n  }),\n  fromContext3: t.field({\n    type: User,\n    resolve: (root, args, { load }) => load(User, '789'),\n  }),\n  fromContext4: t.field({\n    type: [User],\n    resolve: (root, args, { loadMany }) => loadMany(User, ['123', '456']),\n  }),\n}));\n```\n","readmeFilename":"README.md","_id":"@giraphql/plugin-dataloader@0.0.0-preview-202179204139","_nodeVersion":"14.17.4","_npmVersion":"6.14.14","dist":{"integrity":"sha512-Ds0gTZY8GTAY9pl2NdGJ/7EMUbslngUV26Fygj2K0WCmVUdbdenLLx/0znDyoZE6IOuMz9+pMw1+wGy6jqHhrA==","shasum":"f9bd0e91648489769fa5dba436c721d7f60bfa3d","tarball":"https://registry.npmjs.org/@giraphql/plugin-dataloader/-/plugin-dataloader-0.0.0-preview-202179204139.tgz","fileCount":61,"unpackedSize":137270,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJhEZMTCRA9TVsSAnZWagAARBgP/AuzyeetV2Q8oSKwc3G4\nrEALultIL1KGeRCzoCVl+igvPZrOt0jLuqs197zKKwMIqRPZWL5ijJJJhYsc\nmfj6LfMV8+9AQXXywTGAaXNqb1SFnfFigOZMxHpwdNOU4nDGLrDyWlRa31wT\nGUirnzuB6tYsfYDTQux3qT1bVhVv07VRS5c7LhOZk0QZ/ezLA/jXMCFl7EE5\nY5+yZcJRDoYA8zcj3WS35yl3rHbfgghwABPiCaFfjUCydzX491JFJpRwzoCf\nN96MM36+GcUmQtN/t3XA/wx8yHvwPFQq2EybfKIF+NAsmj6M2c1bsqspRC+b\nkOm2pk/1+s18zFawwMvw6x6gRY3qLE4uqb3lLc/HR+UaIdXb2hVrNOv2l4SM\nHq9vNPVVdOW7J/Q4aUfvG4DZsxR3XHLE/EgD3nvft0s6AHJ8H5ZyVEfSVk2a\nWVOFAdUnlTDnTaQZO/kcvesPhoyLaTaXn3GHt+WQHfMRJgEqixRxK54wGWMM\ngCZam3/vPTq8WjLxUZXDqRBFQp6qlr33Ndsj0+DT5AdHj8k3wDBFzefl/2cY\nRc5t9N7v1A6iOLFXm5quxMOUvlVFZ5Wyx33eTOSRx30JCLGTNpKyUgufYwAg\ncNHTVH/CrT0PduFxtYyTWbt8ZRwtiPdWZalV/OKhCAtDAaxTszFPu88Y2Xck\ncohT\r\n=oW6/\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIBiv/LQZYrXHVjuOruWE49+InAgX5Zz5wtdYU0bqXa+2AiEA1h1zDBFnQJqIv0Ka1zbtGrfDUuPiH9IlZ/JRyhW+5mQ="}]},"_npmUser":{"name":"hayes","email":"michael@hayes.io"},"directories":{},"maintainers":[{"name":"hayes","email":"michael@hayes.io"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/plugin-dataloader_0.0.0-preview-202179204139_1628541715421_0.5209316559741486"},"_hasShrinkwrap":false},"2.12.0":{"name":"@giraphql/plugin-dataloader","version":"2.12.0","description":"A GiraphQL plugin for attaching dataloader to object types","main":"./lib/index.js","module":"./esm/index.js","exports":{"import":"./esm/index.js","require":"./lib/index.js"},"author":{"name":"Michael Hayes"},"license":"ISC","keywords":["giraphql","graphql","schema","typescript","dataloader"],"publishConfig":{"access":"public"},"peerDependencies":{"dataloader":"2","graphql":">=15.1.0"},"devDependencies":{"@giraphql/core":"^2.14.0","@giraphql/plugin-relay":"^2.14.0","@giraphql/plugin-errors":"^2.6.0","apollo-server":"^2.25.2","dataloader":"^2.0.0","graphql-tag":"^2.12.5"},"gitHead":"9dfe52f1975f41a111e01bf96a20033a914e2acc","scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"_resolved":"","_integrity":"","_from":"file:giraphql-plugin-dataloader-2.12.0.tgz","_id":"@giraphql/plugin-dataloader@2.12.0","_nodeVersion":"14.17.4","_npmVersion":"6.14.14","_npmUser":{"name":"hayes","email":"michael@hayes.io"},"dist":{"integrity":"sha512-BOnQRgee2M9pYaReGQL/6pJQBAoSfCxv6QVMdj65dAmhNMGwuc9F0Fps4bKUp1CD3gYUG5WKZiLUJaVm8YmA2w==","shasum":"efa9b49baf93406e5fb6ee0764ffbb86486bbb2a","tarball":"https://registry.npmjs.org/@giraphql/plugin-dataloader/-/plugin-dataloader-2.12.0.tgz","fileCount":61,"unpackedSize":143837,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJhFauCCRA9TVsSAnZWagAAHggP/jkUFcmDG77F0rHuDkhx\npbL1Dt+yoo/WEyaMELdPJGERClsxOVtqu0XBMG1C/n/yLdew0PmvoPqbFwX4\ncDkKmW7l6XPF7CBlIXYf6wxNkCGbGviEZ0m4VmCp7XbV4aNwcQY0ro8dBtFN\n6m938dVJxDmDA0SozF4xs2UE+3Zka5GBNhkEgO37NcTjHfU2/0DVUbY80RW2\njRBy0/lYUJ7anvlaGGkqefMMaFRLol8KlAyCBNpLms+GOKcE+MZwWhAx+CVm\nkflGmbPfEvIAhTYMjYm5cHPZYASZOCyJn5NEt5hkfrMvhPtCMJA1JYndtbcE\nvCVGRKDHDSXtktKFb1lYXlwGMEE91JQMnFX1J68eSiYrqAXphuonTumtGE/n\nHMvHdOL8Xc0rCic8oBahKcnSlcl5euMgWjiCE0ju+fdAwV/wgWDjD4U7EhXF\nKypUhyE+cG4qsB81Z3E4gu8thR5JgCqEjGwCFq4Tn0ZAmaucNjCkx+GlkUZ1\nPo5tKLoI7+irCb9px9yIknVJUOGTOPZIAawzkvy+njzWXCMLxGBVCG7/mMvX\njdkVbTP9Ts55Kp/v5s74YJ+I3yzYPRk5pMOcT4GYyFxLpFzX6jngo+u5XSUD\nCOJOn/LzjHDNVgmGnmwk55SSh/9FhHJBCmw+hV/RIQBa5h+rYNF7ZN7r0R9o\nhZbn\r\n=SnV8\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIFo8u9IhHYxhWtaG1eVNIPF+B8omE6nxda1dYSJIG+iWAiEAnp6fAPj96aUSq0qI04l+8RcLdqX8pp3XU/uAROPyVsY="}]},"directories":{},"maintainers":[{"name":"hayes","email":"michael@hayes.io"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/plugin-dataloader_2.12.0_1628810114696_0.504187254612187"},"_hasShrinkwrap":false},"2.13.0":{"name":"@giraphql/plugin-dataloader","version":"2.13.0","description":"A GiraphQL plugin for attaching dataloader to object types","main":"./lib/index.js","module":"./esm/index.js","exports":{"import":"./esm/index.js","require":"./lib/index.js"},"author":{"name":"Michael Hayes"},"license":"ISC","keywords":["giraphql","graphql","schema","typescript","dataloader"],"publishConfig":{"access":"public"},"peerDependencies":{"dataloader":"2","graphql":">=15.1.0"},"devDependencies":{"@giraphql/core":"^2.14.2","@giraphql/plugin-relay":"^2.14.1","@giraphql/plugin-errors":"^2.7.2","apollo-server":"^2.25.2","dataloader":"^2.0.0","graphql-tag":"^2.12.5"},"gitHead":"9dfe52f1975f41a111e01bf96a20033a914e2acc","scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"_resolved":"","_integrity":"","_from":"file:giraphql-plugin-dataloader-2.13.0.tgz","_id":"@giraphql/plugin-dataloader@2.13.0","_nodeVersion":"14.17.5","_npmVersion":"6.14.14","_npmUser":{"name":"hayes","email":"michael@hayes.io"},"dist":{"integrity":"sha512-ikyQ8/YsV8svyP92rXF3bCx1hUAuPnvTbvDUyKjy1yQbAJksYWu6rqTEeVUzeizmzITd3+ABjzgRGfeo/MRzJA==","shasum":"8d6f0d5b6c09283cb660f5e556dd543426359a72","tarball":"https://registry.npmjs.org/@giraphql/plugin-dataloader/-/plugin-dataloader-2.13.0.tgz","fileCount":61,"unpackedSize":147393,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJhKWbWCRA9TVsSAnZWagAAgEgP/39MKUv02Wi6BeehWeuH\nBV1Q2648886uwP4T2n6xYObn13gmBnh36W11vIHJyHcFMuZK81SeVZprqHfa\nmjxz7ta3/NOBLgtbSdIinalOWMg+I6PtB4zyuxdMPwTWBGOqnvv/uepu6cH7\n7ILq/ITgfd5FBkZsMisgah+dQoirUUvK9xacLopagM4bNCq2g8G+RXVTF4Fs\nrh1/1mnL0269eMloPalfX/sQfGspj0QehMgSDyBPz6dWKrWqqn/FOTrpwQqQ\nNBmn6vnYofR8y1WQkuoQShkSelTLLGQCx+OshpQZb4rVzrvK2Xs/VPtTn4D2\nLYSsSI3yeXgkv8nWCNhFWm0KlDzA5D3+iB8IDHkopIxm5+ya50UjCPbqMp/B\nQqnhWCctTIehkaTOFI8GEuYq38XwaEAJszbOtfEdRvjJ0iDLkrvTAJQ63nxZ\niP8zm7ZJkn6VxhYsAhE/s5vmihSwooWAmKeFEWVhYK9teyzukurdkBPUQyw3\nE0ECN9IzrIQMrxP70LMcmnHKdTxOQGRbnaL2AKX5IMWgTbIDFwY5xe2WuW9O\nyTNlFUMihJNK7KnwSuXxmBlB5md2o3lGknU2uqZmH5XKm2vvqUwmkDgCnT7Q\nI59S7nv4hrS+rbpAiqOaniJMMQcC/Aizph0oQBYLedn5tt7V5HfjJL6n+AH8\nCqKw\r\n=T+OF\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCedhIuj+AnrDNpOD5u5IgEck+feXGHBcVoWm0lUzj7+wIhAKbDU3DivOTRGNzfVk0n1MbdDaBVgs9WUq0IxmkLNmzg"}]},"directories":{},"maintainers":[{"name":"hayes","email":"michael@hayes.io"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/plugin-dataloader_2.13.0_1630103254132_0.4178516086794368"},"_hasShrinkwrap":false},"2.14.0":{"name":"@giraphql/plugin-dataloader","version":"2.14.0","description":"A GiraphQL plugin for attaching dataloader to object types","main":"./lib/index.js","module":"./esm/index.js","exports":{"import":"./esm/index.js","require":"./lib/index.js"},"author":{"name":"Michael Hayes"},"license":"ISC","keywords":["giraphql","graphql","schema","typescript","dataloader"],"publishConfig":{"access":"public"},"peerDependencies":{"dataloader":"2","graphql":">=15.1.0"},"devDependencies":{"@giraphql/core":"^2.15.0","@giraphql/test-utils":"^0.1.0","@giraphql/plugin-errors":"^2.8.0","@giraphql/plugin-relay":"^2.15.0","dataloader":"^2.0.0","graphql-tag":"^2.12.5"},"gitHead":"9dfe52f1975f41a111e01bf96a20033a914e2acc","scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"_resolved":"","_integrity":"","_from":"file:giraphql-plugin-dataloader-2.14.0.tgz","_id":"@giraphql/plugin-dataloader@2.14.0","_nodeVersion":"14.17.5","_npmVersion":"6.14.14","_npmUser":{"name":"hayes","email":"michael@hayes.io"},"dist":{"integrity":"sha512-0wl8LEN2mOuwhlHKXG9OE5P6k2pH/+PJQEtRWfUm6FC0nOtb4q9gl26qt2Yqhf5xpxspWTj3SiCV2jOAtr22AA==","shasum":"1bd90dd30e1510e06b1f51aaad2e71745bcc287e","tarball":"https://registry.npmjs.org/@giraphql/plugin-dataloader/-/plugin-dataloader-2.14.0.tgz","fileCount":61,"unpackedSize":143340,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJhKzlKCRA9TVsSAnZWagAAKXYQAKO9sWsJzmi6pywf3MXP\nrVnFKpeXF7yFmfceuRc2Tg9LEdrb8kto/9cNyVek70eOaut+sWtx1sbV8kVU\nOvCy639miYFR+myOTa5Gglc+Fic/H6ta/eNhphNxU/VpZbX0B+ri8Xvo2qNs\nHvDYA33jEgmxAq6y5KrdbgjtW5LqZzdEERKFFPvHrgT9ETs8mwlNa9Hf84Je\nSW4tT1jBynnv4sSzS2/06PmTpXbSYKSQla3PFdyfgX2a33TuSPbIh53QVI3Y\nP0zF2673QzioQf3Qqzqfn0sEIVTDaugfLJrQgq05uQR/o2OdijBWJN3x090A\n0LDcGFpRnN70ehsply19C/l31xJY3skCVSxFmaBKr3O4yzftlAmmPEZDrGGJ\nUS/fH3RsCCOR5RB9fJUlK3ELCCmx8f+bClTwwnmS08H+uJsg89IYBPkV6X9T\nhzrfUmUPZcXUB6YU3aQ1BPut1RX7V0ajYM/rZK1ezPxKql2YvphHuCdwIjuh\n4loCGy29YvjzIx8155KoxpSEPjZIRHMeS5awze7SiGTc4Y3ls+vIlCXWFsKc\nHrsMiK++OK1iu6Wgi93dFKd4E2OS4Zu+EdmqSahpanFGcihd2sqf8ugEDiX1\n278IvvdLC5bp6LtUL6ZofDDQFN58CuIx71/5WXzWlwDgX4OQsWYXK/0xEJCf\nI02c\r\n=X2sC\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIE8i+mCdM/u0g/2Iz4kKouys4MaKZdbGrDzNm4jJTXfbAiBeGle2qRhBwPlnZRvOyLCMXwOLa5R4EB8dbAaFd58Hpg=="}]},"directories":{},"maintainers":[{"name":"hayes","email":"michael@hayes.io"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/plugin-dataloader_2.14.0_1630222665894_0.4372260453042678"},"_hasShrinkwrap":false},"2.14.1":{"name":"@giraphql/plugin-dataloader","version":"2.14.1","description":"A GiraphQL plugin for attaching dataloader to object types","main":"./lib/index.js","module":"./esm/index.js","exports":{"import":"./esm/index.js","require":"./lib/index.js"},"author":{"name":"Michael Hayes"},"license":"ISC","keywords":["giraphql","graphql","schema","typescript","dataloader"],"publishConfig":{"access":"public"},"peerDependencies":{"dataloader":"2","graphql":">=15.1.0"},"devDependencies":{"@giraphql/core":"^2.15.1","@giraphql/test-utils":"^0.1.1","@giraphql/plugin-errors":"^2.8.1","@giraphql/plugin-relay":"^2.15.1","dataloader":"^2.0.0","graphql-tag":"^2.12.5"},"gitHead":"9dfe52f1975f41a111e01bf96a20033a914e2acc","scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"_resolved":"","_integrity":"","_from":"file:giraphql-plugin-dataloader-2.14.1.tgz","_id":"@giraphql/plugin-dataloader@2.14.1","_nodeVersion":"14.17.5","_npmVersion":"6.14.14","_npmUser":{"name":"hayes","email":"michael@hayes.io"},"dist":{"integrity":"sha512-BLAXTIHdnAdnFPMCiORWvoKBQYLNJBcSLRqz9TXgOfQ9GFQLbQUP7jN0Lhe7pCohc9QF1d7li1vLNJ26V5Qtng==","shasum":"ff3e90d42f1c0d76d2b162d23ebfe8a327f43e89","tarball":"https://registry.npmjs.org/@giraphql/plugin-dataloader/-/plugin-dataloader-2.14.1.tgz","fileCount":61,"unpackedSize":143439,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJhLRicCRA9TVsSAnZWagAAhpAP/RITHpU/atqTnCEE/miG\ne/9opMqfIhGLYqyXcliaVsKF/Q8IhaSaUM962DiPLzI3xQmpSWJeeEGVUMxC\ngIe3N5ACpV/vHljonD738cgHu5BBVQ5chE28Fyq1TVuQ3Ac95KSgY2bxah+c\nWX5zaKtPHSSrxpaQ10QJmD+/OSLwRgd6GoJnmXmIrLiki3xc6KnbuS9rnzX1\nxoDa4yvEHxq2pc78zT39q65lNai8KJUketgyopsI4VQeSyUtqcjz9cJK9LnV\n3RONvLkiIrovuXsIGXTsC1dSBuYhVRoLnm8AnFgpTvG60i6Gpj29DTCunDsG\n2pfgUHeb8qsHNiBHoptxihiJ/+xj0I1VzN9sghxiYbG6xtNA1vI7cz5JkYoc\nwuihwJ6WUPCthJuiZH8VRP0qRbYOpKfw/npVb2cq1LqMGOJRez4jV5lmTIQ6\n+9Rt872mSWkUa5piFUV5SDCN2sZYZMjArt/7IUhxSR70WFMVQA0RqlmfnoTc\nfjNx4X4fYkZLD26hLAdkwFcOYrMqkudJdaHFpqSsqfJQap6endgWyUgxGXo9\n0bmwAtEt3vELt3lInYgXTnLS1I1XI+9ineu64SZ9pHKZU3R/1zVbyvkWwelH\n5M5KF9yVM5SGfhweSODXw0gAKubYkfNEaJ8sbhEKSiBl6dgzcrz5VHe3TW4u\n78Ag\r\n=p+vI\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDj8ZIusvlUW26uk9Y/qY3i4DYe9fSCTW+4jrpFLuExMgIgP2+iVfFEScqjQqKzggqTWQGQWhCUf8et09n0Y6oOeVY="}]},"directories":{},"maintainers":[{"name":"hayes","email":"michael@hayes.io"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/plugin-dataloader_2.14.1_1630345372493_0.038180162280545105"},"_hasShrinkwrap":false},"2.15.0":{"name":"@giraphql/plugin-dataloader","version":"2.15.0","description":"A GiraphQL plugin for attaching dataloader to object types","main":"./lib/index.js","module":"./esm/index.js","exports":{"import":"./esm/index.js","require":"./lib/index.js"},"author":{"name":"Michael Hayes"},"license":"ISC","keywords":["giraphql","graphql","schema","typescript","dataloader"],"publishConfig":{"access":"public"},"peerDependencies":{"dataloader":"2","graphql":">=15.1.0"},"devDependencies":{"@giraphql/core":"^2.15.1","@giraphql/test-utils":"^0.1.1","@giraphql/plugin-errors":"^2.8.1","@giraphql/plugin-relay":"^2.15.1","dataloader":"^2.0.0","graphql-tag":"^2.12.5"},"gitHead":"9dfe52f1975f41a111e01bf96a20033a914e2acc","scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"_resolved":"","_integrity":"","_from":"file:giraphql-plugin-dataloader-2.15.0.tgz","_id":"@giraphql/plugin-dataloader@2.15.0","_nodeVersion":"14.17.5","_npmVersion":"6.14.14","_npmUser":{"name":"hayes","email":"michael@hayes.io"},"dist":{"integrity":"sha512-5AjTRZxs5IL1YsNh1IFAZEJQ/EeXAED2sWgog8FvOFk7Ku2eebH7Q0bO2XYgBMJsK+XrmTvdAi7yb66v0gpkwA==","shasum":"4288cb50239d2d55acbcdd398fb8fb2bae240b0b","tarball":"https://registry.npmjs.org/@giraphql/plugin-dataloader/-/plugin-dataloader-2.15.0.tgz","fileCount":97,"unpackedSize":172872,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJhLwVrCRA9TVsSAnZWagAAf4cP/jAQlpz3GjlOXKTobKgZ\nA8chP7n9Vh1im8EUzIfERSiRWPUt2m9N2UaPZmTeiFB+aqqeURWkEby6OK+1\nCOR0+0YyHDnowD96tAZA1E74PvSoLwcMRG7lhfQUmWXraGeJGHWGraCKhO2L\no6TijELCei0W+jcXF0hEBqLp5Qo/fbngZS0ueRB3D9yAz/4TOicWutLLTtKx\nAFD3TUyeUTsLM93ngum3Jf+S2V8IrXD+UCceg9LCfhEJW++px4DupBErOoDU\nzsWv7KZZjN/fYTHqK/8OyPmSPlGncDLW6VNpxOmlsZyITspb5UVdGXmQh9Gr\nVfhmYWJot57tIfE2bPoB0kURuJHbBUNqS2anYEnD002fOAEMyg9z9Yh7qanq\ny/HS4I6jwhubhLzfdS4M/SF2al9A6Do+HC2loU1XLNLtQ4r8WYDRwudCaZWm\nf1fuabSRtWPlz7uDcHCAa0Lt8JfLgfoFwNmELyNa4k7gf9P3BvJMQt3l5/M6\nDhpSREGWg3c3+bCg1T3w8Xh6/uZHJgc0epN6WuzIoVfjQVLp2p344priOyPA\nqIVtV4nGA8TLhiIohBY5NZ0ZoIiwCTV/h+7GZ0ToG9OWtdy+sqnqZb9m4Ics\nIDmpVR2fe2c6j7gEf+TYVlj1gMPfMvBUvMKPK2gZ6wUtpPZ/IOJAHlitzljK\npiVq\r\n=tUlk\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIFoAbEKVPxVtIYHqu/9lCs8OBKDROujJZ3W+Zgp0EcECAiBnPl/bmAauPCE8EFZQW5ysVhlB8I+sx88fLOqWCkjcnA=="}]},"directories":{},"maintainers":[{"name":"hayes","email":"michael@hayes.io"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/plugin-dataloader_2.15.0_1630471531560_0.6918197422509915"},"_hasShrinkwrap":false},"0.0.0-preview-202181322430":{"name":"@giraphql/plugin-dataloader","version":"0.0.0-preview-202181322430","description":"A GiraphQL plugin for attaching dataloader to object types","main":"./lib/index.js","module":"./esm/index.js","exports":{"import":"./esm/index.js","require":"./lib/index.js"},"author":{"name":"Michael Hayes"},"license":"ISC","keywords":["giraphql","graphql","schema","typescript","dataloader"],"publishConfig":{"access":"public"},"peerDependencies":{"dataloader":"2","graphql":">=15.1.0"},"devDependencies":{"@giraphql/core":"^2.15.1","@giraphql/test-utils":"^0.1.1","@giraphql/plugin-errors":"^2.8.1","@giraphql/plugin-relay":"^2.15.1","dataloader":"^2.0.0","graphql-tag":"^2.12.5"},"gitHead":"9dfe52f1975f41a111e01bf96a20033a914e2acc","scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"_resolved":"","_integrity":"","_from":"file:giraphql-plugin-dataloader-0.0.0-preview-202181322430.tgz","readme":"# Dataloader Plugin\n\nThis plugin makes it easy to add fields and types that are loaded through a dataloader.\n\n## Usage\n\n### Install\n\nTo use the dataloader plugin you will need to install both the `dataloader` package and the giraphql\ndataloader plugin:\n\n```bash\nyarn add dataloader @giraphql/plugin-dataloader\n```\n\n### Setup\n\n```typescript\nimport DataloaderPlugin from '@giraphql/plugin-dataloader';\n\nconst builder = new SchemaBuilder({\n  plugins: [DataloaderPlugin],\n});\n```\n\n### loadable objects\n\nTo create an object type that can be loaded with a dataloader use the new `builder.loadableObject`\nmethod:\n\n```ts\nconst User = builder.loadableObject('User', {\n  // load will be called with ids of users that need to be loaded\n  // Note that the types for keys (and context if present) are required\n  load: (ids: string[], context: ContextType) => context.loadUsersById(ids),\n  fields: (t) => ({\n    id: t.exposeID('id', {}),\n    username: t.string({\n      // the shape of parent will be inferred from `loadUsersById()` above\n      resolve: (parent) => parent.username,\n    }),\n  }),\n});\n```\n\nWhen defining fields that return `User`s, you will now be able to return either a `string` (based in\nids param of `load`), or a User object (type based on the return type of `loadUsersById`).\n\n```ts\nbuilder.queryType({\n  fields: (t) => ({\n    user: t.field({\n      type: User,\n      args: {\n        id: t.arg.string({ required: true }),\n      },\n      // Here we can just return the ID directly rather than loading the user ourselves\n      resolve: (root, args) => args.id,\n    }),\n    currentUser: t.field({\n      type: User,\n      // If we already have the user, we use it, and the dataloader will not be called\n      resolve: (root, args, context) => context.currentUser,\n    }),\n    users: t.field({\n      type: [User],\n      args: {\n        ids: t.arg.stringList({ required: true }),\n      },\n      // Mixing ids and user objects also works\n      resolve: (_root, args, context) => [...args.ids, context.CurrentUser],\n    }),\n  }),\n});\n```\n\nGiraphQL will detect when a resolver returns `string`, `number`, or `bigint` (typescript will\nconstrain the allowed types to whatever is expected by the load function). If a resolver returns an\nobject instead, GiraphQL knows it can skip the dataloader for that object.\n\n### loadable fields\n\nIn some cases you may need more granular dataloaders. To handle these cases there is a new\n`t.loadable` method for defining fields with their own dataloaders.\n\n```ts\n// Normal object that the fields below will load\ninterface PostShape {\n  id: string;\n  title: string;\n  content: string;\n}\n\nconst Post = builder.objectRef<PostShape>('Post').implement({\n  fields: (t) => ({\n    id: t.exposeID('id', {}),\n    title: t.exposeString('title', {}),\n    content: t.exposeString('title', {}),\n  }),\n});\n\n// Loading a single Post\nbuilder.objectField(User, 'latestPost', (t) =>\n  t.loadable({\n    type: Post,\n    // will be called with ids of latest posts for all users in query\n    load: (ids: number[], context) => context.loadPosts(ids),\n    resolve: (user, args) => user.lastPostID,\n  }),\n);\n// Loading multiple Posts\nbuilder.objectField(User, 'posts', (t) =>\n  t.loadable({\n    type: [Post],\n    // will be called with ids of posts loaded for all users in query\n    load: (ids: number[], context) => context.loadPosts(ids),\n    resolve: (user, args) => user.postIDs,\n  }),\n);\n```\n\n### dataloader options\n\nYou can provide additional options for your dataloaders using `loaderOptions`.\n\n```ts\nconst User = builder.loadableObject('User', {\n  loaderOptions: { maxBatchSize: 20 },\n  load: (ids: string[], context: ContextType) => context.loadUsersById(ids),\n  fields: (t) => ({ id: t.exposeID('id', {}) }),\n});\n\nbuilder.objectField(User, 'posts', (t) =>\n  t.loadable({\n    type: [Post],\n    loaderOptions: { maxBatchSize: 20 },\n    load: (ids: number[], context) => context.loadPosts(ids),\n    resolve: (user, args) => user.postIDs,\n  }),\n);\n```\n\nSee [dataloader docs](https://github.com/graphql/dataloader#api) for all available options.\n\n### Manually using dataloader\n\nDataloaders for \"loadable\" objects can be accessed via their ref by passing in the context object\nfor the current request. dataloaders are not shared across requests, so we need the context to get\nthe correct dataloader for the current request:\n\n```ts\n// create loadable object\nconst User = builder.loadableObject('User', {\n  load: (ids: string[], context: ContextType) => context.loadUsersById(ids),\n  fields: (t) => ({\n    id: t.exposeID('id', {}),\n  }),\n});\n\nbuilder.queryField('user', (t) =>\n  t.field({\n    type: User,\n    resolve: (parent, args, context) => {\n      // get data loader for User type\n      const loader = User.getDataloader(context);\n\n      // manually load a user\n      return loader.load('123');\n    },\n  }),\n);\n```\n\n### Errors\n\nCalling dataloader.loadMany will resolve to a value like `(Type | Error)[]`. Your `load` function\nmay also return results in that format if your loader can have parital failures. GraphQL does not\nhave special handling for Error objects. Instead GiraphQL will map these results to something like\n`(Type | Promise<Type>)[]` where Errors are replaced with promises that will be rejected. This\nallows the normal graphql resolver flow to correctly handle these errors.\n\nIf you are using the `loadMany` method from a dataloader manually, you can apply the same mapping\nusing the `rejectErrors` helper:\n\n```ts\nimport { rejectErrors } from '@giraphql/plugin-dataloader';\n\nbuilder.queryField('user', (t) =>\n  t.field({\n    type: [User],\n    resolve: (parent, args, context) => {\n      const loader = User.getDataloader(context);\n\n      return rejectErrors(loader.loadMany(['123', '456']));\n    },\n  }),\n);\n```\n\n### (Optional) Adding loaders to context\n\nIf you want to make dataloaders accessible via the context object directly, there is some additional\nsetup required. Below are a few options for different ways you can load data from the context\nobject. You can determine which of these options works best for you or add you own helpers.\n\nFirst you'll need to update the types for your context type:\n\n```ts\nimport { LoadableRef } from '@giraphql/plugin-dataloader';\n\nexport interface ContextType {\n  userLoader: DataLoader<string, { id: number }>; // expose a specific loader\n  getLoader: <K, V>(ref: LoadableRef<K, V, ContextType>) => DataLoader<K, V>; // helper to get a loader from a ref\n  load: <K, V>(ref: LoadableRef<K, V, ContextType>, id: K) => Promise<V>; // helper for loading a single resource\n  loadMany: <K, V>(ref: LoadableRef<K, V, ContextType>, ids: K[]) => Promise<(Error | V)[]>; // helper for loading many\n  // other context fields\n}\n```\n\nnext you'll need to update your context factory function. The exact format of this depends on what\ngraphql server implementation you are using.\n\n```ts\nimport { initContextCache } from '@giraphql/core';\nimport { LoadableRef, rejectErrors } from '@giraphql/plugin-dataloader';\n\nexport const createContext = (req, res): ContextType => ({\n  // Adding this will prevent any issues if you server implementation\n  // copies or extends the context object before passing it to your resolvers\n  ...initContextCache(),\n\n  // using getters allows us to access the context object using `this`\n  get userLoader() {\n    return User.getDataloader(this);\n  },\n  get getLoader() {\n    return <K, V>(ref: LoadableRef<K, V, ContextType>) => ref.getDataloader(this);\n  },\n  get load() {\n    return <K, V>(ref: LoadableRef<K, V, ContextType>, id: K) => ref.getDataloader(this).load(id);\n  },\n  get loadMany() {\n    return <K, V>(ref: LoadableRef<K, V, ContextType>, ids: K[]) =>\n      rejectErrors(ref.getDataloader(this).loadMany(ids));\n  },\n});\n```\n\nNow you can use these helpers from your context object:\n\n```ts\nbuilder.queryFields((t) => ({\n  fromContext1: t.field({\n    type: User,\n    resolve: (root, args, { userLoader }) => userLoader.load('123'),\n  }),\n  fromContext2: t.field({\n    type: User,\n    resolve: (root, args, { getLoader }) => getLoader(User).load('456'),\n  }),\n  fromContext3: t.field({\n    type: User,\n    resolve: (root, args, { load }) => load(User, '789'),\n  }),\n  fromContext4: t.field({\n    type: [User],\n    resolve: (root, args, { loadMany }) => loadMany(User, ['123', '456']),\n  }),\n}));\n```\n\n### Using with the Relay plugin\n\nIf you are using the Relay plugin, there is an additional method `loadableNode` that gets added to\nthe builder. You can use this method to create `node` objects that work like other loadeble objects.\n\n```ts\nconst UserNode = builder.loadableNode('UserNode', {\n  id: {\n    resolve: (user) => user.id,\n  },\n  // For loadable objects we always need to include an isTypeOf check\n  isTypeOf: (obj) => obj instanceof User,\n  load: (ids: string[], context: ContextType) => context.loadUsersById(ids),\n  fields: (t) => ({}),\n});\n```\n\n### Caching resources loaded manually in a resolver\n\nWhen manually loading a resource in a resolver it is not automatically added to the dataloader\ncache. If you want any resolved value to be stored in the cache in case it is used somewhere else in\nthe query you can use the `cacheResolved` option.\n\nThe `cacheResolved` option takes a function that converts the loaded object into it's cache Key:\n\n```ts\nconst User = builder.loadableObject('User', {\n  load: (ids: string[], context: ContextType) => context.loadUsersById(ids),\n  cacheResolved: user => user.id,\n  fields: (t) => ({\n    id: t.exposeID('id', {}),\n    ...\n  }),\n});\n```\n\nWhenever a resolver returns a User or list or Users, those objects will automatically be added the\ndataloaders cache, so they can be re-used in other parts of the query.\n","readmeFilename":"README.md","_id":"@giraphql/plugin-dataloader@0.0.0-preview-202181322430","_nodeVersion":"12.22.5","_npmVersion":"6.14.14","dist":{"integrity":"sha512-09/BaaJBThn3TtPS5XJ3oAKlf4nYt2OEdqOPuyRfLErHOwp+emoTWIUO3EqM1uf6twMVpXAVf725ufCvl7XRWg==","shasum":"cc4897912c18f77b6f8a000be429d92a0069175c","tarball":"https://registry.npmjs.org/@giraphql/plugin-dataloader/-/plugin-dataloader-0.0.0-preview-202181322430.tgz","fileCount":16,"unpackedSize":42526,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJhPrZ4CRA9TVsSAnZWagAAKukQAJSJrn5h+7pr518LF9JG\nEGrbMx7UBeMEAgK9Q2axzSUCo+QVWvMH0KVV+00lwtpeJ2Y+REhBd11lMfCb\nZN1YMmu06ZjBNh9NZzS3XAEAsP2Vy1O9/ApsWCcPLBoxNqHtkoDCBV8rFsKH\nRDodjSZy0Iqs7xvxKBKUXxh4pkx0NqxVOqeBfADsW+7AyovxJRIJvWYBGYa5\nTw1HJuvBt93NYWmiPuREzMp0+3JFtMpn8iGqPs6L8nTXlBgpQkahATW6sTOg\nNdrk/5QhMWESFU91xrWq3vkPkUV2UePZosETF+VD74NcrwATSq3BcsnlD+eO\n9MxnYD0Uo/Bw18/rouYmLvYhbmKq562NGbN41l1I3JHzMlSW3y8OOmYeN6tz\npgvAh50pw3qbHEBMWof4UmaZuiS5ODN2PikJh39HUkE+EK/i79WDUIySnoBq\nXew+7/j2J+tU29qLfBuUiXeTEfhSC7e/G8iA2VpkcywZ6FPc16vHHW2myGpg\nPKJ00JQwdNU0j4G9CN/S5b4V4GxzNW95HU38/hwFcfFwXIq+Elb1xZ1t4EZb\nKsyZNFJfTcUYvMFNmSfB5TdDf940V2lGu7wkHxetXjCwlXvgmU6DLV261b62\nR9BwZEmBNArVt1S9olVLcoWdND9QKdVTdJJ2VrbEa9at9FlrJfgeSgs3KAVQ\naXah\r\n=Q8nv\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIHH0vlefvJkH+CzGhpA0Cn07YmsWClQncWF4RMcjxztXAiBgPAZwf6SRuBQ4VctyiunjhPvRKwVRvSZIq1wcBp63iQ=="}]},"_npmUser":{"name":"hayes","email":"michael@hayes.io"},"directories":{},"maintainers":[{"name":"hayes","email":"michael@hayes.io"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/plugin-dataloader_0.0.0-preview-202181322430_1631499895887_0.8673193829005843"},"_hasShrinkwrap":false},"2.16.0":{"name":"@giraphql/plugin-dataloader","version":"2.16.0","description":"A GiraphQL plugin for attaching dataloader to object types","main":"./lib/index.js","module":"./esm/index.js","exports":{"import":"./esm/index.js","require":"./lib/index.js"},"author":{"name":"Michael Hayes"},"license":"ISC","keywords":["giraphql","graphql","schema","typescript","dataloader"],"publishConfig":{"access":"public"},"peerDependencies":{"dataloader":"2","graphql":">=15.1.0"},"devDependencies":{"@giraphql/core":"^2.15.1","@giraphql/test-utils":"^0.1.1","@giraphql/plugin-errors":"^2.8.1","@giraphql/plugin-relay":"^2.15.1","dataloader":"^2.0.0","graphql-tag":"^2.12.5"},"gitHead":"9dfe52f1975f41a111e01bf96a20033a914e2acc","scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"_resolved":"","_integrity":"","_from":"file:giraphql-plugin-dataloader-2.16.0.tgz","_id":"@giraphql/plugin-dataloader@2.16.0","_nodeVersion":"14.17.6","_npmVersion":"6.14.15","_npmUser":{"name":"hayes","email":"michael@hayes.io"},"dist":{"integrity":"sha512-4I3Uv1g6M0CDt4GTJtXr6QxeNKDELdsmyraQscREfrfCMvz4gAtjdvpCX0Syu15BKjE2BpFJHXczYGG7xhTrHg==","shasum":"6f7535498fca39e473879b3528562a0ffb509952","tarball":"https://registry.npmjs.org/@giraphql/plugin-dataloader/-/plugin-dataloader-2.16.0.tgz","fileCount":97,"unpackedSize":185073,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJhPsYSCRA9TVsSAnZWagAAe9EQAJd779eyKSxStFX/aUan\n5homj4JMNS95lWHTG6dB4rj0lYy710Zw9ztc6vJiBLK40vHFpHoINfnyHHsO\ne0qnQLp8QLI6RVj4iSle6iqg8w6on1b8XriCn4bZ6b/amAz1QmJHWs0CZeHU\nHpus51cQz0JrhYX+tjykEF3XOcMT5zZdqZkYGFrrI55BR5XtmjoL3r3Hxj3H\nnFvUBPBpYuxoMcCpAVi8Eh0eUloua/d7tNJRqxiO5d9zGT1ihKYSthAtRGIM\nYBTppefp9w9ve8D9DIf3FatU2wuot1Zj/yxrvjfb6cq12qmDyKR2XW1ZyVep\nFKrGmtWQYTzqiUPXeqsaRoHNp+eIB8yWexc3H/EywqBTAlP0K3sr6MTg/8nA\nJunZZ2F2oW8Pqv0CeXoFom9R7k+AWHwIabaoF/KkC/nN78lLaC9C0+htBTJK\ndpUdpF3EZsolZNkzhwsUnHTafSw9PqB5+8TxATPbk8X39c6GqKM8LCUlvVJc\nxAeSPRfggJzDCiJ7jqHaNiF32+V7T+4oT1/kmPyKpnP6X9kSwlE6yeepccRI\n2VIxSiCYRKFevtvGgt8oazOg85UM9YW7c0iXTjKeC+nWtA3RKevKnOta/GWX\nnS/OMOOSTBB66eq+IUAIwEolHr10a8ewKAqgJS3MVMeSxoVokNCUskKN1H53\nxWi7\r\n=G92A\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIH+zW5NuLhvJoigFJXB1cj54jaA+Jx+Jg2e2Fb7hWjDxAiEAnfji91hfCEmgq3ETmR/tWYy2dM1hPFvu3cGwycfwxuA="}]},"directories":{},"maintainers":[{"name":"hayes","email":"michael@hayes.io"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/plugin-dataloader_2.16.0_1631503890216_0.36450779960444457"},"_hasShrinkwrap":false},"2.16.1":{"name":"@giraphql/plugin-dataloader","version":"2.16.1","description":"A GiraphQL plugin for attaching dataloader to object types","main":"./lib/index.js","module":"./esm/index.js","exports":{"import":"./esm/index.js","require":"./lib/index.js"},"author":{"name":"Michael Hayes"},"license":"ISC","keywords":["giraphql","graphql","schema","typescript","dataloader"],"publishConfig":{"access":"public"},"peerDependencies":{"dataloader":"2","graphql":">=15.1.0"},"devDependencies":{"@giraphql/core":"^2.15.2","@giraphql/test-utils":"^0.1.2","@giraphql/plugin-errors":"^2.8.2","@giraphql/plugin-relay":"^2.15.2","dataloader":"^2.0.0","graphql-tag":"^2.12.5"},"gitHead":"9dfe52f1975f41a111e01bf96a20033a914e2acc","scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"_resolved":"","_integrity":"","_from":"file:giraphql-plugin-dataloader-2.16.1.tgz","_id":"@giraphql/plugin-dataloader@2.16.1","_nodeVersion":"14.17.6","_npmVersion":"6.14.15","_npmUser":{"name":"hayes","email":"michael@hayes.io"},"dist":{"integrity":"sha512-E3AANI6w5Eyphfd0fvOIjwy9qR6InlyeEXG+9hKyyrOJIdIim+24GIqRUFa6C4OcAAGOvCcuN0q+hzOGLzx5uw==","shasum":"4a6049a7d8189914dbc6054fb7364b5b9d504a2b","tarball":"https://registry.npmjs.org/@giraphql/plugin-dataloader/-/plugin-dataloader-2.16.1.tgz","fileCount":97,"unpackedSize":184564,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIE4dbUxHceRRTrncI33WW6KyBE43If2/lqNYs2OsEnSJAiEApkTU5CxRNbPM40TuHrd0Udx4POSlpV7SCbaVoAE2Eeo="}]},"directories":{},"maintainers":[{"name":"hayes","email":"michael@hayes.io"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/plugin-dataloader_2.16.1_1632278618115_0.9271865028341659"},"_hasShrinkwrap":false},"2.17.0":{"name":"@giraphql/plugin-dataloader","version":"2.17.0","description":"A GiraphQL plugin for attaching dataloader to object types","main":"./lib/index.js","module":"./esm/index.js","exports":{"import":"./esm/index.js","require":"./lib/index.js"},"author":{"name":"Michael Hayes"},"license":"ISC","keywords":["giraphql","graphql","schema","typescript","dataloader"],"publishConfig":{"access":"public"},"peerDependencies":{"dataloader":"2","graphql":">=15.1.0"},"devDependencies":{"@giraphql/core":"^2.16.0","@giraphql/test-utils":"^0.2.0","@giraphql/plugin-errors":"^2.10.0","@giraphql/plugin-relay":"^2.16.0","dataloader":"^2.0.0","graphql-tag":"^2.12.5"},"gitHead":"9dfe52f1975f41a111e01bf96a20033a914e2acc","scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"_resolved":"","_integrity":"","_from":"file:giraphql-plugin-dataloader-2.17.0.tgz","_id":"@giraphql/plugin-dataloader@2.17.0","_nodeVersion":"14.17.6","_npmVersion":"6.14.15","_npmUser":{"name":"hayes","email":"michael@hayes.io"},"dist":{"integrity":"sha512-LD0Ir8Wc8IqtBaFGLLqvozqYlFQv3PgYp6a3eR/glLNtAFD4z4AGtt0yFFnpoVmnFtu0NSWGmDd4K6scVMHuDg==","shasum":"90b0d8602ba3d3c1b747ccc6b6e504e25928761f","tarball":"https://registry.npmjs.org/@giraphql/plugin-dataloader/-/plugin-dataloader-2.17.0.tgz","fileCount":97,"unpackedSize":186663,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIA5Ff1Jn6JDT7g+V/iC3QUc1YKsPImeZyDcq9Kp7E85gAiAWwTt0yB8x+UpG1Np/AVP6lq09+3xQ6Zguf0HkMTk3Jw=="}]},"directories":{},"maintainers":[{"name":"hayes","email":"michael@hayes.io"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/plugin-dataloader_2.17.0_1632971278230_0.52511043920852"},"_hasShrinkwrap":false},"2.18.0":{"name":"@giraphql/plugin-dataloader","version":"2.18.0","description":"A GiraphQL plugin for attaching dataloader to object types","main":"./lib/index.js","module":"./esm/index.js","exports":{"import":"./esm/index.js","require":"./lib/index.js"},"author":{"name":"Michael Hayes"},"license":"ISC","keywords":["giraphql","graphql","schema","typescript","dataloader"],"publishConfig":{"access":"public"},"peerDependencies":{"dataloader":"2","graphql":">=15.1.0"},"devDependencies":{"@giraphql/core":"^2.17.0","@giraphql/test-utils":"^0.3.0","@giraphql/plugin-errors":"^2.11.0","@giraphql/plugin-relay":"^2.17.0","dataloader":"^2.0.0","graphql-tag":"^2.12.5"},"gitHead":"9dfe52f1975f41a111e01bf96a20033a914e2acc","scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"_resolved":"","_integrity":"","_from":"file:giraphql-plugin-dataloader-2.18.0.tgz","_id":"@giraphql/plugin-dataloader@2.18.0","_nodeVersion":"14.18.1","_npmVersion":"6.14.15","_npmUser":{"name":"hayes","email":"michael@hayes.io"},"dist":{"integrity":"sha512-wJe8QgeyJm76JKu8UcDEK3TT8jdL1m7vy9AW8C9GcL0HgefP02vUgEWzvih0DnoW97IceftzYD//1C9nNpLYaQ==","shasum":"054a24dfa7a8f6f7fd4023e1c3fc472daf223e04","tarball":"https://registry.npmjs.org/@giraphql/plugin-dataloader/-/plugin-dataloader-2.18.0.tgz","fileCount":97,"unpackedSize":187049,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCICgOZJIInjiaznpdPGSvzUebMIB0JGk8hfk9nKWS8OXuAiEAhLpjgcbcqb+YMZp8mGUrJapXtnuptuuhYBq0zbaTb/c="}]},"directories":{},"maintainers":[{"name":"hayes","email":"michael@hayes.io"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/plugin-dataloader_2.18.0_1635985511856_0.5958330585697078"},"_hasShrinkwrap":false},"2.19.0":{"name":"@giraphql/plugin-dataloader","version":"2.19.0","description":"A GiraphQL plugin for attaching dataloader to object types","main":"./lib/index.js","module":"./esm/index.js","exports":{"import":"./esm/index.js","require":"./lib/index.js"},"author":{"name":"Michael Hayes"},"license":"ISC","keywords":["giraphql","graphql","schema","typescript","dataloader"],"publishConfig":{"access":"public"},"peerDependencies":{"dataloader":"2","graphql":">=15.1.0"},"devDependencies":{"@giraphql/core":"^2.18.0","@giraphql/plugin-errors":"^2.12.0","@giraphql/plugin-relay":"^2.18.0","@giraphql/test-utils":"^0.4.0","dataloader":"^2.0.0","graphql-tag":"^2.12.6"},"gitHead":"9dfe52f1975f41a111e01bf96a20033a914e2acc","scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"_resolved":"","_integrity":"","_from":"file:giraphql-plugin-dataloader-2.19.0.tgz","_id":"@giraphql/plugin-dataloader@2.19.0","_nodeVersion":"14.18.1","_npmVersion":"6.14.15","_npmUser":{"name":"hayes","email":"michael@hayes.io"},"dist":{"integrity":"sha512-BBI2caN8/J6wssO/nrnElqSxMoklyYmM4JRZFTQNZTHOxuBRWoxzD+UWVxVAybz9MrEOzr+zsS+UVtbxpBALYg==","shasum":"5ef06cdf11784d3ec8b1276cd5b507c83bdd9d96","tarball":"https://registry.npmjs.org/@giraphql/plugin-dataloader/-/plugin-dataloader-2.19.0.tgz","fileCount":97,"unpackedSize":187112,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJhlEjGCRA9TVsSAnZWagAA+uIP/0kyXMSqHTxSxJplxy/4\nPYlB91xA6TvR5WSdebAADr1NE+aJV1LLFFfNt1Rmew8Y2Kmzkn9SDeev+8ir\nqg4N2P53Cnl7LgI8fAnt/vjaIwYZ9pDC9KIJaPmZp38FZT/ScmrHvGrOcSE4\ncb5otHydDnloXX0C3W1ZgUwKGhuu8Vjhu0Vr9UrHdjYcV0fiXRgR1wmkvuzp\nntA2o//rzkSZTdd106YIupr+46jHWflR+MTHtFaoR+3MzPhWXzBbLScKmXMQ\nfHdRcFPOAmToomnB/u217N7fhGh1b2MeDndpxfE16krUEyktx/97py9x6pEn\nL3WYVKfsgQaYv/5HKw5Re5A22gwCOc6gEMtCSoAqk7m7LkIoNiLyEJ8SbXLa\nqgb+Dfa9BZnayj//q+zE6kc7drLPYkq9HxAFc84pqwNEfcvjGcINWBp6WtKC\nnM+kn8pxH7qcB5j1M+typfDJkDmpXbAHCRyn79YbNd2slnAPXZIZEDHTmLY5\nlNcn2UoZqcRph6Z/7PCycaMEPhQBOACLd4JaBf9cbLqnYqK3rmXfY1ETX3yv\nQ6Lnf02oBEHrbj+C+DZwR+QYqDdFSjRshWyFEYETqrf7+Tlq/nHBVW2Gyo1W\nDjFcZxtqtKLA64+V9ZjvHcIbmFf423HgWm4+iuBhet8sic8o0kHT/EwSVjDz\nHjgi\r\n=l6qt\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIGMIPxTvxDuVS2YC88KckTzsn5WdkhkN0FofTCHkzRueAiAAtwG+8jhnJUQVM7H+1sJVnvcDi9UutdAWHSmqeLbK5w=="}]},"directories":{},"maintainers":[{"name":"hayes","email":"michael@hayes.io"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/plugin-dataloader_2.19.0_1637107910300_0.12843046161677973"},"_hasShrinkwrap":false},"2.19.1":{"name":"@giraphql/plugin-dataloader","version":"2.19.1","description":"A GiraphQL plugin for attaching dataloader to object types","main":"./lib/index.js","types":"./lib/index.d.ts","module":"./esm/index.js","exports":{"import":"./esm/index.js","require":"./lib/index.js"},"author":{"name":"Michael Hayes"},"license":"ISC","keywords":["giraphql","graphql","schema","typescript","dataloader"],"publishConfig":{"access":"public"},"peerDependencies":{"dataloader":"2","graphql":">=15.1.0"},"devDependencies":{"@giraphql/core":"^2.18.1","@giraphql/plugin-errors":"^2.12.1","@giraphql/plugin-relay":"^2.18.1","@giraphql/test-utils":"^0.4.1","dataloader":"^2.0.0","graphql-tag":"^2.12.6"},"gitHead":"9dfe52f1975f41a111e01bf96a20033a914e2acc","scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"_resolved":"","_integrity":"","_from":"file:giraphql-plugin-dataloader-2.19.1.tgz","_id":"@giraphql/plugin-dataloader@2.19.1","_nodeVersion":"14.18.1","_npmVersion":"6.14.15","_npmUser":{"name":"hayes","email":"michael@hayes.io"},"dist":{"integrity":"sha512-FwmOB1czllmWweoc1svW4KY9JBOyR8sPxKzKar9OPXbEvCPi6DRDmxISEQ0u3JaP6anT9hzzFr0DDQ4UivR/Wg==","shasum":"97e935f4533681f2b2f4fbecf59525801c7e37f0","tarball":"https://registry.npmjs.org/@giraphql/plugin-dataloader/-/plugin-dataloader-2.19.1.tgz","fileCount":97,"unpackedSize":187217,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJhlHFpCRA9TVsSAnZWagAAy3cP/RYcp3e3N5zHBQOOye3y\nzviMEhGC8+/2e5rXRhVorNeDfo8QULGF9wAkj5m1rDVRkwwrgO9IB6ycr3RW\nCgPp9DK28oMxok0YssJB6YWIepMjLstBq4sDiUaXOAXc7mMORl+lgcrnFkFK\nTHQuYTlap3/+wzf34iQDjrl/LJZTCa+prhbLUfT5ESzp1naDWJftXFCH7DEw\nUzeqnDyRXWA5TfpgA8SWq+QS82jlZ01OSYXrAD+WqT+kblqgeZ+onLk5Lvf6\nfoi6p9lwtNm3Ry+vfE6t8SHc3tXIWtzjJZwYKxYUQoyIkHgGcs4wLwT24P6k\ngYk4ebvEW+TMRr4ngYPxWiT/MJ3kjsm8nrsZxMcxuDi8lnJG6m/bIE5KhAkj\nhlHbofrA5hG5D5QfkjinrsJLkJ13fB5ttbQAnDYxyFJUkpnVV6PvayplzIPB\no2z6Y3syIju/pipEwf99363Pxn75B0UOowOvDTUDmbkIvI+6x0x19GzugX2N\nDc0DOeTf5vZgoQKfSEuo7u36KoKaQYWiXBqFR1yXmKXiKJGqOxB5KphwnaMz\ncQtldYgojePjvEt9qsdkZEQi9Wo7iyNOOR2FTuKXUe6uq62cMuvdRff3K1j5\nramFfhGoFFbwIsCSQuRR0hl4s5DSjvO7Ju17ihlZiKWQ5EX2SsB1U+kT5Pvr\nP5Yf\r\n=5abZ\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCr9Wmc6j2Tr0rwG+VIwELkTUSWzMAKziclO/Bt3MLR2wIhALzR464wjqOd0P1baRZpsHfVh8k+8xPn6c1B/ZEXNOIk"}]},"directories":{},"maintainers":[{"name":"hayes","email":"michael@hayes.io"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/plugin-dataloader_2.19.1_1637118313686_0.2473457566202224"},"_hasShrinkwrap":false},"2.19.2":{"name":"@giraphql/plugin-dataloader","version":"2.19.2","description":"A GiraphQL plugin for attaching dataloader to object types","main":"./lib/index.js","types":"./lib/index.d.ts","module":"./esm/index.js","exports":{"import":"./esm/index.js","require":"./lib/index.js"},"author":{"name":"Michael Hayes"},"license":"ISC","keywords":["giraphql","graphql","schema","typescript","dataloader"],"publishConfig":{"access":"public"},"peerDependencies":{"dataloader":"2","graphql":">=15.1.0"},"devDependencies":{"@giraphql/core":"^2.19.1","@giraphql/plugin-errors":"^2.12.2","@giraphql/plugin-relay":"^2.18.3","@giraphql/test-utils":"^0.5.1","dataloader":"^2.0.0","graphql-tag":"^2.12.6"},"gitHead":"9dfe52f1975f41a111e01bf96a20033a914e2acc","scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"_resolved":"","_integrity":"","_from":"file:giraphql-plugin-dataloader-2.19.2.tgz","_id":"@giraphql/plugin-dataloader@2.19.2","_nodeVersion":"14.18.1","_npmVersion":"6.14.15","_npmUser":{"name":"hayes","email":"michael@hayes.io"},"dist":{"integrity":"sha512-UPpm8/KZlPDpGaxkGt/bVQSaBfdzkrE3uCp9drUHDT5lm1PMl+WZMWIpkEVBH1lb+nKkZMzKLnVL443xrlYO+g==","shasum":"9e223f326db08a9a0a0a3df4ad8bca9b57fe24e8","tarball":"https://registry.npmjs.org/@giraphql/plugin-dataloader/-/plugin-dataloader-2.19.2.tgz","fileCount":97,"unpackedSize":187663,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJhpb4qCRA9TVsSAnZWagAAcAQQAJwQ4UR610v25tWym5qs\nR3LOhBMBCCAkKeacLhlliPqMZz043K3Y4IB8UHOexmjyoIeWMnzk6n3cU9Vp\nTVX8IjC/rT1/i5bWjrEpc8HmWZNZ14tR8ReF+rdrMoR0zuO23/mMaRcAxMxC\n3A2MvMRsYseC5LRzN/kDvOTGbGE0bn39qxW//gCEo5I4j5EiAwqlibY6C1kO\n9F3MKRTfpcmo5wwni8B2dUyNQl/JWlGBlnsuOMXCMPSdxkRSWkt4D9ryMW9T\ncsUfh7FL6hg3vyPSjYEGdqJrQc72U8Kv0/KQEJTkM06RwE6PnxKhEvvMbzzB\nRBapjxmJGuoyez08ENrLqedfYrXmJEm1ALicmfG/SmMzNXok5FpWCg9cx45D\nxH+c/f16XmYfuc67TNQ/2L+gOYc3E4Gty5Jpcvx2Gck4r9yqkHwmh3g87UzU\nTznTQBgOw4JIoqPd34QeyQP8g7kq3uirRxIS9YR/NKu50NDLxcD+425hyVy7\n307VFRLG+SDqdtXSbunsYZ7OyXlIvbBMOcCySBn8QQtmrbD8yZvpxHYKRV04\nWLI/n4uEx5NKdNXUdu8G8j+qKB1UZ47MAp6DtA4ZtWzjXSBcJ14CXUp3L1vF\nk3ozwpSz7XI4c5qYwzctnu3uNnOR6f4dU/zhJ5eSmJG6wCof1hJfuXol5V+T\nKuSZ\r\n=or6n\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDbfitLE7ssrmnL2lz821eQekOa38W5pTu0jjIpmLauqwIhAL2niZzyuYdHQV4f7Q5PPJoSbyGBs1WFNgJddbApT5qo"}]},"directories":{},"maintainers":[{"name":"hayes","email":"michael@hayes.io"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/plugin-dataloader_2.19.2_1638252074046_0.9489830336932106"},"_hasShrinkwrap":false},"2.19.3":{"name":"@giraphql/plugin-dataloader","version":"2.19.3","description":"A GiraphQL plugin for attaching dataloader to object types","main":"./lib/index.js","types":"./lib/index.d.ts","module":"./esm/index.js","exports":{"import":"./esm/index.js","require":"./lib/index.js"},"author":{"name":"Michael Hayes"},"license":"ISC","keywords":["giraphql","graphql","schema","typescript","dataloader"],"publishConfig":{"access":"public"},"peerDependencies":{"dataloader":"2","graphql":">=15.1.0"},"devDependencies":{"@giraphql/core":"^2.19.1","@giraphql/plugin-errors":"^2.12.3","@giraphql/plugin-relay":"^2.18.4","@giraphql/test-utils":"^0.5.1","dataloader":"^2.0.0","graphql-tag":"^2.12.6"},"gitHead":"9dfe52f1975f41a111e01bf96a20033a914e2acc","scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"_resolved":"","_integrity":"","_from":"file:giraphql-plugin-dataloader-2.19.3.tgz","_id":"@giraphql/plugin-dataloader@2.19.3","_nodeVersion":"14.18.2","_npmVersion":"6.14.15","_npmUser":{"name":"hayes","email":"michael@hayes.io"},"dist":{"integrity":"sha512-nlzmLBRvYPxt0Vz4Pwns7jGu64rVVT519HhN7MEAPygd1hE566nsNlWR2zYdi8X4ebElx/qhR1SkA3hXJm0jlg==","shasum":"903a242e14926ce4a816823ec1972143bb072f99","tarball":"https://registry.npmjs.org/@giraphql/plugin-dataloader/-/plugin-dataloader-2.19.3.tgz","fileCount":97,"unpackedSize":187858,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJht+ySCRA9TVsSAnZWagAAMfgQAJbcxeKpwrXNRYMOw31P\nq8eRaHgXhKRpP4xuYe5gkR3xsD4614lCIW3fU6CvCVL9EiZvf5zHCMA4Xx0j\nFnNgHwQp8wIa5Mufc4YVBaJIDKGNBXOfyjU0s0j/1a2u9y92rZ5YaGd7KL1r\nJ9+TKSkfGkVHvR0uq9Rau9B0uPOp6sKn8MlsLiLZbnzFtr65W/MJkZWJWn3X\nyXFFDYYIeay4sAFdLXkinxyJdcNTgPBVBUt/lir9IMpgRthOANRBL7ISaHF6\nzty8D70K0sVoTZMvORlHtCbLyT1xE4FySUI5KUl3Cj6OLJyuVBzPk9RtHsE9\nTHqXIsVvjriJ0iqRBpIuE4581n0IxUn8Pet340iUu4HzQAPC/Omrh8nNHBdK\nZD3dQBWVJEla9IKbo4SuC1gSGXJjNxmjVfpq+t7T9PkWu2Rz49fKWPrdd859\nzdaYrcYWqJLc7cbVO1yr3smBO+dTwzotYZXXhEkZvbNJr90WiCvKqFX9u3k9\nkA19xnEjTw9DXPbWU3MmUo6HuDvQluWq9HgYNu9OQWWQf+sGQBQK9pNWyjO0\nL9G7ZXiU3+ivC3l8HndrQYBxnbvHlPkD2oNRpz8b115/H67FIMV847xjBSQb\nelC84c904SYkrvM5hdb7NcGygwtWhCyv2dGScX5hW0T3dQ4NkstUMSAhKv8U\nsk0M\r\n=xk21\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCBs+v6zqFuB3GisG3Kriur54zxS8W0DkLHrrPPxrrxzAIgB0p2R/8AjFGZcKWk57/OamS6slCcZT8le0eU9oOhE6U="}]},"directories":{},"maintainers":[{"name":"hayes","email":"michael@hayes.io"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/plugin-dataloader_2.19.3_1639443602298_0.025463412568811572"},"_hasShrinkwrap":false},"2.20.0":{"name":"@giraphql/plugin-dataloader","version":"2.20.0","description":"A GiraphQL plugin for attaching dataloader to object types","main":"./lib/index.js","types":"./lib/index.d.ts","module":"./esm/index.js","exports":{"import":"./esm/index.js","require":"./lib/index.js"},"author":{"name":"Michael Hayes"},"license":"ISC","keywords":["giraphql","graphql","schema","typescript","dataloader"],"publishConfig":{"access":"public"},"peerDependencies":{"dataloader":"2","graphql":">=15.1.0"},"devDependencies":{"@giraphql/core":"^2.22.0","@giraphql/plugin-errors":"^2.13.0","@giraphql/plugin-relay":"^2.19.0","@giraphql/test-utils":"^0.6.0","dataloader":"^2.0.0","graphql-tag":"^2.12.6"},"gitHead":"9dfe52f1975f41a111e01bf96a20033a914e2acc","scripts":{"type":"tsc --noEmit && tsc --project tests/tsconfig.json","build":"pnpm build:cjs && pnpm build:esm","build:cjs":"tsc --module commonjs --outDir lib","build:esm":"tsc --module es2020 --outDir esm && pnpm esm:extensions","esm:extensions":"ts-node --compiler-options \"{\\\"module\\\":\\\"commonjs\\\"}\" ../../.config/esm-transformer.ts","test":"pnpm jest"},"_resolved":"","_integrity":"","_from":"file:giraphql-plugin-dataloader-2.20.0.tgz","_id":"@giraphql/plugin-dataloader@2.20.0","_nodeVersion":"14.18.2","_npmVersion":"6.14.15","_npmUser":{"name":"hayes","email":"michael@hayes.io"},"dist":{"integrity":"sha512-fIROCukPn0sTbCa0zM0O+ScrFhtf1sVBnhEgl34PJpn6HmBiNOYhPQmdRfiP0BdfJ8pN50r27trsE7f2vs35yA==","shasum":"ab2901004df2e04881ae51b5daac1ee7615474c1","tarball":"https://registry.npmjs.org/@giraphql/plugin-dataloader/-/plugin-dataloader-2.20.0.tgz","fileCount":100,"unpackedSize":191429,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJhuX7KCRA9TVsSAnZWagAAnNcP+gKQrNXYCHsI4KLFr5Yu\nuOaSZ8kefpIGB0b7ZMW5aLXuyM6RpV8Btek1FDUZELleu0wfmLKSasmTd1wT\nv9PdAF8p7QuX5SUUx4sIrTFT34pPbi0TxAEttQXyRQ4yxZz7e+K5V+Ul4IeS\nvzGqYxRKFpjzQqNCC4vlg05SqH/YQ+2UETqOQoY6UFRLszgyt7Q2T+aA0ZKN\nwU9gqewgdmIOzZwYwMMDEadg3BicqdCj2iwss+fdGLRKijyxHkzW54yZMkgB\ntELOg/M/1LMB6476acTnLDQ+19MJuLxfMQF2exH1+lZBMDe2hdHtbpq8E7r4\n1NPlv9+MsOjirTm6lYOpPjrKRWweOpbXbfpUCMEU87DEcthm2jjGz1jPyx/k\nZxp+UfDjMLQmg3C/QdWMnlBwcrXZkk1uJn/KSPyfGsxXe4hlNESOO+z69SAK\n8f6mZO3kZepo6p0NIptW++uosqiVEfzVCNlNGo3gDwEiD+hr1JPQ0+HoEc55\nTXPNq+mjTSl9NeGGKq3q/qVxZ/MWawZHksSaDKYSbBErHkbWXLRblKHoje8+\nvv9GCzBhUtPMW0MeF5w3lUSs5w0WKHBmZB3aZmlzYZdTnFyAy/kcm8/tLaDH\nCH77AfPGFMjv3WiFOoHnpPSU9mOwug6UJMfRazgWb/mof337Wg9+9JSaAl3h\ncZy/\r\n=rzQB\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCp+28riLWy+bX7z6SnhjajPXZxW6MaMk3s+sKLCUdwugIgHBou3ZyFoLC6N6pf+CqEM4mY6J/B2zA27wSITHJHIGE="}]},"directories":{},"maintainers":[{"name":"hayes","email":"michael@hayes.io"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/plugin-dataloader_2.20.0_1639546570032_0.13109127568475154"},"_hasShrinkwrap":false}},"time":{"created":"2021-05-08T23:09:23.005Z","2.0.0-alpha.1":"2021-05-08T23:09:23.668Z","modified":"2022-04-05T14:20:08.310Z","2.0.0-alpha.2":"2021-05-08T23:18:16.495Z","2.0.0":"2021-05-09T00:08:24.766Z","2.1.0":"2021-05-10T18:01:37.630Z","2.1.1":"2021-05-10T21:40:03.004Z","2.1.2":"2021-05-10T21:47:11.377Z","2.1.3":"2021-05-12T23:04:51.136Z","2.2.0":"2021-05-13T01:20:03.491Z","2.2.1":"2021-05-18T22:30:51.138Z","2.2.2":"2021-05-26T23:59:22.481Z","2.2.3":"2021-05-28T01:44:44.240Z","2.2.4-alpha.0":"2021-05-29T06:46:48.091Z","2.2.4-alpha.1":"2021-05-29T06:54:25.940Z","2.2.4-alpha.2":"2021-05-29T22:41:55.560Z","2.2.4":"2021-05-31T06:59:33.517Z","2.3.0-alpha.0":"2021-06-09T20:11:03.910Z","2.3.0":"2021-06-10T00:55:54.799Z","2.4.0":"2021-06-11T07:22:34.137Z","2.5.0-alpha.0":"2021-06-28T01:13:01.562Z","2.5.0-alpha.1":"2021-06-28T18:14:11.495Z","2.5.0":"2021-06-28T18:28:36.485Z","2.5.1":"2021-06-29T07:07:04.576Z","2.5.2":"2021-07-02T18:33:26.624Z","2.5.3":"2021-07-02T20:08:55.358Z","2.5.4-alpha.0":"2021-07-03T01:01:20.611Z","2.5.4-alpha.1":"2021-07-04T03:32:28.396Z","2.5.4":"2021-07-04T04:18:22.816Z","2.5.5":"2021-07-10T03:43:48.621Z","2.5.6-alpha.0":"2021-07-17T03:50:48.790Z","2.5.6":"2021-07-23T18:41:56.242Z","2.6.0-alpha.0":"2021-07-28T20:01:36.639Z","2.6.0":"2021-07-29T22:47:14.940Z","2.7.0":"2021-07-30T23:28:55.541Z","2.7.1-alpha.0":"2021-08-02T05:07:04.167Z","2.8.0":"2021-08-03T04:04:05.385Z","2.8.1":"2021-08-05T04:42:05.776Z","2.9.0":"2021-08-05T07:15:44.334Z","2.9.1":"2021-08-05T07:22:42.481Z","0.0.0-preview-202177065":"2021-08-07T00:07:02.317Z","0.0.0-preview-20217701452":"2021-08-07T00:15:06.184Z","2.9.2":"2021-08-07T00:15:30.331Z","0.0.0-preview-20217752147":"2021-08-07T05:22:01.220Z","0.0.0-preview-20217753333":"2021-08-07T05:33:48.132Z","0.0.0-preview-202178182932":"2021-08-08T18:29:49.009Z","0.0.0-preview-202178184810":"2021-08-08T18:48:24.431Z","0.0.0-preview-202178194614":"2021-08-08T19:46:28.757Z","2.11.0":"2021-08-08T19:57:19.525Z","0.0.0-preview-202179204139":"2021-08-09T20:41:55.532Z","2.12.0":"2021-08-12T23:15:14.805Z","2.13.0":"2021-08-27T22:27:34.313Z","2.14.0":"2021-08-29T07:37:46.045Z","2.14.1":"2021-08-30T17:42:52.649Z","2.15.0":"2021-09-01T04:45:31.713Z","0.0.0-preview-202181322430":"2021-09-13T02:24:56.071Z","2.16.0":"2021-09-13T03:31:30.394Z","2.16.1":"2021-09-22T02:43:38.325Z","2.17.0":"2021-09-30T03:07:58.371Z","2.18.0":"2021-11-04T00:25:12.059Z","2.19.0":"2021-11-17T00:11:50.482Z","2.19.1":"2021-11-17T03:05:13.859Z","2.19.2":"2021-11-30T06:01:14.226Z","2.19.3":"2021-12-14T01:00:02.699Z","2.20.0":"2021-12-15T05:36:10.214Z"},"maintainers":[{"name":"hayes","email":"michael@hayes.io"}],"description":"A GiraphQL plugin for attaching dataloader to object types","keywords":["giraphql","graphql","schema","typescript","dataloader"],"author":{"name":"Michael Hayes"},"license":"ISC","readme":"# Dataloader Plugin\n\nThis plugin makes it easy to add fields and types that are loaded through a dataloader.\n\n## Usage\n\n### Install\n\nTo use the dataloader plugin you will need to install both the `dataloader` package and the giraphql\ndataloader plugin:\n\n```bash\nyarn add dataloader @giraphql/plugin-dataloader\n```\n\n### Setup\n\n```typescript\nimport DataloaderPlugin from '@giraphql/plugin-dataloader';\n\nconst builder = new SchemaBuilder({\n  plugins: [DataloaderPlugin],\n});\n```\n\n### loadable objects\n\nTo create an object type that can be loaded with a dataloader use the new `builder.loadableObject`\nmethod:\n\n```typescript\nconst User = builder.loadableObject('User', {\n  // load will be called with ids of users that need to be loaded\n  // Note that the types for keys (and context if present) are required\n  load: (ids: string[], context: ContextType) => context.loadUsersById(ids),\n  fields: (t) => ({\n    id: t.exposeID('id', {}),\n    username: t.string({\n      // the shape of parent will be inferred from `loadUsersById()` above\n      resolve: (parent) => parent.username,\n    }),\n  }),\n});\n```\n\nIt is **VERY IMPORTANT** to return values from `load` in an order that exactly matches the order of\nthe requested IDs. The order is used to map results to their IDs, and if the results are returned in\na different order, your GraphQL requests will end up with the wrong data. Correctly sorting results\nreturned from a database or other data source can be tricky, so there this plugin has a `sort`\noption (described below) to simplify the sorting process. For more details on how the load function\nworks, see the [dataloader docs](https://github.com/graphql/dataloader#batch-function).\n\nWhen defining fields that return `User`s, you will now be able to return either a `string` (based in\nids param of `load`), or a User object (type based on the return type of `loadUsersById`).\n\n```typescript\nbuilder.queryType({\n  fields: (t) => ({\n    user: t.field({\n      type: User,\n      args: {\n        id: t.arg.string({ required: true }),\n      },\n      // Here we can just return the ID directly rather than loading the user ourselves\n      resolve: (root, args) => args.id,\n    }),\n    currentUser: t.field({\n      type: User,\n      // If we already have the user, we use it, and the dataloader will not be called\n      resolve: (root, args, context) => context.currentUser,\n    }),\n    users: t.field({\n      type: [User],\n      args: {\n        ids: t.arg.stringList({ required: true }),\n      },\n      // Mixing ids and user objects also works\n      resolve: (_root, args, context) => [...args.ids, context.CurrentUser],\n    }),\n  }),\n});\n```\n\nGiraphQL will detect when a resolver returns `string`, `number`, or `bigint` (typescript will\nconstrain the allowed types to whatever is expected by the load function). If a resolver returns an\nobject instead, GiraphQL knows it can skip the dataloader for that object.\n\n### loadable fields\n\nIn some cases you may need more granular dataloaders. To handle these cases there is a new\n`t.loadable` method for defining fields with their own dataloaders.\n\n```typescript\n// Normal object that the fields below will load\ninterface PostShape {\n  id: string;\n  title: string;\n  content: string;\n}\n\nconst Post = builder.objectRef<PostShape>('Post').implement({\n  fields: (t) => ({\n    id: t.exposeID('id', {}),\n    title: t.exposeString('title', {}),\n    content: t.exposeString('title', {}),\n  }),\n});\n\n// Loading a single Post\nbuilder.objectField(User, 'latestPost', (t) =>\n  t.loadable({\n    type: Post,\n    // will be called with ids of latest posts for all users in query\n    load: (ids: number[], context) => context.loadPosts(ids),\n    resolve: (user, args) => user.lastPostID,\n  }),\n);\n// Loading multiple Posts\nbuilder.objectField(User, 'posts', (t) =>\n  t.loadable({\n    type: [Post],\n    // will be called with ids of posts loaded for all users in query\n    load: (ids: number[], context) => context.loadPosts(ids),\n    resolve: (user, args) => user.postIDs,\n  }),\n);\n```\n\n### dataloader options\n\nYou can provide additional options for your dataloaders using `loaderOptions`.\n\n```typescript\nconst User = builder.loadableObject('User', {\n  loaderOptions: { maxBatchSize: 20 },\n  load: (ids: string[], context: ContextType) => context.loadUsersById(ids),\n  fields: (t) => ({ id: t.exposeID('id', {}) }),\n});\n\nbuilder.objectField(User, 'posts', (t) =>\n  t.loadable({\n    type: [Post],\n    loaderOptions: { maxBatchSize: 20 },\n    load: (ids: number[], context) => context.loadPosts(ids),\n    resolve: (user, args) => user.postIDs,\n  }),\n);\n```\n\nSee [dataloader docs](https://github.com/graphql/dataloader#api) for all available options.\n\n### Manually using dataloader\n\nDataloaders for \"loadable\" objects can be accessed via their ref by passing in the context object\nfor the current request. dataloaders are not shared across requests, so we need the context to get\nthe correct dataloader for the current request:\n\n```typescript\n// create loadable object\nconst User = builder.loadableObject('User', {\n  load: (ids: string[], context: ContextType) => context.loadUsersById(ids),\n  fields: (t) => ({\n    id: t.exposeID('id', {}),\n  }),\n});\n\nbuilder.queryField('user', (t) =>\n  t.field({\n    type: User,\n    resolve: (parent, args, context) => {\n      // get data loader for User type\n      const loader = User.getDataloader(context);\n\n      // manually load a user\n      return loader.load('123');\n    },\n  }),\n);\n```\n\n### Errors\n\nCalling dataloader.loadMany will resolve to a value like `(Type | Error)[]`. Your `load` function\nmay also return results in that format if your loader can have parital failures. GraphQL does not\nhave special handling for Error objects. Instead GiraphQL will map these results to something like\n`(Type | Promise<Type>)[]` where Errors are replaced with promises that will be rejected. This\nallows the normal graphql resolver flow to correctly handle these errors.\n\nIf you are using the `loadMany` method from a dataloader manually, you can apply the same mapping\nusing the `rejectErrors` helper:\n\n```typescript\nimport { rejectErrors } from '@giraphql/plugin-dataloader';\n\nbuilder.queryField('user', (t) =>\n  t.field({\n    type: [User],\n    resolve: (parent, args, context) => {\n      const loader = User.getDataloader(context);\n\n      return rejectErrors(loader.loadMany(['123', '456']));\n    },\n  }),\n);\n```\n\n### (Optional) Adding loaders to context\n\nIf you want to make dataloaders accessible via the context object directly, there is some additional\nsetup required. Below are a few options for different ways you can load data from the context\nobject. You can determine which of these options works best for you or add you own helpers.\n\nFirst you'll need to update the types for your context type:\n\n```typescript\nimport { LoadableRef } from '@giraphql/plugin-dataloader';\n\nexport interface ContextType {\n  userLoader: DataLoader<string, { id: number }>; // expose a specific loader\n  getLoader: <K, V>(ref: LoadableRef<K, V, ContextType>) => DataLoader<K, V>; // helper to get a loader from a ref\n  load: <K, V>(ref: LoadableRef<K, V, ContextType>, id: K) => Promise<V>; // helper for loading a single resource\n  loadMany: <K, V>(ref: LoadableRef<K, V, ContextType>, ids: K[]) => Promise<(Error | V)[]>; // helper for loading many\n  // other context fields\n}\n```\n\nnext you'll need to update your context factory function. The exact format of this depends on what\ngraphql server implementation you are using.\n\n```typescript\nimport { initContextCache } from '@giraphql/core';\nimport { LoadableRef, rejectErrors } from '@giraphql/plugin-dataloader';\n\nexport const createContext = (req, res): ContextType => ({\n  // Adding this will prevent any issues if you server implementation\n  // copies or extends the context object before passing it to your resolvers\n  ...initContextCache(),\n\n  // using getters allows us to access the context object using `this`\n  get userLoader() {\n    return User.getDataloader(this);\n  },\n  get getLoader() {\n    return <K, V>(ref: LoadableRef<K, V, ContextType>) => ref.getDataloader(this);\n  },\n  get load() {\n    return <K, V>(ref: LoadableRef<K, V, ContextType>, id: K) => ref.getDataloader(this).load(id);\n  },\n  get loadMany() {\n    return <K, V>(ref: LoadableRef<K, V, ContextType>, ids: K[]) =>\n      rejectErrors(ref.getDataloader(this).loadMany(ids));\n  },\n});\n```\n\nNow you can use these helpers from your context object:\n\n```typescript\nbuilder.queryFields((t) => ({\n  fromContext1: t.field({\n    type: User,\n    resolve: (root, args, { userLoader }) => userLoader.load('123'),\n  }),\n  fromContext2: t.field({\n    type: User,\n    resolve: (root, args, { getLoader }) => getLoader(User).load('456'),\n  }),\n  fromContext3: t.field({\n    type: User,\n    resolve: (root, args, { load }) => load(User, '789'),\n  }),\n  fromContext4: t.field({\n    type: [User],\n    resolve: (root, args, { loadMany }) => loadMany(User, ['123', '456']),\n  }),\n}));\n```\n\n### Using with the Relay plugin\n\nIf you are using the Relay plugin, there is an additional method `loadableNode` that gets added to\nthe builder. You can use this method to create `node` objects that work like other loadeble objects.\n\n```typescript\nconst UserNode = builder.loadableNode('UserNode', {\n  id: {\n    resolve: (user) => user.id,\n  },\n  // For loadable objects we always need to include an isTypeOf check\n  isTypeOf: (obj) => obj instanceof User,\n  load: (ids: string[], context: ContextType) => context.loadUsersById(ids),\n  fields: (t) => ({}),\n});\n```\n\n### Caching resources loaded manually in a resolver\n\nWhen manually loading a resource in a resolver it is not automatically added to the dataloader\ncache. If you want any resolved value to be stored in the cache in case it is used somewhere else in\nthe query you can use the `cacheResolved` option.\n\nThe `cacheResolved` option takes a function that converts the loaded object into it's cache Key:\n\n```typescript\nconst User = builder.loadableObject('User', {\n  load: (ids: string[], context: ContextType) => context.loadUsersById(ids),\n  cacheResolved: user => user.id,\n  fields: (t) => ({\n    id: t.exposeID('id', {}),\n    ...\n  }),\n});\n```\n\nWhenever a resolver returns a User or list or Users, those objects will automatically be added the\ndataloaders cache, so they can be re-used in other parts of the query.\n\n### Sorting results from your `load` function\n\nAs mentioned above, the `load` function must return results in the same order as the provided array\nof IDs. Doing this correctly can be a little complicated, so this plugin includes an alternative.\nFor any type or field that creates a dataloader, you can also provide a `sort` option which will\ncorrectly map your results into the correct order based on their ids. To do this, you will need to\nprovide a function that accepts a result object, and returns its id.\n\n```typescript\nconst User = builder.loadableObject('User', {\n  load: (ids: string[], context: ContextType) => context.loadUsersById(ids),\n  sort: user => user.id,\n  fields: (t) => ({\n    id: t.exposeID('id', {}),\n    ...\n  }),\n});\n```\n\nThis will also work with loadable nodes, interfaces, unions, or fields.\n\nWhen sorting, if the list of results contains an Error the error is thrown because it can not be\nmapped to the correct location. This `sort` option should NOT be used for cases where the result\nlist is expected to contain errors.\n\n### Shared `toKey` method.\n\nDefining multiple functions to extract the key from a loaded object can become redundant. In cases\nwhen you are using both `cacheResolved` and `sort` you can use a `toKey` function instead:\n\n```typescript\nconst User = builder.loadableObject('User', {\n  load: (ids: string[], context: ContextType) => context.loadUsersById(ids),\n  toKey: user => user.id,\n  cacheResolved: true,\n  sort: true,\n  fields: (t) => ({\n    id: t.exposeID('id', {}),\n    ...\n  }),\n});\n```\n","readmeFilename":"README.md"}