{"_id":"dynamodb-graph","_rev":"35-03be23f04dcf92b0df03088a2ab2e502","name":"dynamodb-graph","description":"## Introduction","dist-tags":{"latest":"4.1.1"},"versions":{"1.0.0":{"name":"dynamodb-graph","version":"1.0.0","main":"dist/index.js","repository":{"github":"git@github.com:guzmonne/dynamodb-graph.git"},"license":"MIT","dependencies":{"aws-sdk":"^2.169.0","cuid":"^1.3.8","lodash":"^4.17.4","rxjs":"^5.5.5"},"scripts":{"validate:stack":"cd scripts && ./validate_stack.sh","delete:stack":"cd scripts && ./delete_stack.sh","describe:stack":"cd scripts && ./describe_stack.sh","deploy:stack":"cd scripts && ./deploy_stack.sh","test":"jest --watch"},"devDependencies":{"jest":"^21.2.1"},"description":"This is a library aimed to work with DynamoDB as if it was a Graph. The idea came from the \"Advanced Design Patterns for Amazon DynamoDB (DAT403-R)\" talk from Rick Houlihan on 2017 AWS re:Invent conference. Close to the end he describes a way to use a Dyn","licenseText":"MIT License\n\nCopyright (c) 2017 Guzman Monne\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n","_id":"dynamodb-graph@1.0.0","dist":{"shasum":"c3c8215aa29503003e61a9d00a75952aa9da9905","tarball":"https://registry.npmjs.org/dynamodb-graph/-/dynamodb-graph-1.0.0.tgz","integrity":"sha512-Vg75P8I+gshgfDWhcPpDUt6xbtz/j4jEX3/d5vRuNlJdebvernzrhJCDG7gMaQDRL27Edi47psePP6j7hdRu+g==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIGv8DG8wy+TZtb2OLIxsCswO6wxg4cAggIK3ejM2BiNvAiAjaBGgLwQZWs6Pah9L3D+z+5aZU+RfssMAyK2XKpcynw=="}]},"maintainers":[{"name":"guzmonne","email":"guzmonne@hotmail.com"}],"_npmUser":{"name":"guzmonne","email":"guzmonne@hotmail.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/dynamodb-graph-1.0.0.tgz_1513440942204_0.5089373898226768"}},"1.0.2":{"name":"dynamodb-graph","version":"1.0.2","main":"dist/index.js","repository":{"github":"git@github.com:guzmonne/dynamodb-graph.git"},"license":"MIT","dependencies":{"aws-sdk":"^2.169.0","cuid":"^1.3.8","lodash":"^4.17.4","rxjs":"^5.5.5"},"scripts":{"validate:stack":"cd scripts && ./validate_stack.sh","delete:stack":"cd scripts && ./delete_stack.sh","describe:stack":"cd scripts && ./describe_stack.sh","deploy:stack":"cd scripts && ./deploy_stack.sh","test":"jest --watch"},"devDependencies":{"jest":"^21.2.1"},"description":"This is a library aimed to work with DynamoDB as if it was a Graph. The idea came from the \"Advanced Design Patterns for Amazon DynamoDB (DAT403-R)\" talk from Rick Houlihan on 2017 AWS re:Invent conference. Close to the end he describes a way to use a Dyn","licenseText":"MIT License\n\nCopyright (c) 2017 Guzman Monne\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n","_id":"dynamodb-graph@1.0.2","dist":{"shasum":"aa6773f411b8517374adfc29890b0bbf20fb1dce","tarball":"https://registry.npmjs.org/dynamodb-graph/-/dynamodb-graph-1.0.2.tgz","integrity":"sha512-3oPG8t3Z1iqxUk8MVwvag0HEK9MERrRRQ7jvE+hc3qXM/SUd8VOIKXJpAGgyum4o2uqDfkB0wxs+ayIC7r3ToQ==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIAmRoCE1KEhVik7XboJkHBk7vzcmrrGRsgUjbD2uV/9QAiEAsHxc2HDFnYKb0xGWSbLMAhJzhb65rroJuZJKzJZcMTA="}]},"maintainers":[{"name":"guzmonne","email":"guzmonne@hotmail.com"}],"_npmUser":{"name":"guzmonne","email":"guzmonne@hotmail.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/dynamodb-graph-1.0.2.tgz_1513441020582_0.06363432900980115"}},"1.0.3":{"name":"dynamodb-graph","version":"1.0.3","main":"dist/index.js","repository":{"github":"git@github.com:guzmonne/dynamodb-graph.git"},"license":"MIT","dependencies":{"aws-sdk":"^2.169.0","cuid":"^1.3.8","lodash":"^4.17.4","rxjs":"^5.5.5"},"scripts":{"validate:stack":"cd scripts && ./validate_stack.sh","delete:stack":"cd scripts && ./delete_stack.sh","describe:stack":"cd scripts && ./describe_stack.sh","deploy:stack":"cd scripts && ./deploy_stack.sh","test":"jest --watch"},"devDependencies":{"jest":"^21.2.1"},"description":"This is a library aimed to work with DynamoDB as if it was a Graph. The idea came from the \"Advanced Design Patterns for Amazon DynamoDB (DAT403-R)\" talk from Rick Houlihan on 2017 AWS re:Invent conference. Close to the end he describes a way to use a Dyn","licenseText":"MIT License\n\nCopyright (c) 2017 Guzman Monne\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n","_id":"dynamodb-graph@1.0.3","dist":{"shasum":"1d570c239f7eb17f44a617cc8ee5d177d8857b49","tarball":"https://registry.npmjs.org/dynamodb-graph/-/dynamodb-graph-1.0.3.tgz","integrity":"sha512-QiNQTyJTMfIQwS6U1uzpFrR9qreOAd+q7ST7uwXQK+GOPGIHqUBIQu85Fnje6nK4vps5JO1WY/uQIV8c07f+KA==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIDXqn4IY6tXpj1ImnVblH3h2nj85NVu5xaTX5U0CZJnJAiB3hPs046lFFhQYfxG3LZT5k3RXW1w+IEuKQ/8vB6s8kw=="}]},"maintainers":[{"name":"guzmonne","email":"guzmonne@hotmail.com"}],"_npmUser":{"name":"guzmonne","email":"guzmonne@hotmail.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/dynamodb-graph-1.0.3.tgz_1513460273455_0.4389150352217257"}},"1.0.4":{"name":"dynamodb-graph","version":"1.0.4","main":"dist/index.js","repository":{"github":"git@github.com:guzmonne/dynamodb-graph.git"},"license":"MIT","dependencies":{"aws-sdk":"^2.169.0","cuid":"^1.3.8","lodash":"^4.17.4","rxjs":"^5.5.5"},"scripts":{"validate:stack":"cd scripts && ./validate_stack.sh","delete:stack":"cd scripts && ./delete_stack.sh","describe:stack":"cd scripts && ./describe_stack.sh","deploy:stack":"cd scripts && ./deploy_stack.sh","test":"jest --watch"},"devDependencies":{"jest":"^21.2.1"},"gitHead":"d83fc77b157ab6c46a64958bea97c12d16304c0c","description":"This is a library aimed to work with DynamoDB as if it was a Graph. The idea came from the \"Advanced Design Patterns for Amazon DynamoDB (DAT403-R)\" talk from Rick Houlihan on 2017 AWS re:Invent conference. Close to the end he describes a way to use a Dyn","_id":"dynamodb-graph@1.0.4","_shasum":"30cfc1fdcc5123a9f868b71a01369e8832560449","_from":".","_npmVersion":"3.10.10","_nodeVersion":"6.10.3","_npmUser":{"name":"guzmonne","email":"guzmonne@hotmail.com"},"dist":{"shasum":"30cfc1fdcc5123a9f868b71a01369e8832560449","tarball":"https://registry.npmjs.org/dynamodb-graph/-/dynamodb-graph-1.0.4.tgz","integrity":"sha512-oOd+c5fjSaZDYlpu3sQLdXx8kyaVCwo4SwNta/XkFeHntR6PHY72909PKNLdoxnmoVyX/TDgFntPpN3wyv+4bQ==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCgp/s9CKObfrPfnHHFPAkQcpiW0joUR6RsrqMJ5JecQgIhANF0Poo6UFQfFo1B3tPQbYqQJYVIki9zhWNgbUUcZuPM"}]},"maintainers":[{"name":"guzmonne","email":"guzmonne@hotmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/dynamodb-graph-1.0.4.tgz_1513460747681_0.36285317107103765"}},"1.0.5":{"name":"dynamodb-graph","version":"1.0.5","main":"dist/index.js","repository":{"github":"git@github.com:guzmonne/dynamodb-graph.git"},"license":"MIT","dependencies":{"aws-sdk":"^2.169.0","cuid":"^1.3.8","lodash":"^4.17.4","rxjs":"^5.5.5"},"scripts":{"validate:stack":"cd scripts && ./validate_stack.sh","delete:stack":"cd scripts && ./delete_stack.sh","describe:stack":"cd scripts && ./describe_stack.sh","deploy:stack":"cd scripts && ./deploy_stack.sh","test":"jest --watch"},"devDependencies":{"jest":"^21.2.1"},"gitHead":"a9ef60b892df0998161ac61c80102c515b32d6e5","description":"This is a library aimed to work with DynamoDB as if it was a Graph. The idea came from the \"Advanced Design Patterns for Amazon DynamoDB (DAT403-R)\" talk from Rick Houlihan on 2017 AWS re:Invent conference. Close to the end he describes a way to use a Dyn","_id":"dynamodb-graph@1.0.5","_shasum":"60ed1b155ad9b524899247b946c4a19d46a5e7b8","_from":".","_npmVersion":"3.10.10","_nodeVersion":"6.10.3","_npmUser":{"name":"guzmonne","email":"guzmonne@hotmail.com"},"dist":{"shasum":"60ed1b155ad9b524899247b946c4a19d46a5e7b8","tarball":"https://registry.npmjs.org/dynamodb-graph/-/dynamodb-graph-1.0.5.tgz","integrity":"sha512-F7D9txCwbcVPU0/NhynrX2SkqnvgOdzWQ3+QQiivmSovNPLXoa9Ur3qv2C9uJEKe26q2pfiZGzgk27e0AqCfIQ==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCID84o+gDsq8T0WsJDrMKVYQEglUKN3CO5kuJFunOPgETAiEAiAHzNC0X6I/y3U4PdRfk+uIA+hUqYaap8f+WwGCP3eQ="}]},"maintainers":[{"name":"guzmonne","email":"guzmonne@hotmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/dynamodb-graph-1.0.5.tgz_1513466382362_0.05618094466626644"}},"1.0.6":{"name":"dynamodb-graph","version":"1.0.6","main":"dist/index.js","repository":{"github":"git@github.com:guzmonne/dynamodb-graph.git"},"license":"MIT","dependencies":{"aws-sdk":"^2.169.0","cuid":"^1.3.8","lodash":"^4.17.4","rxjs":"^5.5.5"},"scripts":{"validate:stack":"cd scripts && ./validate_stack.sh","delete:stack":"cd scripts && ./delete_stack.sh","describe:stack":"cd scripts && ./describe_stack.sh","deploy:stack":"cd scripts && ./deploy_stack.sh","test":"jest --watch"},"devDependencies":{"jest":"^21.2.1"},"gitHead":"0512b548518e50a44c6283eea40e6d0de336f484","description":"This is a library aimed to work with DynamoDB as if it was a Graph. The idea came from the \"Advanced Design Patterns for Amazon DynamoDB (DAT403-R)\" talk from Rick Houlihan on 2017 AWS re:Invent conference. Close to the end he describes a way to use a Dyn","_id":"dynamodb-graph@1.0.6","_shasum":"1cc89e5bd7d8c7b28034670c684b3c9a62dd938c","_from":".","_npmVersion":"3.10.10","_nodeVersion":"6.10.3","_npmUser":{"name":"guzmonne","email":"guzmonne@hotmail.com"},"dist":{"shasum":"1cc89e5bd7d8c7b28034670c684b3c9a62dd938c","tarball":"https://registry.npmjs.org/dynamodb-graph/-/dynamodb-graph-1.0.6.tgz","integrity":"sha512-aGlOCo5s1Rl6NOfyI1pBO3n1GP5aKHPX2/gafUDF/nB21ZXkKRfM0t39kFUOM6ICrKnApA2qiTWG4sguYo5KZA==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCUonX/GKDT3HSk36lraFP1nMPu8dGmRoZEhvGbL3lizgIhALcXcBdDjCQ2zxXacvOkawtqzOcw5Ey16d+FbRnpgTeB"}]},"maintainers":[{"name":"guzmonne","email":"guzmonne@hotmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/dynamodb-graph-1.0.6.tgz_1513471987219_0.014571847394108772"}},"1.0.7":{"name":"dynamodb-graph","version":"1.0.7","main":"dist/index.js","repository":{"github":"git@github.com:guzmonne/dynamodb-graph.git"},"license":"MIT","dependencies":{"aws-sdk":"^2.169.0","cuid":"^1.3.8","lodash":"^4.17.4","rxjs":"^5.5.5"},"scripts":{"validate:stack":"cd scripts && ./validate_stack.sh","delete:stack":"cd scripts && ./delete_stack.sh","describe:stack":"cd scripts && ./describe_stack.sh","deploy:stack":"cd scripts && ./deploy_stack.sh","test":"jest --watch"},"devDependencies":{"jest":"^21.2.1"},"gitHead":"20cc08fe5bdf996a9ae0436a6eea56e65e6bf1bc","description":"This is a library aimed to work with DynamoDB as if it was a Graph. The idea came from the \"Advanced Design Patterns for Amazon DynamoDB (DAT403-R)\" talk from Rick Houlihan on 2017 AWS re:Invent conference. Close to the end he describes a way to use a Dyn","_id":"dynamodb-graph@1.0.7","_shasum":"a2f95df44c23b084e92bdcea450a421265d69957","_from":".","_npmVersion":"3.10.10","_nodeVersion":"6.10.3","_npmUser":{"name":"guzmonne","email":"guzmonne@hotmail.com"},"dist":{"shasum":"a2f95df44c23b084e92bdcea450a421265d69957","tarball":"https://registry.npmjs.org/dynamodb-graph/-/dynamodb-graph-1.0.7.tgz","integrity":"sha512-b+rPlIy4S5kPAYwFrhwJaz9oiSa6AWPS+9ycRJZ/i3aJj8TilaJTkkHKbSxTmR+Z9/3VxBp1D4bYHjvNE8+rIg==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQC+AVH9JTQDEoUQtxMtBuWjAP1jzCO4H4oUifbHNJHIYAIhAJ4rRzYz8sOTNyr44KI10xGSQfsKV+jP3OkJcRVj4Cgk"}]},"maintainers":[{"name":"guzmonne","email":"guzmonne@hotmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/dynamodb-graph-1.0.7.tgz_1513472177387_0.22059478657320142"}},"1.0.8":{"name":"dynamodb-graph","version":"1.0.8","main":"dist/index.js","repository":{"github":"git@github.com:guzmonne/dynamodb-graph.git"},"license":"MIT","dependencies":{"aws-sdk":"^2.169.0","cuid":"^1.3.8","lodash":"^4.17.4","rxjs":"^5.5.5"},"scripts":{"validate:stack":"cd scripts && ./validate_stack.sh","delete:stack":"cd scripts && ./delete_stack.sh","describe:stack":"cd scripts && ./describe_stack.sh","deploy:stack":"cd scripts && ./deploy_stack.sh","test":"jest --watch"},"devDependencies":{"jest":"^21.2.1"},"gitHead":"d38d456c49aed29c32748422413dad301c515887","description":"This is a library aimed to work with DynamoDB as if it was a Graph. The idea came from the \"Advanced Design Patterns for Amazon DynamoDB (DAT403-R)\" talk from Rick Houlihan on 2017 AWS re:Invent conference. Close to the end he describes a way to use a Dyn","_id":"dynamodb-graph@1.0.8","_shasum":"8a347a0c26c9a7a51524ca9cebd774729e5ee516","_from":".","_npmVersion":"3.10.10","_nodeVersion":"6.10.3","_npmUser":{"name":"guzmonne","email":"guzmonne@hotmail.com"},"dist":{"shasum":"8a347a0c26c9a7a51524ca9cebd774729e5ee516","tarball":"https://registry.npmjs.org/dynamodb-graph/-/dynamodb-graph-1.0.8.tgz","integrity":"sha512-y0ySsW+3t3jQ2LnRTwmPtjRaKOASdLGjPNuBTV5HOTi/rdzykqF7Gufq3y8/EOFXXvtZjS6a8JgW5YLZVUVpUw==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCL4bcUxmVIM9H3r8Gt5g35XfTKuv6sCL9TvPVxn+7tHAIgedLT4kZe/Sbu/qCLV786urx+O+8uL5omxUgc6OApdXI="}]},"maintainers":[{"name":"guzmonne","email":"guzmonne@hotmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/dynamodb-graph-1.0.8.tgz_1513472914315_0.26881830324418843"}},"1.0.9":{"name":"dynamodb-graph","version":"1.0.9","main":"dist/index.js","repository":{"github":"git@github.com:guzmonne/dynamodb-graph.git"},"license":"MIT","dependencies":{"aws-sdk":"^2.169.0","cuid":"^1.3.8","lodash":"^4.17.4","rxjs":"^5.5.5"},"scripts":{"validate:stack":"cd scripts && ./validate_stack.sh","delete:stack":"cd scripts && ./delete_stack.sh","describe:stack":"cd scripts && ./describe_stack.sh","deploy:stack":"cd scripts && ./deploy_stack.sh","test":"jest --watch"},"devDependencies":{"jest":"^21.2.1"},"gitHead":"fed2eb519fd6130f9fe3cde180cb809381a772f8","description":"This is a library aimed to work with DynamoDB as if it was a Graph. The idea came from the \"Advanced Design Patterns for Amazon DynamoDB (DAT403-R)\" talk from Rick Houlihan on 2017 AWS re:Invent conference. Close to the end he describes a way to use a Dyn","_id":"dynamodb-graph@1.0.9","_shasum":"856336197a4cdb2a84fcb33a621f67ebbf4bdce6","_from":".","_npmVersion":"3.10.10","_nodeVersion":"6.10.3","_npmUser":{"name":"guzmonne","email":"guzmonne@hotmail.com"},"dist":{"shasum":"856336197a4cdb2a84fcb33a621f67ebbf4bdce6","tarball":"https://registry.npmjs.org/dynamodb-graph/-/dynamodb-graph-1.0.9.tgz","integrity":"sha512-g/6NBR7hDF4ZjYiiF0DajbwiQoQNuJe2aquwh2ir8r7B63RdyUNxyhD8ICsNceo95SgJKpWxyUrg2/c5hnA3zA==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCnpzvOsURBmG9bupv7zeJl4CHL2hS5an6v21vrpUVbsgIhAIzBUiF524P+zQlDML9e7rmRYBOMnZQ/lBl9FIEKLrJv"}]},"maintainers":[{"name":"guzmonne","email":"guzmonne@hotmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/dynamodb-graph-1.0.9.tgz_1513476848693_0.05002461979165673"}},"1.0.10":{"name":"dynamodb-graph","version":"1.0.10","main":"dist/index.js","repository":{"github":"git@github.com:guzmonne/dynamodb-graph.git"},"license":"MIT","dependencies":{"aws-sdk":"^2.169.0","cuid":"^1.3.8","lodash":"^4.17.4","rxjs":"^5.5.5"},"scripts":{"validate:stack":"cd scripts && ./validate_stack.sh","delete:stack":"cd scripts && ./delete_stack.sh","describe:stack":"cd scripts && ./describe_stack.sh","deploy:stack":"cd scripts && ./deploy_stack.sh","test":"jest --watch"},"devDependencies":{"jest":"^21.2.1"},"gitHead":"11675e8537913b769374211e7d56bbd1dc6b0b92","description":"This is a library aimed to work with DynamoDB as if it was a Graph. The idea came from the \"Advanced Design Patterns for Amazon DynamoDB (DAT403-R)\" talk from Rick Houlihan on 2017 AWS re:Invent conference. Close to the end he describes a way to use a Dyn","_id":"dynamodb-graph@1.0.10","_shasum":"3c811aac5c3c61e0d1f39fd56b3ad1bd2976cf8b","_from":".","_npmVersion":"3.10.10","_nodeVersion":"6.10.3","_npmUser":{"name":"guzmonne","email":"guzmonne@hotmail.com"},"dist":{"shasum":"3c811aac5c3c61e0d1f39fd56b3ad1bd2976cf8b","tarball":"https://registry.npmjs.org/dynamodb-graph/-/dynamodb-graph-1.0.10.tgz","integrity":"sha512-Tvu0XlTaW79MqLgD+WryGtlSmq6zdu949mPvGPaox2qBk8fjlyWhytowiptSL9XvINck+Q/dP0w7H5pHrrqpTA==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDH1UjhiRrnUINwgxoRBhzkT3pL04GyMEg0oFFB/1DRNQIgLJvp9upUJZC4m6umgfg8wrgleW5k6j5eVfC4IV0yopw="}]},"maintainers":[{"name":"guzmonne","email":"guzmonne@hotmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/dynamodb-graph-1.0.10.tgz_1513540623374_0.6248675617389381"}},"1.0.11":{"name":"dynamodb-graph","version":"1.0.11","main":"dist/index.js","repository":{"github":"git@github.com:guzmonne/dynamodb-graph.git"},"license":"MIT","dependencies":{"aws-sdk":"^2.169.0","cuid":"^1.3.8","lodash":"^4.17.4","rxjs":"^5.5.5"},"scripts":{"validate:stack":"cd scripts && ./validate_stack.sh","delete:stack":"cd scripts && ./delete_stack.sh","describe:stack":"cd scripts && ./describe_stack.sh","deploy:stack":"cd scripts && ./deploy_stack.sh","test":"jest --watch"},"devDependencies":{"jest":"^21.2.1"},"gitHead":"59ae4e58ace21049d3cb0f6a4fed2d25c9ed6f2f","description":"This is a library aimed to work with DynamoDB as if it was a Graph. The idea came from the \"Advanced Design Patterns for Amazon DynamoDB (DAT403-R)\" talk from Rick Houlihan on 2017 AWS re:Invent conference. Close to the end he describes a way to use a Dyn","_id":"dynamodb-graph@1.0.11","_shasum":"4623ceedb79c3dce284c068fa19c4d1fc7725172","_from":".","_npmVersion":"3.10.10","_nodeVersion":"6.10.3","_npmUser":{"name":"guzmonne","email":"guzmonne@hotmail.com"},"dist":{"shasum":"4623ceedb79c3dce284c068fa19c4d1fc7725172","tarball":"https://registry.npmjs.org/dynamodb-graph/-/dynamodb-graph-1.0.11.tgz","integrity":"sha512-BHlXu4zOsj1kG75RHeyJyqxE1Y/XT5QQIlgZIJ8IBPT3BrHAeonpSYp3MSIu+ZQKzA+La90a2Rlmvjep5c6Atg==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDyIqV94IDVfsthQJuy0Oy604KijGWyIveCyVYoi4KQ7QIgOdyxBojkCe4sJQocr7Maz8XiziEPsSX3AFyLZtE6WN4="}]},"maintainers":[{"name":"guzmonne","email":"guzmonne@hotmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/dynamodb-graph-1.0.11.tgz_1513542057391_0.8597017650026828"}},"1.0.12":{"name":"dynamodb-graph","version":"1.0.12","main":"dist/index.js","repository":{"github":"git@github.com:guzmonne/dynamodb-graph.git"},"license":"MIT","dependencies":{"aws-sdk":"^2.169.0","cuid":"^1.3.8","lodash":"^4.17.4","rxjs":"^5.5.5"},"scripts":{"validate:stack":"cd scripts && ./validate_stack.sh","delete:stack":"cd scripts && ./delete_stack.sh","describe:stack":"cd scripts && ./describe_stack.sh","deploy:stack":"cd scripts && ./deploy_stack.sh","test":"jest --watch"},"devDependencies":{"jest":"^21.2.1"},"gitHead":"d2aea4cd1d3321af6ea063ff7e479da1584304cc","description":"This is a library aimed to work with DynamoDB as if it was a Graph. The idea came from the \"Advanced Design Patterns for Amazon DynamoDB (DAT403-R)\" talk from Rick Houlihan on 2017 AWS re:Invent conference. Close to the end he describes a way to use a Dyn","_id":"dynamodb-graph@1.0.12","_shasum":"d909a5afc0a3caadc6209a9d800f27a5a61ced3b","_from":".","_npmVersion":"3.10.10","_nodeVersion":"6.10.3","_npmUser":{"name":"guzmonne","email":"guzmonne@hotmail.com"},"dist":{"shasum":"d909a5afc0a3caadc6209a9d800f27a5a61ced3b","tarball":"https://registry.npmjs.org/dynamodb-graph/-/dynamodb-graph-1.0.12.tgz","integrity":"sha512-Z/LonfnsYJ4i3sgcSNuKfea+EQAZgrst3sNGXi7NWf993eKbnDqQrQupMHqte41pIh5maPJUjiRKEK54NZt6dg==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIG2/FwkaQ+lp0uTvpqkYrlxcZO+wdE9xptF/Sjjn4vi9AiBXMwJT7rX2QVjE7gU8BUhEVwwrRor0lu+mQadUTHOilQ=="}]},"maintainers":[{"name":"guzmonne","email":"guzmonne@hotmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/dynamodb-graph-1.0.12.tgz_1513546744391_0.9828048129566014"}},"1.1.0":{"name":"dynamodb-graph","version":"1.1.0","main":"dist/index.js","repository":{"github":"git@github.com:guzmonne/dynamodb-graph.git"},"license":"MIT","dependencies":{"aws-sdk":"^2.169.0","cuid":"^1.3.8","lodash":"^4.17.4","rxjs":"^5.5.5"},"scripts":{"validate:stack":"cd scripts && ./validate_stack.sh","delete:stack":"cd scripts && ./delete_stack.sh","describe:stack":"cd scripts && ./describe_stack.sh","deploy:stack":"cd scripts && ./deploy_stack.sh","test":"jest --watch"},"devDependencies":{"jest":"^21.2.1"},"gitHead":"10242d773ee89b49b7145130b4561156d22915ff","description":"This is a library aimed to work with DynamoDB as if it was a Graph. The idea came from the \"Advanced Design Patterns for Amazon DynamoDB (DAT403-R)\" talk from Rick Houlihan on 2017 AWS re:Invent conference. Close to the end he describes a way to use a Dyn","_id":"dynamodb-graph@1.1.0","_shasum":"1411dd6664b0f86114899c5f04dc64be36f70ca7","_from":".","_npmVersion":"3.10.10","_nodeVersion":"6.10.3","_npmUser":{"name":"guzmonne","email":"guzmonne@hotmail.com"},"dist":{"shasum":"1411dd6664b0f86114899c5f04dc64be36f70ca7","tarball":"https://registry.npmjs.org/dynamodb-graph/-/dynamodb-graph-1.1.0.tgz","integrity":"sha512-xhDPaqgFNLHejaPfvkQZt5KgMA0OVWY7SSTbVgWzP5yNe/1L//U049THusktUtP0heqtNPeGnBapebHq7UXHvw==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCyWd08b6SjbbYjt0BFdfTtj01eTII0E92XcUAA99/ojQIhAMmZpN6p3WmrTEMy7LLovieg8tJlw2JzH44NJdUw5jk3"}]},"maintainers":[{"name":"guzmonne","email":"guzmonne@hotmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/dynamodb-graph-1.1.0.tgz_1513704083965_0.11802968801930547"}},"1.2.0":{"name":"dynamodb-graph","version":"1.2.0","main":"dist/index.js","repository":{"github":"git@github.com:guzmonne/dynamodb-graph.git"},"license":"MIT","dependencies":{"aws-sdk":"^2.169.0","cuid":"^1.3.8","lodash":"^4.17.4","rxjs":"^5.5.5"},"scripts":{"validate:stack":"cd scripts && ./validate_stack.sh","delete:stack":"cd scripts && ./delete_stack.sh","describe:stack":"cd scripts && ./describe_stack.sh","deploy:stack":"cd scripts && ./deploy_stack.sh","test":"jest --watch"},"devDependencies":{"jest":"^21.2.1"},"gitHead":"2d355866dbe5c2ef45ed668de6d3281684f5d1f9","description":"This is a library aimed to work with DynamoDB as if it was a Graph. The idea came from the \"Advanced Design Patterns for Amazon DynamoDB (DAT403-R)\" talk from Rick Houlihan on 2017 AWS re:Invent conference. Close to the end he describes a way to use a Dyn","_id":"dynamodb-graph@1.2.0","_shasum":"3452ff20294930c5a5e27d59c4f37886ecd67119","_from":".","_npmVersion":"3.10.10","_nodeVersion":"6.10.3","_npmUser":{"name":"guzmonne","email":"guzmonne@hotmail.com"},"dist":{"shasum":"3452ff20294930c5a5e27d59c4f37886ecd67119","tarball":"https://registry.npmjs.org/dynamodb-graph/-/dynamodb-graph-1.2.0.tgz","integrity":"sha512-4CBU1c/kkcvO/0RoMH4niJqrD20kJ6iUSzmHVSR69GalWBhvGdfIJmPWkH8sVNNJpGWJKwWA61jOAqQnbIGw5w==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIH8Huifit1pHtPVa2DKTafOHxDGhyfIekGhwJqeXjHu2AiEAyr3svQqEFVzYRUWKL83SSFIUmmYCbTAhpUzpmB6o4xA="}]},"maintainers":[{"name":"guzmonne","email":"guzmonne@hotmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/dynamodb-graph-1.2.0.tgz_1513716828078_0.5815588380210102"}},"1.3.0":{"name":"dynamodb-graph","version":"1.3.0","main":"dist/index.js","repository":{"github":"git@github.com:guzmonne/dynamodb-graph.git"},"license":"MIT","dependencies":{"aws-sdk":"^2.169.0","cuid":"^1.3.8","lodash":"^4.17.4","rxjs":"^5.5.5"},"scripts":{"validate:stack":"cd scripts && ./validate_stack.sh","delete:stack":"cd scripts && ./delete_stack.sh","describe:stack":"cd scripts && ./describe_stack.sh","deploy:stack":"cd scripts && ./deploy_stack.sh","test":"jest --watch"},"devDependencies":{"jest":"^21.2.1"},"gitHead":"f682a12f2e9e76c1356ebee879efdd4acc921788","description":"This is a library aimed to work with DynamoDB as if it was a Graph. The idea came from the \"Advanced Design Patterns for Amazon DynamoDB (DAT403-R)\" talk from Rick Houlihan on 2017 AWS re:Invent conference. Close to the end he describes a way to use a Dyn","_id":"dynamodb-graph@1.3.0","_shasum":"146869abcb6c5ad725ec7e956c7ea54b2f60892f","_from":".","_npmVersion":"3.10.10","_nodeVersion":"6.10.3","_npmUser":{"name":"guzmonne","email":"guzmonne@hotmail.com"},"dist":{"shasum":"146869abcb6c5ad725ec7e956c7ea54b2f60892f","tarball":"https://registry.npmjs.org/dynamodb-graph/-/dynamodb-graph-1.3.0.tgz","integrity":"sha512-rT0uOcXvZkf1J0QtXVPLQrBjCNWJTB7GFtxCbXBMkOScfWkJo510pkowK5o2DvkZRlGasj6KOVfS6AUwP1FcKg==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDktn4Pg4f1Wpuo4BgmHvGcDkp+cOQb7/FdISgruaH3hQIhAJ+0RKZNjB9wgPbvgBAseUjFLduRE00cCskMQLgeG9bS"}]},"maintainers":[{"name":"guzmonne","email":"guzmonne@hotmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/dynamodb-graph-1.3.0.tgz_1513775372995_0.20714941271580756"}},"1.3.1":{"name":"dynamodb-graph","version":"1.3.1","main":"dist/index.js","repository":{"github":"git@github.com:guzmonne/dynamodb-graph.git"},"license":"MIT","dependencies":{"aws-sdk":"^2.169.0","cuid":"^1.3.8","lodash":"^4.17.4","rxjs":"^5.5.5"},"scripts":{"validate:stack":"cd scripts && ./validate_stack.sh","delete:stack":"cd scripts && ./delete_stack.sh","describe:stack":"cd scripts && ./describe_stack.sh","deploy:stack":"cd scripts && ./deploy_stack.sh","test":"jest --watch"},"devDependencies":{"jest":"^21.2.1"},"gitHead":"5c3c19e7afbfe923894400f80c845f3654d2effc","description":"This is a library aimed to work with DynamoDB as if it was a Graph. The idea came from the \"Advanced Design Patterns for Amazon DynamoDB (DAT403-R)\" talk from Rick Houlihan on 2017 AWS re:Invent conference. Close to the end he describes a way to use a Dyn","_id":"dynamodb-graph@1.3.1","_shasum":"8899ae81b6045bf8466f00c427dfe368018486d5","_from":".","_npmVersion":"3.10.10","_nodeVersion":"6.10.3","_npmUser":{"name":"guzmonne","email":"guzmonne@hotmail.com"},"dist":{"shasum":"8899ae81b6045bf8466f00c427dfe368018486d5","tarball":"https://registry.npmjs.org/dynamodb-graph/-/dynamodb-graph-1.3.1.tgz","integrity":"sha512-wStpssupXo2S8yJLTEp1b16sFtYQYUgxRYy7HS3UvKkJLLGc6TlCtSBz4GQkbB/3eQg+DKmzs9LeNOffrpKuRA==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCEzpeAAOn1+wW6KnrwRxJRoODO2qZxTX16Ue9XQA+bcgIgGWWrmPrzuVujjfS/9ECdDo65Gw6nn7+J5856zmx++zU="}]},"maintainers":[{"name":"guzmonne","email":"guzmonne@hotmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/dynamodb-graph-1.3.1.tgz_1513781382040_0.9347470768261701"}},"1.4.0":{"name":"dynamodb-graph","version":"1.4.0","main":"dist/index.js","repository":{"github":"git@github.com:guzmonne/dynamodb-graph.git"},"license":"MIT","dependencies":{"aws-sdk":"^2.169.0","cuid":"^1.3.8","lodash":"^4.17.4","rxjs":"^5.5.5"},"scripts":{"validate:stack":"cd scripts && ./validate_stack.sh","delete:stack":"cd scripts && ./delete_stack.sh","describe:stack":"cd scripts && ./describe_stack.sh","deploy:stack":"cd scripts && ./deploy_stack.sh","test":"jest --watch"},"devDependencies":{"jest":"^21.2.1"},"gitHead":"8706fba4e489b0c8088de2efa7497de90f80e7aa","description":"This is a library aimed to work with DynamoDB as if it was a Graph. The idea came from the \"Advanced Design Patterns for Amazon DynamoDB (DAT403-R)\" talk from Rick Houlihan on 2017 AWS re:Invent conference. Close to the end he describes a way to use a Dyn","_id":"dynamodb-graph@1.4.0","_shasum":"275ac3e696d1a4a988d3b8a6279ab9cf210ee08c","_from":".","_npmVersion":"3.10.10","_nodeVersion":"6.10.3","_npmUser":{"name":"guzmonne","email":"guzmonne@hotmail.com"},"dist":{"shasum":"275ac3e696d1a4a988d3b8a6279ab9cf210ee08c","tarball":"https://registry.npmjs.org/dynamodb-graph/-/dynamodb-graph-1.4.0.tgz","integrity":"sha512-z4F0GnxVyDDLExxCI8C+SETQWGhCwiEFOSQqlpN9RdsiI0glMig7e0jL/2AbOzwAenHlrNEbMPZFZ52sLnzFvw==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIDP+WMo518hD8aMXFI024u65Tyl/boR4MnwllqXIUe2PAiEAhyNUSPaIDvQQFv1E1oHaQp11rYTtvRgVDP19jY2Ys+c="}]},"maintainers":[{"name":"guzmonne","email":"guzmonne@hotmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/dynamodb-graph-1.4.0.tgz_1513812967280_0.43337605032138526"}},"1.5.0":{"name":"dynamodb-graph","version":"1.5.0","main":"dist/index.js","repository":{"github":"git@github.com:guzmonne/dynamodb-graph.git"},"license":"MIT","dependencies":{"aws-sdk":"^2.169.0","cuid":"^1.3.8","lodash":"^4.17.4","rxjs":"^5.5.5"},"scripts":{"validate:stack":"cd scripts && ./validate_stack.sh","delete:stack":"cd scripts && ./delete_stack.sh","describe:stack":"cd scripts && ./describe_stack.sh","deploy:stack":"cd scripts && ./deploy_stack.sh","test":"jest --watch"},"devDependencies":{"jest":"^21.2.1","sinon":"^4.1.3"},"gitHead":"90862f67d6ade1eaf235db64a39b7deba92061e1","description":"This is a library aimed to work with DynamoDB as if it was a Graph. The idea came from the \"Advanced Design Patterns for Amazon DynamoDB (DAT403-R)\" talk from Rick Houlihan on 2017 AWS re:Invent conference. Close to the end he describes a way to use a Dyn","_id":"dynamodb-graph@1.5.0","_shasum":"6a0fa6ec3ff49691b0e30566badd6a182bec65bc","_from":".","_npmVersion":"3.10.10","_nodeVersion":"6.10.3","_npmUser":{"name":"guzmonne","email":"guzmonne@hotmail.com"},"dist":{"shasum":"6a0fa6ec3ff49691b0e30566badd6a182bec65bc","tarball":"https://registry.npmjs.org/dynamodb-graph/-/dynamodb-graph-1.5.0.tgz","integrity":"sha512-QkQg5A9q2EiZOU0Q9880+A4h8CofQW7VCbe0d7dd5uBfBj87gcQfxUV2+UxIswl4GdbjFRvfvbYtyBhcGCl3tg==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCjaIxERH7ly58LtvcHtav0z4yqk86EA9kYXSiDd9yBGwIhAKZwwfjwsS4snk2FJ2CLgqCcVC9HDj6sfCBvA7xz4zx1"}]},"maintainers":[{"name":"guzmonne","email":"guzmonne@hotmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/dynamodb-graph-1.5.0.tgz_1513989718668_0.7514050707686692"}},"1.6.0":{"name":"dynamodb-graph","version":"1.6.0","main":"dist/index.js","repository":{"github":"git@github.com:guzmonne/dynamodb-graph.git"},"license":"MIT","dependencies":{"aws-sdk":"^2.169.0","cuid":"^1.3.8","lodash":"^4.17.4","rxjs":"^5.5.5"},"scripts":{"validate:stack":"cd scripts && ./validate_stack.sh","delete:stack":"cd scripts && ./delete_stack.sh","describe:stack":"cd scripts && ./describe_stack.sh","deploy:stack":"cd scripts && ./deploy_stack.sh","test":"jest --watch"},"devDependencies":{"jest":"^21.2.1","sinon":"^4.1.3"},"gitHead":"cd1bbce879b2a6e02424f2f4b88de8ccb6178a11","description":"This is a library aimed to work with DynamoDB as if it was a Graph. The idea came from the \"Advanced Design Patterns for Amazon DynamoDB (DAT403-R)\" talk from Rick Houlihan on 2017 AWS re:Invent conference. Close to the end he describes a way to use a Dyn","_id":"dynamodb-graph@1.6.0","_shasum":"d6217e7c2d275b914c5807f2bdaabfa794094d0c","_from":".","_npmVersion":"3.10.10","_nodeVersion":"6.10.3","_npmUser":{"name":"guzmonne","email":"guzmonne@hotmail.com"},"dist":{"shasum":"d6217e7c2d275b914c5807f2bdaabfa794094d0c","tarball":"https://registry.npmjs.org/dynamodb-graph/-/dynamodb-graph-1.6.0.tgz","integrity":"sha512-4TOOpxHbqzeWHB7nyANs+hsFd9ZlzDK8sFHB45YMghLoS1jX6V2KiKB8B08NGuqDlVvdHU7i9rGRN4RY70Yg/A==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIBaOE77XRFMa4JjoA7OmrLvcaRW9PboeE4b1Ny1dcGwEAiBiu04c+fmzn1WR24h4og7bL5oeGEpGfgiA0F487dSvFQ=="}]},"maintainers":[{"name":"guzmonne","email":"guzmonne@hotmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/dynamodb-graph-1.6.0.tgz_1513994510589_0.3468962099868804"}},"1.6.1":{"name":"dynamodb-graph","version":"1.6.1","main":"dist/index.js","repository":{"github":"git@github.com:guzmonne/dynamodb-graph.git"},"license":"MIT","dependencies":{"aws-sdk":"^2.169.0","cuid":"^1.3.8","lodash":"^4.17.4","rxjs":"^5.5.5"},"scripts":{"validate:stack":"cd scripts && ./validate_stack.sh","delete:stack":"cd scripts && ./delete_stack.sh","describe:stack":"cd scripts && ./describe_stack.sh","deploy:stack":"cd scripts && ./deploy_stack.sh","test":"jest --watch"},"devDependencies":{"jest":"^21.2.1","sinon":"^4.1.3"},"gitHead":"f17f70bfa12603b7db537394f5c0f21257f5aae0","description":"This is a library aimed to work with DynamoDB as if it was a Graph. The idea came from the \"Advanced Design Patterns for Amazon DynamoDB (DAT403-R)\" talk from Rick Houlihan on 2017 AWS re:Invent conference. Close to the end he describes a way to use a Dyn","_id":"dynamodb-graph@1.6.1","_shasum":"98954b6ea7596e57750db7c830c1a8bb2061fe67","_from":".","_npmVersion":"3.10.10","_nodeVersion":"6.10.3","_npmUser":{"name":"guzmonne","email":"guzmonne@hotmail.com"},"dist":{"shasum":"98954b6ea7596e57750db7c830c1a8bb2061fe67","tarball":"https://registry.npmjs.org/dynamodb-graph/-/dynamodb-graph-1.6.1.tgz","integrity":"sha512-km9Gg4GC5W2WeDEg68TgJIVjnysAV4DksBg+7v7NgFy9AT2bazlsmKw72esFz5d6nxW/u7r9gS+Pk4Qd/2Lctw==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIENC0I+Qos2ER3TUINLlvnTxdTwZ94+OPREFC+KMrfEKAiEA49i81h4HCMOJhIgNK/pqfInPLcMKmpKW6jh9w+EN9Mc="}]},"maintainers":[{"name":"guzmonne","email":"guzmonne@hotmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/dynamodb-graph-1.6.1.tgz_1513998588071_0.3379795402288437"}},"1.6.2":{"name":"dynamodb-graph","version":"1.6.2","main":"dist/index.js","repository":{"github":"git@github.com:guzmonne/dynamodb-graph.git"},"license":"MIT","dependencies":{"aws-sdk":"^2.169.0","cuid":"^1.3.8","lodash":"^4.17.4","rxjs":"^5.5.5"},"scripts":{"validate:stack":"cd scripts && ./validate_stack.sh","delete:stack":"cd scripts && ./delete_stack.sh","describe:stack":"cd scripts && ./describe_stack.sh","deploy:stack":"cd scripts && ./deploy_stack.sh","test":"jest --watch"},"devDependencies":{"jest":"^21.2.1","sinon":"^4.1.3"},"gitHead":"92179a578c72def862df03e0b9e9a861f1416792","description":"This is a library aimed to work with DynamoDB as if it was a Graph. The idea came from the \"Advanced Design Patterns for Amazon DynamoDB (DAT403-R)\" talk from Rick Houlihan on 2017 AWS re:Invent conference. Close to the end he describes a way to use a Dyn","_id":"dynamodb-graph@1.6.2","_shasum":"cd961315d6170eb24c854685e8ae210c90022874","_from":".","_npmVersion":"3.10.10","_nodeVersion":"6.10.3","_npmUser":{"name":"guzmonne","email":"guzmonne@hotmail.com"},"dist":{"shasum":"cd961315d6170eb24c854685e8ae210c90022874","tarball":"https://registry.npmjs.org/dynamodb-graph/-/dynamodb-graph-1.6.2.tgz","integrity":"sha512-qVueKwc7uOddTJDpGTnMmm5kRZgdFcoadGn67J0N5WuDts5imc6IIc3zjR/hNLVHPXTcyKLwnGsteDHLsZXXyw==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCCVkdMaOAEnbsfLbH7gMdUoW7VSoVUUu1fKQEOlrA7PgIgVw536FQCUKQBFbZJvHVgNcEt953Subu5ThXv94EWA3M="}]},"maintainers":[{"name":"guzmonne","email":"guzmonne@hotmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/dynamodb-graph-1.6.2.tgz_1513999266835_0.3015364382881671"}},"1.6.3":{"name":"dynamodb-graph","version":"1.6.3","main":"dist/index.js","repository":{"github":"git@github.com:guzmonne/dynamodb-graph.git"},"license":"MIT","dependencies":{"aws-sdk":"^2.169.0","cuid":"^1.3.8","lodash":"^4.17.4","rxjs":"^5.5.5"},"scripts":{"validate:stack":"cd scripts && ./validate_stack.sh","delete:stack":"cd scripts && ./delete_stack.sh","describe:stack":"cd scripts && ./describe_stack.sh","deploy:stack":"cd scripts && ./deploy_stack.sh","test":"jest --watch"},"devDependencies":{"jest":"^21.2.1","sinon":"^4.1.3"},"gitHead":"360c770ab3c39be8c1e58bc83bde7ea26ced3753","description":"This is a library aimed to work with DynamoDB as if it was a Graph. The idea came from the \"Advanced Design Patterns for Amazon DynamoDB (DAT403-R)\" talk from Rick Houlihan on 2017 AWS re:Invent conference. Close to the end he describes a way to use a Dyn","_id":"dynamodb-graph@1.6.3","_shasum":"78a16603bdb3fb7288364619cc182768cb46ab6d","_from":".","_npmVersion":"3.10.10","_nodeVersion":"6.10.3","_npmUser":{"name":"guzmonne","email":"guzmonne@hotmail.com"},"dist":{"shasum":"78a16603bdb3fb7288364619cc182768cb46ab6d","tarball":"https://registry.npmjs.org/dynamodb-graph/-/dynamodb-graph-1.6.3.tgz","integrity":"sha512-A1zNRhqDE9x06mFR9cCHMVdTtwY3xLrdyhtaUETvGhhwmO3Ac2w7njXfFS8NECIYEp6jlMLSdd4SJ2E6yeGYow==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQD3HhPlNfodX723jadx6RPZCPw1j8HhQnTeUKdKyA//MgIgCAf7uw3Z13P+4/o9ngFnsl9/xFcEiZawgG6Sy4b8PY0="}]},"maintainers":[{"name":"guzmonne","email":"guzmonne@hotmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/dynamodb-graph-1.6.3.tgz_1513999516729_0.23164282785728574"}},"1.7.0":{"name":"dynamodb-graph","version":"1.7.0","main":"dist/index.js","repository":{"github":"git@github.com:guzmonne/dynamodb-graph.git"},"license":"MIT","dependencies":{"aws-sdk":"^2.169.0","cuid":"^1.3.8","lodash":"^4.17.4","rxjs":"^5.5.5"},"scripts":{"validate:stack":"cd scripts && ./validate_stack.sh","delete:stack":"cd scripts && ./delete_stack.sh","describe:stack":"cd scripts && ./describe_stack.sh","deploy:stack":"cd scripts && ./deploy_stack.sh","test":"jest --watch"},"devDependencies":{"jest":"^21.2.1","sinon":"^4.1.3"},"gitHead":"ba608508106870d494c0e1ccb7bb213a3be07164","description":"This is a library aimed to work with DynamoDB as if it was a Graph. The idea came from the \"Advanced Design Patterns for Amazon DynamoDB (DAT403-R)\" talk from Rick Houlihan on 2017 AWS re:Invent conference. Close to the end he describes a way to use a Dyn","_id":"dynamodb-graph@1.7.0","_shasum":"7a7321709d1d0f0ed090fa9344d810a4bd742676","_from":".","_npmVersion":"3.10.10","_nodeVersion":"6.10.3","_npmUser":{"name":"guzmonne","email":"guzmonne@hotmail.com"},"dist":{"shasum":"7a7321709d1d0f0ed090fa9344d810a4bd742676","tarball":"https://registry.npmjs.org/dynamodb-graph/-/dynamodb-graph-1.7.0.tgz","integrity":"sha512-9GFSN0cbbKk9Jw7FL7eJXcfMUEsKhHMB0Z/1IgEj4Js81UDaq2AKqY/uHN0S4lztpZLMsgp9XVN49/k15e3HAw==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIARjR4yIrGKhclE5UQlcri4pgUySX3Ttx7cLQsziWw8bAiEAt4nwChH/zKW/jat1dVTOzJh6bCjLWfwHfOLXkKSxMCc="}]},"maintainers":[{"name":"guzmonne","email":"guzmonne@hotmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/dynamodb-graph-1.7.0.tgz_1514062349665_0.9466463185381144"}},"1.7.1":{"name":"dynamodb-graph","version":"1.7.1","main":"dist/index.js","repository":{"github":"git@github.com:guzmonne/dynamodb-graph.git"},"license":"MIT","dependencies":{"aws-sdk":"^2.169.0","cuid":"^1.3.8","lodash":"^4.17.4","rxjs":"^5.5.5"},"scripts":{"validate:stack":"cd scripts && ./validate_stack.sh","delete:stack":"cd scripts && ./delete_stack.sh","describe:stack":"cd scripts && ./describe_stack.sh","deploy:stack":"cd scripts && ./deploy_stack.sh","test":"jest --watch"},"devDependencies":{"jest":"^21.2.1","sinon":"^4.1.3"},"gitHead":"bccfea2be6f3188af0f936e85d4afc8431471394","description":"This is a library aimed to work with DynamoDB as if it was a Graph. The idea came from the \"Advanced Design Patterns for Amazon DynamoDB (DAT403-R)\" talk from Rick Houlihan on 2017 AWS re:Invent conference. Close to the end he describes a way to use a Dyn","_id":"dynamodb-graph@1.7.1","_shasum":"1b32b5c63f21f6024e04384a628b206769688da0","_from":".","_npmVersion":"3.10.10","_nodeVersion":"6.10.3","_npmUser":{"name":"guzmonne","email":"guzmonne@hotmail.com"},"dist":{"shasum":"1b32b5c63f21f6024e04384a628b206769688da0","tarball":"https://registry.npmjs.org/dynamodb-graph/-/dynamodb-graph-1.7.1.tgz","integrity":"sha512-mSyQy+hCEb32aKlj8UFf9OkW7hK+72xypgYlUuUWZKU9N51a8I1+QrM4kMIH1wDGauU7jxaMlIPrqxZaYcIzBw==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIAV/Uv8ESk4xuZNV5TJaQxXsciyILr7qTCW0K2KkCoUUAiEAgQIZ1W1gu/bDB9PubPGwuhPXrkXVNcyKwtUwkryp1eo="}]},"maintainers":[{"name":"guzmonne","email":"guzmonne@hotmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/dynamodb-graph-1.7.1.tgz_1514071027773_0.7160835352260619"}},"1.7.2":{"name":"dynamodb-graph","version":"1.7.2","main":"dist/index.js","repository":{"github":"git@github.com:guzmonne/dynamodb-graph.git"},"license":"MIT","dependencies":{"aws-sdk":"^2.169.0","cuid":"^1.3.8","lodash":"^4.17.4","rxjs":"^5.5.5"},"scripts":{"validate:stack":"cd scripts && ./validate_stack.sh","delete:stack":"cd scripts && ./delete_stack.sh","describe:stack":"cd scripts && ./describe_stack.sh","deploy:stack":"cd scripts && ./deploy_stack.sh","test":"jest --watch"},"devDependencies":{"jest":"^21.2.1","sinon":"^4.1.3"},"gitHead":"1d455967c68942c340cfd6523b71753e32f4ddcc","description":"This is a library aimed to work with DynamoDB as if it was a Graph. The idea came from the \"Advanced Design Patterns for Amazon DynamoDB (DAT403-R)\" talk from Rick Houlihan on 2017 AWS re:Invent conference. Close to the end he describes a way to use a Dyn","_id":"dynamodb-graph@1.7.2","_shasum":"c3f450627782dc846d691cb2b1f9c93681e6ac04","_from":".","_npmVersion":"3.10.10","_nodeVersion":"6.10.3","_npmUser":{"name":"guzmonne","email":"guzmonne@hotmail.com"},"dist":{"shasum":"c3f450627782dc846d691cb2b1f9c93681e6ac04","tarball":"https://registry.npmjs.org/dynamodb-graph/-/dynamodb-graph-1.7.2.tgz","integrity":"sha512-e2MCHQtxiz5vvEm+xPbu9tKXTmEd5uMJRLy3vjfsLH5ZJ+1Pnj0H20ckhumIPfpooIo0z6+/xVB79xpZuEaybQ==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQD6QW1qMHWRh9VAbSRFmuF2QrELBBQpKL7GRls8Vz2dowIhAI5GL2I/exuPx6ftYE0yXb9h+ZUTuglssV7IpCHURi0r"}]},"maintainers":[{"name":"guzmonne","email":"guzmonne@hotmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/dynamodb-graph-1.7.2.tgz_1514130438812_0.23831297038123012"}},"1.7.3":{"name":"dynamodb-graph","version":"1.7.3","main":"dist/index.js","repository":{"github":"git@github.com:guzmonne/dynamodb-graph.git"},"license":"MIT","dependencies":{"aws-sdk":"^2.169.0","cuid":"^1.3.8","lodash":"^4.17.4","rxjs":"^5.5.5"},"scripts":{"validate:stack":"cd scripts && ./validate_stack.sh","delete:stack":"cd scripts && ./delete_stack.sh","describe:stack":"cd scripts && ./describe_stack.sh","deploy:stack":"cd scripts && ./deploy_stack.sh","test":"jest --watch"},"devDependencies":{"jest":"^21.2.1","sinon":"^4.1.3"},"gitHead":"8b50456a5b0a9faff01e7d07ba72cc98592ad6ec","description":"This is a library aimed to work with DynamoDB as if it was a Graph. The idea came from the \"Advanced Design Patterns for Amazon DynamoDB (DAT403-R)\" talk from Rick Houlihan on 2017 AWS re:Invent conference. Close to the end he describes a way to use a Dyn","_id":"dynamodb-graph@1.7.3","_shasum":"5e9de6dd23b6d0a5921c8f22e1ebb14cead68ccd","_from":".","_npmVersion":"3.10.10","_nodeVersion":"6.10.3","_npmUser":{"name":"guzmonne","email":"guzmonne@hotmail.com"},"dist":{"shasum":"5e9de6dd23b6d0a5921c8f22e1ebb14cead68ccd","tarball":"https://registry.npmjs.org/dynamodb-graph/-/dynamodb-graph-1.7.3.tgz","integrity":"sha512-zGNyxXxNGzKu1jXJvdtU02r+edzI+YxyI236rFOpUCl9JxESn2OGx/LyTZImZOqZlXoLzhUesyCdBtWtAN26XA==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQC9yPf8zUDeRmHdeseIisSJIiodkbE9kTJ8FBJUVA/ybQIgIwNile9LyyZmE4V7Nv+C+DxXqAJzDRdix85h97mOQbM="}]},"maintainers":[{"name":"guzmonne","email":"guzmonne@hotmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/dynamodb-graph-1.7.3.tgz_1514143242056_0.5487026805058122"}},"1.7.4":{"name":"dynamodb-graph","version":"1.7.4","main":"dist/index.js","repository":{"github":"git@github.com:guzmonne/dynamodb-graph.git"},"license":"MIT","dependencies":{"aws-sdk":"^2.169.0","cuid":"^1.3.8","lodash":"^4.17.4","rxjs":"^5.5.5"},"scripts":{"validate:stack":"cd scripts && ./validate_stack.sh","delete:stack":"cd scripts && ./delete_stack.sh","describe:stack":"cd scripts && ./describe_stack.sh","deploy:stack":"cd scripts && ./deploy_stack.sh","test":"jest --watch"},"devDependencies":{"jest":"^21.2.1","sinon":"^4.1.3"},"gitHead":"3bd133c6923472ecbf5c96f2bd93975b9d3e3a3b","description":"This is a library aimed to work with DynamoDB as if it was a Graph. The idea came from the \"Advanced Design Patterns for Amazon DynamoDB (DAT403-R)\" talk from Rick Houlihan on 2017 AWS re:Invent conference. Close to the end he describes a way to use a Dyn","_id":"dynamodb-graph@1.7.4","_shasum":"5c6e5375fff9f1001b55dee58007bb5eb12e1233","_from":".","_npmVersion":"3.10.10","_nodeVersion":"6.10.3","_npmUser":{"name":"guzmonne","email":"guzmonne@hotmail.com"},"dist":{"shasum":"5c6e5375fff9f1001b55dee58007bb5eb12e1233","tarball":"https://registry.npmjs.org/dynamodb-graph/-/dynamodb-graph-1.7.4.tgz","integrity":"sha512-IcDmDt6cvOLDj5ytX7+aKggUfzyEO6NuwENqRomBC6MIaqREDmF8oL8+A5kcmy+JblV1IYwgqNNa5Os9/xfn6A==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIDbQiZKAwaoNSdvj+ssA4edmJHq0ubK81amgN2MnJsY2AiAeiwUUsVJUJyYxFhr2utWqFfGlbewjG2QQ2xWEffjauQ=="}]},"maintainers":[{"name":"guzmonne","email":"guzmonne@hotmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/dynamodb-graph-1.7.4.tgz_1514145651121_0.2203554743900895"}},"1.7.5":{"name":"dynamodb-graph","version":"1.7.5","main":"dist/index.js","repository":{"github":"git@github.com:guzmonne/dynamodb-graph.git"},"license":"MIT","dependencies":{"aws-sdk":"^2.169.0","cuid":"^1.3.8","lodash":"^4.17.4","rxjs":"^5.5.5"},"scripts":{"validate:stack":"cd scripts && ./validate_stack.sh","delete:stack":"cd scripts && ./delete_stack.sh","describe:stack":"cd scripts && ./describe_stack.sh","deploy:stack":"cd scripts && ./deploy_stack.sh","test":"jest --watch"},"devDependencies":{"jest":"^21.2.1","sinon":"^4.1.3"},"gitHead":"ec0ae3e3dfc0161b18a5dfffffb41d96b3f4ee77","description":"This is a library aimed to work with DynamoDB as if it was a Graph. The idea came from the \"Advanced Design Patterns for Amazon DynamoDB (DAT403-R)\" talk from Rick Houlihan on 2017 AWS re:Invent conference. Close to the end he describes a way to use a Dyn","_id":"dynamodb-graph@1.7.5","_shasum":"b91a91d503c315fd5eb9fe1a8b4e5caef14043d1","_from":".","_npmVersion":"3.10.10","_nodeVersion":"6.10.3","_npmUser":{"name":"guzmonne","email":"guzmonne@hotmail.com"},"dist":{"shasum":"b91a91d503c315fd5eb9fe1a8b4e5caef14043d1","tarball":"https://registry.npmjs.org/dynamodb-graph/-/dynamodb-graph-1.7.5.tgz","integrity":"sha512-bZa+8BNDYl3tqs7AptntAbLR5mxkr5K/4aAoFVikjzOP3G0UwC6CJbC8HJCaL7Zw+sYZagFPp/aV9Zp++r+WJQ==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCICfU/tFbJazVnzdxA6OzLqwFHQ5t1JnZKZO/5vatLrvBAiBoQijpjySDNb7gol1PeIWB5cHycO4TiqkUepSUVcmc4A=="}]},"maintainers":[{"name":"guzmonne","email":"guzmonne@hotmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/dynamodb-graph-1.7.5.tgz_1514303523636_0.769019016996026"}},"2.0.0":{"name":"dynamodb-graph","version":"2.0.0","main":"dist/index.js","repository":{"github":"git@github.com:guzmonne/dynamodb-graph.git"},"license":"MIT","dependencies":{"aws-sdk":"^2.169.0","cuid":"^1.3.8","lodash":"^4.17.4","rxjs":"^5.5.5"},"scripts":{"validate:stack":"cd scripts && ./validate_stack.sh","delete:stack":"cd scripts && ./delete_stack.sh","describe:stack":"cd scripts && ./describe_stack.sh","deploy:stack":"cd scripts && ./deploy_stack.sh","test":"jest --watch"},"devDependencies":{"jest":"^21.2.1","sinon":"^4.1.3"},"gitHead":"d22ec098df904f04dccbc35a0bc3fa0851aa46d0","description":"This is a library aimed to work with DynamoDB as if it was a Graph. The idea came from the \"Advanced Design Patterns for Amazon DynamoDB (DAT403-R)\" talk from Rick Houlihan on 2017 AWS re:Invent conference. Close to the end he describes a way to use a Dyn","_id":"dynamodb-graph@2.0.0","_shasum":"e447d76d2cc4e8268631fe0a9d430cf3ec4f6c8d","_from":".","_npmVersion":"3.10.10","_nodeVersion":"6.10.3","_npmUser":{"name":"guzmonne","email":"guzmonne@hotmail.com"},"dist":{"shasum":"e447d76d2cc4e8268631fe0a9d430cf3ec4f6c8d","tarball":"https://registry.npmjs.org/dynamodb-graph/-/dynamodb-graph-2.0.0.tgz","integrity":"sha512-SOWaagd2lLMSUr2Fg7oXoVe9z6F+10YIFK+de54Peo0ITSFXvNWeJNLcpZPYU949Bk7MJNUpxq0pcS52hpVgRg==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQD1JyBc3rodwVdMzi23/teMjsjEo+VPQrsY447cSZG/EgIgaXn4NmaJMzToQEd83SowMKOpp5gDtXVumHYaH6N2D6M="}]},"maintainers":[{"name":"guzmonne","email":"guzmonne@hotmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/dynamodb-graph-2.0.0.tgz_1514338173386_0.2462591417133808"}},"2.0.1":{"name":"dynamodb-graph","version":"2.0.1","main":"dist/index.js","repository":{"github":"git@github.com:guzmonne/dynamodb-graph.git"},"license":"MIT","dependencies":{"aws-sdk":"^2.169.0","cuid":"^1.3.8","lodash":"^4.17.4","rxjs":"^5.5.5"},"scripts":{"validate:stack":"cd scripts && ./validate_stack.sh","delete:stack":"cd scripts && ./delete_stack.sh","describe:stack":"cd scripts && ./describe_stack.sh","deploy:stack":"cd scripts && ./deploy_stack.sh","test":"jest --watch"},"devDependencies":{"jest":"^21.2.1","sinon":"^4.1.3"},"gitHead":"eb2ef619a57d66e8397d20b6e1066be530ecb349","description":"This is a library aimed to work with DynamoDB as if it was a Graph. The idea came from the \"Advanced Design Patterns for Amazon DynamoDB (DAT403-R)\" talk from Rick Houlihan on 2017 AWS re:Invent conference. Close to the end he describes a way to use a Dyn","_id":"dynamodb-graph@2.0.1","_shasum":"2b72e58f515636333f0abb802306013ecf85ca2c","_from":".","_npmVersion":"3.10.10","_nodeVersion":"6.10.3","_npmUser":{"name":"guzmonne","email":"guzmonne@hotmail.com"},"dist":{"shasum":"2b72e58f515636333f0abb802306013ecf85ca2c","tarball":"https://registry.npmjs.org/dynamodb-graph/-/dynamodb-graph-2.0.1.tgz","integrity":"sha512-z68I5rqYgedWRN9FCNf7yDljS/Cdgv0NJWBBWD4mDKFtWxmUkFxQFWr4Vtd77n4DsaXwKPwTQ5w8h8xXmeXbAQ==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIFg3i39vh98i6F/KQgrkJsh5RtxfEbz/5F2WDIfeSu/rAiBGK++KoR04ICACtM6O0jfBtdjnZpJOKGDBJmdoopcSSg=="}]},"maintainers":[{"name":"guzmonne","email":"guzmonne@hotmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/dynamodb-graph-2.0.1.tgz_1514343987861_0.4578783637844026"}},"3.0.0":{"name":"dynamodb-graph","version":"3.0.0","main":"dist/index.js","repository":{"github":"git@github.com:guzmonne/dynamodb-graph.git"},"license":"MIT","dependencies":{"aws-sdk":"^2.169.0","cuid":"^1.3.8","lodash":"^4.17.4","rxjs":"^5.5.5"},"scripts":{"validate:stack":"cd scripts && ./validate_stack.sh","delete:stack":"cd scripts && ./delete_stack.sh","describe:stack":"cd scripts && ./describe_stack.sh","deploy:stack":"cd scripts && ./deploy_stack.sh","test":"jest --watch"},"devDependencies":{"console.table":"^0.9.1","csvtojson":"^1.1.9","jest":"^21.2.1","sinon":"^4.1.3","yamljs":"^0.3.0"},"gitHead":"d6c679130f9dfe60a244750661e6020e4e5c6018","description":"This is a library aimed to work with DynamoDB as if it was a Graph. The idea came from the \"Advanced Design Patterns for Amazon DynamoDB (DAT403-R)\" talk from Rick Houlihan on 2017 AWS re:Invent conference. Close to the end, he describes a way to use a Dy","_id":"dynamodb-graph@3.0.0","_shasum":"10ea3d2adc1b9183d9f02fbde5d17445f11e5144","_from":".","_npmVersion":"3.10.10","_nodeVersion":"6.10.3","_npmUser":{"name":"guzmonne","email":"guzmonne@hotmail.com"},"dist":{"shasum":"10ea3d2adc1b9183d9f02fbde5d17445f11e5144","tarball":"https://registry.npmjs.org/dynamodb-graph/-/dynamodb-graph-3.0.0.tgz","integrity":"sha512-CRJYbzHnQBek6pd1OLSQzgcBSdm54UQdf5opa4RiUm+OhBfDLWXE8iBFKjh84BwmRTd9ax97hn0gyz1J6XfHoA==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCwUFzHgY/ef/2k+MGcwowvyKvFYXSq7Shlr5DP8XK01wIgB7wHZsAazETVJUq8nAC+g7c3bmLe4MZDMQIdBUzQTb4="}]},"maintainers":[{"name":"guzmonne","email":"guzmonne@hotmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/dynamodb-graph-3.0.0.tgz_1515013958943_0.6243422455154359"}},"4.0.0":{"name":"dynamodb-graph","version":"4.0.0","main":"dist/index.js","repository":{"github":"git@github.com:guzmonne/dynamodb-graph.git"},"license":"MIT","dependencies":{"aws-sdk":"^2.169.0","cuid":"^1.3.8","lodash":"^4.17.4"},"scripts":{"validate:stack":"cd scripts && ./validate_stack.sh","delete:stack":"cd scripts && ./delete_stack.sh","describe:stack":"cd scripts && ./describe_stack.sh","deploy:stack":"cd scripts && ./deploy_stack.sh","test":"jest --watch"},"devDependencies":{"console.table":"^0.9.1","csvtojson":"^1.1.9","jest":"^21.2.1","rxjs":"^5.5.6","sinon":"^4.1.3","yamljs":"^0.3.0"},"gitHead":"6959cb721e3e08b1dba01f8f29df7eca82e738b8","description":"## Introduction","_id":"dynamodb-graph@4.0.0","_shasum":"448aaefb3804ed84e16c63d342c06e603ae23505","_from":".","_npmVersion":"4.1.2","_nodeVersion":"7.5.0","_npmUser":{"name":"guzmonne","email":"guzmonne@hotmail.com"},"dist":{"shasum":"448aaefb3804ed84e16c63d342c06e603ae23505","tarball":"https://registry.npmjs.org/dynamodb-graph/-/dynamodb-graph-4.0.0.tgz","integrity":"sha512-FFobPFq8L6p7XEgSjZpLtVFGJrxiib+MMwpW/mk0Y10SVyEiyXiD10RXncnHkyyJvKQYS0wD12sDTlm+tVS1wA==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQD+wHrUH1M+tnVZNCgWjlxcr3yayggr9K4IZjDNWI3dggIhALzPkAnr0r/lBBsm5ReOvKrfL/fKrtWnVoI2HIvh9oM/"}]},"maintainers":[{"name":"guzmonne","email":"guzmonne@hotmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/dynamodb-graph-4.0.0.tgz_1515529582028_0.6648256394546479"}},"4.1.0":{"name":"dynamodb-graph","version":"4.1.0","main":"dist/index.js","repository":{"github":"git@github.com:guzmonne/dynamodb-graph.git"},"license":"MIT","dependencies":{"aws-sdk":"^2.169.0","cuid":"^1.3.8","hex-2-num":"^1.0.0","lodash":"^4.17.4"},"scripts":{"validate:stack":"cd scripts && ./validate_stack.sh","delete:stack":"cd scripts && ./delete_stack.sh","describe:stack":"cd scripts && ./describe_stack.sh","deploy:stack":"cd scripts && ./deploy_stack.sh","test":"jest --watch"},"devDependencies":{"console.table":"^0.9.1","csvtojson":"^1.1.9","jest":"^21.2.1","rxjs":"^5.5.6","sinon":"^4.1.3","yamljs":"^0.3.0"},"gitHead":"295a38be3c79a029a356cc8af5a9ba75bbadb6f7","description":"## Introduction","_id":"dynamodb-graph@4.1.0","_shasum":"4eea656b96e291d9a5e2c7e778a021089423ffe5","_from":".","_npmVersion":"3.10.10","_nodeVersion":"6.10.3","_npmUser":{"name":"guzmonne","email":"guzmonne@hotmail.com"},"dist":{"shasum":"4eea656b96e291d9a5e2c7e778a021089423ffe5","tarball":"https://registry.npmjs.org/dynamodb-graph/-/dynamodb-graph-4.1.0.tgz","integrity":"sha512-ILyyqc2O91MUxqW9Dfb/sOg3zv1fxwpEkxbrIdAAbeaD/SACPimELp1QTT2SDS8OCFHxacWv4A5HYWXMqtU5Yw==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIFG+xUVIqeqAMUsSPRsqGFsUdln55VQpKzw1ZoFbgr/gAiEA4ANXdaduc0iWISD99ThmWZ4kcg4Xl1/ndoqqJalDfN0="}]},"maintainers":[{"name":"guzmonne","email":"guzmonne@hotmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/dynamodb-graph-4.1.0.tgz_1515785804282_0.6754453361500055"}},"4.1.1":{"name":"dynamodb-graph","version":"4.1.1","main":"dist/index.js","repository":{"github":"git@github.com:guzmonne/dynamodb-graph.git"},"license":"MIT","dependencies":{"aws-sdk":"^2.169.0","cuid":"^1.3.8","hex-2-num":"^1.0.0","lodash":"^4.17.4"},"scripts":{"validate:stack":"cd scripts && ./validate_stack.sh","delete:stack":"cd scripts && ./delete_stack.sh","describe:stack":"cd scripts && ./describe_stack.sh","deploy:stack":"cd scripts && ./deploy_stack.sh","test":"jest --watch"},"devDependencies":{"console.table":"^0.9.1","csvtojson":"^1.1.9","jest":"^21.2.1","rxjs":"^5.5.6","sinon":"^4.1.3","yamljs":"^0.3.0"},"gitHead":"df18b9cd35c3b2e84b2a4b077f87f04671cd7407","description":"## Introduction","_id":"dynamodb-graph@4.1.1","_shasum":"86fc15b10bb7c164fa60dca4e76584b38832f839","_from":".","_npmVersion":"4.1.2","_nodeVersion":"7.5.0","_npmUser":{"name":"guzmonne","email":"guzmonne@hotmail.com"},"dist":{"shasum":"86fc15b10bb7c164fa60dca4e76584b38832f839","tarball":"https://registry.npmjs.org/dynamodb-graph/-/dynamodb-graph-4.1.1.tgz","integrity":"sha512-w7tj1ZNREFM1CRBvK7lKsGsjWQ8vh1kxKWzege1QYgFq1punPWrHV3Y8xiGXx0d3xE4+Ot37dXlYu5onNoZArQ==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIHUTLgqTdCQV+xKoYTDcU2+bl4hFb3EHyZFtvalYHaXYAiEAy5UvwtYt0HjL6Ywqj23qi6JCZJg3m33ZVNOD5/kJjx8="}]},"maintainers":[{"name":"guzmonne","email":"guzmonne@hotmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/dynamodb-graph-4.1.1.tgz_1515853858143_0.8670198328327388"}}},"readme":"# DynamoDB-Graph\n\n## Introduction\n\nThis is a library built to work with DynamoDB as if it was storing a Graph. The idea came from the \"Advanced Design Patterns for Amazon DynamoDB (DAT403-R)\" talk from Rick Houlihan on 2017 AWS re:Invent conference. Close to the end, he describes a way to use a DynamoDB table to represent a directed graph. I found that notion very interesting, so I started working on a library that would abstract the details of the graph representation, on top of DynamoDB using the AWS Document Client driver, from the AWS JavaScript SDK.\n\nBesides the ideas explained in the talk, I other two more:\n\n1. The concept of a `tenant`.\n2. A way to handle the amount of GSI partitions to use, by defining the maximum number of GSIK allowed, which are generated from the Nodes ids.\n\nEach node can belong to a `tenant`, which is a way to box entities (users, companie, groups, etc) into their own parititon inside the table. This is done by concatenating the `id` of each node, and their `GSIK`, with the `tenant id`. This last value if configured when the library is intitialized, and is completely abstracted from the user. Meaning, you can interact with the table as if the `tenant` value didn't exist. You could have multiple users handling the same Node `ids`, as long as they have a unique `tenant` id.\n\nThis has another aditional benefit: we can apply IAM policies to let the users only access the keys with their corresponding tenant. Making it impossible to access the keys from other users.\n\nTo control the number of GSI Keys you can use the `maxGSIK` attribute when configuring the library. This value defines the ammount of GSIK allowed on the table, and shoudl be a multiple of 10 to allow a normal distribution of the nodes in each GSIK.\n\nThe data inside every Node item must be stored as a `string`. That means that you have to stringify the data types that you want to store on the table. On the documentation section, I explain a couple of ways of storing numbers on the database.\n\n**Important Note:** This library was built on top of Node 6.10.3, because I wanted to use it on AWS Lambda, and at the moment is the highest version supported. It should work on higher versions, but I haven't tested it.\n\n##DynamoDB table.\n\nThe schema for the DynamoDB table, written as a CloudFormation template is the following:\n\n```yaml\nAWSTemplateFormatVersion: \"2010-09-09\"\nResources:\n  Graph:\n    Type: \"AWS::DynamoDB::Table\"\n    Properties:\n      AttributeDefinitions:\n        -\n          AttributeName: \"Node\"\n          AttributeType: \"S\"\n        -\n          AttributeName: \"Type\"\n          AttributeType: \"S\"\n        -\n          AttributeName: \"Data\"\n          AttributeType: \"S\"\n        -\n          AttributeName: \"GSIK\"\n          AttributeType: \"S\"\n      KeySchema:\n        -\n          AttributeName: \"Node\"\n          KeyType: \"HASH\"\n        -\n          AttributeName: \"Type\"\n          KeyType: \"RANGE\"\n      ProvisionedThroughput:\n        ReadCapacityUnits: \"1\"\n        WriteCapacityUnits: \"1\"\n      TableName: \"GraphTable\"\n      GlobalSecondaryIndexes:\n        -\n          IndexName: \"ByType\"\n          KeySchema:\n            -\n              AttributeName: \"GSIK\"\n              KeyType: \"HASH\"\n            -\n              AttributeName: \"Type\"\n              KeyType: \"RANGE\"\n          Projection:\n            ProjectionType: \"ALL\"\n          ProvisionedThroughput:\n            ReadCapacityUnits: \"2\"\n            WriteCapacityUnits: \"2\"\n        -\n          IndexName: \"ByData\"\n          KeySchema:\n            -\n              AttributeName: \"GSIK\"\n              KeyType: \"HASH\"\n            -\n              AttributeName: \"Data\"\n              KeyType: \"RANGE\"\n          Projection:\n            ProjectionType: \"ALL\"\n          ProvisionedThroughput:\n            ReadCapacityUnits: \"2\"\n            WriteCapacityUnits: \"2\"\n```\n\nOn the `scripts` folder you'll find scripts to implement this table on your AWS account. You can call them directly or using `yarn` or `npm` tasks:\n\n```\nyarn validate:stack // Validates the template.\nyarn delete:stack   // Deletes the current stack.\nyarn describe:stack // Describes the current stack status and info.\nyarn deploy:stack   // Deploys the stack to your configured AWS account.\n```\n\n## Getting Started\n\nInstall the library on your project using npm or yarn.\n\n```\n// NPM\nnpm install --save dynamodb-graph\n// YARN\nyarn install dynamodb-graph\n```\n\nThen you can import it to your project, and you must initialize it before you can start using it. Basically, you musth provide the DynamoDB DocumentClient driver, table name, tenant key, and `maxGSIK` value. The table name can also be taken from an environment variable called `TABLE_NAME`. I am considering letting other important options be configured the same way.\n\n```javascript\nvar AWS = require('aws-sdk');\nvar dynamodbGraph = require('dynamodb-graph');\n\nvar documentClient = new AWS.DynamoDB.DocumentClient();\nvar maxGSIK = 10;\nvar table = process.env.TABLE_NAME;\nvar tenant = 'Client#123';\n\nvar g = dynamodbGraph({ documentClient, maxGSIK, table, tenant });\n```\n\n## Playground\n\nTo be able to test the library I have provided some scripts that work on existing data. More specifically, [\"The Simpsons\" by the data](https://www.kaggle.com/wcukierski/the-simpsons-by-the-data). You can go to the link, and download it from [Kaggle](https://www.kaggle.com). Then `unzip` the files inside the `scripts` folder, and run the `seed_local_table.js` script. Then go dring a cup of coffee, eat a sandwich, and catch up on your current series, cause it's gonna take a long time to load. I did my best to show the progress of the upload so you know that something is at least going on.\n\nAfter all the data is up, you can run the script `playground.js` and see the library in action with some examples I come up with. More examples are welcomed.\n\nLastly, I left another script called `repl.js`, which contains the library, an instantiated `documentClient` driver, and some other useful functions to use on the node `repl`. Just open up a `node` console and run:\n\n```\nvar {g, documentClient, dynamo, log, scan} = require('./scripts/repl.js')\n```\n\nOr something like that.\n\n**Important note**: both scripts can be used against DynamoDB itself, though I wouldn't recommend to do so while testing the library. I won't take responsability for any charges generated on your account while using this library. Instead, you should run a local instance of DynamoDB.\n\nTo my knowledge, there are two alternatives:\n\n1. [Dynalite](https://github.com/mhart/dynalite), from [Michael Hart](https://github.com/mhart).\n2. [Official DynamoDB local version](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/DynamoDBLocal.html).\n\nAny one of those will work fine. Just be sure to run it on `port` **8989** or to set the `ENDPOINT` environment variable pointed to your local port when running all the scripts.\n\n## Documentation\n\n### Initialize the library\n\nTo initialie the library we must configure some global options.\n\n* `documentClient`: DynamoDB Document Client driver. You can configure it to point to a local DynamoDB process to avoid unneccesary charges while testing the library.\n* `maxGSIK`: Maximum `GSIK` value. Defaults to 10. This value let's you setup the ammount of partitions you believe would be enough to store your data. I recommend setting this value as a multiple of 10, to allow for a close to normal distribution of the keys. **You should never decrease this value, only increase it.**\n* `tenant`: Any string identifier you want to apply to the current tenant. This value will be applied to every Node, and will be taken out befor returning back the results of each operation. That way you don't have to deal with it.\n* `table`: Name of the DynamoDB table to store the data. Can be defined as an environment variable called `TABLE_NAME`.\n\n```javascript\nvar g = require('dynamodb-graph')({\n  documentClient, // DynamoDB DocumentClient driver.\n  maxGSIK: 10, // Max GSIK value. Multiples of 10 recommended.\n  tenant: 'Simpsons', // Tenant identifier. Defaults to ''.\n  table: TABLE_NAME // DynamoDB table name. Can be provided as env variable.\n});\n```\n\n### Create methods\n\n#### Create node\n\nWe can provide our own Node identifier, or let the library create a random CUID value. To create a new node, we call the `create` function passing the data to be stored on the node. The data must be a string, if it is not, it will throw an Error. If you want to store numbers, booleans, or any other kind of object, you must stringify it before saving it to the table.\n\n```javascript\nvar id = 'Character#2';\nvar type = 'Character';\nvar data = 'Homer Simpson';\n\ng\n  .node({ id, type })\n  .create({ data })\n  .then(result => {\n    console.log(result.Item);\n    /**\n     * {\n     *    Node: 'Character#2',\n     *    Type: 'Character',\n     *    Data: 'Homer Simpson',\n     *    GSIK: '9',\n     *    Target: 'Character#2'\n     * }\n     */\n  });\n```\n\nIf the Node `id` is not set when calling the `node()` method, then a random\n`cuid` will be configured on it. You can check this value by accessing the Node\n`id` property.\n\n```javascript\nvar type = 'Character';\nvar node = g.node({ type });\n\nconsole.log(node.id);\n// cjc1bicq30000aetcfkub88p7\n```\n\nRunning the `create` method on that node will create it with the random `cuid` selected as Node `id`.\n\n```javascript\nvar data = 'Homer Simpson';\nvar type = 'Character';\ng\n  .node({ type })\n  .create({ data })\n  .then(result => {\n    console.log(result.Item);\n    /**\n     * {\n     *    Node: 'cjc1bicq30000aetcfkub88p7',\n     *    Type: 'Character',\n     *    Data: 'Homer Simpson',\n     *    GSIK: '9',\n     *    Target: 'cjc1bicq30000aetcfkub88p7'\n     * }\n     */\n  });\n```\n\n#### Create edge\n\nHere we are connecting a character Node to an episode Node. To do that, we select the node and type where we want to store the edge, and then we call the `create` method, passing the `target` id and the data to be stored.\n\n```javascript\nvar id = 'Character#2';\nvar type = 'StarredIn#Episode#1';\nvar target = 'Episode#1';\nvar data = 'Bart the Genius';\n\ng\n  .node({ id, type })\n  .create({ target, data })\n  .then(result => {\n    console.log(result.Item);\n    /**\n     * {\n     *    Node: 'Character#2',\n     *    Type: 'StarredIn#Episode#1',\n     *    Data: 'Bart the Genius',\n     *    GSIK: '9',\n     *    Target: 'Episode#1'\n     * }\n     */\n  });\n```\n\n#### Create property\n\nA property is like an edge, but without a target. It allows to store additional information about the node, that will be stored on the same partitions, and which don't require the creation or existance of another node.\n\nTo create them we call the `create` function with the `prop` data to be stored.\n\n```javascript\nvar id = 'Character#2';\nvar type = 'Gender';\nvar prop = 'm';\n\ng\n  .node({ id, type })\n  .create({ prop })\n  .then(result => {\n    console.log(result.Item);\n    /**\n     * {\n     *    Node: 'Character#2',\n     *    Type: 'Gender',\n     *    Data: 'm',\n     *    GSIK: '9',\n     * }\n     */\n  });\n```\n\n### Get methods\n\n#### Get a single node, edge, or prop.\n\nUse the `get` method, after providing the Node `id` and `type` to the `node()` function.\n\n```javascript\nvar id = 'Character#2';\nvar type = 'Character';\n\ng\n  .node({ id, type })\n  .get()\n  .then(result => {\n    console.log(result.Item);\n    /**\n     * {\n     *    Node: 'Character#2',\n     *    Type: 'Character',\n     *    Data: 'Homer Simpson',\n     *    GSIK: '9',\n     *    Target: 'Character#2'\n     * }\n     */\n  });\n```\n\n#### Get a list of node items by type\n\nIf we pass in a list of `types` to the `get()` function, it will return all the items with those types on that `node`. If you set the `type` when calling the `node` function, it will be added to the list of item types to get.\n\n```javascript\nvar id = 'Character#2';\nvar type = 'Character';\n\ng\n  .node({ id, type })\n  .get(['StarredIn#Episode#1', 'Gender'])\n  .then(result => {\n    console.log(result.Items);\n    /**\n     * [{\n     *    Node: 'Character#2',\n     *    Type: 'Character',\n     *    Data: 'Homer Simpson',\n     *    GSIK: '9',\n     *    Target: 'Character#2'\n     * }, {\n     *    Node: 'Character#2',\n     *    Type: 'StarredIn#Episode#1',\n     *    Data: 'Bart the Genius',\n     *    GSIK: '9',\n     *    Target: 'Episode#1'\n     * }, {\n     *    Node: 'Character#2',\n     *    Type: 'Gender',\n     *    Data: 'm',\n     *    GSIK: '9',\n     * }]\n     */\n  });\n```\n\n#### Get all the node edges or all the node props.\n\nTo get all the Node edges or props, we use the `edges()` or `props()` method respectively, after providing the node `id`, to the `node` function.\n\n```javascript\nvar id = 'Character#2';\n\n// -- Edges --\ng\n  .node({ id })\n  .edges()\n  .then(result => {\n    console.log(result.Items);\n    /**\n     * [{\n     *    Node: 'Character#2',\n     *    Type: 'StarredIn#Episode#1',\n     *    Data: 'Bart the Genius',\n     *    GSIK: '9',\n     *    Target: 'Episode#1'\n     * }]\n     */\n  });\n// -- Props --\ng\n  .node({ id })\n  .props()\n  .then(result => {\n    console.log(result.Items);\n    /**\n     * [{\n     *    Node: 'Character#2',\n     *    Type: 'Gender',\n     *    Data: 'm',\n     *    GSIK: '9',\n     * }]\n     */\n  });\n```\n\nTake into account that the `type` value declared on the node is not necessary and won't be taken into consideration when the `get` function is called.\n\nBoth functions allow to set a limit on how much items you want. Just set the `limit` configuration value to some number.\n\n```javascript\nvar id = 'Character#2';\n\ng\n  .node({ id })\n  .edges({ limit: 1 }) // Also applies to `prop()`.\n  .then(result => {\n    console.log(result.Items);\n    /**\n     * [{\n     *    Node: 'Character#2',\n     *    Type: 'StarredIn#Episode#1',\n     *    Data: 'Bart the Genius',\n     *    GSIK: '9',\n     *    Target: 'Episode#1'\n     * }]\n     */\n  });\n```\n\nIf the Node has more edges or props that were not returned but matched the current query, then the `Offset` parameter is returned. This value points to the last element evaluated while performing the query, and can be used in subsequent queries as its starting point. Use the `offset` attribute for this purpose.\n\n```javascript\nvar id = 'Character#2';\nvar type = 'Character';\nvar offset = 'Q2hhcmFjdGVy';\n\ng\n  .node({ id })\n  .edges({ offset }) // Also applies to `prop()`.\n  .then(result => {\n    console.log(result.Items);\n    /**\n     * [{\n     *    Node: 'Character#2',\n     *    Type: 'SpokeLine#269#Episode#32',\n     *    Data: 'Oh.',\n     *    GSIK: '9',\n     *    Target: 'Line#9609'\n     * }]\n     */\n    console.log(result.Offset);\n    // U3Bva2VMaW5lIzI2OSNFcGlzb2RlIzMy\n    console.log(result.LastEvaluatedKey);\n    /**\n     * {\n     *    Node: 'Character#2',\n     *    Type: 'SpokeLine#269#Episode#32',\n     * }\n     */\n  });\n```\n\n### Query methods\n\n#### Query items by `Node`, sorted by `Type`\n\n[DynamoDB Expression Operators and Functions](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Expressions.OperatorsAndFunctions.html)\n\nWe can query over the `prop` and `edge` types of a Node using the `query()` method. As before, we provide the Node `id` to the `node` function, and then\nwe call `query()` over its result, providing a `where` and `and` condition objects.\n\nTo construct a condition object, we provide just one key to the `where` or `and` object called either `type` or `data`. Inside this key, we store another object, again with just one key, corresponding to a valid [DynamoDB Key Condition operator](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Query.html). The value of this key will be used for the comparison operation. For most of them, the value should be just a string, except the: `size` operator which takes a number; the `BETWEEN` operator which takes an array of two strings; and for the `IN` operator, an array with up to 100 strings.\n\n```javascript\nvar id = 'Character#2';\n\ng\n  .node({ id })\n  .query({ where: { type: { begins_with: 'Line' } } })\n  .then(result => {\n    console.log(result.Items);\n    /**\n     * [{\n     *    Node: 'Character#2',\n     *    Type: 'Line#265#Episode#32',\n     *    Data: 'Bart didn't get one vote?! Oh, this is...'\n     *    GSIK: '9'\n     *    Target: 'Line#9605'\n     * }, {\n     *    Node: 'Character#2',\n     *    Type: 'Line#114#Episode#33',\n     *    Data: 'Marge! What are you doing?...'\n     *    GSIK: '9'\n     *    Target: 'Line#9769'\n     * }]\n     */\n  });\n```\n\nAs mentioned before, we can add a filter condition to the query using the `filter` condition object, which should be constructed just as the `where` object. Note that this aditional condition will be applied as a `FilterExpression`, which means, that the condition will be applied after all the items that match the condition on the `where` condition object returns.\n\n```javascript\nvar id = 'Character#2';\nvar operator = 'begins_with';\nvar value = 'Line';\nvar name = 'Bart';\n\ng\n  .node({ id })\n  .query({\n    where: { type: { [operator]: value } },\n    filter: { data: { [operator]: name } }\n  })\n  .then(result => {\n    console.log(result.Items);\n    /**\n     * [{\n     *    Node: 'Character#2',\n     *    Type: 'Line#265#Episode#32',\n     *    Data: 'Bart didn't get one vote?! Oh, this is...'\n     *    GSIK: '9'\n     *    Target: 'Line#9605'\n     * }]\n     */\n  });\n```\n\nIf you invert the `data` and `type` keys on the `where` and `filter` objects, it will apply first the condition on the `type` and then on the `data`. This is because the data is indexed by `type` on the table.\n\n```javascript\nvar id = 'Character#2';\nvar operator = 'begins_with';\nvar value = 'Line';\nvar name = 'Bart';\n\ng\n  .node({ id })\n  .query({\n    where: { data: { [operator]: name } },\n    and: { type: { [operator]: value } }\n  })\n  .then(result => {\n    console.log(result.Items); // Same result as before.\n    /**\n     * [{\n     *    Node: 'Character#2',\n     *    Type: 'Line#265#Episode#32',\n     *    Data: 'Bart didn't get one vote?! Oh, this is...'\n     *    GSIK: '9'\n     *    Target: 'Line#9605'\n     * }]\n     */\n  });\n```\n\nIf you only include a `where` condition object applied to the `data` attribute, the query will be run against all the items of the Node. This could be a very inefficient query if your Node has a lot of items connected to it, and you only need a few of them.\n\n```javascript\nvar id = 'Character#2';\nvar operator = 'begins_with';\nvar name = 'Bart';\n\ng\n  .node({ id })\n  .query({\n    where: { data: { [operator]: name } }\n  })\n  .then(result => {\n    console.log(result.Items);\n    /**\n     * [{\n     *    Node: 'Character#2',\n     *    Type: 'Line#265#Episode#32',\n     *    Data: 'Bart didn't get one vote?! Oh, this is...'\n     *    GSIK: '9'\n     *    Target: 'Line#9605'\n     * }]\n     */\n    console.log(result.ScannedCount);\n    // This will equal to all the items connected to the Node 'Character#2'\n    // which could be a very big number.\n  });\n```\n\nOn a positive note, `filter` conditions can use more operators. These are:\n\n* `IN`: True if the `data` of the Node is included on the `value` list.\n* `contains`: True if the `data` contains a substring equal to the `value`.\n* `size`: True if the `data` has a length equal to the `value`.\n\nIf you check DynamoDB documentation you'll note that you can use other comparators when working with the `size` function. To make things simpler for myself, I only included the equality for now. I plan to correct this in further versions.\n\nLogical evaluations can also be used up two one level, using an `and`, `or`, or `not` key, with a condition object. _On a future version, I plan to allow more than just one level of logical evaluations._\n\n```javascript\nvar id = 'Character#2';\n\ng\n  .node({ id })\n  .query({\n    where: { type: { begins_with: 'Line' } },\n    filter: {\n      data: {\n        begins_with: 'Bart',\n        and: { size: 25 }\n      }\n    }\n  })\n  .then(result => {\n    console.log(result.Items);\n    /**\n     * [{\n     *    Node: 'Character#2',\n     *    Type: 'Line#166#Episode#99',\n     *    Data: 'Bart, you're coming home.'\n     *    GSIK: '9'\n     *    Target: 'Line#29206'\n     * }]\n     */\n  });\n```\n\nAs with the `edges()` and `props()` functions, you can provide a `limit` and an `offset` value. They will work exactly the same as with those other methods. The `Offset` value returned is just the base64 encoded type. To reconstruct it into a DynamoDB key, we just need the node `id`. If you don't want to work with encoded strings, you can just pass to the `offset` attribute an entire DynamoDB key, like the one returned in the `LastEvaluatedKey` value.\n\n```javascript\nvar node = g.node({id});\nnode.query({\n  where: { type: { begins_with: 'Line' } }\n  limit: 1,\n})\n.then(result => {\n  console.log(result.Items);\n  /**\n   * [{\n   *    Node: 'Character#2',\n   *    Type: 'Line#265#Episode#32',\n   *    Data: 'Bart didn't get one vote?! Oh, this is...'\n   *    GSIK: '9'\n   *    Target: 'Line#9605'\n   * }]\n   */\n  console.log(result.Offset);\n  // TGluZSMyNjUjRXBpc29kZSMzMg==\n  console.log(result.LastEvaluatedKey);\n  /**\n   * {\n   *    Node: 'Character#2',\n   *    Type: 'Line#265#Episode#32',\n   * }\n   */\n  return node.query({\n    where: { type: { begins_with: 'Line' } }\n    limit: 1,\n    offset: result.Offset\n  })\n})\n.then(result => {\n  console.log(result.Items);\n  /**\n   * [{\n   *    Node: 'Character#2',\n   *    Type: 'Line#114#Episode#33',\n   *    Data: 'Marge! What are you doing?...'\n   *    GSIK: '9'\n   *    Target: 'Line#9769'\n   * }]\n   */\n});\n```\n\nDynamoDB `LastEvaluatedKey` will also be returned on the `result` object, and can also be used on the `offset` attribute. The reason why I also provide the `Offset` value is explained further ahead.\n\n#### Handling numbers\n\nDynamoDB requires that all the attributes that will be indexed, be explicityly defined as: `string`, `number`, or `binary`. For our purposes, storing the data as strings gives us the chance to store any kind of data that can be stringified. How we do this will affect our ability to query the `data` later.\n\nStoring numbers is a great example. They can be easily stored as their string representations: `4` as `'4'`. The problem with this approach is that all the numeric query operators will become useless. Querying using comparators with numbers stored this way may lead to weird situations, like: `'10' < '9.99' // true`.\n\nA better way to store numbers is as hexadecimal strings. JavaScript uses 64 bit double-precision floating point binary strings to represent numbers, following the [IEEE 754 standar](https://en.wikipedia.org/wiki/IEEE_754).\n\nBasically, a number is stored the following way:\n\n* 1 `sign` bit.\n* 11 `exponent` bits.\n* 52 `significant precision` bits.\n\n![Binary64 representation](https://upload.wikimedia.org/wikipedia/commons/a/a9/IEEE_754_Double_Floating_Point_Format.svg)\n\nConverting JavaScript numbers to their 8 byte hexadecimal string representation will allow us to:\n\n* Save numbers as strings without losing precision.\n* Allow us to use comparator operators when running queries.\n\nUnfortunately, the last point is not entirely true. You can use comparator operators, only if all the numbers stored are positive. Because of the way negative numbers are represented, they will always be bigger than positive ones. Also, comparing two negative numbers will work exactly the same, meaning:\n`-1 < -2`.\n\nI have some ideas of how I might solve this, so some version in the future might not have this issue.\n\nNow, since most of the use cases can work without using negative numbers, I decided to include this solutions to the library. So if you are only storing positive values on the `Data` attribute, you can run any number of queries and they will work. You don't have to make the conversion yourself, the library takes care of that. Every number corresponding to the `Data`, on the `query` or on the `response`, will be converted to and from its hexadecimal representation.\n\nThis means that the number `1` will be stored as `0x3ff0000000000000`. Notice the `0x` prefix. It indicates to the library that the strings corresponds to a number. So, if you want to store text that begins with this prefix, you are going to have to modify it. Else, you might receive a corrupted version of your data.\n\nYou may found the library that makes converts the number here:\n\n[https://www.npmjs.com/package/hex-2-num](https://www.npmjs.com/package/hex-2-num)\n\n```javascript\ng\n  .query({\n    where: { type: { '=': 'imdb_rating' } },\n    filter: { data: { '>': 9.2 } }\n  })\n  .then(result => {\n    console.log(result.Items);\n    /**\n     * [{\n     *    Node: 'Episode#186',\n     *    Type: 'imdb_rating',\n     *    Data: 9.3\n     *    GSIK: '9'\n     * }]\n     */\n  });\n```\n\n#### Query items by GSIK, sorted By Type\n\nTo query the Node `types`, regardless of the Node `id`, we can leverage the `GSIK` indexes. By default, the queries will be run over every `GSIK` value, and will return a maximum of 100 items each.\n\nNow, instead of using the `node` function we use the `query` function, with a `where` and a `filter` condition object. The `where` condition object will define which index to use (`ByType` or `ByData`). Which means, that the operators allowed on the `where` condition **don't** include: `IN`, `contains`, `size`, and logical expressions. They are only allowed on the `filter` condition. So make sure you select the best index for your query.\n\n```javascript\ng.query({ where: { type: { '=': 'Character' } } }).then(result => {\n  console.log(result.Items);\n  /**\n   * [{\n   *    Node: 'Character#2',\n   *    Type: 'Character',\n   *    Data: 'Homer Simpson'\n   *    GSIK: '9'\n   *    Target: 'Character#2'\n   * }, {\n   *    Node: 'Character#8',\n   *    Type: 'Character',\n   *    Data: 'Bart Simpson'\n   *    GSIK: '5'\n   *    Target: 'Character#8'\n   * }]\n   */\n});\n```\n\nAs before, the results can be filtered further by using a `filter` condition object whith the `data` or `type` key present. This will build a `FilterCondition` expression, which will discard any item that doesn't match the condition, **after** the query operation is done.\n\n```javascript\ng\n  .query({\n    where: { type: { '=': 'Gender' } },\n    filter: { data: { '=': 'm' } }\n  })\n  .then(result => {\n    console.log(result.Items);\n    /**\n     * [{\n     *    Node: 'Character#2',\n     *    Type: 'Gender',\n     *    Data: 'm'\n     *    GSIK: '9'\n     * }, {\n     *    Node: 'Character#8',\n     *    Type: 'Gender',\n     *    Data: 'm'\n     *    GSIK: '5'\n     * }]\n     */\n  });\n```\n\nTo use the index `ByData` we use the `data` key on the `where` object instead of the `type`.\n\n```javascript\ng\n  .query({\n    where: { data: { '=': 'm' } },\n    filter: { type: { '=': 'Gender' } }\n  })\n  .then(result => {\n    console.log(result.Items);\n    /**\n     * [{\n     *    Node: 'Character#2',\n     *    Type: 'Gender',\n     *    Data: 'm'\n     *    GSIK: '9'\n     * }, {\n     *    Node: 'Character#8',\n     *    Type: 'Gender',\n     *    Data: 'm'\n     *    GSIK: '5'\n     * }]\n     */\n  });\n```\n\nLooking at the last two examples you can see that, even though they return the same information, the first one is a much better option for this usecase. The scanned items on the second example could be much higher than the ones on the first one.\n\n#### GSIK handling\n\nIn order to control the `GSIK` being queried, you can provide a `gsik` object. This object must contain some of these keys:\n\n* `startGSIK`: Start value of the `GSIK`. Equals 0 by default.\n* `endGSIK`: End value of the `GSIK`. Equals `maxGSIK - 1` by default. **Must be larger than `startGSIK`**.\n* `listGSIK`: A list of GSIK to use, provided as a list of numbers. Only the GSIK provided on the list will be queried. If `startGSIK` or `endGSIK` are also defined, they will not be considered.\n\n```javascript\nvar listGSIK = [9];\nvar limit = 1;\n\ng\n  .query({\n    where: { type: { '=': 'Character' } },\n    gsik: { listGSIK }\n    limit\n  })\n  .then(result => {\n    console.log(result.Items);\n    /**\n     * [{\n     *    Node: 'Character#2',\n     *    Type: 'Character',\n     *    Data: 'Homer Simpson'\n     *    GSIK: '9'\n     *    Target: 'Character#2'\n     * }]\n     */\n  });\n```\n\n#### Handling offset values\n\nA query by default will only return up too 100 items per GSIK. You can modify this behaviour by changing the `limit` value. None of this means that you'll actually receive the ammount of items you asked for. This is just the behaviour of DynamoDB. If the size of the query is to big, or there aren't enough items on a GSIK, you'll receive a lower count of items. Given this, you can't control how many items will be received after a query (at least no with this version of the library). If you use a `CUID` or `UUID` generator function for the Node `id` value, then you'll probably get the same ammount of items per GSIK, so you can predict how many items will be returned in total.\n\nDynamoDB uses a `LastEvaluatedKey` value to handle offsets on a query. Whenever this key is returned by DynamoDB, it means that there are more items that match the query, but where not returned. Doing the same query using this value will return the remaing items, or a subset of them and another `LastEvaluatedKey` value.\n\nOn each call to the query function, you'll receive two of three different attributes you can use to handle the offset of subsequential queries. These are:\n\n* `LastEvaluatedKey`: Only returned when running a query against a known Node.\n* `LastEvaluatedKeys`: A map of `GSIK` to `LastEvaluatedKey's` scanned on each.\n* `Offset`: A base64 encoded string containing just the needed information to reconstruct the `LastEvaluatedKeys` object.\n\nUsing the `Offset` value allows for easier paging, since you only care about one value. Also, JSON objects are quite verbose, a simplified base64 encoded string can be much smaller than a stringified JSON object. This is particularly usefull if you must use this value from the frontend through an API.\n\nTo paginate the query, you can use (or construct) this results and apply them to the `offset` attribute. The library will make sure to transform it into something that DynamoDB can understand.\n\nIf you want to construct your own `GSIK` to `LastEvaluatedKey` map, you don't have to include every `GSIK` you plan to query. The ones that are not defined will just be queried from the beginning.\n\n```javascript\nvar listGSIK = [9];\nvar limit = 1;\n\ng\n  .query({\n    where: { type: { '=': 'Character' } },\n    gsik: { listGSIK }\n    limit\n  })\n  .then(result => {\n    console.log(result.LastEvaluatedKeys);\n    /**\n     * {\n     *    '9': {\n     *      Node: 'Character#2',\n     *      Type: 'Character',\n     *      GSIK: '9'\n     *    }\n     * }\n     */\n    console.log(result.Offset);\n    // OSxDaGFyYWN0ZXIjMixDaGFyYWN0ZXI\n    console.log(JSON.stringify(result.LastEvaluatedKeys));\n    // eyJOb2RlIjoiQ2hhcmFjdGVyIzIiLCJUeXBlIjoiQ2hhcmFjdGVyIiwiR1NJSyI6IjkifQ==\n    return Promise.all(\n      g.query({\n        where: { type: { '=': 'Character' } },\n        gsik: { listGSIK },\n        limit\n        offset: result.LastEvaluatedKeys\n      }),\n      g.query({\n        where: { type: { '=': 'Character' } },\n        gsik: { listGSIK },\n        limit\n        offset: result.Offset\n      })]\n  })\n  .then(results => {\n    // Both queries work exactly the same.\n    console.log(results[0].Items[0].Node === results[0].Items[1].Node);\n    // true\n  })\n```\n\nOn the example using the `Offset` value doesn't look like and advantage, but it can make a huge difference if you are querying over 10 `GSIK` or more.\n\n**You could also store the offset value on another Node, to query later when you need to paginate the results.**\n\n### Update method\n\nTo update a node value you just overwrite it with a new node with the same Node `id` and `type`.\n\n```javascript\nvar id = 'Character#2';\nvar type = 'Character';\nvar data = 'homer simpson';\n\nvar Node = g.node({ id, type });\n\nNode.create({ data })\n  .then(result => {\n    console.log(result.Item);\n    /**\n     * {\n     *    Node: 'Character#2',\n     *    Type: 'Character',\n     *    Data: 'homer simpson',\n     *    GSIK: '9',\n     *    Target: 'Character#2'\n     * }\n     */\n    return Node.create({ data: 'Homer Simpson' });\n  })\n  .then(result => {\n    console.log(result.Item);\n    /**\n     * {\n     *    Node: 'Character#2',\n     *    Type: 'Character',\n     *    Data: 'Homer Simpson',\n     *    GSIK: '9',\n     *    Target: 'Character#2'\n     * }\n     */\n    return Node.create({ data: 'Homer Simpson' });\n  });\n```\n\n### Destroy method\n\nThe interface to destroy a node is very similar to how you get one. If you want to destroy an item, you select it with the `node` function, and then call the `destroy` method on it.\n\n```javascript\nvar id = 'Character#2';\nvar type = 'Character';\n\ng\n  .node({ id, type })\n  .destroy()\n  .then(result => {\n    console.log(result);\n    // {}\n  });\n```\n\n#### JSDoc Comments\n\nI tried to include information on each function as a JSDoc comment. I plan in the future to transform it into a proper documentation site. I wish there was something like `Sphix` for JavaScript but for now it should be enough.\n\n## Test\n\nI am using `jest` and `yarn` to test the library, and Node **6.10.3**. So, just clone the repo, install the dependencies with `yarn install`, and run `yarn test` to start them.\n\n```\ngit clone git@github.com:guzmonne/dynamodb-graph.git\n\nyarn install\n\nyarn test\n```\n\n## Contributions\n\nMore than welcomed.\n\n## Licence\n\nMIT\n","maintainers":[{"name":"guzmonne","email":"guzmonne@hotmail.com"}],"time":{"modified":"2022-06-16T02:46:01.164Z","created":"2017-12-16T16:15:42.313Z","1.0.0":"2017-12-16T16:15:42.313Z","1.0.2":"2017-12-16T16:17:01.116Z","1.0.3":"2017-12-16T21:37:53.566Z","1.0.4":"2017-12-16T21:45:47.840Z","1.0.5":"2017-12-16T23:19:42.515Z","1.0.6":"2017-12-17T00:53:07.330Z","1.0.7":"2017-12-17T00:56:17.558Z","1.0.8":"2017-12-17T01:08:34.423Z","1.0.9":"2017-12-17T02:14:08.816Z","1.0.10":"2017-12-17T19:57:03.558Z","1.0.11":"2017-12-17T20:20:57.552Z","1.0.12":"2017-12-17T21:39:04.532Z","1.1.0":"2017-12-19T17:21:24.122Z","1.2.0":"2017-12-19T20:53:48.187Z","1.3.0":"2017-12-20T13:09:33.103Z","1.3.1":"2017-12-20T14:49:42.109Z","1.4.0":"2017-12-20T23:36:07.470Z","1.5.0":"2017-12-23T00:41:58.816Z","1.6.0":"2017-12-23T02:01:50.725Z","1.6.1":"2017-12-23T03:09:48.147Z","1.6.2":"2017-12-23T03:21:06.943Z","1.6.3":"2017-12-23T03:25:16.831Z","1.7.0":"2017-12-23T20:52:29.956Z","1.7.1":"2017-12-23T23:17:07.872Z","1.7.2":"2017-12-24T15:47:18.906Z","1.7.3":"2017-12-24T19:20:42.184Z","1.7.4":"2017-12-24T20:00:51.269Z","1.7.5":"2017-12-26T15:52:05.299Z","2.0.0":"2017-12-27T01:29:33.558Z","2.0.1":"2017-12-27T03:06:27.937Z","3.0.0":"2018-01-03T21:12:39.019Z","4.0.0":"2018-01-09T20:26:22.179Z","4.1.0":"2018-01-12T19:36:44.391Z","4.1.1":"2018-01-13T14:30:58.276Z"},"repository":{"github":"git@github.com:guzmonne/dynamodb-graph.git"},"license":"MIT","readmeFilename":"README.md"}