{"_id":"dynameh","_rev":"43-247bc85ef29419c7f4b60cb4fd1aa3cf","name":"dynameh","description":"DynamoDB on Node more easier","dist-tags":{"latest":"4.5.1","beta":"4.0.0-beta.5"},"versions":{"2.2.1":{"name":"dynameh","version":"2.2.1","description":"DynamoDB utils.","main":"dist/index.js","types":"dist/index.d.ts","files":["dist/"],"scripts":{"build":"tsc","clean":"rimraf ./dist","lint":"tslint --project tsconfig.json","test":"mocha --recursive --throw-deprecation --require ts-node/register \"src/**/*.test.ts\""},"repository":{"type":"git","url":"git+https://github.com/Giftbit/dynameh.git"},"keywords":["aws","dynamodb"],"contributors":[{"name":"Jeffery Grajkowski","email":"pushplay@gmail.com","url":"https://github.com/pushplay/"},{"name":"Graham Baradoy","email":"graham@giftbit.com","url":"https://github.com/Baradoy/"}],"license":"MIT","bugs":{"url":"https://github.com/Giftbit/dynameh/issues"},"homepage":"https://github.com/Giftbit/dynameh#readme","dependencies":{},"devDependencies":{"@types/chai":"^3.4.35","@types/mocha":"^2.2.39","@types/node":"^7.0.5","chai":"^3.5.0","mocha":"^3.2.0","rimraf":"^2.6.1","ts-node":"^3.0.2","tslint":"^4.5.1","typescript":"^2.2.1"},"peerDependencies":{"aws-sdk":"^2.7.15"},"gitHead":"b9a03dab5182865d962a3a3c642ab45477d30384","_id":"dynameh@2.2.1","_shasum":"7fe60bf90fb19c09ab099d0f7a49e99af0c56f34","_from":".","_npmVersion":"2.15.9","_nodeVersion":"7.3.0","_npmUser":{"name":"pushplay","email":"pushplay@gmail.com"},"dist":{"shasum":"7fe60bf90fb19c09ab099d0f7a49e99af0c56f34","tarball":"https://registry.npmjs.org/dynameh/-/dynameh-2.2.1.tgz","integrity":"sha512-cKSsfLG6bi6ryjA44luaB43HXcvXd+V276L/ETZMiqqMtDwuSj3r04oWQ+bSb7hYwqnfGEFT+/4cfs7XD6ZrYA==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCApcoHQwTLfM6CZIpsaeRXh8UZ5oaknP5Uy0jfa2FgbgIgaEyMjfoOSY/FATHny3HXCWRsvt1xEZ6AbB4EaIpmT1E="}]},"maintainers":[{"name":"pushplay","email":"pushplay@gmail.com"}],"_npmOperationalInternal":{"host":"packages-18-east.internal.npmjs.com","tmp":"tmp/dynameh-2.2.1.tgz_1490227392065_0.6118014995008707"},"directories":{}},"2.2.2":{"name":"dynameh","version":"2.2.2","description":"DynamoDB on Node more easier","main":"dist/index.js","types":"dist/index.d.ts","files":["dist/"],"scripts":{"build":"tsc","clean":"rimraf ./dist","docs":"rimraf docs && typedoc src/ --out docs --mode modules --target es6 --excludePrivate --theme minimal","lint":"tslint --project tsconfig.json","prepublish":"npm run clean && npm run build && npm run lint && npm run test && npm run docs","test":"mocha --recursive --throw-deprecation --require ts-node/register \"src/**/*.test.ts\""},"repository":{"type":"git","url":"git+https://github.com/Giftbit/dynameh.git"},"keywords":["dynamodb"],"contributors":[{"name":"Jeffery Grajkowski","email":"pushplay@gmail.com","url":"https://github.com/pushplay/"},{"name":"Graham Baradoy","email":"graham@giftbit.com","url":"https://github.com/Baradoy/"}],"license":"MIT","bugs":{"url":"https://github.com/Giftbit/dynameh/issues"},"homepage":"https://github.com/Giftbit/dynameh#readme","dependencies":{},"devDependencies":{"@types/chai":"^3.4.35","@types/mocha":"^2.2.39","@types/node":"^7.0.5","chai":"^3.5.0","mocha":"^3.2.0","rimraf":"^2.6.1","ts-node":"^3.0.2","tslint":"^4.5.1","typedoc":"^0.5.9","typescript":"^2.2.1"},"peerDependencies":{"aws-sdk":"^2.7.15"},"gitHead":"5c9c56a8e98914fa182939c0a06b088cdd444a4e","_id":"dynameh@2.2.2","_shasum":"f485b52047f3f7379b7f01e96e73dee0e3b39551","_from":".","_npmVersion":"2.15.9","_nodeVersion":"7.3.0","_npmUser":{"name":"pushplay","email":"pushplay@gmail.com"},"dist":{"shasum":"f485b52047f3f7379b7f01e96e73dee0e3b39551","tarball":"https://registry.npmjs.org/dynameh/-/dynameh-2.2.2.tgz","integrity":"sha512-4hC1GghLH3jepk39EGOmVUDPiRk5Z26GAtIDYs2RDUZKGzONjUyYehuab1vM8BFZ8nhXm6dNHkdWOWTE6UYlVA==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIH0uqOa3urqYkchbgV/6dw/1ThNXeM48WsKaR9d3s6z3AiEAs2THBuaJJTvIYvqtvqO5Fn0aUeU56uAVsAmsF3EplV4="}]},"maintainers":[{"name":"pushplay","email":"pushplay@gmail.com"}],"_npmOperationalInternal":{"host":"packages-12-west.internal.npmjs.com","tmp":"tmp/dynameh-2.2.2.tgz_1490297653861_0.9105460313148797"},"directories":{}},"2.3.0":{"name":"dynameh","version":"2.3.0","description":"DynamoDB on Node more easier","main":"dist/index.js","types":"dist/index.d.ts","files":["dist/"],"scripts":{"build":"tsc","clean":"rimraf ./dist","docs":"rimraf docs && typedoc src/ --out docs --mode modules --target es6 --excludePrivate --theme minimal","lint":"tslint --project tsconfig.json","prepublish":"npm run clean && npm run build && npm run lint && npm run test && npm run docs","test":"mocha --recursive --throw-deprecation --require ts-node/register \"src/**/*.test.ts\""},"repository":{"type":"git","url":"git+https://github.com/Giftbit/dynameh.git"},"keywords":["dynamodb"],"contributors":[{"name":"Jeffery Grajkowski","email":"pushplay@gmail.com","url":"https://github.com/pushplay/"},{"name":"Graham Baradoy","email":"graham@giftbit.com","url":"https://github.com/Baradoy/"}],"license":"MIT","bugs":{"url":"https://github.com/Giftbit/dynameh/issues"},"homepage":"https://github.com/Giftbit/dynameh#readme","dependencies":{},"devDependencies":{"@types/chai":"^3.4.35","@types/mocha":"^2.2.39","@types/node":"^7.0.5","chai":"^3.5.0","mocha":"^3.2.0","rimraf":"^2.6.1","ts-node":"^3.0.2","tslint":"^4.5.1","typedoc":"^0.5.9","typescript":"^2.2.1"},"peerDependencies":{"aws-sdk":"^2.7.15"},"gitHead":"5c9c56a8e98914fa182939c0a06b088cdd444a4e","_id":"dynameh@2.3.0","_shasum":"d8611768dbb15926d01e8b3b6f9ff2890627e4ca","_from":".","_npmVersion":"2.15.9","_nodeVersion":"7.3.0","_npmUser":{"name":"pushplay","email":"pushplay@gmail.com"},"dist":{"shasum":"d8611768dbb15926d01e8b3b6f9ff2890627e4ca","tarball":"https://registry.npmjs.org/dynameh/-/dynameh-2.3.0.tgz","integrity":"sha512-28QDB3VbHg52eEr4rXBCvp42G+aqmN6jp4T88UD4+Sxo+SRKL9tb/Zm0m4oFtDCSBNGLabA6c0ZfzZakmZg3bQ==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIDfEIAptO1jVjE+xZsM82rwmi25xwvbEcsJU+0C/Xk4gAiBvDFWpqkoJ6ytmgehex8T/TYeslmiZho7uNCG/tHn2XQ=="}]},"maintainers":[{"name":"pushplay","email":"pushplay@gmail.com"}],"_npmOperationalInternal":{"host":"packages-12-west.internal.npmjs.com","tmp":"tmp/dynameh-2.3.0.tgz_1490312320113_0.6177616966888309"},"directories":{}},"2.4.0":{"name":"dynameh","version":"2.4.0","description":"DynamoDB on Node more easier","main":"dist/index.js","types":"dist/index.d.ts","files":["dist/"],"scripts":{"build":"tsc","clean":"rimraf ./dist","docs":"rimraf ./docs && typedoc src/ --out docs --mode modules --module commonjs --target es6 --excludePrivate --name Dynameh && touch ./docs/.nojekyll && gh-pages -d docs -t","lint":"tslint --project tsconfig.json","prepublish":"npm run clean && npm run build && npm run lint && npm run test && npm run docs","test":"mocha --recursive --throw-deprecation --require ts-node/register \"src/**/*.test.ts\""},"repository":{"type":"git","url":"git+https://github.com/Giftbit/dynameh.git"},"keywords":["dynamodb"],"contributors":[{"name":"Jeffery Grajkowski","email":"pushplay@gmail.com","url":"https://github.com/pushplay/"},{"name":"Graham Baradoy","email":"graham@giftbit.com","url":"https://github.com/Baradoy/"}],"license":"MIT","bugs":{"url":"https://github.com/Giftbit/dynameh/issues"},"homepage":"https://github.com/Giftbit/dynameh#readme","dependencies":{},"devDependencies":{"@types/chai":"^3.4.35","@types/mocha":"^2.2.39","@types/node":"^7.0.5","chai":"^3.5.0","gh-pages":"^0.12.0","mocha":"^3.2.0","rimraf":"^2.6.1","touch":"^1.0.0","ts-node":"^3.0.2","tslint":"^4.5.1","typedoc":"^0.5.9","typescript":"^2.2.1"},"peerDependencies":{"aws-sdk":"^2.7.15"},"gitHead":"99c47781460584b7e7986f83c1c90d67a847910d","_id":"dynameh@2.4.0","_shasum":"5f6435fa20466751538db48b9972797c7a901094","_from":".","_npmVersion":"2.15.9","_nodeVersion":"7.3.0","_npmUser":{"name":"pushplay","email":"pushplay@gmail.com"},"dist":{"shasum":"5f6435fa20466751538db48b9972797c7a901094","tarball":"https://registry.npmjs.org/dynameh/-/dynameh-2.4.0.tgz","integrity":"sha512-k1bqx0iCcHQWvla33Lvi9q47w/iQ7v/q4Ku5W9ddFW+fgaz5k6R2BkzPhgcpo84TRqJOB5IQF/2z+2X5574zag==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCID4kdKk9fuhozyV5lpcbudM04fr6n7VayTrNO3ITXmz4AiB8k6DdsDC1811S5XYL7718RTn3qrvusGu/V+Oi8E6rNA=="}]},"maintainers":[{"name":"pushplay","email":"pushplay@gmail.com"}],"_npmOperationalInternal":{"host":"packages-12-west.internal.npmjs.com","tmp":"tmp/dynameh-2.4.0.tgz_1490905648418_0.10875479225069284"},"directories":{}},"2.5.0":{"name":"dynameh","version":"2.5.0","description":"DynamoDB on Node more easier","main":"dist/index.js","types":"dist/index.d.ts","files":["dist/"],"scripts":{"build":"tsc","clean":"rimraf ./dist","docs":"rimraf ./docs && typedoc src/ --out docs --mode modules --module commonjs --target es6 --excludePrivate --name Dynameh && touch ./docs/.nojekyll && gh-pages -d docs -t","lint":"tslint --project tsconfig.json","prepublish":"npm run clean && npm run build && npm run lint && npm run test && npm run docs","test":"mocha --recursive --throw-deprecation --require ts-node/register \"src/**/*.test.ts\""},"repository":{"type":"git","url":"git+https://github.com/Giftbit/dynameh.git"},"keywords":["dynamodb"],"contributors":[{"name":"Jeffery Grajkowski","email":"pushplay@gmail.com","url":"https://github.com/pushplay/"},{"name":"Graham Baradoy","email":"graham@giftbit.com","url":"https://github.com/Baradoy/"}],"license":"MIT","bugs":{"url":"https://github.com/Giftbit/dynameh/issues"},"homepage":"https://github.com/Giftbit/dynameh#readme","dependencies":{},"devDependencies":{"@types/chai":"^3.5.2","@types/mocha":"^2.2.41","@types/node":"^7.0.18","chai":"^3.5.0","gh-pages":"^1.0.0","mocha":"^3.3.0","rimraf":"^2.6.1","touch":"^1.0.0","ts-node":"^3.0.4","tslint":"^5.2.0","typedoc":"^0.6.0","typescript":"^2.3.2"},"peerDependencies":{"aws-sdk":"^2.49.0"},"gitHead":"62cf85c0de08242ca5f6b2b5b7e45ee213706d86","_id":"dynameh@2.5.0","_shasum":"8bf94a16fb19d5c9ca070a8c80d5f7c9405566b1","_from":".","_npmVersion":"4.2.0","_nodeVersion":"7.10.0","_npmUser":{"name":"pushplay","email":"pushplay@gmail.com"},"dist":{"shasum":"8bf94a16fb19d5c9ca070a8c80d5f7c9405566b1","tarball":"https://registry.npmjs.org/dynameh/-/dynameh-2.5.0.tgz","integrity":"sha512-QzTIpLjNxcbDyyk9D/xNDxZqM4gtKepabsnLL2o9oSIgQGjcBs+6b8H7DkpoAim4Un/SGmgvO/wtiKI+7PZfug==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIArp96pSPXKlAufAvZ5UfpgFl8o+mqw0v6P5cAnNIk1cAiBIwQrLBtOq7ApTTFXatd4F2Qiwub9g9Gcg0/tRd67vbg=="}]},"maintainers":[{"name":"pushplay","email":"pushplay@gmail.com"}],"_npmOperationalInternal":{"host":"packages-12-west.internal.npmjs.com","tmp":"tmp/dynameh-2.5.0.tgz_1494437026400_0.5856663407757878"},"directories":{}},"2.5.1":{"name":"dynameh","version":"2.5.1","description":"DynamoDB on Node more easier","main":"dist/index.js","types":"dist/index.d.ts","files":["dist/"],"scripts":{"build":"tsc","clean":"rimraf ./dist","docs":"rimraf ./docs && typedoc src/ --out docs --mode modules --module commonjs --target es6 --excludePrivate --name Dynameh && touch ./docs/.nojekyll && gh-pages -d docs -t","lint":"tslint --project tsconfig.json","prepublish":"npm run clean && npm run build && npm run lint && npm run test && npm run docs","test":"mocha --recursive --throw-deprecation --require ts-node/register \"src/**/*.test.ts\""},"repository":{"type":"git","url":"git+https://github.com/Giftbit/dynameh.git"},"keywords":["dynamodb"],"contributors":[{"name":"Jeffery Grajkowski","email":"pushplay@gmail.com","url":"https://github.com/pushplay/"},{"name":"Graham Baradoy","email":"graham@giftbit.com","url":"https://github.com/Baradoy/"}],"license":"MIT","bugs":{"url":"https://github.com/Giftbit/dynameh/issues"},"homepage":"https://github.com/Giftbit/dynameh#readme","dependencies":{},"devDependencies":{"@types/chai":"^4.0.1","@types/mocha":"^2.2.41","@types/node":"^8.0.7","chai":"^4.0.2","gh-pages":"^1.0.0","mocha":"^3.4.2","rimraf":"^2.6.1","touch":"^3.1.0","ts-node":"^3.2.0","tslint":"^5.5.0","typedoc":"^0.7.1","typescript":"^2.4.1"},"peerDependencies":{"aws-sdk":"^2.49.0"},"gitHead":"c0b9578b34a8ef391b56a973c6bc83aa8c281ef2","_id":"dynameh@2.5.1","_npmVersion":"5.0.4","_nodeVersion":"8.1.2","_npmUser":{"name":"pushplay","email":"pushplay@gmail.com"},"dist":{"integrity":"sha512-gWSd+d4CgbEP1KzukPNTPl6/ltLTHCCWFoOAWpBKhnZEay9wKtbat+apHCi7CSGAOag7QXJXfVbiTl3yVYEk1A==","shasum":"038e8ca1523379e73be186c09afa7dc860746b6c","tarball":"https://registry.npmjs.org/dynameh/-/dynameh-2.5.1.tgz","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIDVPi30Ji1w4y6sMupQxlyRfoncTXxyx9gf2j2ABDSXHAiEAjzd1SfLAqy27F8oq5ODi1W68/MBJoL+nJ9lA8O0/30w="}]},"maintainers":[{"name":"pushplay","email":"pushplay@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/dynameh-2.5.1.tgz_1499289673026_0.7237109476700425"},"directories":{}},"2.6.0":{"name":"dynameh","version":"2.6.0","description":"DynamoDB on Node more easier","main":"dist/index.js","types":"dist/index.d.ts","files":["dist/"],"scripts":{"build":"tsc","clean":"rimraf ./dist","docs":"rimraf ./docs && typedoc src/ --out docs --mode modules --module commonjs --target es6 --excludePrivate --name Dynameh && touch ./docs/.nojekyll && gh-pages -d docs -t","lint":"tslint --project tsconfig.json","prepublishOnly":"npm run clean && npm run build && npm run lint && npm run test && npm run docs","test":"mocha --recursive --throw-deprecation --require ts-node/register \"src/**/*.test.ts\""},"repository":{"type":"git","url":"git+https://github.com/Giftbit/dynameh.git"},"keywords":["dynamodb"],"contributors":[{"name":"Jeffery Grajkowski","email":"pushplay@gmail.com","url":"https://github.com/pushplay/"},{"name":"Graham Baradoy","email":"graham@giftbit.com","url":"https://github.com/Baradoy/"}],"license":"MIT","bugs":{"url":"https://github.com/Giftbit/dynameh/issues"},"homepage":"https://github.com/Giftbit/dynameh#readme","dependencies":{},"devDependencies":{"@types/chai":"^4.0.1","@types/mocha":"^2.2.41","@types/node":"^8.0.7","chai":"^4.0.2","gh-pages":"^1.0.0","mocha":"^3.4.2","rimraf":"^2.6.1","touch":"^3.1.0","ts-node":"^3.2.0","tslint":"^5.5.0","typedoc":"^0.8.0","typescript":"^2.4.1"},"peerDependencies":{"aws-sdk":"^2.49.0"},"gitHead":"922d9f18b1f16b8d96b6e1df1618941dd448460a","_id":"dynameh@2.6.0","_npmVersion":"5.2.0","_nodeVersion":"8.2.1","_npmUser":{"name":"pushplay","email":"pushplay@gmail.com"},"dist":{"integrity":"sha512-TlS0y4JX8jeLFqalZCGLj+zfkvVUFHfZBBIdKiyd9mAl+EGwmkmiywUHuaBgeeXHGTsfitDjSi5lnxUJYwilnQ==","shasum":"73d3d802a46e7e32f94fa39ee6262a26891b0013","tarball":"https://registry.npmjs.org/dynameh/-/dynameh-2.6.0.tgz","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDWX3tZORS9uCwUwKXYHaHrh1Zw88tDDMu5Ly7hYo5oRAIhAK6bpJqIap23l7eHX2JYpGxywR817Zj4zDB76fRleZNA"}]},"maintainers":[{"name":"pushplay","email":"pushplay@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/dynameh-2.6.0.tgz_1501602609680_0.052407199051231146"},"directories":{}},"2.7.0":{"name":"dynameh","version":"2.7.0","description":"DynamoDB on Node more easier","main":"dist/index.js","types":"dist/index.d.ts","files":["dist/"],"scripts":{"build":"tsc","clean":"rimraf ./dist","docs":"rimraf ./docs && typedoc src/ --out docs --mode modules --module commonjs --target es6 --excludePrivate --name Dynameh && touch ./docs/.nojekyll && gh-pages -d docs -t","lint":"tslint --project tsconfig.json","prepublishOnly":"npm run clean && npm run build && npm run lint && npm run test && npm run docs","test":"mocha --recursive --throw-deprecation --require ts-node/register \"src/**/*.test.ts\""},"repository":{"type":"git","url":"git+https://github.com/Giftbit/dynameh.git"},"keywords":["dynamodb"],"contributors":[{"name":"Jeffery Grajkowski","email":"pushplay@gmail.com","url":"https://github.com/pushplay/"},{"name":"Graham Baradoy","email":"graham@giftbit.com","url":"https://github.com/Baradoy/"}],"license":"MIT","bugs":{"url":"https://github.com/Giftbit/dynameh/issues"},"homepage":"https://github.com/Giftbit/dynameh#readme","dependencies":{},"devDependencies":{"@types/chai":"^4.0.1","@types/mocha":"^2.2.41","@types/node":"^8.0.7","chai":"^4.0.2","gh-pages":"^1.0.0","mocha":"^3.4.2","rimraf":"^2.6.1","touch":"^3.1.0","ts-node":"^3.2.0","tslint":"^5.5.0","typedoc":"^0.8.0","typescript":"^2.4.1"},"peerDependencies":{"aws-sdk":"^2.49.0"},"gitHead":"57542fcf32dab620dcdc030ecfe65bd688ad33f8","_id":"dynameh@2.7.0","_npmVersion":"5.2.0","_nodeVersion":"8.2.1","_npmUser":{"name":"pushplay","email":"pushplay@gmail.com"},"dist":{"integrity":"sha512-FuBiHNUiMIQLEPnBZZJgnd6oTSTa0beSZ3J9QY5kXADeJmBTj/NA3bgaPrH1RxHTNrSTuNHn6NmryrQCSlJ4pg==","shasum":"ff3b0644e3bb3a4856d861f0a9319d610a3c3e0a","tarball":"https://registry.npmjs.org/dynameh/-/dynameh-2.7.0.tgz","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCfJrN9Q829r/2aA9y/BW+GWB7fz9k4NOMmsiXpziC02gIhAJ3oPLe44VeevLgV0Ei5hIufoocnY/XaHwLKKTlP+TV8"}]},"maintainers":[{"name":"pushplay","email":"pushplay@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/dynameh-2.7.0.tgz_1501611060339_0.11640486610122025"},"directories":{}},"2.7.1":{"name":"dynameh","version":"2.7.1","description":"DynamoDB on Node more easier","main":"dist/index.js","types":"dist/index.d.ts","files":["dist/"],"scripts":{"build":"tsc","clean":"rimraf ./dist","docs":"rimraf ./docs && typedoc src/ --out docs --mode modules --module commonjs --target es6 --excludePrivate --name Dynameh && touch ./docs/.nojekyll && gh-pages -d docs -t","lint":"tslint --project tsconfig.json","prepublishOnly":"npm run clean && npm run build && npm run lint && npm run test && npm run docs","test":"mocha --recursive --throw-deprecation --require ts-node/register \"src/**/*.test.ts\""},"repository":{"type":"git","url":"git+https://github.com/Giftbit/dynameh.git"},"keywords":["dynamodb"],"contributors":[{"name":"Jeffery Grajkowski","email":"pushplay@gmail.com","url":"https://github.com/pushplay/"},{"name":"Graham Baradoy","email":"graham@giftbit.com","url":"https://github.com/Baradoy/"}],"license":"MIT","bugs":{"url":"https://github.com/Giftbit/dynameh/issues"},"homepage":"https://github.com/Giftbit/dynameh#readme","dependencies":{},"devDependencies":{"@types/chai":"^4.0.1","@types/mocha":"^2.2.41","@types/node":"^8.0.7","chai":"^4.0.2","gh-pages":"^1.0.0","mocha":"^3.4.2","rimraf":"^2.6.1","touch":"^3.1.0","ts-node":"^3.2.0","tslint":"^5.5.0","typedoc":"^0.8.0","typescript":"^2.4.1"},"peerDependencies":{"aws-sdk":"^2.49.0"},"gitHead":"b851abd41c77de0208dd74454c9b3806a0149866","_id":"dynameh@2.7.1","_npmVersion":"5.2.0","_nodeVersion":"8.2.1","_npmUser":{"name":"pushplay","email":"pushplay@gmail.com"},"dist":{"integrity":"sha512-WmreGrhANYjG+Md1M2xYX+kW/tPsQOHMGAGt9hbO3dCVNnL0aRDWr2+EClfN6j8eX0KWSsf30vOX/awu/9Zedg==","shasum":"a86d253c01d05ab6a7caccd8876ec26cb54d53c6","tarball":"https://registry.npmjs.org/dynameh/-/dynameh-2.7.1.tgz","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDXQdMra5M5XQIjGj+E5GskvrQGdHpfoY9xQqJBpRXu+wIgIYmGvFhGc/kHeytQGZ+3rarEfSlfhl/nXHM+cPiLRQE="}]},"maintainers":[{"name":"pushplay","email":"pushplay@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/dynameh-2.7.1.tgz_1501612929566_0.19590985705144703"},"directories":{}},"2.7.2":{"name":"dynameh","version":"2.7.2","description":"DynamoDB on Node more easier","main":"dist/index.js","types":"dist/index.d.ts","files":["dist/"],"scripts":{"build":"tsc","clean":"rimraf ./dist","docs":"rimraf ./docs && typedoc src/ --out docs --mode modules --module commonjs --target es6 --excludePrivate --name Dynameh && touch ./docs/.nojekyll && gh-pages -d docs -t","lint":"tslint --project tsconfig.json","prepublishOnly":"npm run clean && npm run build && npm run lint && npm run test && npm run docs","test":"mocha --recursive --throw-deprecation --require ts-node/register \"src/**/*.test.ts\""},"repository":{"type":"git","url":"git+https://github.com/Giftbit/dynameh.git"},"keywords":["dynamodb"],"contributors":[{"name":"Jeffery Grajkowski","email":"pushplay@gmail.com","url":"https://github.com/pushplay/"},{"name":"Graham Baradoy","email":"graham@giftbit.com","url":"https://github.com/Baradoy/"}],"license":"MIT","bugs":{"url":"https://github.com/Giftbit/dynameh/issues"},"homepage":"https://github.com/Giftbit/dynameh#readme","dependencies":{},"devDependencies":{"@types/chai":"^4.0.1","@types/mocha":"^2.2.41","@types/node":"^8.0.7","chai":"^4.0.2","gh-pages":"^1.0.0","mocha":"^3.4.2","rimraf":"^2.6.1","touch":"^3.1.0","ts-node":"^3.2.0","tslint":"^5.5.0","typedoc":"^0.8.0","typescript":"^2.4.1"},"peerDependencies":{"aws-sdk":"^2.49.0"},"gitHead":"1a142cedd69018d71a0005369c2702c5d468282e","_id":"dynameh@2.7.2","_npmVersion":"5.2.0","_nodeVersion":"8.2.1","_npmUser":{"name":"pushplay","email":"pushplay@gmail.com"},"dist":{"integrity":"sha512-/ZxrwBJdk6FzvEj2BsU3IVr7kQ8vfw+krfUVjdY7gUTCIQLO1oX9Qxb6xnfS8XIBbZNX+JtOf8Y6SSQMWteVxQ==","shasum":"222163c6f22f58f8e33cfa29ccd30011dad7538f","tarball":"https://registry.npmjs.org/dynameh/-/dynameh-2.7.2.tgz","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCdYLL7c5/mfvJgATS2lTExGVK2gjnYZlQ6J62/hWRvFgIgBKjXpBS/wRaNeGZ7O4pKa8udPUOlMRd56Fnu8wT15fM="}]},"maintainers":[{"name":"pushplay","email":"pushplay@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/dynameh-2.7.2.tgz_1502735739066_0.09307367680594325"},"directories":{}},"2.8.0":{"name":"dynameh","version":"2.8.0","description":"DynamoDB on Node more easier","main":"dist/index.js","types":"dist/index.d.ts","files":["dist/"],"scripts":{"build":"tsc","clean":"rimraf ./dist","docs":"rimraf ./docs && typedoc src/ --out docs --mode modules --module commonjs --target es6 --excludePrivate --name Dynameh && touch ./docs/.nojekyll && gh-pages -d docs -t","lint":"tslint --project tsconfig.json","prepublishOnly":"npm run clean && npm run build && npm run lint && npm run test && npm run docs","test":"mocha --recursive --throw-deprecation --require ts-node/register \"src/**/*.test.ts\""},"repository":{"type":"git","url":"git+https://github.com/Giftbit/dynameh.git"},"keywords":["dynamodb"],"contributors":[{"name":"Jeffery Grajkowski","email":"pushplay@gmail.com","url":"https://github.com/pushplay/"},{"name":"Graham Baradoy","email":"graham@giftbit.com","url":"https://github.com/Baradoy/"}],"license":"MIT","bugs":{"url":"https://github.com/Giftbit/dynameh/issues"},"homepage":"https://github.com/Giftbit/dynameh#readme","dependencies":{},"devDependencies":{"@types/chai":"^4.0.1","@types/mocha":"^2.2.41","@types/node":"^8.0.7","chai":"^4.0.2","gh-pages":"^1.0.0","mocha":"^3.4.2","rimraf":"^2.6.1","touch":"^3.1.0","ts-node":"^3.2.0","tslint":"^5.5.0","typedoc":"^0.8.0","typescript":"^2.4.1"},"peerDependencies":{"aws-sdk":"^2.49.0"},"gitHead":"3a8079f558be36d276ec0719808460346f9b3acb","_id":"dynameh@2.8.0","_npmVersion":"5.2.0","_nodeVersion":"8.2.1","_npmUser":{"name":"pushplay","email":"pushplay@gmail.com"},"dist":{"integrity":"sha512-crsyD62F2kj8DE9SHfpZCcLTu4P7aVOuBVGBhKB2Vh/D7Ub9cqmql1qjXGD5sGWr0dEn1DGQbfSVqbTXevJEqw==","shasum":"aa2158bf2556d36c027d936f153573e43d689a89","tarball":"https://registry.npmjs.org/dynameh/-/dynameh-2.8.0.tgz","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQD1Bic/5x7mgBQW7YHXU5wEPLoYPgnNWahZ9gO2lCqCngIgGpuj/3SgGZ7oFXEHlGtFvjIUtiXXrVOzN6qwMwXms1g="}]},"maintainers":[{"name":"pushplay","email":"pushplay@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/dynameh-2.8.0.tgz_1503091018536_0.2876585219055414"},"directories":{}},"2.9.0":{"name":"dynameh","version":"2.9.0","description":"DynamoDB on Node more easier","main":"dist/index.js","types":"dist/index.d.ts","files":["dist/"],"scripts":{"build":"tsc","clean":"rimraf ./dist","docs":"rimraf ./docs && typedoc src/ --out docs --mode modules --module commonjs --target es6 --excludePrivate --name Dynameh && touch ./docs/.nojekyll && gh-pages -d docs -t","lint":"tslint --project tsconfig.json","prepublishOnly":"npm run clean && npm run build && npm run lint && npm run test && npm run docs","test":"mocha --recursive --throw-deprecation --require ts-node/register \"src/**/*.test.ts\""},"repository":{"type":"git","url":"git+https://github.com/Giftbit/dynameh.git"},"keywords":["dynamodb"],"contributors":[{"name":"Jeffery Grajkowski","email":"pushplay@gmail.com","url":"https://github.com/pushplay/"},{"name":"Graham Baradoy","email":"graham@giftbit.com","url":"https://github.com/Baradoy/"}],"license":"MIT","bugs":{"url":"https://github.com/Giftbit/dynameh/issues"},"homepage":"https://github.com/Giftbit/dynameh#readme","dependencies":{},"devDependencies":{"@types/chai":"^4.0.4","@types/mocha":"^2.2.42","@types/node":"^8.0.27","chai":"^4.1.2","gh-pages":"^1.0.0","mocha":"^3.4.2","rimraf":"^2.6.1","touch":"^3.1.0","ts-node":"^3.2.0","tslint":"^5.7.0","typedoc":"^0.8.0","typescript":"^2.5.2"},"peerDependencies":{"aws-sdk":"^2.49.0"},"gitHead":"cfb694fbb6d669f5d08324572f0ce2e0b39e589a","_id":"dynameh@2.9.0","_npmVersion":"5.4.0","_nodeVersion":"8.2.1","_npmUser":{"name":"pushplay","email":"pushplay@gmail.com"},"dist":{"integrity":"sha512-ee+/exouiN21szKFgcKI00JoGafZNIrcFoIhLVKcwgY2AUbfA4jzOmlvbh14y/vD7l5iVcxkT1bbSVKYre264g==","shasum":"f7a6a38233c6300b5e267744c0fa8ed4c086b336","tarball":"https://registry.npmjs.org/dynameh/-/dynameh-2.9.0.tgz","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIGBGDaw42+TLyGvkNQYSytXOU3HM70EteosYAjRIPiCiAiEAswE+oEftDhiGCPWYsn+fGuhYwX7To+t2ZAfuwkujx14="}]},"maintainers":[{"name":"pushplay","email":"pushplay@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/dynameh-2.9.0.tgz_1504884472705_0.09690585266798735"},"directories":{}},"2.9.1":{"name":"dynameh","version":"2.9.1","description":"DynamoDB on Node more easier","main":"dist/index.js","types":"dist/index.d.ts","files":["dist/"],"scripts":{"build":"tsc","clean":"rimraf ./dist","docs":"rimraf ./docs && typedoc src/ --out docs --mode modules --module commonjs --target es6 --excludePrivate --name Dynameh && touch ./docs/.nojekyll && gh-pages -d docs -t","lint":"tslint --project tsconfig.json","prepublishOnly":"npm run clean && npm run build && npm run lint && npm run test && npm run docs","test":"mocha --recursive --throw-deprecation --require ts-node/register \"src/**/*.test.ts\""},"repository":{"type":"git","url":"git+https://github.com/Giftbit/dynameh.git"},"keywords":["dynamodb"],"contributors":[{"name":"Jeffery Grajkowski","email":"pushplay@gmail.com","url":"https://github.com/pushplay/"},{"name":"Graham Baradoy","email":"graham@giftbit.com","url":"https://github.com/Baradoy/"}],"license":"MIT","bugs":{"url":"https://github.com/Giftbit/dynameh/issues"},"homepage":"https://github.com/Giftbit/dynameh#readme","dependencies":{},"devDependencies":{"@types/chai":"^4.0.4","@types/mocha":"^2.2.42","@types/node":"^8.0.27","chai":"^4.1.2","gh-pages":"^1.0.0","mocha":"^3.4.2","rimraf":"^2.6.1","touch":"^3.1.0","ts-node":"^3.2.0","tslint":"^5.7.0","typedoc":"^0.8.0","typescript":"^2.5.2"},"peerDependencies":{"aws-sdk":"^2.49.0"},"gitHead":"13d0ba3a853cff36ff0aeeee31bce5d67d65cc00","_id":"dynameh@2.9.1","_npmVersion":"5.4.0","_nodeVersion":"8.2.1","_npmUser":{"name":"pushplay","email":"pushplay@gmail.com"},"dist":{"integrity":"sha512-xZlRpTgUyeA9wlUV2sn3x4MMWDRoyuIMfSun9YR5jNmXc2wDd44y4rGe3eD9ZG1OdrVmsC2KGEfM5pTtaB0bUg==","shasum":"c29e75dd7c033f055e48fdb3ca4e2e84e4472162","tarball":"https://registry.npmjs.org/dynameh/-/dynameh-2.9.1.tgz","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCYhp/s5AzfiKG6smdVY9olaUdr1nfNlWUSruBlpBE+1AIgH6xNYhtN4oKc5mfxkHyjZf+kSeEgzlpk+/dvhr5wRYI="}]},"maintainers":[{"name":"pushplay","email":"pushplay@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/dynameh-2.9.1.tgz_1504900477297_0.741861334303394"},"directories":{}},"2.10.0":{"name":"dynameh","version":"2.10.0","description":"DynamoDB on Node more easier","main":"dist/index.js","types":"dist/index.d.ts","files":["dist/"],"scripts":{"build":"tsc","clean":"rimraf ./dist","docs":"rimraf ./docs && typedoc src/ --out docs --mode modules --module commonjs --target es6 --excludePrivate --name Dynameh && touch ./docs/.nojekyll && gh-pages -d docs -t","lint":"tslint --project tsconfig.json","prepublishOnly":"npm run clean && npm run build && npm run lint && npm run test && npm run docs","test":"mocha --recursive --throw-deprecation --require ts-node/register \"src/**/*.test.ts\""},"repository":{"type":"git","url":"git+https://github.com/Giftbit/dynameh.git"},"keywords":["dynamodb"],"contributors":[{"name":"Jeffery Grajkowski","email":"pushplay@gmail.com","url":"https://github.com/pushplay/"},{"name":"Graham Baradoy","email":"graham@giftbit.com","url":"https://github.com/Baradoy/"}],"license":"MIT","bugs":{"url":"https://github.com/Giftbit/dynameh/issues"},"homepage":"https://github.com/Giftbit/dynameh#readme","dependencies":{},"devDependencies":{"@types/chai":"^4.0.4","@types/mocha":"^2.2.42","@types/node":"^8.0.27","chai":"^4.1.2","gh-pages":"^1.0.0","mocha":"^3.4.2","rimraf":"^2.6.1","touch":"^3.1.0","ts-node":"^3.2.0","tslint":"^5.7.0","typedoc":"^0.8.0","typescript":"^2.5.2"},"peerDependencies":{"aws-sdk":"^2.49.0"},"gitHead":"7e012f7d805bba5801ab7240cf09ad24048e7a9e","_id":"dynameh@2.10.0","_npmVersion":"5.4.0","_nodeVersion":"8.8.0","_npmUser":{"name":"pushplay","email":"pushplay@gmail.com"},"dist":{"integrity":"sha512-FuoW4KxbrWy6b1KKNDwsw8/xw9Vv4xXxqzdOu3z3sKWMfOKyKuuKVsMZ87Lyv3x5wyPRyRbRAEVkGGHcWuP3Mg==","shasum":"22cee7687f48267166ad8ffccc7e6757957dce49","tarball":"https://registry.npmjs.org/dynameh/-/dynameh-2.10.0.tgz","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDaYN+wVvbORMpDxrauvB4xXHQOvMfBqqLwRz1fDYZibQIhAPe1EeovTRx1w0zvdVOnsNniPUJDLn3E+Mt07SK7eA3K"}]},"maintainers":[{"name":"pushplay","email":"pushplay@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/dynameh-2.10.0.tgz_1514618863128_0.45822389074601233"},"directories":{}},"2.10.1":{"name":"dynameh","version":"2.10.1","description":"DynamoDB on Node more easier","main":"dist/index.js","types":"dist/index.d.ts","files":["dist/"],"scripts":{"build":"tsc","clean":"rimraf ./dist","docs":"rimraf ./docs && typedoc src/ --out docs --mode modules --module commonjs --target es6 --excludePrivate --name Dynameh && touch ./docs/.nojekyll && gh-pages -d docs -t","lint":"tslint --project tsconfig.json","prepublishOnly":"npm run clean && npm run build && npm run lint && npm run test && npm run docs","test":"mocha --recursive --throw-deprecation --require ts-node/register \"src/**/*.test.ts\""},"repository":{"type":"git","url":"git+https://github.com/Giftbit/dynameh.git"},"keywords":["dynamodb"],"contributors":[{"name":"Jeffery Grajkowski","email":"pushplay@gmail.com","url":"https://github.com/pushplay/"},{"name":"Graham Baradoy","email":"graham@giftbit.com","url":"https://github.com/Baradoy/"}],"license":"MIT","bugs":{"url":"https://github.com/Giftbit/dynameh/issues"},"homepage":"https://github.com/Giftbit/dynameh#readme","dependencies":{},"devDependencies":{"@types/chai":"^4.0.4","@types/mocha":"^2.2.42","@types/node":"^8.0.27","aws-sdk":"^2.176.0","chai":"^4.1.2","gh-pages":"^1.1.0","mocha":"^4.1.0","rimraf":"^2.6.2","touch":"^3.1.0","ts-node":"^4.1.0","tslint":"^5.7.0","typedoc":"^0.9.0","typescript":"^2.5.2"},"peerDependencies":{"aws-sdk":"^2.176.0"},"gitHead":"73c3791fcaa3417c4e86aa5f72fb1bf938a1de66","_id":"dynameh@2.10.1","_npmVersion":"5.4.0","_nodeVersion":"8.8.0","_npmUser":{"name":"pushplay","email":"pushplay@gmail.com"},"dist":{"integrity":"sha512-5NBM8JpXsOzFAinOKOe1RUdP/HqdMX+R5lBDJS0fuIxfxnjNhgDbiISJmm10Q4/ZM++8r4wb9IwvVFRk6bE9VA==","shasum":"c5b30e472696d9ec5d80473424ea4e08836362df","tarball":"https://registry.npmjs.org/dynameh/-/dynameh-2.10.1.tgz","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIA3UC8XSdJB6P+TTH5hwGSyCRnb7G6JX8pJtiORxji+BAiAQpTvZWgAR4itEZpb9eOwHkIMjAkgeWn/UVGd6tPQZLA=="}]},"maintainers":[{"name":"pushplay","email":"pushplay@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/dynameh-2.10.1.tgz_1515100937179_0.41986770322546363"},"directories":{}},"2.10.2":{"name":"dynameh","version":"2.10.2","description":"DynamoDB on Node more easier","main":"dist/index.js","types":"dist/index.d.ts","files":["dist/"],"scripts":{"build":"tsc","clean":"rimraf ./dist","docs":"rimraf ./docs && typedoc src/ --out docs --mode modules --module commonjs --target es6 --excludePrivate --name Dynameh && touch ./docs/.nojekyll && gh-pages -d docs -t","lint":"tslint --project tsconfig.json","prepublishOnly":"npm run clean && npm run build && npm run lint && npm run test && npm run docs","test":"mocha --recursive --throw-deprecation --require ts-node/register \"src/**/*.test.ts\""},"repository":{"type":"git","url":"git+https://github.com/Giftbit/dynameh.git"},"keywords":["dynamodb"],"contributors":[{"name":"Jeffery Grajkowski","email":"pushplay@gmail.com","url":"https://github.com/pushplay/"},{"name":"Graham Baradoy","email":"graham@giftbit.com","url":"https://github.com/Baradoy/"}],"license":"MIT","bugs":{"url":"https://github.com/Giftbit/dynameh/issues"},"homepage":"https://github.com/Giftbit/dynameh#readme","dependencies":{},"devDependencies":{"@types/chai":"^4.0.4","@types/mocha":"^2.2.42","@types/node":"^8.0.27","aws-sdk":"^2.176.0","chai":"^4.1.2","gh-pages":"^1.1.0","mocha":"^4.1.0","rimraf":"^2.6.2","touch":"^3.1.0","ts-node":"^4.1.0","tslint":"^5.7.0","typedoc":"^0.9.0","typescript":"^2.5.2"},"peerDependencies":{"aws-sdk":"^2.176.0"},"gitHead":"345fbbad1c530596c23c5b0067b7b876940e5483","_id":"dynameh@2.10.2","_npmVersion":"5.6.0","_nodeVersion":"9.3.0","_npmUser":{"name":"pushplay","email":"pushplay@gmail.com"},"dist":{"integrity":"sha512-H41D8TlA2ZhMb+tDNmYXUyQWGTRNpnNKO1XbyHHXmDrW7n5cKsYQQZX0OSKsLJMh+67lZ9lxMA18tFj/HJ7ebQ==","shasum":"b69372d586c8e2c60adc340e705b0772a39ff5ea","tarball":"https://registry.npmjs.org/dynameh/-/dynameh-2.10.2.tgz","fileCount":23,"unpackedSize":87430,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQC/cdIKFB/LWxBbpLujQszvVXfrRYshh+bvORqKYU+TzQIgJhoKWxFhECkXlWOUNO0kavGebRGZCelINbTqEqUTrow="}]},"maintainers":[{"name":"pushplay","email":"pushplay@gmail.com"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/dynameh_2.10.2_1518204195678_0.09778963609009161"},"_hasShrinkwrap":false},"2.10.3":{"name":"dynameh","version":"2.10.3","description":"DynamoDB on Node more easier","main":"dist/index.js","types":"dist/index.d.ts","files":["dist/"],"scripts":{"build":"tsc","clean":"rimraf ./dist","docs":"rimraf ./docs && typedoc src/ --out docs --mode modules --module commonjs --target es6 --excludePrivate --name Dynameh && touch ./docs/.nojekyll && gh-pages -d docs -t","lint":"tslint --project tsconfig.json","prepublishOnly":"npm run clean && npm run build && npm run lint && npm run test && npm run docs","test":"mocha --recursive --throw-deprecation --require ts-node/register \"src/**/*.test.ts\""},"repository":{"type":"git","url":"git+https://github.com/Giftbit/dynameh.git"},"keywords":["dynamodb"],"contributors":[{"name":"Jeffery Grajkowski","email":"pushplay@gmail.com","url":"https://github.com/pushplay/"},{"name":"Graham Baradoy","email":"graham@giftbit.com","url":"https://github.com/Baradoy/"}],"license":"MIT","bugs":{"url":"https://github.com/Giftbit/dynameh/issues"},"homepage":"https://github.com/Giftbit/dynameh#readme","dependencies":{},"devDependencies":{"@types/chai":"^4.1.2","@types/mocha":"^2.2.48","@types/node":"^4.0.36","aws-sdk":"^2.176.0","chai":"^4.1.2","gh-pages":"^1.1.0","mocha":"^5.0.0","rimraf":"^2.6.2","touch":"^3.1.0","ts-node":"^4.1.0","tslint":"^5.9.1","typedoc":"^0.10.0","typescript":"^2.7.1"},"peerDependencies":{"aws-sdk":"^2.176.0"},"gitHead":"b29cce0487a0dd2bea3ac7710f7247f31025b702","_id":"dynameh@2.10.3","_npmVersion":"5.6.0","_nodeVersion":"9.3.0","_npmUser":{"name":"pushplay","email":"pushplay@gmail.com"},"dist":{"integrity":"sha512-IM3ZEnFTtHteNpF+a6yPVSytq9rmw1B1Tm+3oSbULQhsSB0NNkhC0dfGzJjpj0nABHDasrBCr3ruttDkJBIdjA==","shasum":"4d073c26fd7e65437afa4f378a355e16d132e6d3","tarball":"https://registry.npmjs.org/dynameh/-/dynameh-2.10.3.tgz","fileCount":23,"unpackedSize":87559,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCpM8PqiLbGOn1I2Uez/D3vJ3jIhT3ORJqPFAca1uRqVgIhAMG9WGaa2WB5fTLQwp7NJGHKmYcTGuF9a7v4bOwvXTgQ"}]},"maintainers":[{"name":"pushplay","email":"pushplay@gmail.com"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/dynameh_2.10.3_1518563058658_0.8495187051501789"},"_hasShrinkwrap":false},"3.0.0":{"name":"dynameh","version":"3.0.0","description":"DynamoDB on Node more easier","main":"dist/index.js","types":"dist/index.d.ts","scripts":{"build":"tsc","clean":"rimraf ./dist","docs":"rimraf ./docs && typedoc src/ --out docs --mode modules --module commonjs --target es6 --excludePrivate --excludeNotExported --exclude '**/*.test.ts' --name Dynameh && touch ./docs/.nojekyll && gh-pages -d docs -t","lint":"tslint --project tsconfig.json","prepublishOnly":"npm run clean && npm run build && npm run lint && npm run test && npm run docs","test":"mocha --recursive --throw-deprecation --require ts-node/register \"src/**/*.test.ts\""},"repository":{"type":"git","url":"git+https://github.com/Giftbit/dynameh.git"},"keywords":["dynamodb"],"contributors":[{"name":"Jeffery Grajkowski","email":"pushplay@gmail.com","url":"https://github.com/pushplay/"},{"name":"Graham Baradoy","email":"graham@giftbit.com","url":"https://github.com/Baradoy/"}],"license":"MIT","bugs":{"url":"https://github.com/Giftbit/dynameh/issues"},"homepage":"https://github.com/Giftbit/dynameh#readme","dependencies":{},"devDependencies":{"@types/chai":"^4.1.7","@types/mocha":"^5.2.5","@types/node":"^10.12.18","aws-sdk":"^2.391.0","chai":"^4.2.0","gh-pages":"^2.0.1","mocha":"^5.2.0","rimraf":"^2.6.3","touch":"^3.1.0","ts-node":"^7.0.1","tslint":"^5.12.1","typedoc":"^0.14.2","typescript":"^3.2.4"},"peerDependencies":{"aws-sdk":"^2.391.0"},"gitHead":"3c62a43a1414a260c7abb1152009ee1a3e9c520d","_id":"dynameh@3.0.0","_npmVersion":"6.1.0","_nodeVersion":"8.10.0","_npmUser":{"name":"pushplay","email":"pushplay@gmail.com"},"dist":{"integrity":"sha512-2aT7PfwofmkfVr879lVXThqgFnv4r8IqfAP2p7VVMkDCNn8PZ0kS46q9C6a2PdB/uxFmOLSyfKI5OGxwa9jo0w==","shasum":"45965e734dac69326bc5d92f4802dd26258df621","tarball":"https://registry.npmjs.org/dynameh/-/dynameh-3.0.0.tgz","fileCount":25,"unpackedSize":105150,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJcT51UCRA9TVsSAnZWagAAnocP/jgOjrJ1Q+iDM0SgLPgg\ny0fNlOxAdBJQzAN5zIHzpe57TwY4km1WFGCqaFLLFCWCHfrYsXLAjy+iGO6X\nRg419L9AZ3tf3ghT5+z7+uLi7iBTCFJ1t7lj3lTKpjWz3ca7E/9T4RYZgDIf\noNk9OzVWWW7IMaNPa6OdczD0H1ZIaMAz+M5unZc5h8ztJTS+sbRYbB96DnkN\nl38ogr1bXzXOt8VOOvE+kjG/6cxVk3cl87FpqUWbVZm0q485Xx8CB9+pdQpx\n12TggdvyWoN18i7StdU60yCF7CyjlU212mAZn5uRuwAUBdWkklqR31qokodF\nD6oVCamFZSKUmpw16hRIVU7ZyggRlYe9UPa3Zz/EpmmZL11slDKOTHisG3IN\nyxTd00WEoVn8jjtzgs6SfSnImBBBpd2IcZdUsWJjvKLnxIef0XQXeHB+mDo9\nTs39DsP4XGlcjRui7pvbCbOH+wqnjCUmvtGOuyLS9X8Me2HO+oIBpUwPz1Ki\nO/Y1j4PwqdqkRhPSCkdCqH4Z5wrib3G/u+jq0H9rXnvlRTAMNtSDNf3vLYR6\nylasbNbilXnh9jtfJmKMhXEf4kluBYq9QoHJH1vrp3AN5ZC4oX0ax2jnZP9w\npQnwLdBl8Vc+brsE18g7A3icVITfF9OVq2egBf3y7nBul2sLgeUH5eQKw6W8\nB7f3\r\n=4XtW\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIHX6G12r0iSx1bVYrg9Wc368F5/Ysi5pNUmX45BIkX2mAiEA9f5bEx/C4UWdCEI+KiEZvArGt/P7T+c5swig/2xoXAk="}]},"maintainers":[{"name":"pushplay","email":"pushplay@gmail.com"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/dynameh_3.0.0_1548721491311_0.37475298393553436"},"_hasShrinkwrap":false},"3.1.0":{"name":"dynameh","version":"3.1.0","description":"DynamoDB on Node more easier","main":"dist/index.js","types":"dist/index.d.ts","scripts":{"build":"tsc","clean":"rimraf ./dist","docs":"rimraf ./docs && typedoc src/ --out docs --mode modules --module commonjs --target es6 --excludePrivate --excludeNotExported --exclude '**/*.test.ts' --name Dynameh && touch ./docs/.nojekyll && gh-pages -d docs -t","lint":"tslint --project tsconfig.json","prepublishOnly":"npm run clean && npm run build && npm run lint && npm run test && npm run docs","test":"mocha --recursive --throw-deprecation --require ts-node/register \"src/**/*.test.ts\""},"repository":{"type":"git","url":"git+https://github.com/Giftbit/dynameh.git"},"keywords":["dynamodb"],"contributors":[{"name":"Jeffery Grajkowski","email":"pushplay@gmail.com","url":"https://github.com/pushplay/"},{"name":"Graham Baradoy","email":"graham@giftbit.com","url":"https://github.com/Baradoy/"}],"license":"MIT","bugs":{"url":"https://github.com/Giftbit/dynameh/issues"},"homepage":"https://github.com/Giftbit/dynameh#readme","dependencies":{},"devDependencies":{"@types/chai":"^4.1.7","@types/mocha":"^5.2.5","@types/node":"^10.12.18","aws-sdk":"^2.391.0","chai":"^4.2.0","gh-pages":"^2.0.1","mocha":"^5.2.0","rimraf":"^2.6.3","touch":"^3.1.0","ts-node":"^7.0.1","tslint":"^5.12.1","typedoc":"^0.14.2","typescript":"^3.2.4"},"peerDependencies":{"aws-sdk":"^2.391.0"},"gitHead":"3c62a43a1414a260c7abb1152009ee1a3e9c520d","_id":"dynameh@3.1.0","_npmVersion":"6.1.0","_nodeVersion":"8.10.0","_npmUser":{"name":"pushplay","email":"pushplay@gmail.com"},"dist":{"integrity":"sha512-iMwaE0LmhxrMyuuNCcYKOGanfwPhTChvtEMAozRUkTWwnabq/YCve5aOoJLcMJXav+D5IoYg7AoQUsO/K+P1KQ==","shasum":"419a7d23287e5e0ec34f105089a294bb4a54467a","tarball":"https://registry.npmjs.org/dynameh/-/dynameh-3.1.0.tgz","fileCount":25,"unpackedSize":106154,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJckovZCRA9TVsSAnZWagAAsc8P/jT9QgUsXTl/ZtRM7rhX\n5TZBK8AMLSDTdDVcm1wnLEQG5liA5X3irO4b1JVQSc+Qa25nJeI7hj2cUcn6\nNytF66rY85vpPvuKi5l9ToWXcgifI1VHpUzO1mPoY0t0Kj5z5/LI4CejhLeP\nwktnw8PXUbfE57lyGbJeu7vxW4MttMdXdRyVngvSgtc7yFQLw85wWY2G1GLE\nnWz7G99nydbdN/FfgcZz/XwEQEQ3FNxg7q+J3m6vNQAyXR+QiS7+9xqS4IX4\nzgWBLER40RSFMgmam7064sNbzgvqWFwPvwLvr0FY3uH9RN+E3guuSaTtgcPH\nAFon8oO//D97ZvSb0DUvxLg55VugEJhE0Tqq4BA6a8UfJc7U/xifsL5Vze/H\nrXM+rqYBMYEWUMhR8L8yG1q0n9mTxb5xw39dQZdIpJFUHk5G+pN9nOVm4yw4\n4oOs2WoG4bQhJd+tnPBWby70W62iHZtV3vgKpA09bQhgkqhrrOrpZ8PhztVz\nOJLgXTG5+FqvzvEmw+vGgXM3HBfwURGVHS8oXeVoarEE7BdKhRNvQWLOD1Dn\nMStGFJK3kopDRJ7Ia9eYGG0jstgGrRB3uODNlbaOC8uNrRe9OqwRdcf70LWF\nCkQNtSRkWahqIsl8iqC5TwJu2I8IDfLW0VAQVcCfr+cpzQLdWb/VdBuSzl5+\nFVN0\r\n=KGZt\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIGQtYHHC+rxthfj03rzzJWNRcvtFc/dbVUn4SUMjudpcAiBp9inxWOr1N9ybrZr+05Gk4RXhX+jqqLG4af0AUeidcA=="}]},"maintainers":[{"name":"pushplay","email":"pushplay@gmail.com"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/dynameh_3.1.0_1553107929086_0.018192199996827974"},"_hasShrinkwrap":false},"3.2.0":{"name":"dynameh","version":"3.2.0","description":"DynamoDB on Node more easier","main":"dist/index.js","types":"dist/index.d.ts","scripts":{"build":"tsc","clean":"rimraf ./dist","docs":"rimraf ./docs && typedoc src/ --out docs --mode modules --module commonjs --target es6 --excludePrivate --excludeNotExported --exclude '**/*.test.ts' --name Dynameh && touch ./docs/.nojekyll && gh-pages -d docs -t","lint":"tslint --project tsconfig.json","prepublishOnly":"npm run clean && npm run build && npm run lint && npm run test && npm run docs","test":"mocha --recursive --throw-deprecation --require ts-node/register \"src/**/*.test.ts\""},"repository":{"type":"git","url":"git+https://github.com/Giftbit/dynameh.git"},"keywords":["dynamodb"],"contributors":[{"name":"Jeffery Grajkowski","email":"pushplay@gmail.com","url":"https://github.com/pushplay/"},{"name":"Graham Baradoy","email":"graham@giftbit.com","url":"https://github.com/Baradoy/"}],"license":"MIT","bugs":{"url":"https://github.com/Giftbit/dynameh/issues"},"homepage":"https://github.com/Giftbit/dynameh#readme","dependencies":{},"devDependencies":{"@types/chai":"^4.1.7","@types/mocha":"^5.2.5","@types/node":"^10.12.18","aws-sdk":"^2.391.0","chai":"^4.2.0","gh-pages":"^2.0.1","mocha":"^5.2.0","rimraf":"^2.6.3","touch":"^3.1.0","ts-node":"^7.0.1","tslint":"^5.12.1","typedoc":"^0.14.2","typescript":"^3.2.4"},"peerDependencies":{"aws-sdk":"^2.391.0"},"gitHead":"02ea97e411e85484913beb1be93363a40a335350","_id":"dynameh@3.2.0","_npmVersion":"6.1.0","_nodeVersion":"8.10.0","_npmUser":{"name":"pushplay","email":"pushplay@gmail.com"},"dist":{"integrity":"sha512-BQltXj6ZxwqnituiFz0MiXA8EarEksxo1vD7OCHkai/GGEu2JrgoanrsWFHdT90FXywMsR7Ed4UCC1QoWzXv/w==","shasum":"068161ef9bae9b11d9cb9e1751b0beb319d2949b","tarball":"https://registry.npmjs.org/dynameh/-/dynameh-3.2.0.tgz","fileCount":25,"unpackedSize":107301,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJck+r1CRA9TVsSAnZWagAALEAP/2h4aZw1+wW2/EmUvs7s\nlcs/nWyLV+60KHTgEmmyw6VDg1KNxX4HFyvZCOoNaO4lVatdy6+pSSfjTwh4\nnabmhkD1JIHiOEj6Vo9zivk7tuZuEiLhcY5EFvIzxUG5rb5uH60NNWbX8FcO\n/NnegBlE32/xp/xglwXoBPoVKzj2bgVx0lPoabqU5A8FB0C2ZL3sfMn5zl5R\nGoD9f0EJrxnTEKtH+qWo4HOjRQ6fRGnAJCuAPTEEDCn2PRlsjGpV0nOh1vrZ\ncaDjj83vQd/6TyUWaY0tyHE3uz2srtOPHMI+B98LydxPE3OoaSQA5oDHcKzl\nWUoWk/Vr2FyVl6QfVGUiREeEEPpNzasVK+w1BioGNIaKvUicyZURGy1EZw1A\nsF/mSGHChZ67iffRufdZ5x/8BHdUs8NkOegJLpc4OGL2VVfuO4MpXQviawQU\ntnu504j5Y37pTIrmz6wRxRm6mIBdEnFj7JZ5Ztph1INpBbqGN2OYQe2AFsw2\nVNQ1AYORIfn84tEfERrHauOaeakggz+bIbmBzk6mrp9aAOwSyBL5SC3TKUqq\nVLc/fy3M8u2+OE1UtLa5HDJAP53CG4rs4cuDEA3BS5EblDRfc5sCUvfsy3p7\nfV2bolDRCHGnGdLEIscHlISbl8V2LBaBtVhXKL9KM0XWvzrqXqX7s+U4lPtG\nxImv\r\n=TTc+\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDJD00OAVt75Mkui2lJxyVlkobaMi0UiX7N++JHsnAA9QIgWaR9mh8t11jxPFjldYYljL63R3FR4HkvVzmm+AkB9so="}]},"maintainers":[{"name":"pushplay","email":"pushplay@gmail.com"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/dynameh_3.2.0_1553197812457_0.03998770262710716"},"_hasShrinkwrap":false},"3.3.0-beta.1":{"name":"dynameh","version":"3.3.0-beta.1","description":"DynamoDB on Node more easier","main":"dist/index.js","types":"dist/index.d.ts","scripts":{"build":"tsc","clean":"rimraf ./dist","docs":"rimraf ./docs && typedoc src/ --out docs --mode modules --module commonjs --target es6 --excludePrivate --excludeNotExported --exclude '**/*.test.ts' --name Dynameh && touch ./docs/.nojekyll && gh-pages -d docs -t","lint":"tslint --project tsconfig.json","prepublishOnly":"npm run clean && npm run build && npm run lint && npm run test && npm run docs","test":"mocha --recursive --throw-deprecation --require ts-node/register \"src/**/*.test.ts\""},"repository":{"type":"git","url":"git+https://github.com/Giftbit/dynameh.git"},"keywords":["dynamodb"],"contributors":[{"name":"Jeffery Grajkowski","email":"pushplay@gmail.com","url":"https://github.com/pushplay/"},{"name":"Graham Baradoy","email":"graham@giftbit.com","url":"https://github.com/Baradoy/"}],"license":"MIT","bugs":{"url":"https://github.com/Giftbit/dynameh/issues"},"homepage":"https://github.com/Giftbit/dynameh#readme","dependencies":{},"devDependencies":{"@types/chai":"^4.1.7","@types/mocha":"^5.2.5","@types/node":"^10.12.18","aws-sdk":"^2.391.0","chai":"^4.2.0","gh-pages":"^2.0.1","mocha":"^5.2.0","rimraf":"^2.6.3","touch":"^3.1.0","ts-node":"^7.0.1","tslint":"^5.12.1","typedoc":"^0.14.2","typescript":"^3.2.4"},"peerDependencies":{"aws-sdk":"^2.391.0"},"readme":"# Dynameh\nDynamoDB on Node more easier\n\nDynameh makes the official [DynamoDB JavaScript API](http://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/DynamoDB.html) easier to use.  It makes it easier to:\n\n- [build request objects](https://giftbit.github.io/dynameh/modules/_requestbuilder_.html)\n- [unwrap response objects](https://giftbit.github.io/dynameh/modules/_responseunwrapper_.html)\n- [build a projection expression](https://giftbit.github.io/dynameh/modules/_requestbuilder_.html#addprojection)\n- [build a condition expression](https://giftbit.github.io/dynameh/modules/_requestbuilder_.html#addcondition)\n- [run oversized batch requests](https://giftbit.github.io/dynameh/modules/_batchhelper_.html)\n- [run requests concurrently that can't be run in batch](https://giftbit.github.io/dynameh/modules/_concurrenthelper_.html)\n- [implement optimistic locking](https://giftbit.github.io/dynameh/interfaces/_tableschema_.tableschema.html#versionkeyfield)\n- [configure Date serialization](https://giftbit.github.io/dynameh/interfaces/_tableschema_.tableschema.html#dateserializationfunction)\n\n## Installation\n\nDynameh is your typical NPM package.\n\n```bash\nnpm install --save dynameh\n```\n\n## Usage\n\n```javascript\nimport * as dynameh from \"dynameh\";\n// or\nconst dynameh = require(\"dynameh\");\n```\n\nSee the [documentation](https://giftbit.github.io/dynameh/) for details on each module and its methods.\n\n### A Simple Example\n\nThis example is written using async/await which is available in TypeScript and ES2017.\n\n```javascript\nimport * as aws from \"aws-sdk\";\nimport * as dynameh from \"dynameh\";\n\n// Initialize the DynamoDB client.\nconst dynamodb = new aws.DynamoDB({\n    apiVersion: \"2012-08-10\",\n    region: \"us-west-1\"\n});\n\n// Set up the table schema.\nconst tableSchema = {\n    tableName: \"motorcycles\",\n    partitionKeyField: \"id\",\n    partitionKeyType: \"string\"\n};\n\nasync function updateMotorcycleHorsePower(motorcycleId, bhp) {\n    // Fetch the item from the database.\n    const getRequest = dynameh.requestBuilder.buildGetInput(tableSchema, motorcycleId);\n    const getResult = await dynamodb.getItem(getRequest).promise();\n    let motorcycle = dynameh.responseUnwrapper.unwrapGetOutput(getResult);\n    \n    if (!motorcycle) {\n        // Item not found, create it.\n        motorcycle = {\n            id: motorcycleId\n        };\n    }\n    \n    // Update the horse power stat.\n    motorcycle.bhp = bhp;\n    \n    // Put the updated object in the database.\n    const putRequest = dynameh.requestBuilder.buildPutInput(tableSchema, motorcycle);\n    await dynamodb.putItem(putRequest).promise();\n}\n\nupdateMotorcycleHorsePower(\"sv-650\", 73.4);\n```\n\n### TableSchema\n\nThe key to easy building of requests in Dynameh is the [TableSchema](https://giftbit.github.io/dynameh/interfaces/_tableschema_.tableschema.html).  This simple object defines all the extra information Dynameh needs to build requests.\n\nFor a table called `MyTable` with a partition key `id` that is a number...\n\n```json\n{\n  \"tableName\": \"MyTable\",\n  \"partitionKeyField\": \"id\",\n  \"partitionKeyType\": \"number\"\n}\n```\n\nFor a table called `MyAdvancedTable` with a partition key `id` that is a string, a sort key `date` that is a number, and a version field `version`...\n\n```json\n{\n  \"tableName\": \"MyAdvancedTable\",\n  \"partitionKeyField\": \"id\",\n  \"partitionKeyType\": \"string\",\n  \"sortKeyField\": \"date\",\n  \"sortKeyType\": \"number\",\n  \"versionKeyField\": \"version\"\n}\n```\n\n### Optimistic Locking\n\nOptimistic locking is a strategy for preventing changes from clobbering each other.  For example two processes read from the database, make unrelated changes, and then both write to the database but the second write overwrites the first (clobbers).\n\nEnable optimistic locking by setting the `versionKeyField` on your TableSchema.  In the second TableSchema example that field is `version`.  The `versionKeyField` will be automatically incremented on the server side during a put request.  If the value for `versionKeyField` sent does not match the current value in the database then the contents have changed since the last get and the optimistic lock has failed.  In that case you should get the latest version from the database and replay the update against that.\n\n```javascript\nimport * as aws from \"aws-sdk\";\nimport * as dynameh from \"dynameh\";\n\n// Initialize the DynamoDB client.\nconst dynamodb = new aws.DynamoDB({\n    apiVersion: \"2012-08-10\",\n    region: \"us-west-1\"\n});\n\n// Set up the table schema.\nconst tableSchema = {\n    tableName: \"motorcycles\",\n    partitionKeyField: \"id\",\n    partitionKeyType: \"string\",\n    versionKeyField: \"version\"\n};\n\nasync function updateMotorcycleHorsePower(motorcycleId, bhp) {\n    // Fetch the item from the database.\n    const getRequest = dynameh.requestBuilder.buildGetInput(tableSchema, motorcycleId);\n    const getResult = await dynamodb.getItem(getRequest).promise();\n    let motorcycle = dynameh.responseUnwrapper.unwrapGetOutput(getResult);\n    \n    if (!motorcycle) {\n        // Item not found, create it.\n        // Note that we don't need to set the version on create.\n        motorcycle = {\n            id: motorcycleId\n        };\n    }\n    \n    // Update the horse power stat.\n    motorcycle.bhp = bhp;\n    \n    // Put the updated object in the database.\n    const putRequest = dynameh.requestBuilder.buildPutInput(tableSchema, motorcycle);\n    try {\n        await dynamodb.putItem(putRequest).promise();\n    } catch (err) {\n        if (err.code === \"ConditionalCheckFailedException\") {\n            // If this is the error code then the optimistic locking has failed\n            // and we should redo the update operation (done here with recursion).\n            updateMotorcycleHorsePower(motorcycleId, bhp);\n        } else {\n            throw err;\n        }\n    }\n}\n\nupdateMotorcycleHorsePower(\"sv-650\", 73.4);\n```\n\n### Conditions\n\nConditions can be added to a put or delete request to make the operation conditional.\n\nOne of the most useful conditions is that the item must not already exist (create but not update).  This is done by asserting `attribute_not_exists` on the primary key.  For example...\n\n```javascript\nconst tableSchema = {\n    tableName: \"Boats\",\n    partitionKeyField: \"name\",\n    partitionKeyType: \"string\"\n};\n\nasync function addNewBoat(boat) {\n    const putRequest = dynameh.requestBuilder.buildPutInput(tableSchema, boat);\n    const conditionalPutRequest = dynameh.requestBuilder.addCondition(tableSchema, putRequest, {attribute: \"name\", operator: \"attribute_not_exists\"});\n    // Note that addCondition() does not change the original object.\n    // putRequest != conditionalPutRequest\n    \n    try {\n        await dynamodb.putItem(conditionalPutRequest).promise();\n    } catch (err) {\n        if (err.code === \"ConditionalCheckFailedException\") {\n            throw new Error(\"This boat already exists!\");\n        } else {\n            throw err;\n        }\n    }\n}\n\naddNewBoat({\n    name: \"Boaty McBoatface\",\n    type: \"submarine\",\n    autonomous: true\n});\n```\n\nThe following conditions are available...\n\n| condition            | # of value parameters |\n|----------------------|-----------------------|\n| =                    | 1                     |\n| <>                   | 1                     |\n| <                    | 1                     |\n| <=                   | 1                     |\n| >                    | 1                     |\n| >=                   | 1                     |\n| BETWEEN              | 2                     |\n| IN                   | at least 1            |\n| attribute_exists     | 0                     |\n| attribute_not_exists | 0                     |\n| attribute_type       | 1                     |\n| begins_with          | 1                     |\n| contains             | 1                     |\n| size                 | 0                     |\n\n### Projections\n\nProjections can be added to a get, batch get or query request to control what attributes are returned.  This saves bandwidth on the request.\n\nFor example...\n\n```javascript\nconst tableSchema = {\n    tableName: \"Transactions\",\n    partitionKeyField: \"customerId\",\n    partitionKeyType: \"string\",\n    sortKeyField: \"transactionId\",\n    sortKeyType: \"string\",\n};\n\nasync function getTransactionDates(customerId) {\n    const queryRequest = dynameh.requestBuilder.buildQueryInput(tableSchema, customerId);\n    const projectedQueryRequest = dynameh.requestBuilder.addProjection(tableSchema, queryRequest, [\"date\"]);\n    // Note that addProjection() does not change the original object.\n    // queryRequest != projectedQueryRequest\n    \n    const queryResponse = await dynamodb.query(projectedQueryRequest).promise();\n    const transactions = dynameh.responseUnwrapper.unwrapQueryOutput(queryResponse);\n    return transactions.map(t => t.date);\n}\n\ngetTransactionDates(\"BusinessFactory\");\n```\n\n### Date Serialization\n\nDate serialization can be configured by setting `dateSerializationFunction` on your `TableSchema`.  It's a function that takes in a `Date` and returns a `string` or `number`.  By default Dates are serialized as ISO-8601 strings.\n\nFor example...\n\n```javascript\nconst tableSchema = {\n    tableName: \"MyTable\",\n    partitionKeyField: \"id\",\n    partitionKeyType: \"number\",\n    dateSerializationFunction: date => date.toISOString()   // same as default\n};\n```\n","readmeFilename":"README.md","gitHead":"8162eee56f9bca2d60adb04dce301f972da3dd16","_id":"dynameh@3.3.0-beta.1","_npmVersion":"6.1.0","_nodeVersion":"8.10.0","_npmUser":{"name":"pushplay","email":"pushplay@gmail.com"},"dist":{"integrity":"sha512-0938uPfY1tRkfqXHU1H9FvyQtVL6+Kslq9kotRun1tEo0A2p1gouvunHk3SBjuzPFCcnVnPe88ZOIanKbpZ8Yw==","shasum":"d111920d783a24ef5da4547e9f1938bfd28ddfad","tarball":"https://registry.npmjs.org/dynameh/-/dynameh-3.3.0-beta.1.tgz","fileCount":25,"unpackedSize":111880,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJcmR6FCRA9TVsSAnZWagAAqZYP/iownG5re43Co3jGzwvN\nJECI+GcC+RIE8Teh53W9KYCVuUNsTSZdnYFe0+JQ+kYYfJ6ZG9kHQxcERIE4\nmqiFWqYuINBe0oMXTlzpbm4q/Q8XOLIlqjgg2k2lDuZ0ZxZ2PReEIR5Xf57i\nb4snOAfKoXaiFZCunQyo6D1dfL9+ibV93y5tlEEAeWK0WQrlrguzNeMTisx6\nLI+/9lLR2+gOkOUXd1Fj6k8PzOal0tBDwnrJ3E/T3V1rzwoB6q7a1r7kmCyn\neLKRJmxKEJVqxnLG6cbaCJnY8p9u5jU8s1GERONLKMLLcalKoZzjnf12Q655\niu0EjTit+bKmjJqBNss/QgqryVLjXVYud6CARizomBYY5okSAnE8xOgQDD+H\nhwhcg4VV2skFgJNZlUAkPfc5uYNAsqLfnbj4aIgAcWmo4vdztqRYuzJ801qr\nwI+8vYas/67MBY+svyWTV8JudJylnrtG8Con1LRleonkmIcHscSRtHi/rkJ9\nnQJUbjLtERokXoeCOAWFRRjZb8GsNKGTjJCatSH2PCql/PyB8CHn/gWVtiXD\nvVhJNiG3aND/EdOBiDS4gNZH+83iHBN0qaCgQP12yRpyu7VhRGhYWNqeSNIG\nv3wlluvbrwnc5YyQso1rd2cKxFIfAjeQuKdSje4QinZZWmRoKkAcc4bpwbBV\nc8C8\r\n=4YiX\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDtFwWcJUNmOc1a5uECeijkrBegkVoe8MQ+5J8kBpIgGgIgXLI7jBYR4Ahb4B0elqWaT8mvUQMt8gEbpwzCGzeCBVY="}]},"maintainers":[{"name":"pushplay","email":"pushplay@gmail.com"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/dynameh_3.3.0-beta.1_1553538692492_0.5347976317719598"},"_hasShrinkwrap":false},"3.3.0-beta.2":{"name":"dynameh","version":"3.3.0-beta.2","description":"DynamoDB on Node more easier","main":"dist/index.js","types":"dist/index.d.ts","scripts":{"build":"tsc","clean":"rimraf ./dist","docs":"rimraf ./docs && typedoc src/ --out docs --mode modules --module commonjs --target es6 --excludePrivate --excludeNotExported --exclude '**/*.test.ts' --name Dynameh && touch ./docs/.nojekyll && gh-pages -d docs -t","lint":"tslint --project tsconfig.json","prepublishOnly":"npm run clean && npm run build && npm run lint && npm run test && npm run docs","test":"mocha --recursive --throw-deprecation --require ts-node/register \"src/**/*.test.ts\""},"repository":{"type":"git","url":"git+https://github.com/Giftbit/dynameh.git"},"keywords":["dynamodb"],"contributors":[{"name":"Jeffery Grajkowski","email":"pushplay@gmail.com","url":"https://github.com/pushplay/"},{"name":"Graham Baradoy","email":"graham@giftbit.com","url":"https://github.com/Baradoy/"}],"license":"MIT","bugs":{"url":"https://github.com/Giftbit/dynameh/issues"},"homepage":"https://github.com/Giftbit/dynameh#readme","dependencies":{},"devDependencies":{"@types/chai":"^4.1.7","@types/mocha":"^5.2.5","@types/node":"^10.12.18","aws-sdk":"^2.391.0","chai":"^4.2.0","gh-pages":"^2.0.1","mocha":"^5.2.0","rimraf":"^2.6.3","touch":"^3.1.0","ts-node":"^7.0.1","tslint":"^5.12.1","typedoc":"^0.14.2","typescript":"^3.2.4"},"peerDependencies":{"aws-sdk":"^2.391.0"},"readme":"# Dynameh\nDynamoDB on Node more easier\n\nDynameh makes the official [DynamoDB JavaScript API](http://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/DynamoDB.html) easier to use.  It makes it easier to:\n\n- [build request objects](https://giftbit.github.io/dynameh/modules/_requestbuilder_.html)\n- [unwrap response objects](https://giftbit.github.io/dynameh/modules/_responseunwrapper_.html)\n- [build a projection expression](https://giftbit.github.io/dynameh/modules/_requestbuilder_.html#addprojection)\n- [build a condition expression](https://giftbit.github.io/dynameh/modules/_requestbuilder_.html#addcondition)\n- [run oversized batch requests](https://giftbit.github.io/dynameh/modules/_batchhelper_.html)\n- [run requests concurrently that can't be run in batch](https://giftbit.github.io/dynameh/modules/_concurrenthelper_.html)\n- [implement optimistic locking](https://giftbit.github.io/dynameh/interfaces/_tableschema_.tableschema.html#versionkeyfield)\n- [configure Date serialization](https://giftbit.github.io/dynameh/interfaces/_tableschema_.tableschema.html#dateserializationfunction)\n\n## Installation\n\nDynameh is your typical NPM package.\n\n```bash\nnpm install --save dynameh\n```\n\n## Usage\n\n```javascript\nimport * as dynameh from \"dynameh\";\n// or\nconst dynameh = require(\"dynameh\");\n```\n\nSee the [documentation](https://giftbit.github.io/dynameh/) for details on each module and its methods.\n\n### A Simple Example\n\nThis example is written using async/await which is available in TypeScript and ES2017.\n\n```javascript\nimport * as aws from \"aws-sdk\";\nimport * as dynameh from \"dynameh\";\n\n// Initialize the DynamoDB client.\nconst dynamodb = new aws.DynamoDB({\n    apiVersion: \"2012-08-10\",\n    region: \"us-west-1\"\n});\n\n// Set up the table schema.\nconst tableSchema = {\n    tableName: \"motorcycles\",\n    partitionKeyField: \"id\",\n    partitionKeyType: \"string\"\n};\n\nasync function updateMotorcycleHorsePower(motorcycleId, bhp) {\n    // Fetch the item from the database.\n    const getRequest = dynameh.requestBuilder.buildGetInput(tableSchema, motorcycleId);\n    const getResult = await dynamodb.getItem(getRequest).promise();\n    let motorcycle = dynameh.responseUnwrapper.unwrapGetOutput(getResult);\n    \n    if (!motorcycle) {\n        // Item not found, create it.\n        motorcycle = {\n            id: motorcycleId\n        };\n    }\n    \n    // Update the horse power stat.\n    motorcycle.bhp = bhp;\n    \n    // Put the updated object in the database.\n    const putRequest = dynameh.requestBuilder.buildPutInput(tableSchema, motorcycle);\n    await dynamodb.putItem(putRequest).promise();\n}\n\nupdateMotorcycleHorsePower(\"sv-650\", 73.4);\n```\n\n### TableSchema\n\nThe key to easy building of requests in Dynameh is the [TableSchema](https://giftbit.github.io/dynameh/interfaces/_tableschema_.tableschema.html).  This simple object defines all the extra information Dynameh needs to build requests.\n\nFor a table called `MyTable` with a partition key `id` that is a number...\n\n```json\n{\n  \"tableName\": \"MyTable\",\n  \"partitionKeyField\": \"id\",\n  \"partitionKeyType\": \"number\"\n}\n```\n\nFor a table called `MyAdvancedTable` with a partition key `id` that is a string, a sort key `date` that is a number, and a version field `version`...\n\n```json\n{\n  \"tableName\": \"MyAdvancedTable\",\n  \"partitionKeyField\": \"id\",\n  \"partitionKeyType\": \"string\",\n  \"sortKeyField\": \"date\",\n  \"sortKeyType\": \"number\",\n  \"versionKeyField\": \"version\"\n}\n```\n\n### Optimistic Locking\n\nOptimistic locking is a strategy for preventing changes from clobbering each other.  For example two processes read from the database, make unrelated changes, and then both write to the database but the second write overwrites the first (clobbers).\n\nEnable optimistic locking by setting the `versionKeyField` on your TableSchema.  In the second TableSchema example that field is `version`.  The `versionKeyField` will be automatically incremented on the server side during a put request.  If the value for `versionKeyField` sent does not match the current value in the database then the contents have changed since the last get and the optimistic lock has failed.  In that case you should get the latest version from the database and replay the update against that.\n\n```javascript\nimport * as aws from \"aws-sdk\";\nimport * as dynameh from \"dynameh\";\n\n// Initialize the DynamoDB client.\nconst dynamodb = new aws.DynamoDB({\n    apiVersion: \"2012-08-10\",\n    region: \"us-west-1\"\n});\n\n// Set up the table schema.\nconst tableSchema = {\n    tableName: \"motorcycles\",\n    partitionKeyField: \"id\",\n    partitionKeyType: \"string\",\n    versionKeyField: \"version\"\n};\n\nasync function updateMotorcycleHorsePower(motorcycleId, bhp) {\n    // Fetch the item from the database.\n    const getRequest = dynameh.requestBuilder.buildGetInput(tableSchema, motorcycleId);\n    const getResult = await dynamodb.getItem(getRequest).promise();\n    let motorcycle = dynameh.responseUnwrapper.unwrapGetOutput(getResult);\n    \n    if (!motorcycle) {\n        // Item not found, create it.\n        // Note that we don't need to set the version on create.\n        motorcycle = {\n            id: motorcycleId\n        };\n    }\n    \n    // Update the horse power stat.\n    motorcycle.bhp = bhp;\n    \n    // Put the updated object in the database.\n    const putRequest = dynameh.requestBuilder.buildPutInput(tableSchema, motorcycle);\n    try {\n        await dynamodb.putItem(putRequest).promise();\n    } catch (err) {\n        if (err.code === \"ConditionalCheckFailedException\") {\n            // If this is the error code then the optimistic locking has failed\n            // and we should redo the update operation (done here with recursion).\n            updateMotorcycleHorsePower(motorcycleId, bhp);\n        } else {\n            throw err;\n        }\n    }\n}\n\nupdateMotorcycleHorsePower(\"sv-650\", 73.4);\n```\n\n### Conditions\n\nConditions can be added to a put or delete request to make the operation conditional.\n\nOne of the most useful conditions is that the item must not already exist (create but not update).  This is done by asserting `attribute_not_exists` on the primary key.  For example...\n\n```javascript\nconst tableSchema = {\n    tableName: \"Boats\",\n    partitionKeyField: \"name\",\n    partitionKeyType: \"string\"\n};\n\nasync function addNewBoat(boat) {\n    const putRequest = dynameh.requestBuilder.buildPutInput(tableSchema, boat);\n    const conditionalPutRequest = dynameh.requestBuilder.addCondition(tableSchema, putRequest, {attribute: \"name\", operator: \"attribute_not_exists\"});\n    // Note that addCondition() does not change the original object.\n    // putRequest != conditionalPutRequest\n    \n    try {\n        await dynamodb.putItem(conditionalPutRequest).promise();\n    } catch (err) {\n        if (err.code === \"ConditionalCheckFailedException\") {\n            throw new Error(\"This boat already exists!\");\n        } else {\n            throw err;\n        }\n    }\n}\n\naddNewBoat({\n    name: \"Boaty McBoatface\",\n    type: \"submarine\",\n    autonomous: true\n});\n```\n\nThe following conditions are available...\n\n| condition            | # of value parameters |\n|----------------------|-----------------------|\n| =                    | 1                     |\n| <>                   | 1                     |\n| <                    | 1                     |\n| <=                   | 1                     |\n| >                    | 1                     |\n| >=                   | 1                     |\n| BETWEEN              | 2                     |\n| IN                   | at least 1            |\n| attribute_exists     | 0                     |\n| attribute_not_exists | 0                     |\n| attribute_type       | 1                     |\n| begins_with          | 1                     |\n| contains             | 1                     |\n| size                 | 0                     |\n\n### Projections\n\nProjections can be added to a get, batch get or query request to control what attributes are returned.  This saves bandwidth on the request.\n\nFor example...\n\n```javascript\nconst tableSchema = {\n    tableName: \"Transactions\",\n    partitionKeyField: \"customerId\",\n    partitionKeyType: \"string\",\n    sortKeyField: \"transactionId\",\n    sortKeyType: \"string\",\n};\n\nasync function getTransactionDates(customerId) {\n    const queryRequest = dynameh.requestBuilder.buildQueryInput(tableSchema, customerId);\n    const projectedQueryRequest = dynameh.requestBuilder.addProjection(tableSchema, queryRequest, [\"date\"]);\n    // Note that addProjection() does not change the original object.\n    // queryRequest != projectedQueryRequest\n    \n    const queryResponse = await dynamodb.query(projectedQueryRequest).promise();\n    const transactions = dynameh.responseUnwrapper.unwrapQueryOutput(queryResponse);\n    return transactions.map(t => t.date);\n}\n\ngetTransactionDates(\"BusinessFactory\");\n```\n\n### Date Serialization\n\nDate serialization can be configured by setting `dateSerializationFunction` on your `TableSchema`.  It's a function that takes in a `Date` and returns a `string` or `number`.  By default Dates are serialized as ISO-8601 strings.\n\nFor example...\n\n```javascript\nconst tableSchema = {\n    tableName: \"MyTable\",\n    partitionKeyField: \"id\",\n    partitionKeyType: \"number\",\n    dateSerializationFunction: date => date.toISOString()   // same as default\n};\n```\n","readmeFilename":"README.md","gitHead":"8162eee56f9bca2d60adb04dce301f972da3dd16","_id":"dynameh@3.3.0-beta.2","_npmVersion":"6.1.0","_nodeVersion":"8.10.0","_npmUser":{"name":"pushplay","email":"pushplay@gmail.com"},"dist":{"integrity":"sha512-tsLmCYEmZ+7EjrT0JkkxXci+vyNRzwq80gwij61PuUd2+ooeG6wCoE8J5SUk04nsqVxOGkySJYPZLmX0xrliqQ==","shasum":"9c7b3308c3e66c8774536209e984a33a12bb0108","tarball":"https://registry.npmjs.org/dynameh/-/dynameh-3.3.0-beta.2.tgz","fileCount":27,"unpackedSize":119485,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJcmVDzCRA9TVsSAnZWagAAb4IP/AtqBC5fJ/Tt09wzSU7l\nu0KexQLhGxRcmbvYKeEn4rItNJ2C/sbZRiU+1t7xi3Bq9ii+3W+mq4+v3sA8\nAy5hIGb4DRe9VGnG/zwNiFh/8TNKhmLLb32gWbmHg4nAeIye6qoUz+LTo6qn\nt06ghNm9CS6Y8fmx7H/x2cT2lNF2iwYJ2wdKsxMnFnA8VkUs9pGWPO1QHayS\nj4WkO9bl3p2SQ1eqfE6CeXpFG6zBYO5MuznpSRr7PvHaza5fhVMrQdvOlfPQ\nikBPRA4VjopcbevEvVo0pxeIqGEQHLIttvnAcOZFXj6BVG6l+HUff49rcFAD\nQM7FkbY0oHwNQL5ZHWhjQ1pdlAlYRJ2JnrzvQ6R0glVwPqFK/5kah4N0tQNu\n8DR3cFM4EOTNTZ49nEaZBIeliroTBP0P+WTBzuFqpvmEvc4A3ZexZ+jmpRVi\nbisTD7Z1dlJsQH1JxjSSFFEe30SC+7hyj9mpi0WVeGyTTf09/d7L6KIJN3PU\nzowTBEK4zxbDg7wQ7OgvXgD/Hd47IXJZz8o8ppgAyBJZTmexIHv70one056Z\nwJAV8p1590iXKjgJYdRdYa39SxOirZO+KgMhV5rYFY4kbfYe38MJe1LK7Lsl\nCb26nSYXuhNv9t93UCfEzbB1aNjQK8q7/ux8czVE7ACMcU+CuNU/B0F/hSAz\nYsPi\r\n=RmJ0\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIHukpNr7so2udV0BbrA3PXPFCxezYwCibqKeNmI8pYrmAiEAgh8pRrGL9IRvdeS5IYGJ++5z6YYgAWwkF3UFVa4qXo4="}]},"maintainers":[{"name":"pushplay","email":"pushplay@gmail.com"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/dynameh_3.3.0-beta.2_1553551602521_0.0034153074569660546"},"_hasShrinkwrap":false},"3.3.0-beta.3":{"name":"dynameh","version":"3.3.0-beta.3","description":"DynamoDB on Node more easier","main":"dist/index.js","types":"dist/index.d.ts","scripts":{"build":"tsc","clean":"rimraf ./dist","docs":"rimraf ./docs && typedoc src/ --out docs --mode modules --module commonjs --target es6 --excludePrivate --excludeNotExported --exclude '**/*.test.ts' --name Dynameh && touch ./docs/.nojekyll && gh-pages -d docs -t","lint":"tslint --project tsconfig.json","prepublishOnly":"npm run clean && npm run build && npm run lint && npm run test && npm run docs","test":"mocha --recursive --throw-deprecation --require ts-node/register \"src/**/*.test.ts\""},"repository":{"type":"git","url":"git+https://github.com/Giftbit/dynameh.git"},"keywords":["dynamodb"],"contributors":[{"name":"Jeffery Grajkowski","email":"pushplay@gmail.com","url":"https://github.com/pushplay/"},{"name":"Graham Baradoy","email":"graham@giftbit.com","url":"https://github.com/Baradoy/"}],"license":"MIT","bugs":{"url":"https://github.com/Giftbit/dynameh/issues"},"homepage":"https://github.com/Giftbit/dynameh#readme","dependencies":{},"devDependencies":{"@types/chai":"^4.1.7","@types/mocha":"^5.2.5","@types/node":"^10.12.18","aws-sdk":"^2.391.0","chai":"^4.2.0","gh-pages":"^2.0.1","mocha":"^5.2.0","rimraf":"^2.6.3","touch":"^3.1.0","ts-node":"^7.0.1","tslint":"^5.12.1","typedoc":"^0.14.2","typescript":"^3.2.4"},"peerDependencies":{"aws-sdk":"^2.391.0"},"readme":"# Dynameh\nDynamoDB on Node more easier\n\nDynameh makes the official [DynamoDB JavaScript API](http://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/DynamoDB.html) easier to use.  It makes it easier to:\n\n- [build request objects](https://giftbit.github.io/dynameh/modules/_requestbuilder_.html)\n- [unwrap response objects](https://giftbit.github.io/dynameh/modules/_responseunwrapper_.html)\n- [build a projection expression](https://giftbit.github.io/dynameh/modules/_requestbuilder_.html#addprojection)\n- [build a condition expression](https://giftbit.github.io/dynameh/modules/_requestbuilder_.html#addcondition)\n- [run oversized batch requests](https://giftbit.github.io/dynameh/modules/_batchhelper_.html)\n- [run requests concurrently that can't be run in batch](https://giftbit.github.io/dynameh/modules/_concurrenthelper_.html)\n- [implement optimistic locking](https://giftbit.github.io/dynameh/interfaces/_tableschema_.tableschema.html#versionkeyfield)\n- [configure Date serialization](https://giftbit.github.io/dynameh/interfaces/_tableschema_.tableschema.html#dateserializationfunction)\n\n## Installation\n\nDynameh is your typical NPM package.\n\n```bash\nnpm install --save dynameh\n```\n\n## Usage\n\n```javascript\nimport * as dynameh from \"dynameh\";\n// or\nconst dynameh = require(\"dynameh\");\n```\n\nSee the [documentation](https://giftbit.github.io/dynameh/) for details on each module and its methods.\n\n### A Simple Example\n\nThis example is written using async/await which is available in TypeScript and ES2017.\n\n```javascript\nimport * as aws from \"aws-sdk\";\nimport * as dynameh from \"dynameh\";\n\n// Initialize the DynamoDB client.\nconst dynamodb = new aws.DynamoDB({\n    apiVersion: \"2012-08-10\",\n    region: \"us-west-1\"\n});\n\n// Set up the table schema.\nconst tableSchema = {\n    tableName: \"motorcycles\",\n    partitionKeyField: \"id\",\n    partitionKeyType: \"string\"\n};\n\nasync function updateMotorcycleHorsePower(motorcycleId, bhp) {\n    // Fetch the item from the database.\n    const getRequest = dynameh.requestBuilder.buildGetInput(tableSchema, motorcycleId);\n    const getResult = await dynamodb.getItem(getRequest).promise();\n    let motorcycle = dynameh.responseUnwrapper.unwrapGetOutput(getResult);\n    \n    if (!motorcycle) {\n        // Item not found, create it.\n        motorcycle = {\n            id: motorcycleId\n        };\n    }\n    \n    // Update the horse power stat.\n    motorcycle.bhp = bhp;\n    \n    // Put the updated object in the database.\n    const putRequest = dynameh.requestBuilder.buildPutInput(tableSchema, motorcycle);\n    await dynamodb.putItem(putRequest).promise();\n}\n\nupdateMotorcycleHorsePower(\"sv-650\", 73.4);\n```\n\n### TableSchema\n\nThe key to easy building of requests in Dynameh is the [TableSchema](https://giftbit.github.io/dynameh/interfaces/_tableschema_.tableschema.html).  This simple object defines all the extra information Dynameh needs to build requests.\n\nFor a table called `MyTable` with a partition key `id` that is a number...\n\n```json\n{\n  \"tableName\": \"MyTable\",\n  \"partitionKeyField\": \"id\",\n  \"partitionKeyType\": \"number\"\n}\n```\n\nFor a table called `MyAdvancedTable` with a partition key `id` that is a string, a sort key `date` that is a number, and a version field `version`...\n\n```json\n{\n  \"tableName\": \"MyAdvancedTable\",\n  \"partitionKeyField\": \"id\",\n  \"partitionKeyType\": \"string\",\n  \"sortKeyField\": \"date\",\n  \"sortKeyType\": \"number\",\n  \"versionKeyField\": \"version\"\n}\n```\n\n### Optimistic Locking\n\nOptimistic locking is a strategy for preventing changes from clobbering each other.  For example two processes read from the database, make unrelated changes, and then both write to the database but the second write overwrites the first (clobbers).\n\nEnable optimistic locking by setting the `versionKeyField` on your TableSchema.  In the second TableSchema example that field is `version`.  The `versionKeyField` will be automatically incremented on the server side during a put request.  If the value for `versionKeyField` sent does not match the current value in the database then the contents have changed since the last get and the optimistic lock has failed.  In that case you should get the latest version from the database and replay the update against that.\n\n```javascript\nimport * as aws from \"aws-sdk\";\nimport * as dynameh from \"dynameh\";\n\n// Initialize the DynamoDB client.\nconst dynamodb = new aws.DynamoDB({\n    apiVersion: \"2012-08-10\",\n    region: \"us-west-1\"\n});\n\n// Set up the table schema.\nconst tableSchema = {\n    tableName: \"motorcycles\",\n    partitionKeyField: \"id\",\n    partitionKeyType: \"string\",\n    versionKeyField: \"version\"\n};\n\nasync function updateMotorcycleHorsePower(motorcycleId, bhp) {\n    // Fetch the item from the database.\n    const getRequest = dynameh.requestBuilder.buildGetInput(tableSchema, motorcycleId);\n    const getResult = await dynamodb.getItem(getRequest).promise();\n    let motorcycle = dynameh.responseUnwrapper.unwrapGetOutput(getResult);\n    \n    if (!motorcycle) {\n        // Item not found, create it.\n        // Note that we don't need to set the version on create.\n        motorcycle = {\n            id: motorcycleId\n        };\n    }\n    \n    // Update the horse power stat.\n    motorcycle.bhp = bhp;\n    \n    // Put the updated object in the database.\n    const putRequest = dynameh.requestBuilder.buildPutInput(tableSchema, motorcycle);\n    try {\n        await dynamodb.putItem(putRequest).promise();\n    } catch (err) {\n        if (err.code === \"ConditionalCheckFailedException\") {\n            // If this is the error code then the optimistic locking has failed\n            // and we should redo the update operation (done here with recursion).\n            updateMotorcycleHorsePower(motorcycleId, bhp);\n        } else {\n            throw err;\n        }\n    }\n}\n\nupdateMotorcycleHorsePower(\"sv-650\", 73.4);\n```\n\n### Conditions\n\nConditions can be added to a put or delete request to make the operation conditional.\n\nOne of the most useful conditions is that the item must not already exist (create but not update).  This is done by asserting `attribute_not_exists` on the primary key.  For example...\n\n```javascript\nconst tableSchema = {\n    tableName: \"Boats\",\n    partitionKeyField: \"name\",\n    partitionKeyType: \"string\"\n};\n\nasync function addNewBoat(boat) {\n    const putRequest = dynameh.requestBuilder.buildPutInput(tableSchema, boat);\n    const conditionalPutRequest = dynameh.requestBuilder.addCondition(tableSchema, putRequest, {attribute: \"name\", operator: \"attribute_not_exists\"});\n    // Note that addCondition() does not change the original object.\n    // putRequest != conditionalPutRequest\n    \n    try {\n        await dynamodb.putItem(conditionalPutRequest).promise();\n    } catch (err) {\n        if (err.code === \"ConditionalCheckFailedException\") {\n            throw new Error(\"This boat already exists!\");\n        } else {\n            throw err;\n        }\n    }\n}\n\naddNewBoat({\n    name: \"Boaty McBoatface\",\n    type: \"submarine\",\n    autonomous: true\n});\n```\n\nThe following conditions are available...\n\n| condition            | # of value parameters |\n|----------------------|-----------------------|\n| =                    | 1                     |\n| <>                   | 1                     |\n| <                    | 1                     |\n| <=                   | 1                     |\n| >                    | 1                     |\n| >=                   | 1                     |\n| BETWEEN              | 2                     |\n| IN                   | at least 1            |\n| attribute_exists     | 0                     |\n| attribute_not_exists | 0                     |\n| attribute_type       | 1                     |\n| begins_with          | 1                     |\n| contains             | 1                     |\n| size                 | 0                     |\n\n### Projections\n\nProjections can be added to a get, batch get or query request to control what attributes are returned.  This saves bandwidth on the request.\n\nFor example...\n\n```javascript\nconst tableSchema = {\n    tableName: \"Transactions\",\n    partitionKeyField: \"customerId\",\n    partitionKeyType: \"string\",\n    sortKeyField: \"transactionId\",\n    sortKeyType: \"string\",\n};\n\nasync function getTransactionDates(customerId) {\n    const queryRequest = dynameh.requestBuilder.buildQueryInput(tableSchema, customerId);\n    const projectedQueryRequest = dynameh.requestBuilder.addProjection(tableSchema, queryRequest, [\"date\"]);\n    // Note that addProjection() does not change the original object.\n    // queryRequest != projectedQueryRequest\n    \n    const queryResponse = await dynamodb.query(projectedQueryRequest).promise();\n    const transactions = dynameh.responseUnwrapper.unwrapQueryOutput(queryResponse);\n    return transactions.map(t => t.date);\n}\n\ngetTransactionDates(\"BusinessFactory\");\n```\n\n### Date Serialization\n\nDate serialization can be configured by setting `dateSerializationFunction` on your `TableSchema`.  It's a function that takes in a `Date` and returns a `string` or `number`.  By default Dates are serialized as ISO-8601 strings.\n\nFor example...\n\n```javascript\nconst tableSchema = {\n    tableName: \"MyTable\",\n    partitionKeyField: \"id\",\n    partitionKeyType: \"number\",\n    dateSerializationFunction: date => date.toISOString()   // same as default\n};\n```\n","readmeFilename":"README.md","gitHead":"f19b33c07d854cc90a681969717d979ae5f98d9d","_id":"dynameh@3.3.0-beta.3","_npmVersion":"6.1.0","_nodeVersion":"8.10.0","_npmUser":{"name":"pushplay","email":"pushplay@gmail.com"},"dist":{"integrity":"sha512-seVid5xUrHqEjmiTK3sAg3+ks9HpNyvN4rm642BJF7wStPXJqbGs5w78+Zyi+pSF/SUtfk2Ykh9/s1mK/xGv8A==","shasum":"7f9adba665e9e0d4cf9036524de9d62dd7a5d237","tarball":"https://registry.npmjs.org/dynameh/-/dynameh-3.3.0-beta.3.tgz","fileCount":27,"unpackedSize":122924,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJcnQXiCRA9TVsSAnZWagAAVFIQAJZg7yGnT1d+keh2VRPe\nvw4r/kaJ+VyndaMLQOG6ZxW4yoG4nMudEBmh8qi7KTmX3CT76aaKPlX6cIkP\n/A1+v1zr2X5VjiNK/4IVF2Ovp6fUN9/CkrI9Mrve/6Qd1HrZG9TNcIw07Y+W\n0HSa07ngC4Q3xGXAZypbw4SrTt4OccYOMgD7bLstOopYTgvpgLDXm3LDUaqq\nQaeOt9Q2I76u01toNo0i8Xg9+VRD3bc+jhtiGYbVVQ5GbTbkC677ebubEzBF\n/dAITXJeHX+il6zr4c3fd3zfA8m4VfY5NJ7eVEyJ2xex3UPYwJ4S7Srbe15k\nt/JR3i1oFtpG40ui9aLMlIz6wtM/+8DsX2RX77R3EWKxswcCg945yz0WKSo2\nf0c2T1Ncqdpk0AbH5oor1SOVStQa5HLzuKI29PIJq/GbAn0KQylgoejc9PZu\nPlmwrW6ChVi+PnMw8QyEnHUNJUyun3QgGnJSyrgcAPEkefVcxmANHjAcyRMJ\nWNCCm0kVITk2FhzpXX1Z/T+EwVuqTAraHu3y7Ru/i6WgKXpMhTvSAVM+CS5q\ns12ik9s39ySH/BAVNO9jzrcuQkQj1oCFsejZvnlC1s/nKOgGndVL+6+0EBv4\nhc1d0njnaFGpSTOFozNT/qC8KJ4cIP7jxRm7RtaZwOKIQqSgN/hTl7SVUPkY\n8l16\r\n=pyHZ\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDbDtETRSyQUjAf3AaAzeYPdjFCHFRmQORWbraQ0H0D4QIgfN3HGwLQ3Z6Jkh6oGc5afX3DNmEhqNNvpV4XhrAN2jY="}]},"maintainers":[{"name":"pushplay","email":"pushplay@gmail.com"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/dynameh_3.3.0-beta.3_1553794530235_0.0071812357497036405"},"_hasShrinkwrap":false},"3.3.0-beta.4":{"name":"dynameh","version":"3.3.0-beta.4","description":"DynamoDB on Node more easier","main":"dist/index.js","types":"dist/index.d.ts","scripts":{"build":"tsc","clean":"rimraf ./dist","docs":"rimraf ./docs && typedoc src/ --out docs --mode modules --module commonjs --target es6 --excludePrivate --excludeNotExported --exclude '**/*.test.ts' --name Dynameh && touch ./docs/.nojekyll && gh-pages -d docs -t","lint":"tslint --project tsconfig.json","prepublishOnly":"npm run clean && npm run build && npm run lint && npm run test && npm run docs","test":"mocha --recursive --throw-deprecation --require ts-node/register \"src/**/*.test.ts\""},"repository":{"type":"git","url":"git+https://github.com/Giftbit/dynameh.git"},"keywords":["dynamodb"],"contributors":[{"name":"Jeffery Grajkowski","email":"pushplay@gmail.com","url":"https://github.com/pushplay/"},{"name":"Graham Baradoy","email":"graham@giftbit.com","url":"https://github.com/Baradoy/"}],"license":"MIT","bugs":{"url":"https://github.com/Giftbit/dynameh/issues"},"homepage":"https://github.com/Giftbit/dynameh#readme","dependencies":{},"devDependencies":{"@types/chai":"^4.1.7","@types/mocha":"^5.2.6","@types/node":"^11.12.1","aws-sdk":"^2.431.0","chai":"^4.2.0","gh-pages":"^2.0.1","mocha":"^6.0.2","rimraf":"^2.6.3","touch":"^3.1.0","ts-node":"^8.0.3","tslint":"^5.14.0","typedoc":"^0.14.2","typescript":"^3.3.4000"},"peerDependencies":{"aws-sdk":"^2.431.0"},"readme":"# Dynameh\nDynamoDB on Node more easier\n\nDynameh makes the official [DynamoDB JavaScript API](http://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/DynamoDB.html) easier to use.  It makes it easier to:\n\n- [build request objects](https://giftbit.github.io/dynameh/modules/_requestbuilder_.html)\n- [unwrap response objects](https://giftbit.github.io/dynameh/modules/_responseunwrapper_.html)\n- [build a projection expression](https://giftbit.github.io/dynameh/modules/_requestbuilder_.html#addprojection)\n- [build a condition expression](https://giftbit.github.io/dynameh/modules/_requestbuilder_.html#addcondition)\n- [run oversized batch requests](https://giftbit.github.io/dynameh/modules/_batchhelper_.html)\n- [run requests concurrently that can't be run in batch](https://giftbit.github.io/dynameh/modules/_concurrenthelper_.html)\n- [implement optimistic locking](https://giftbit.github.io/dynameh/interfaces/_tableschema_.tableschema.html#versionkeyfield)\n- [configure Date serialization](https://giftbit.github.io/dynameh/interfaces/_tableschema_.tableschema.html#dateserializationfunction)\n\n## Installation\n\nDynameh is your typical NPM package.\n\n```bash\nnpm install --save dynameh\n```\n\n## Usage\n\n```javascript\nimport * as dynameh from \"dynameh\";\n// or\nconst dynameh = require(\"dynameh\");\n```\n\nSee the [documentation](https://giftbit.github.io/dynameh/) for details on each module and its methods.\n\n### A Simple Example\n\nThis example is written using async/await which is available in TypeScript and ES2017.\n\n```javascript\nimport * as aws from \"aws-sdk\";\nimport * as dynameh from \"dynameh\";\n\n// Initialize the DynamoDB client.\nconst dynamodb = new aws.DynamoDB({\n    apiVersion: \"2012-08-10\",\n    region: \"us-west-1\"\n});\n\n// Set up the table schema.\nconst tableSchema = {\n    tableName: \"motorcycles\",\n    partitionKeyField: \"id\",\n    partitionKeyType: \"string\"\n};\n\nasync function updateMotorcycleHorsePower(motorcycleId, bhp) {\n    // Fetch the item from the database.\n    const getRequest = dynameh.requestBuilder.buildGetInput(tableSchema, motorcycleId);\n    const getResult = await dynamodb.getItem(getRequest).promise();\n    let motorcycle = dynameh.responseUnwrapper.unwrapGetOutput(getResult);\n    \n    if (!motorcycle) {\n        // Item not found, create it.\n        motorcycle = {\n            id: motorcycleId\n        };\n    }\n    \n    // Update the horse power stat.\n    motorcycle.bhp = bhp;\n    \n    // Put the updated object in the database.\n    const putRequest = dynameh.requestBuilder.buildPutInput(tableSchema, motorcycle);\n    await dynamodb.putItem(putRequest).promise();\n}\n\nupdateMotorcycleHorsePower(\"sv-650\", 73.4);\n```\n\n### TableSchema\n\nThe key to easy building of requests in Dynameh is the [TableSchema](https://giftbit.github.io/dynameh/interfaces/_tableschema_.tableschema.html).  This simple object defines all the extra information Dynameh needs to build requests.\n\nFor a table called `MyTable` with a partition key `id` that is a number...\n\n```json\n{\n  \"tableName\": \"MyTable\",\n  \"partitionKeyField\": \"id\",\n  \"partitionKeyType\": \"number\"\n}\n```\n\nFor a table called `MyAdvancedTable` with a partition key `id` that is a string, a sort key `date` that is a number, and a version field `version`...\n\n```json\n{\n  \"tableName\": \"MyAdvancedTable\",\n  \"partitionKeyField\": \"id\",\n  \"partitionKeyType\": \"string\",\n  \"sortKeyField\": \"date\",\n  \"sortKeyType\": \"number\",\n  \"versionKeyField\": \"version\"\n}\n```\n\n### Optimistic Locking\n\nOptimistic locking is a strategy for preventing changes from clobbering each other.  For example two processes read from the database, make unrelated changes, and then both write to the database but the second write overwrites the first (clobbers).\n\nEnable optimistic locking by setting the `versionKeyField` on your TableSchema.  In the second TableSchema example that field is `version`.  The `versionKeyField` will be automatically incremented on the server side during a put request.  If the value for `versionKeyField` sent does not match the current value in the database then the contents have changed since the last get and the optimistic lock has failed.  In that case you should get the latest version from the database and replay the update against that.\n\n```javascript\nimport * as aws from \"aws-sdk\";\nimport * as dynameh from \"dynameh\";\n\n// Initialize the DynamoDB client.\nconst dynamodb = new aws.DynamoDB({\n    apiVersion: \"2012-08-10\",\n    region: \"us-west-1\"\n});\n\n// Set up the table schema.\nconst tableSchema = {\n    tableName: \"motorcycles\",\n    partitionKeyField: \"id\",\n    partitionKeyType: \"string\",\n    versionKeyField: \"version\"\n};\n\nasync function updateMotorcycleHorsePower(motorcycleId, bhp) {\n    // Fetch the item from the database.\n    const getRequest = dynameh.requestBuilder.buildGetInput(tableSchema, motorcycleId);\n    const getResult = await dynamodb.getItem(getRequest).promise();\n    let motorcycle = dynameh.responseUnwrapper.unwrapGetOutput(getResult);\n    \n    if (!motorcycle) {\n        // Item not found, create it.\n        // Note that we don't need to set the version on create.\n        motorcycle = {\n            id: motorcycleId\n        };\n    }\n    \n    // Update the horse power stat.\n    motorcycle.bhp = bhp;\n    \n    // Put the updated object in the database.\n    const putRequest = dynameh.requestBuilder.buildPutInput(tableSchema, motorcycle);\n    try {\n        await dynamodb.putItem(putRequest).promise();\n    } catch (err) {\n        if (err.code === \"ConditionalCheckFailedException\") {\n            // If this is the error code then the optimistic locking has failed\n            // and we should redo the update operation (done here with recursion).\n            updateMotorcycleHorsePower(motorcycleId, bhp);\n        } else {\n            throw err;\n        }\n    }\n}\n\nupdateMotorcycleHorsePower(\"sv-650\", 73.4);\n```\n\n### Conditions\n\nConditions can be added to a put or delete request to make the operation conditional.\n\nOne of the most useful conditions is that the item must not already exist (create but not update).  This is done by asserting `attribute_not_exists` on the primary key.  For example...\n\n```javascript\nconst tableSchema = {\n    tableName: \"Boats\",\n    partitionKeyField: \"name\",\n    partitionKeyType: \"string\"\n};\n\nasync function addNewBoat(boat) {\n    const putRequest = dynameh.requestBuilder.buildPutInput(tableSchema, boat);\n    const conditionalPutRequest = dynameh.requestBuilder.addCondition(tableSchema, putRequest, {attribute: \"name\", operator: \"attribute_not_exists\"});\n    // Note that addCondition() does not change the original object.\n    // putRequest != conditionalPutRequest\n    \n    try {\n        await dynamodb.putItem(conditionalPutRequest).promise();\n    } catch (err) {\n        if (err.code === \"ConditionalCheckFailedException\") {\n            throw new Error(\"This boat already exists!\");\n        } else {\n            throw err;\n        }\n    }\n}\n\naddNewBoat({\n    name: \"Boaty McBoatface\",\n    type: \"submarine\",\n    autonomous: true\n});\n```\n\nThe following conditions are available...\n\n| condition            | # of value parameters |\n|----------------------|-----------------------|\n| =                    | 1                     |\n| <>                   | 1                     |\n| <                    | 1                     |\n| <=                   | 1                     |\n| >                    | 1                     |\n| >=                   | 1                     |\n| BETWEEN              | 2                     |\n| IN                   | at least 1            |\n| attribute_exists     | 0                     |\n| attribute_not_exists | 0                     |\n| attribute_type       | 1                     |\n| begins_with          | 1                     |\n| contains             | 1                     |\n| size                 | 0                     |\n\n### Projections\n\nProjections can be added to a get, batch get or query request to control what attributes are returned.  This saves bandwidth on the request.\n\nFor example...\n\n```javascript\nconst tableSchema = {\n    tableName: \"Transactions\",\n    partitionKeyField: \"customerId\",\n    partitionKeyType: \"string\",\n    sortKeyField: \"transactionId\",\n    sortKeyType: \"string\",\n};\n\nasync function getTransactionDates(customerId) {\n    const queryRequest = dynameh.requestBuilder.buildQueryInput(tableSchema, customerId);\n    const projectedQueryRequest = dynameh.requestBuilder.addProjection(tableSchema, queryRequest, [\"date\"]);\n    // Note that addProjection() does not change the original object.\n    // queryRequest != projectedQueryRequest\n    \n    const queryResponse = await dynamodb.query(projectedQueryRequest).promise();\n    const transactions = dynameh.responseUnwrapper.unwrapQueryOutput(queryResponse);\n    return transactions.map(t => t.date);\n}\n\ngetTransactionDates(\"BusinessFactory\");\n```\n\n### Date Serialization\n\nDate serialization can be configured by setting `dateSerializationFunction` on your `TableSchema`.  It's a function that takes in a `Date` and returns a `string` or `number`.  By default Dates are serialized as ISO-8601 strings.\n\nFor example...\n\n```javascript\nconst tableSchema = {\n    tableName: \"MyTable\",\n    partitionKeyField: \"id\",\n    partitionKeyType: \"number\",\n    dateSerializationFunction: date => date.toISOString()   // same as default\n};\n```\n","readmeFilename":"README.md","gitHead":"c2483bbbb8f9eee080a9822b13561d9895a97deb","_id":"dynameh@3.3.0-beta.4","_npmVersion":"6.1.0","_nodeVersion":"8.10.0","_npmUser":{"name":"pushplay","email":"pushplay@gmail.com"},"dist":{"integrity":"sha512-rz2GSfMLbZzHJ741xxl0C6wxa/CsgRv29mQEAtHElfmZ20sck8qLjzxvKw+2oCJggt+MJZUwglHDsd2w9Bgcyw==","shasum":"d31f0f2083e8b72b4c3c6f349a8df73d6e17b663","tarball":"https://registry.npmjs.org/dynameh/-/dynameh-3.3.0-beta.4.tgz","fileCount":27,"unpackedSize":121892,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJcnpNVCRA9TVsSAnZWagAACasP+gPLcwcCrZrl0Q2lvUba\niuW5BY/dgJqhSTibe0hY5CSsui8+OdjKUTkjn3LGC7P3FsroZbJQGz2v4fB1\nSx9a3VriWXU+g3VmZehYEB3VRsEP9SQvKLaQQGd5N4TyboYMORrzvbQukKZX\nPyDj3wHFH+bAD16JAEaqTuqKR8DC+0DXYNFF4yOt9pjxa7+JwBvueRpM3kLz\nTgRmuDJnW7ywFQoN4t5nQteoc4PluDPM/8kZPVYhBRvEHIlGWC60jOyotEhe\neJgI9W4ro95tVGj0lLOlubGik5Nkz5SpXEG20zdJDscIyZKbkI0Q43aItd8q\nAyfKTX8GCLssObIdWsmMKKRbMeqgR/fuSwvR9TLz4qiRC1qBQDKILxUquLPA\nTgnhSKgPa/ENdMpdYGvRyiFe5aEd18I4A5W7A3SmZrRH+0sjKMrFEBxr1LHy\nPekLU7Zs8QKssuyLtq23z8bbcrQJWz5bGvI5KY8QG3uV+b/hWIED9Rvb1+4s\n94CRRbjo9qjiRW6k5wGfdPXUPaStomewxrHnOdN73IGdNtcLztx85/F5thR+\nfa9H3po5fiEYhxNE2UfujbPrF6SIvdjdDuMduYWl/cCfG91nh/Xus+B6IbQ3\ng7tpZCON5aeq+kq0C6Nj13jpCu6Skzb7w+xuFmIIgJDKFiD3RfecrosvYQ4W\n+aVX\r\n=WB69\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCeQCBk+PS+52AR0YWMCPRBsr+nJ+o8TfrmDmbuI6LPqAIhAP0zJR1g5LnrnNZjFd/KLtwa/JrWceYSHJHEKbIMmmRX"}]},"maintainers":[{"name":"pushplay","email":"pushplay@gmail.com"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/dynameh_3.3.0-beta.4_1553896276695_0.2880314478507082"},"_hasShrinkwrap":false},"3.3.0-beta.5":{"name":"dynameh","version":"3.3.0-beta.5","description":"DynamoDB on Node more easier","main":"dist/index.js","types":"dist/index.d.ts","scripts":{"build":"tsc","clean":"rimraf ./dist","docs":"rimraf ./docs && typedoc src/ --out docs --mode modules --module commonjs --target es6 --excludePrivate --excludeNotExported --exclude '**/*.test.ts' --name Dynameh && touch ./docs/.nojekyll && gh-pages -d docs -t","lint":"tslint --project tsconfig.json","prepublishOnly":"npm run clean && npm run build && npm run lint && npm run test && npm run docs","test":"mocha --recursive --throw-deprecation --require ts-node/register \"src/**/*.test.ts\""},"repository":{"type":"git","url":"git+https://github.com/Giftbit/dynameh.git"},"keywords":["dynamodb"],"contributors":[{"name":"Jeffery Grajkowski","email":"pushplay@gmail.com","url":"https://github.com/pushplay/"},{"name":"Graham Baradoy","email":"graham@giftbit.com","url":"https://github.com/Baradoy/"}],"license":"MIT","bugs":{"url":"https://github.com/Giftbit/dynameh/issues"},"homepage":"https://github.com/Giftbit/dynameh#readme","dependencies":{},"devDependencies":{"@types/chai":"^4.1.7","@types/mocha":"^5.2.6","@types/node":"^11.12.1","aws-sdk":"^2.431.0","chai":"^4.2.0","gh-pages":"^2.0.1","mocha":"^6.0.2","rimraf":"^2.6.3","touch":"^3.1.0","ts-node":"^8.0.3","tslint":"^5.14.0","typedoc":"^0.14.2","typescript":"^3.3.4000"},"peerDependencies":{"aws-sdk":"^2.431.0"},"readme":"# Dynameh\nDynamoDB on Node more easier\n\nDynameh makes the official [DynamoDB JavaScript API](http://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/DynamoDB.html) easier to use.  It makes it easier to:\n\n- [build request objects](https://giftbit.github.io/dynameh/modules/_requestbuilder_.html)\n- [unwrap response objects](https://giftbit.github.io/dynameh/modules/_responseunwrapper_.html)\n- [build a projection expression](https://giftbit.github.io/dynameh/modules/_requestbuilder_.html#addprojection)\n- [build a condition expression](https://giftbit.github.io/dynameh/modules/_requestbuilder_.html#addcondition)\n- [run oversized batch requests](https://giftbit.github.io/dynameh/modules/_batchhelper_.html)\n- [run requests concurrently that can't be run in batch](https://giftbit.github.io/dynameh/modules/_concurrenthelper_.html)\n- [implement optimistic locking](https://giftbit.github.io/dynameh/interfaces/_tableschema_.tableschema.html#versionkeyfield)\n- [configure Date serialization](https://giftbit.github.io/dynameh/interfaces/_tableschema_.tableschema.html#dateserializationfunction)\n\n## Installation\n\nDynameh is your typical NPM package.\n\n```bash\nnpm install --save dynameh\n```\n\n## Usage\n\n```javascript\nimport * as dynameh from \"dynameh\";\n// or\nconst dynameh = require(\"dynameh\");\n```\n\nSee the [documentation](https://giftbit.github.io/dynameh/) for details on each module and its methods.\n\n### A Simple Example\n\nThis example is written using async/await which is available in TypeScript and ES2017.\n\n```javascript\nimport * as aws from \"aws-sdk\";\nimport * as dynameh from \"dynameh\";\n\n// Initialize the DynamoDB client.\nconst dynamodb = new aws.DynamoDB({\n    apiVersion: \"2012-08-10\",\n    region: \"us-west-1\"\n});\n\n// Set up the table schema.\nconst tableSchema = {\n    tableName: \"motorcycles\",\n    partitionKeyField: \"id\",\n    partitionKeyType: \"string\"\n};\n\nasync function updateMotorcycleHorsePower(motorcycleId, bhp) {\n    // Fetch the item from the database.\n    const getRequest = dynameh.requestBuilder.buildGetInput(tableSchema, motorcycleId);\n    const getResult = await dynamodb.getItem(getRequest).promise();\n    let motorcycle = dynameh.responseUnwrapper.unwrapGetOutput(getResult);\n    \n    if (!motorcycle) {\n        // Item not found, create it.\n        motorcycle = {\n            id: motorcycleId\n        };\n    }\n    \n    // Update the horse power stat.\n    motorcycle.bhp = bhp;\n    \n    // Put the updated object in the database.\n    const putRequest = dynameh.requestBuilder.buildPutInput(tableSchema, motorcycle);\n    await dynamodb.putItem(putRequest).promise();\n}\n\nupdateMotorcycleHorsePower(\"sv-650\", 73.4);\n```\n\n### TableSchema\n\nThe key to easy building of requests in Dynameh is the [TableSchema](https://giftbit.github.io/dynameh/interfaces/_tableschema_.tableschema.html).  This simple object defines all the extra information Dynameh needs to build requests.\n\nFor a table called `MyTable` with a partition key `id` that is a number...\n\n```json\n{\n  \"tableName\": \"MyTable\",\n  \"partitionKeyField\": \"id\",\n  \"partitionKeyType\": \"number\"\n}\n```\n\nFor a table called `MyAdvancedTable` with a partition key `id` that is a string, a sort key `date` that is a number, and a version field `version`...\n\n```json\n{\n  \"tableName\": \"MyAdvancedTable\",\n  \"partitionKeyField\": \"id\",\n  \"partitionKeyType\": \"string\",\n  \"sortKeyField\": \"date\",\n  \"sortKeyType\": \"number\",\n  \"versionKeyField\": \"version\"\n}\n```\n\n### Optimistic Locking\n\nOptimistic locking is a strategy for preventing changes from clobbering each other.  For example two processes read from the database, make unrelated changes, and then both write to the database but the second write overwrites the first (clobbers).\n\nEnable optimistic locking by setting the `versionKeyField` on your TableSchema.  In the second TableSchema example that field is `version`.  The `versionKeyField` will be automatically incremented on the server side during a put request.  If the value for `versionKeyField` sent does not match the current value in the database then the contents have changed since the last get and the optimistic lock has failed.  In that case you should get the latest version from the database and replay the update against that.\n\n```javascript\nimport * as aws from \"aws-sdk\";\nimport * as dynameh from \"dynameh\";\n\n// Initialize the DynamoDB client.\nconst dynamodb = new aws.DynamoDB({\n    apiVersion: \"2012-08-10\",\n    region: \"us-west-1\"\n});\n\n// Set up the table schema.\nconst tableSchema = {\n    tableName: \"motorcycles\",\n    partitionKeyField: \"id\",\n    partitionKeyType: \"string\",\n    versionKeyField: \"version\"\n};\n\nasync function updateMotorcycleHorsePower(motorcycleId, bhp) {\n    // Fetch the item from the database.\n    const getRequest = dynameh.requestBuilder.buildGetInput(tableSchema, motorcycleId);\n    const getResult = await dynamodb.getItem(getRequest).promise();\n    let motorcycle = dynameh.responseUnwrapper.unwrapGetOutput(getResult);\n    \n    if (!motorcycle) {\n        // Item not found, create it.\n        // Note that we don't need to set the version on create.\n        motorcycle = {\n            id: motorcycleId\n        };\n    }\n    \n    // Update the horse power stat.\n    motorcycle.bhp = bhp;\n    \n    // Put the updated object in the database.\n    const putRequest = dynameh.requestBuilder.buildPutInput(tableSchema, motorcycle);\n    try {\n        await dynamodb.putItem(putRequest).promise();\n    } catch (err) {\n        if (err.code === \"ConditionalCheckFailedException\") {\n            // If this is the error code then the optimistic locking has failed\n            // and we should redo the update operation (done here with recursion).\n            updateMotorcycleHorsePower(motorcycleId, bhp);\n        } else {\n            throw err;\n        }\n    }\n}\n\nupdateMotorcycleHorsePower(\"sv-650\", 73.4);\n```\n\n### Conditions\n\nConditions can be added to a put or delete request to make the operation conditional.\n\nOne of the most useful conditions is that the item must not already exist (create but not update).  This is done by asserting `attribute_not_exists` on the primary key.  For example...\n\n```javascript\nconst tableSchema = {\n    tableName: \"Boats\",\n    partitionKeyField: \"name\",\n    partitionKeyType: \"string\"\n};\n\nasync function addNewBoat(boat) {\n    const putRequest = dynameh.requestBuilder.buildPutInput(tableSchema, boat);\n    const conditionalPutRequest = dynameh.requestBuilder.addCondition(tableSchema, putRequest, {attribute: \"name\", operator: \"attribute_not_exists\"});\n    // Note that addCondition() does not change the original object.\n    // putRequest != conditionalPutRequest\n    \n    try {\n        await dynamodb.putItem(conditionalPutRequest).promise();\n    } catch (err) {\n        if (err.code === \"ConditionalCheckFailedException\") {\n            throw new Error(\"This boat already exists!\");\n        } else {\n            throw err;\n        }\n    }\n}\n\naddNewBoat({\n    name: \"Boaty McBoatface\",\n    type: \"submarine\",\n    autonomous: true\n});\n```\n\nThe following conditions are available...\n\n| condition            | # of value parameters |\n|----------------------|-----------------------|\n| =                    | 1                     |\n| <>                   | 1                     |\n| <                    | 1                     |\n| <=                   | 1                     |\n| >                    | 1                     |\n| >=                   | 1                     |\n| BETWEEN              | 2                     |\n| IN                   | at least 1            |\n| attribute_exists     | 0                     |\n| attribute_not_exists | 0                     |\n| attribute_type       | 1                     |\n| begins_with          | 1                     |\n| contains             | 1                     |\n| size                 | 0                     |\n\n### Projections\n\nProjections can be added to a get, batch get or query request to control what attributes are returned.  This saves bandwidth on the request.\n\nFor example...\n\n```javascript\nconst tableSchema = {\n    tableName: \"Transactions\",\n    partitionKeyField: \"customerId\",\n    partitionKeyType: \"string\",\n    sortKeyField: \"transactionId\",\n    sortKeyType: \"string\",\n};\n\nasync function getTransactionDates(customerId) {\n    const queryRequest = dynameh.requestBuilder.buildQueryInput(tableSchema, customerId);\n    const projectedQueryRequest = dynameh.requestBuilder.addProjection(tableSchema, queryRequest, [\"date\"]);\n    // Note that addProjection() does not change the original object.\n    // queryRequest != projectedQueryRequest\n    \n    const queryResponse = await dynamodb.query(projectedQueryRequest).promise();\n    const transactions = dynameh.responseUnwrapper.unwrapQueryOutput(queryResponse);\n    return transactions.map(t => t.date);\n}\n\ngetTransactionDates(\"BusinessFactory\");\n```\n\n### Date Serialization\n\nDate serialization can be configured by setting `dateSerializationFunction` on your `TableSchema`.  It's a function that takes in a `Date` and returns a `string` or `number`.  By default Dates are serialized as ISO-8601 strings.\n\nFor example...\n\n```javascript\nconst tableSchema = {\n    tableName: \"MyTable\",\n    partitionKeyField: \"id\",\n    partitionKeyType: \"number\",\n    dateSerializationFunction: date => date.toISOString()   // same as default\n};\n```\n","readmeFilename":"README.md","gitHead":"5c8956aff29749e3f14a38a88f0ad7a74ac4492b","_id":"dynameh@3.3.0-beta.5","_npmVersion":"6.1.0","_nodeVersion":"8.10.0","_npmUser":{"name":"pushplay","email":"pushplay@gmail.com"},"dist":{"integrity":"sha512-7PDFaGoGBPoKpLc+aEY3yovYPgaWsXiw1qTRapNejy3kX7WlNXc93B7cVSWq5TMcUAK2xuagB+nFN9MWfFSRpg==","shasum":"c6e6a82b5ff8ef3b44429c1f2bcb781562686104","tarball":"https://registry.npmjs.org/dynameh/-/dynameh-3.3.0-beta.5.tgz","fileCount":27,"unpackedSize":122040,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJcnpyaCRA9TVsSAnZWagAA8bUP/jUANaRZvLuHYP+OMf9v\nQmir7TkdWzihQ7J0K2NdBDrRNkqezlqpXmIDha7qQXeDqYfAg1f2cAD2TwIE\nzxCvX6UCouZGQ682r4Xqk8q5KuS+McgCTCz68PaucPGrB6CTdC7kths/RtsE\nzgyGn4j8Sg8pYir/AT94uT06LoWzQmFvQkGfjL7uBaK2/x/d/OqJpxXp2sQK\n/yGr6IXbUFMK2QDQ9bOq41Dts24rdBLUSc3I1SH1198MllrWoIksTtsqNV+z\nkI7Pv47xcHqlQSAMaCpUDA2SUzaFpz0hIhP0BoxCbeoiCpygnGwr5lVpws7Q\nos5dLtyR6r8GzRgJJ8zucnZJoD7ISa8YX8TpibgYft98AY/gFHPrGQHKNlfA\nDO5sOx2L7pzwn+N+mJmjF685B+yFLRGJ1lV+9QvBzBOLUr8gC+ei4uHoYYhx\nvGl2gFthkHuJ4eiQkEcx6Eb5p1Syc036C66LO6EyFZSaTfWU6EB6JEOcuexo\nVynD1D+7oMWAy87/0nuwNkOz365np5Ln2lx8HG4SG0RQYILtlAG0FdSejJG0\nGTrb/Wpu8e60Vyvm1Iw4108Lxi6TvsQZSG8V8DrITgDyR9PzEnQpFu/YUbMn\nLC8C+qBkoALVzpTYnQEUMFslDmox94Z0kr0xPbEunbpF7w5Hx2FFtQT5FiRO\nEdb1\r\n=0/jO\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCk3NdGBqJsLvtvPjG7OFEeuHpnJHyd7HUoa3byZW2u6QIgXhebhzjwQ62pQD87Xr8c0cbs9qvJ2v2rFYolnqzz7TI="}]},"maintainers":[{"name":"pushplay","email":"pushplay@gmail.com"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/dynameh_3.3.0-beta.5_1553898649557_0.358230848833756"},"_hasShrinkwrap":false},"4.0.0-beta.1":{"name":"dynameh","version":"4.0.0-beta.1","description":"DynamoDB on Node more easier","main":"dist/index.js","types":"dist/index.d.ts","scripts":{"build":"tsc","clean":"rimraf ./dist","docs":"rimraf ./docs && typedoc src/ --out docs --mode modules --module commonjs --target es6 --excludePrivate --excludeNotExported --exclude '**/*.test.ts' --name Dynameh && touch ./docs/.nojekyll && gh-pages -d docs -t","lint":"tslint --project tsconfig.json","prepublishOnly":"npm run clean && npm run build && npm run lint && npm run test && npm run docs","test":"mocha --recursive --throw-deprecation --require ts-node/register \"src/**/*.test.ts\""},"repository":{"type":"git","url":"git+https://github.com/Giftbit/dynameh.git"},"keywords":["dynamodb"],"contributors":[{"name":"Jeffery Grajkowski","email":"pushplay@gmail.com","url":"https://github.com/pushplay/"},{"name":"Graham Baradoy","email":"graham@giftbit.com","url":"https://github.com/Baradoy/"}],"license":"MIT","bugs":{"url":"https://github.com/Giftbit/dynameh/issues"},"homepage":"https://github.com/Giftbit/dynameh#readme","dependencies":{},"devDependencies":{"@types/chai":"^4.1.7","@types/mocha":"^5.2.6","@types/node":"^11.12.1","aws-sdk":"^2.431.0","chai":"^4.2.0","gh-pages":"^2.0.1","mocha":"^6.0.2","rimraf":"^2.6.3","touch":"^3.1.0","ts-node":"^8.0.3","tslint":"^5.14.0","typedoc":"^0.14.2","typescript":"^3.3.4000"},"peerDependencies":{"aws-sdk":"^2.431.0"},"readme":"# Dynameh\nDynamoDB on Node more easier\n\nDynameh makes the official [DynamoDB JavaScript API](http://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/DynamoDB.html) easier to use.  It makes it easier to:\n\n- [build request objects](https://giftbit.github.io/dynameh/modules/_requestbuilder_.html)\n- [unwrap response objects](https://giftbit.github.io/dynameh/modules/_responseunwrapper_.html)\n- [build a projection expression](https://giftbit.github.io/dynameh/modules/_requestbuilder_.html#addprojection)\n- [build a condition expression](https://giftbit.github.io/dynameh/modules/_requestbuilder_.html#addcondition)\n- [run oversized batch requests](https://giftbit.github.io/dynameh/modules/_batchhelper_.html)\n- [run requests concurrently that can't be run in batch](https://giftbit.github.io/dynameh/modules/_concurrenthelper_.html)\n- [implement optimistic locking](https://giftbit.github.io/dynameh/interfaces/_tableschema_.tableschema.html#versionkeyfield)\n- [configure Date serialization](https://giftbit.github.io/dynameh/interfaces/_tableschema_.tableschema.html#dateserializationfunction)\n\n## Installation\n\nDynameh is your typical NPM package.\n\n```bash\nnpm install --save dynameh\n```\n\n## Usage\n\n```javascript\nimport * as dynameh from \"dynameh\";\n// or\nconst dynameh = require(\"dynameh\");\n```\n\nSee the [documentation](https://giftbit.github.io/dynameh/) for details on each module and its methods.\n\n### A Simple Example\n\nThis example is written using async/await which is available in TypeScript and ES2017.\n\n```javascript\nimport * as aws from \"aws-sdk\";\nimport * as dynameh from \"dynameh\";\n\n// Initialize the DynamoDB client.\nconst dynamodb = new aws.DynamoDB({\n    apiVersion: \"2012-08-10\",\n    region: \"us-west-1\"\n});\n\n// Set up the table schema.\nconst tableSchema = {\n    tableName: \"motorcycles\",\n    partitionKeyField: \"id\",\n    partitionKeyType: \"string\"\n};\n\nasync function updateMotorcycleHorsePower(motorcycleId, bhp) {\n    // Fetch the item from the database.\n    const getRequest = dynameh.requestBuilder.buildGetInput(tableSchema, motorcycleId);\n    const getResult = await dynamodb.getItem(getRequest).promise();\n    let motorcycle = dynameh.responseUnwrapper.unwrapGetOutput(getResult);\n    \n    if (!motorcycle) {\n        // Item not found, create it.\n        motorcycle = {\n            id: motorcycleId\n        };\n    }\n    \n    // Update the horse power stat.\n    motorcycle.bhp = bhp;\n    \n    // Put the updated object in the database.\n    const putRequest = dynameh.requestBuilder.buildPutInput(tableSchema, motorcycle);\n    await dynamodb.putItem(putRequest).promise();\n}\n\nupdateMotorcycleHorsePower(\"sv-650\", 73.4);\n```\n\n### TableSchema\n\nThe key to easy building of requests in Dynameh is the [TableSchema](https://giftbit.github.io/dynameh/interfaces/_tableschema_.tableschema.html).  This simple object defines all the extra information Dynameh needs to build requests.\n\nFor a table called `MyTable` with a partition key `id` that is a number...\n\n```json\n{\n  \"tableName\": \"MyTable\",\n  \"partitionKeyField\": \"id\",\n  \"partitionKeyType\": \"number\"\n}\n```\n\nFor a table called `MyAdvancedTable` with a partition key `id` that is a string, a sort key `date` that is a number, and a version field `version`...\n\n```json\n{\n  \"tableName\": \"MyAdvancedTable\",\n  \"partitionKeyField\": \"id\",\n  \"partitionKeyType\": \"string\",\n  \"sortKeyField\": \"date\",\n  \"sortKeyType\": \"number\",\n  \"versionKeyField\": \"version\"\n}\n```\n\n### Optimistic Locking\n\nOptimistic locking is a strategy for preventing changes from clobbering each other.  For example two processes read from the database, make unrelated changes, and then both write to the database but the second write overwrites the first (clobbers).\n\nEnable optimistic locking by setting the `versionKeyField` on your TableSchema.  In the second TableSchema example that field is `version`.  The `versionKeyField` will be automatically incremented on the server side during a put request.  If the value for `versionKeyField` sent does not match the current value in the database then the contents have changed since the last get and the optimistic lock has failed.  In that case you should get the latest version from the database and replay the update against that.\n\n```javascript\nimport * as aws from \"aws-sdk\";\nimport * as dynameh from \"dynameh\";\n\n// Initialize the DynamoDB client.\nconst dynamodb = new aws.DynamoDB({\n    apiVersion: \"2012-08-10\",\n    region: \"us-west-1\"\n});\n\n// Set up the table schema.\nconst tableSchema = {\n    tableName: \"motorcycles\",\n    partitionKeyField: \"id\",\n    partitionKeyType: \"string\",\n    versionKeyField: \"version\"\n};\n\nasync function updateMotorcycleHorsePower(motorcycleId, bhp) {\n    // Fetch the item from the database.\n    const getRequest = dynameh.requestBuilder.buildGetInput(tableSchema, motorcycleId);\n    const getResult = await dynamodb.getItem(getRequest).promise();\n    let motorcycle = dynameh.responseUnwrapper.unwrapGetOutput(getResult);\n    \n    if (!motorcycle) {\n        // Item not found, create it.\n        // Note that we don't need to set the version on create.\n        motorcycle = {\n            id: motorcycleId\n        };\n    }\n    \n    // Update the horse power stat.\n    motorcycle.bhp = bhp;\n    \n    // Put the updated object in the database.\n    const putRequest = dynameh.requestBuilder.buildPutInput(tableSchema, motorcycle);\n    try {\n        await dynamodb.putItem(putRequest).promise();\n    } catch (err) {\n        if (err.code === \"ConditionalCheckFailedException\") {\n            // If this is the error code then the optimistic locking has failed\n            // and we should redo the update operation (done here with recursion).\n            updateMotorcycleHorsePower(motorcycleId, bhp);\n        } else {\n            throw err;\n        }\n    }\n}\n\nupdateMotorcycleHorsePower(\"sv-650\", 73.4);\n```\n\n### Conditions\n\nConditions can be added to a put or delete request to make the operation conditional.\n\nOne of the most useful conditions is that the item must not already exist (create but not update).  This is done by asserting `attribute_not_exists` on the primary key.  For example...\n\n```javascript\nconst tableSchema = {\n    tableName: \"Boats\",\n    partitionKeyField: \"name\",\n    partitionKeyType: \"string\"\n};\n\nasync function addNewBoat(boat) {\n    const putRequest = dynameh.requestBuilder.buildPutInput(tableSchema, boat);\n    const conditionalPutRequest = dynameh.requestBuilder.addCondition(tableSchema, putRequest, {attribute: \"name\", operator: \"attribute_not_exists\"});\n    // Note that addCondition() does not change the original object.\n    // putRequest != conditionalPutRequest\n    \n    try {\n        await dynamodb.putItem(conditionalPutRequest).promise();\n    } catch (err) {\n        if (err.code === \"ConditionalCheckFailedException\") {\n            throw new Error(\"This boat already exists!\");\n        } else {\n            throw err;\n        }\n    }\n}\n\naddNewBoat({\n    name: \"Boaty McBoatface\",\n    type: \"submarine\",\n    autonomous: true\n});\n```\n\nThe following conditions are available...\n\n| condition            | # of value parameters |\n|----------------------|-----------------------|\n| =                    | 1                     |\n| <>                   | 1                     |\n| <                    | 1                     |\n| <=                   | 1                     |\n| >                    | 1                     |\n| >=                   | 1                     |\n| BETWEEN              | 2                     |\n| IN                   | at least 1            |\n| attribute_exists     | 0                     |\n| attribute_not_exists | 0                     |\n| attribute_type       | 1                     |\n| begins_with          | 1                     |\n| contains             | 1                     |\n| size                 | 0                     |\n\n### Projections\n\nProjections can be added to a get, batch get or query request to control what attributes are returned.  This saves bandwidth on the request.\n\nFor example...\n\n```javascript\nconst tableSchema = {\n    tableName: \"Transactions\",\n    partitionKeyField: \"customerId\",\n    partitionKeyType: \"string\",\n    sortKeyField: \"transactionId\",\n    sortKeyType: \"string\",\n};\n\nasync function getTransactionDates(customerId) {\n    const queryRequest = dynameh.requestBuilder.buildQueryInput(tableSchema, customerId);\n    const projectedQueryRequest = dynameh.requestBuilder.addProjection(tableSchema, queryRequest, [\"date\"]);\n    // Note that addProjection() does not change the original object.\n    // queryRequest != projectedQueryRequest\n    \n    const queryResponse = await dynamodb.query(projectedQueryRequest).promise();\n    const transactions = dynameh.responseUnwrapper.unwrapQueryOutput(queryResponse);\n    return transactions.map(t => t.date);\n}\n\ngetTransactionDates(\"BusinessFactory\");\n```\n\n### Date Serialization\n\nDate serialization can be configured by setting `dateSerializationFunction` on your `TableSchema`.  It's a function that takes in a `Date` and returns a `string` or `number`.  By default Dates are serialized as ISO-8601 strings.\n\nFor example...\n\n```javascript\nconst tableSchema = {\n    tableName: \"MyTable\",\n    partitionKeyField: \"id\",\n    partitionKeyType: \"number\",\n    dateSerializationFunction: date => date.toISOString()   // same as default\n};\n```\n","readmeFilename":"README.md","gitHead":"c498446c13b4b97104a2927518721bd45e7728a8","_id":"dynameh@4.0.0-beta.1","_npmVersion":"6.1.0","_nodeVersion":"8.10.0","_npmUser":{"name":"pushplay","email":"pushplay@gmail.com"},"dist":{"integrity":"sha512-wAPy/ZtFG1Jd0dxpdabRSf59Shz/z74vYgrk1KIueq6WBG/vlT/KX7dU+P1ydGAyB0g1sJhee14I6UG/9bQR4Q==","shasum":"42a3dc306b0e704b0110f8dc94c4e1386c364813","tarball":"https://registry.npmjs.org/dynameh/-/dynameh-4.0.0-beta.1.tgz","fileCount":27,"unpackedSize":124283,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJcokZECRA9TVsSAnZWagAAdn8P/0Ol6CCVHL9Ske4Q21CS\nAFuIgkQA21na7MjR5cyPpjz0UtxC3xybg5+BMJn+HisLwdJMkR1EZqR0OW8Y\nMM5Cd89FWnIMsPS1zQUQXzGuwVz5Yy3Q4IL1prvm3StHs2fBRaRwygsTUd0d\nJaxixDik4aTmUcIe7Cd9J3puttxuhfSdNOGwyyBp7SWK/bbwxmmgvjsiwq0G\n5iS8YHTGjf7xBrhnLgQVBeqeWcxDToaWBFhMHnfjH/yik4u13e+MkoMWclkl\n+tkZGJhUP6deeJnMrLVWl+02WWFoCi/9NcTdWiaMn3fNC62pzqijyrhnVUFd\nZqAHzzU7Cq6M5lcYQoekst0iLGx4kveDuzo100iEvYOApTksdLBKrmP9YRHR\nvGD54dyMyvnrdwHUg+X51L4fHFOO7q2m4hpt9OoeXLDuLubEbiCrHx/ZiVIO\ni91Oid7HJXi12RTYLs1ca7pr636qIEsEDQK8fpDRux7UCHW35/6xJqS8AM7f\nitrmaa2b/N/MxBAiUbpGxYoGdhvJ0zznak/BLn5iwKXS+POim8+Pb4hJiSxK\nyXYBcKxb9lgsM8/gOLW4XMBNLXoUuVHv9HktKpXYRsYDJ7Uqgxf/sVTGOzWq\nfRCCB4BvulnR/e9d/B5uZmFkmsZWA1DqEUrO/qG7SlXrnL5loI8iQg129Aeu\nUeFn\r\n=/X24\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDKJiQw9mkhjAGFjDmXP+BkCkowtSU0ecnq4Hym7aziywIgHvqb+2/H5YTm/iSp/TMSa3O8dwXgCterFbrRL8oxj1A="}]},"maintainers":[{"name":"pushplay","email":"pushplay@gmail.com"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/dynameh_4.0.0-beta.1_1554138691859_0.7601210765255026"},"_hasShrinkwrap":false},"4.0.0-beta.2":{"name":"dynameh","version":"4.0.0-beta.2","description":"DynamoDB on Node more easier","main":"dist/index.js","types":"dist/index.d.ts","scripts":{"build":"tsc","clean":"rimraf ./dist","docs":"rimraf ./docs && typedoc src/ --out docs --mode modules --module commonjs --target es6 --excludePrivate --excludeNotExported --exclude '**/*.test.ts' --name Dynameh && touch ./docs/.nojekyll && gh-pages -d docs -t","lint":"tslint --project tsconfig.json","prepublishOnly":"npm run clean && npm run build && npm run lint && npm run test && npm run docs","test":"mocha --recursive --throw-deprecation --require ts-node/register \"src/**/*.test.ts\""},"repository":{"type":"git","url":"git+https://github.com/Giftbit/dynameh.git"},"keywords":["dynamodb"],"contributors":[{"name":"Jeffery Grajkowski","email":"pushplay@gmail.com","url":"https://github.com/pushplay/"},{"name":"Graham Baradoy","email":"graham@giftbit.com","url":"https://github.com/Baradoy/"}],"license":"MIT","bugs":{"url":"https://github.com/Giftbit/dynameh/issues"},"homepage":"https://github.com/Giftbit/dynameh#readme","dependencies":{},"devDependencies":{"@types/chai":"^4.1.7","@types/mocha":"^5.2.6","@types/node":"^11.12.1","aws-sdk":"^2.431.0","chai":"^4.2.0","gh-pages":"^2.0.1","mocha":"^6.0.2","rimraf":"^2.6.3","touch":"^3.1.0","ts-node":"^8.0.3","tslint":"^5.14.0","typedoc":"^0.14.2","typescript":"^3.3.4000"},"peerDependencies":{"aws-sdk":"^2.431.0"},"readme":"# Dynameh\nDynamoDB on Node more easier\n\nDynameh makes the official [DynamoDB JavaScript API](http://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/DynamoDB.html) easier to use.  It makes it easier to:\n\n- [build request objects](https://giftbit.github.io/dynameh/modules/_requestbuilder_.html)\n- [unwrap response objects](https://giftbit.github.io/dynameh/modules/_responseunwrapper_.html)\n- [build a projection expression](https://giftbit.github.io/dynameh/modules/_requestbuilder_.html#addprojection)\n- [build a condition expression](https://giftbit.github.io/dynameh/modules/_requestbuilder_.html#addcondition)\n- [run oversized batch requests](https://giftbit.github.io/dynameh/modules/_batchhelper_.html)\n- [run requests concurrently that can't be run in batch](https://giftbit.github.io/dynameh/modules/_concurrenthelper_.html)\n- [implement optimistic locking](https://giftbit.github.io/dynameh/interfaces/_tableschema_.tableschema.html#versionkeyfield)\n- [configure Date serialization](https://giftbit.github.io/dynameh/interfaces/_tableschema_.tableschema.html#dateserializationfunction)\n\n## Installation\n\nDynameh is your typical NPM package.\n\n```bash\nnpm install --save dynameh\n```\n\n## Usage\n\n```javascript\nimport * as dynameh from \"dynameh\";\n// or\nconst dynameh = require(\"dynameh\");\n```\n\nSee the [documentation](https://giftbit.github.io/dynameh/) for details on each module and its methods.\n\n### A Simple Example\n\nThis example is written using async/await which is available in TypeScript and ES2017.\n\n```javascript\nimport * as aws from \"aws-sdk\";\nimport * as dynameh from \"dynameh\";\n\n// Initialize the DynamoDB client.\nconst dynamodb = new aws.DynamoDB({\n    apiVersion: \"2012-08-10\",\n    region: \"us-west-1\"\n});\n\n// Set up the table schema.\nconst tableSchema = {\n    tableName: \"motorcycles\",\n    partitionKeyField: \"id\",\n    partitionKeyType: \"string\"\n};\n\nasync function updateMotorcycleHorsePower(motorcycleId, bhp) {\n    // Fetch the item from the database.\n    const getRequest = dynameh.requestBuilder.buildGetInput(tableSchema, motorcycleId);\n    const getResult = await dynamodb.getItem(getRequest).promise();\n    let motorcycle = dynameh.responseUnwrapper.unwrapGetOutput(getResult);\n    \n    if (!motorcycle) {\n        // Item not found, create it.\n        motorcycle = {\n            id: motorcycleId\n        };\n    }\n    \n    // Update the horse power stat.\n    motorcycle.bhp = bhp;\n    \n    // Put the updated object in the database.\n    const putRequest = dynameh.requestBuilder.buildPutInput(tableSchema, motorcycle);\n    await dynamodb.putItem(putRequest).promise();\n}\n\nupdateMotorcycleHorsePower(\"sv-650\", 73.4);\n```\n\n### TableSchema\n\nThe key to easy building of requests in Dynameh is the [TableSchema](https://giftbit.github.io/dynameh/interfaces/_tableschema_.tableschema.html).  This simple object defines all the extra information Dynameh needs to build requests.\n\nFor a table called `MyTable` with a partition key `id` that is a number...\n\n```json\n{\n  \"tableName\": \"MyTable\",\n  \"partitionKeyField\": \"id\",\n  \"partitionKeyType\": \"number\"\n}\n```\n\nFor a table called `MyAdvancedTable` with a partition key `id` that is a string, a sort key `date` that is a number, and a version field `version`...\n\n```json\n{\n  \"tableName\": \"MyAdvancedTable\",\n  \"partitionKeyField\": \"id\",\n  \"partitionKeyType\": \"string\",\n  \"sortKeyField\": \"date\",\n  \"sortKeyType\": \"number\",\n  \"versionKeyField\": \"version\"\n}\n```\n\n### Optimistic Locking\n\nOptimistic locking is a strategy for preventing changes from clobbering each other.  For example two processes read from the database, make unrelated changes, and then both write to the database but the second write overwrites the first (clobbers).\n\nEnable optimistic locking by setting the `versionKeyField` on your TableSchema.  In the second TableSchema example that field is `version`.  The `versionKeyField` will be automatically incremented on the server side during a put request.  If the value for `versionKeyField` sent does not match the current value in the database then the contents have changed since the last get and the optimistic lock has failed.  In that case you should get the latest version from the database and replay the update against that.\n\n```javascript\nimport * as aws from \"aws-sdk\";\nimport * as dynameh from \"dynameh\";\n\n// Initialize the DynamoDB client.\nconst dynamodb = new aws.DynamoDB({\n    apiVersion: \"2012-08-10\",\n    region: \"us-west-1\"\n});\n\n// Set up the table schema.\nconst tableSchema = {\n    tableName: \"motorcycles\",\n    partitionKeyField: \"id\",\n    partitionKeyType: \"string\",\n    versionKeyField: \"version\"\n};\n\nasync function updateMotorcycleHorsePower(motorcycleId, bhp) {\n    // Fetch the item from the database.\n    const getRequest = dynameh.requestBuilder.buildGetInput(tableSchema, motorcycleId);\n    const getResult = await dynamodb.getItem(getRequest).promise();\n    let motorcycle = dynameh.responseUnwrapper.unwrapGetOutput(getResult);\n    \n    if (!motorcycle) {\n        // Item not found, create it.\n        // Note that we don't need to set the version on create.\n        motorcycle = {\n            id: motorcycleId\n        };\n    }\n    \n    // Update the horse power stat.\n    motorcycle.bhp = bhp;\n    \n    // Put the updated object in the database.\n    const putRequest = dynameh.requestBuilder.buildPutInput(tableSchema, motorcycle);\n    try {\n        await dynamodb.putItem(putRequest).promise();\n    } catch (err) {\n        if (err.code === \"ConditionalCheckFailedException\") {\n            // If this is the error code then the optimistic locking has failed\n            // and we should redo the update operation (done here with recursion).\n            updateMotorcycleHorsePower(motorcycleId, bhp);\n        } else {\n            throw err;\n        }\n    }\n}\n\nupdateMotorcycleHorsePower(\"sv-650\", 73.4);\n```\n\n### Conditions\n\nConditions can be added to a put or delete request to make the operation conditional.\n\nOne of the most useful conditions is that the item must not already exist (create but not update).  This is done by asserting `attribute_not_exists` on the primary key.  For example...\n\n```javascript\nconst tableSchema = {\n    tableName: \"Boats\",\n    partitionKeyField: \"name\",\n    partitionKeyType: \"string\"\n};\n\nasync function addNewBoat(boat) {\n    const putRequest = dynameh.requestBuilder.buildPutInput(tableSchema, boat);\n    const conditionalPutRequest = dynameh.requestBuilder.addCondition(tableSchema, putRequest, {attribute: \"name\", operator: \"attribute_not_exists\"});\n    // Note that addCondition() does not change the original object.\n    // putRequest != conditionalPutRequest\n    \n    try {\n        await dynamodb.putItem(conditionalPutRequest).promise();\n    } catch (err) {\n        if (err.code === \"ConditionalCheckFailedException\") {\n            throw new Error(\"This boat already exists!\");\n        } else {\n            throw err;\n        }\n    }\n}\n\naddNewBoat({\n    name: \"Boaty McBoatface\",\n    type: \"submarine\",\n    autonomous: true\n});\n```\n\nThe following conditions are available...\n\n| condition            | # of value parameters |\n|----------------------|-----------------------|\n| =                    | 1                     |\n| <>                   | 1                     |\n| <                    | 1                     |\n| <=                   | 1                     |\n| >                    | 1                     |\n| >=                   | 1                     |\n| BETWEEN              | 2                     |\n| IN                   | at least 1            |\n| attribute_exists     | 0                     |\n| attribute_not_exists | 0                     |\n| attribute_type       | 1                     |\n| begins_with          | 1                     |\n| contains             | 1                     |\n| size                 | 0                     |\n\n### Projections\n\nProjections can be added to a get, batch get or query request to control what attributes are returned.  This saves bandwidth on the request.\n\nFor example...\n\n```javascript\nconst tableSchema = {\n    tableName: \"Transactions\",\n    partitionKeyField: \"customerId\",\n    partitionKeyType: \"string\",\n    sortKeyField: \"transactionId\",\n    sortKeyType: \"string\",\n};\n\nasync function getTransactionDates(customerId) {\n    const queryRequest = dynameh.requestBuilder.buildQueryInput(tableSchema, customerId);\n    const projectedQueryRequest = dynameh.requestBuilder.addProjection(tableSchema, queryRequest, [\"date\"]);\n    // Note that addProjection() does not change the original object.\n    // queryRequest != projectedQueryRequest\n    \n    const queryResponse = await dynamodb.query(projectedQueryRequest).promise();\n    const transactions = dynameh.responseUnwrapper.unwrapQueryOutput(queryResponse);\n    return transactions.map(t => t.date);\n}\n\ngetTransactionDates(\"BusinessFactory\");\n```\n\n### Date Serialization\n\nDate serialization can be configured by setting `dateSerializationFunction` on your `TableSchema`.  It's a function that takes in a `Date` and returns a `string` or `number`.  By default Dates are serialized as ISO-8601 strings.\n\nFor example...\n\n```javascript\nconst tableSchema = {\n    tableName: \"MyTable\",\n    partitionKeyField: \"id\",\n    partitionKeyType: \"number\",\n    dateSerializationFunction: date => date.toISOString()   // same as default\n};\n```\n","readmeFilename":"README.md","gitHead":"9b4881a42c4ba86e2735c14c3cdd7a5960870592","_id":"dynameh@4.0.0-beta.2","_npmVersion":"6.1.0","_nodeVersion":"8.10.0","_npmUser":{"name":"pushplay","email":"pushplay@gmail.com"},"dist":{"integrity":"sha512-88vs8uMLdfOh5jJryw9h0WtYs1ykcZOWztKJPhEbWTCYPCht1ucyWvFUfRpwzvoI0+xPUQ5k8uT0vohgxV80iQ==","shasum":"cad30266aca2b4b249ee8405013ed7267e335671","tarball":"https://registry.npmjs.org/dynameh/-/dynameh-4.0.0-beta.2.tgz","fileCount":27,"unpackedSize":124696,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJcoltGCRA9TVsSAnZWagAA11IP/R8s2Z2ZrAXLim4Rx8QT\nAigJ+U0Lu/RL9rt7HVkB1oaIGQM2mSvQlYeYEvumNnetBa+wAgyXb0kZPhQI\n1TmrxbVFzEcGNYB/7X4rBwNdqDjJcVEYQ6yWqcWMGi54BTeV3bN9dt/YSYC7\n/WtH5h2Qv9lQS7pEwa+m9qXeUkOQbskDzWJXcA+eZf/xgoUWNa6dqcJIal2M\n+6NkLS8xIRfWcgu7nnw5qozwJWWhdMx/k/xWVCcSMl/wXJN8q9XVBw9ygj4C\nfY5Hyj33SPud0v2na1XfKP/t5vpPv0/L7NbJZlFB6I8TSiP4gh7O9jJK9C4L\n6rn2FLif+cm0LXL2j28ftSLlU/5047RyYxl9WoZMgtZzarKGoBoujfQ6dmOf\ngder2if+qPKUbmk6rlAjLVOmDD/Yucbi4aqjbsM3jgxjrKyo1vl396cIBJwa\nUqIQYl2+s+bTcZqC4fWyFNXe/8lu2PTuJNjg2KQ6atYqaDyC1VDUFEh3bL/F\nJqAcJR+RKCacqxjAxJhOKtWwQgimXH7XuPrNf+hSSIAzSLVQtC7oQNs7Vn5f\nVV+FPC6EaPM4GsCXWpCcnGOIEtNJruNCTW08QK/kin1FrgenDAQ+VwSzmxut\nzEUacehsk0CFxQU9b8whqBY8wV01Ajc19DBnKg/zgbuWX1Q2/R0ZCYSQuXRY\nw4Td\r\n=NvMe\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCXLIuHkZ1wG4jo4Kjt1N84PB0dEx6B7FF0NkBlRRED4wIgPvGvmGWjJap4B9AWa2hwxp2+MabdRKI8YlG4PZejPXw="}]},"maintainers":[{"name":"pushplay","email":"pushplay@gmail.com"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/dynameh_4.0.0-beta.2_1554144069899_0.8444882620877183"},"_hasShrinkwrap":false},"4.0.0-beta.3":{"name":"dynameh","version":"4.0.0-beta.3","description":"DynamoDB on Node more easier","main":"dist/index.js","types":"dist/index.d.ts","scripts":{"build":"tsc","clean":"rimraf ./dist","docs":"rimraf ./docs && typedoc src/ --out docs --mode modules --module commonjs --target es6 --excludePrivate --excludeNotExported --exclude '**/*.test.ts' --name Dynameh && touch ./docs/.nojekyll && gh-pages -d docs -t","lint":"tslint --project tsconfig.json","prepublishOnly":"npm run clean && npm run build && npm run lint && npm run test && npm run docs","test":"mocha --recursive --throw-deprecation --require ts-node/register \"src/**/*.test.ts\""},"repository":{"type":"git","url":"git+https://github.com/Giftbit/dynameh.git"},"keywords":["dynamodb"],"contributors":[{"name":"Jeffery Grajkowski","email":"pushplay@gmail.com","url":"https://github.com/pushplay/"},{"name":"Graham Baradoy","email":"graham@giftbit.com","url":"https://github.com/Baradoy/"}],"license":"MIT","bugs":{"url":"https://github.com/Giftbit/dynameh/issues"},"homepage":"https://github.com/Giftbit/dynameh#readme","dependencies":{},"devDependencies":{"@types/chai":"^4.1.7","@types/mocha":"^5.2.6","@types/node":"^11.12.1","aws-sdk":"^2.431.0","chai":"^4.2.0","gh-pages":"^2.0.1","mocha":"^6.0.2","rimraf":"^2.6.3","touch":"^3.1.0","ts-node":"^8.0.3","tslint":"^5.14.0","typedoc":"^0.14.2","typescript":"^3.3.4000"},"peerDependencies":{"aws-sdk":"^2.431.0"},"readme":"# Dynameh\nDynamoDB on Node more easier\n\nDynameh makes the official [DynamoDB JavaScript API](http://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/DynamoDB.html) easier to use.  It makes it easier to:\n\n- [build request objects](https://giftbit.github.io/dynameh/modules/_requestbuilder_.html)\n- [unwrap response objects](https://giftbit.github.io/dynameh/modules/_responseunwrapper_.html)\n- [build a projection expression](https://giftbit.github.io/dynameh/modules/_requestbuilder_.html#addprojection)\n- [build a condition expression](https://giftbit.github.io/dynameh/modules/_requestbuilder_.html#addcondition)\n- [run oversized batch requests](https://giftbit.github.io/dynameh/modules/_batchhelper_.html)\n- [run requests concurrently that can't be run in batch](https://giftbit.github.io/dynameh/modules/_concurrenthelper_.html)\n- [implement optimistic locking](https://giftbit.github.io/dynameh/interfaces/_tableschema_.tableschema.html#versionkeyfield)\n- [configure Date serialization](https://giftbit.github.io/dynameh/interfaces/_tableschema_.tableschema.html#dateserializationfunction)\n\n## Installation\n\nDynameh is your typical NPM package.\n\n```bash\nnpm install --save dynameh\n```\n\n## Usage\n\n```javascript\nimport * as dynameh from \"dynameh\";\n// or\nconst dynameh = require(\"dynameh\");\n```\n\nSee the [documentation](https://giftbit.github.io/dynameh/) for details on each module and its methods.\n\n### A Simple Example\n\nThis example is written using async/await which is available in TypeScript and ES2017.\n\n```javascript\nimport * as aws from \"aws-sdk\";\nimport * as dynameh from \"dynameh\";\n\n// Initialize the DynamoDB client.\nconst dynamodb = new aws.DynamoDB({\n    apiVersion: \"2012-08-10\",\n    region: \"us-west-1\"\n});\n\n// Set up the table schema.\nconst tableSchema = {\n    tableName: \"motorcycles\",\n    partitionKeyField: \"id\",\n    partitionKeyType: \"string\"\n};\n\nasync function updateMotorcycleHorsePower(motorcycleId, bhp) {\n    // Fetch the item from the database.\n    const getRequest = dynameh.requestBuilder.buildGetInput(tableSchema, motorcycleId);\n    const getResult = await dynamodb.getItem(getRequest).promise();\n    let motorcycle = dynameh.responseUnwrapper.unwrapGetOutput(getResult);\n    \n    if (!motorcycle) {\n        // Item not found, create it.\n        motorcycle = {\n            id: motorcycleId\n        };\n    }\n    \n    // Update the horse power stat.\n    motorcycle.bhp = bhp;\n    \n    // Put the updated object in the database.\n    const putRequest = dynameh.requestBuilder.buildPutInput(tableSchema, motorcycle);\n    await dynamodb.putItem(putRequest).promise();\n}\n\nupdateMotorcycleHorsePower(\"sv-650\", 73.4);\n```\n\n### TableSchema\n\nThe key to easy building of requests in Dynameh is the [TableSchema](https://giftbit.github.io/dynameh/interfaces/_tableschema_.tableschema.html).  This simple object defines all the extra information Dynameh needs to build requests.\n\nFor a table called `MyTable` with a partition key `id` that is a number...\n\n```json\n{\n  \"tableName\": \"MyTable\",\n  \"partitionKeyField\": \"id\",\n  \"partitionKeyType\": \"number\"\n}\n```\n\nFor a table called `MyAdvancedTable` with a partition key `id` that is a string, a sort key `date` that is a number, and a version field `version`...\n\n```json\n{\n  \"tableName\": \"MyAdvancedTable\",\n  \"partitionKeyField\": \"id\",\n  \"partitionKeyType\": \"string\",\n  \"sortKeyField\": \"date\",\n  \"sortKeyType\": \"number\",\n  \"versionKeyField\": \"version\"\n}\n```\n\n### Optimistic Locking\n\nOptimistic locking is a strategy for preventing changes from clobbering each other.  For example two processes read from the database, make unrelated changes, and then both write to the database but the second write overwrites the first (clobbers).\n\nEnable optimistic locking by setting the `versionKeyField` on your TableSchema.  In the second TableSchema example that field is `version`.  The `versionKeyField` will be automatically incremented on the server side during a put request.  If the value for `versionKeyField` sent does not match the current value in the database then the contents have changed since the last get and the optimistic lock has failed.  In that case you should get the latest version from the database and replay the update against that.\n\n```javascript\nimport * as aws from \"aws-sdk\";\nimport * as dynameh from \"dynameh\";\n\n// Initialize the DynamoDB client.\nconst dynamodb = new aws.DynamoDB({\n    apiVersion: \"2012-08-10\",\n    region: \"us-west-1\"\n});\n\n// Set up the table schema.\nconst tableSchema = {\n    tableName: \"motorcycles\",\n    partitionKeyField: \"id\",\n    partitionKeyType: \"string\",\n    versionKeyField: \"version\"\n};\n\nasync function updateMotorcycleHorsePower(motorcycleId, bhp) {\n    // Fetch the item from the database.\n    const getRequest = dynameh.requestBuilder.buildGetInput(tableSchema, motorcycleId);\n    const getResult = await dynamodb.getItem(getRequest).promise();\n    let motorcycle = dynameh.responseUnwrapper.unwrapGetOutput(getResult);\n    \n    if (!motorcycle) {\n        // Item not found, create it.\n        // Note that we don't need to set the version on create.\n        motorcycle = {\n            id: motorcycleId\n        };\n    }\n    \n    // Update the horse power stat.\n    motorcycle.bhp = bhp;\n    \n    // Put the updated object in the database.\n    const putRequest = dynameh.requestBuilder.buildPutInput(tableSchema, motorcycle);\n    try {\n        await dynamodb.putItem(putRequest).promise();\n    } catch (err) {\n        if (err.code === \"ConditionalCheckFailedException\") {\n            // If this is the error code then the optimistic locking has failed\n            // and we should redo the update operation (done here with recursion).\n            updateMotorcycleHorsePower(motorcycleId, bhp);\n        } else {\n            throw err;\n        }\n    }\n}\n\nupdateMotorcycleHorsePower(\"sv-650\", 73.4);\n```\n\n### Conditions\n\nConditions can be added to a put or delete request to make the operation conditional.\n\nOne of the most useful conditions is that the item must not already exist (create but not update).  This is done by asserting `attribute_not_exists` on the primary key.  For example...\n\n```javascript\nconst tableSchema = {\n    tableName: \"Boats\",\n    partitionKeyField: \"name\",\n    partitionKeyType: \"string\"\n};\n\nasync function addNewBoat(boat) {\n    const putRequest = dynameh.requestBuilder.buildPutInput(tableSchema, boat);\n    const conditionalPutRequest = dynameh.requestBuilder.addCondition(tableSchema, putRequest, {attribute: \"name\", operator: \"attribute_not_exists\"});\n    // Note that addCondition() does not change the original object.\n    // putRequest != conditionalPutRequest\n    \n    try {\n        await dynamodb.putItem(conditionalPutRequest).promise();\n    } catch (err) {\n        if (err.code === \"ConditionalCheckFailedException\") {\n            throw new Error(\"This boat already exists!\");\n        } else {\n            throw err;\n        }\n    }\n}\n\naddNewBoat({\n    name: \"Boaty McBoatface\",\n    type: \"submarine\",\n    autonomous: true\n});\n```\n\nThe following conditions are available...\n\n| condition            | # of value parameters |\n|----------------------|-----------------------|\n| =                    | 1                     |\n| <>                   | 1                     |\n| <                    | 1                     |\n| <=                   | 1                     |\n| >                    | 1                     |\n| >=                   | 1                     |\n| BETWEEN              | 2                     |\n| IN                   | at least 1            |\n| attribute_exists     | 0                     |\n| attribute_not_exists | 0                     |\n| attribute_type       | 1                     |\n| begins_with          | 1                     |\n| contains             | 1                     |\n| size                 | 0                     |\n\n### Projections\n\nProjections can be added to a get, batch get or query request to control what attributes are returned.  This saves bandwidth on the request.\n\nFor example...\n\n```javascript\nconst tableSchema = {\n    tableName: \"Transactions\",\n    partitionKeyField: \"customerId\",\n    partitionKeyType: \"string\",\n    sortKeyField: \"transactionId\",\n    sortKeyType: \"string\",\n};\n\nasync function getTransactionDates(customerId) {\n    const queryRequest = dynameh.requestBuilder.buildQueryInput(tableSchema, customerId);\n    const projectedQueryRequest = dynameh.requestBuilder.addProjection(tableSchema, queryRequest, [\"date\"]);\n    // Note that addProjection() does not change the original object.\n    // queryRequest != projectedQueryRequest\n    \n    const queryResponse = await dynamodb.query(projectedQueryRequest).promise();\n    const transactions = dynameh.responseUnwrapper.unwrapQueryOutput(queryResponse);\n    return transactions.map(t => t.date);\n}\n\ngetTransactionDates(\"BusinessFactory\");\n```\n\n### Date Serialization\n\nDate serialization can be configured by setting `dateSerializationFunction` on your `TableSchema`.  It's a function that takes in a `Date` and returns a `string` or `number`.  By default Dates are serialized as ISO-8601 strings.\n\nFor example...\n\n```javascript\nconst tableSchema = {\n    tableName: \"MyTable\",\n    partitionKeyField: \"id\",\n    partitionKeyType: \"number\",\n    dateSerializationFunction: date => date.toISOString()   // same as default\n};\n```\n","readmeFilename":"README.md","gitHead":"ad3511ed846b147ec27e38a0bc4c962ab267961c","_id":"dynameh@4.0.0-beta.3","_npmVersion":"6.1.0","_nodeVersion":"8.10.0","_npmUser":{"name":"pushplay","email":"pushplay@gmail.com"},"dist":{"integrity":"sha512-b6uYAAHhyvWdmpl6Ghd0V3YHKyVDLonw1H+IVk6TjnoATjtKIOPEpgZuPtWwCA1Jh1bXKM+cpAumDa8n+Lf79g==","shasum":"1865ccec869ecb6d18021020eeb12b1cb257fcca","tarball":"https://registry.npmjs.org/dynameh/-/dynameh-4.0.0-beta.3.tgz","fileCount":27,"unpackedSize":125186,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJcoonzCRA9TVsSAnZWagAA1IAP/1K0WgkM5oZ+scB4yG7C\nOMejorICyg0dNGlgJ4a8DR67v3cMYODWp4Dmx3HYuNtCiMrjpZjG3SG+iYax\n6InK94oOzQuVMtdXfbR1dAu4oItYtlPUqId9wLPs9QbxnR/QXzoRlqWB7WJV\nn3osqiyHHTsDkklVGggau9VnA0hrIwtGFLaiI5DOMoBszTBfoofA6Ugv80z4\nXxVpX7Wd8CoXvM4UdTxygDYpgENOJXDHOpxSRlAFIVKkioNxC2z91bKk+VjD\nyc7hrd0L6Ef1GbCs/2mFUpmRFAUxqbGfZw4KSSvY3D36bti+aCRxjOkE9PxA\naGU+F2Ynjzs3pcdGWRZqyp980IpPdTCthNCyQIq/3EdPsahCUZOwTcd8wZPy\nBv76Nt8yjVG9OsLbbWsu2o4rw3x3TWZpGI6O4WBfarS9NJYZv5NaV/Y/j/P/\nKmHLEpVyyoCqctwZ0VooFgQubCVerWmbb620OxiQ8EA5xKA1bFkEvRrsiqxK\nsjer0RnAW7eKQMBVQh4N9WahOOovBGmAj/ndOHjvNOh9MBb12fyaApvH6VAO\nO0UPO2wW+eahNZCLHh/3kEZsVSCl/krsSSbE3zDax0d15OqBwzN7W+QSC5g8\njVlh8knKqx08cq/ug8eL1gg0aFilQlAJGptdgPifgbQIvCo/q2h8XDyjG85i\nvXfk\r\n=hIDK\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDcjC6zLYLh4Dfc5ISlcaYcz7TSOm1U0W0X6znVCbvJ8QIgMn3KED/Ts4iIZRRrAWRNHeJQTjAkIK+XoK/tAhlTA0U="}]},"maintainers":[{"name":"pushplay","email":"pushplay@gmail.com"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/dynameh_4.0.0-beta.3_1554156019241_0.4475999338078833"},"_hasShrinkwrap":false},"4.0.0-beta.4":{"name":"dynameh","version":"4.0.0-beta.4","description":"DynamoDB on Node more easier","main":"dist/index.js","types":"dist/index.d.ts","scripts":{"build":"tsc","clean":"rimraf ./dist","docs":"rimraf ./docs && typedoc src/ --out docs --mode modules --module commonjs --target es6 --excludePrivate --excludeNotExported --exclude '**/*.test.ts' --name Dynameh && touch ./docs/.nojekyll && gh-pages -d docs -t","lint":"tslint --project tsconfig.json","prepublishOnly":"npm run clean && npm run build && npm run lint && npm run test && npm run docs","test":"mocha --recursive --throw-deprecation --require ts-node/register \"src/**/*.test.ts\""},"repository":{"type":"git","url":"git+https://github.com/Giftbit/dynameh.git"},"keywords":["dynamodb"],"contributors":[{"name":"Jeffery Grajkowski","email":"pushplay@gmail.com","url":"https://github.com/pushplay/"},{"name":"Graham Baradoy","email":"graham@giftbit.com","url":"https://github.com/Baradoy/"}],"license":"MIT","bugs":{"url":"https://github.com/Giftbit/dynameh/issues"},"homepage":"https://github.com/Giftbit/dynameh#readme","dependencies":{},"devDependencies":{"@types/chai":"^4.1.7","@types/mocha":"^5.2.6","@types/node":"^11.12.1","aws-sdk":"^2.431.0","chai":"^4.2.0","gh-pages":"^2.0.1","mocha":"^6.0.2","rimraf":"^2.6.3","touch":"^3.1.0","ts-node":"^8.0.3","tslint":"^5.14.0","typedoc":"^0.14.2","typescript":"^3.3.4000"},"peerDependencies":{"aws-sdk":"^2.431.0"},"readme":"# Dynameh\nDynamoDB on Node more easier\n\nDynameh makes the official [DynamoDB JavaScript API](http://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/DynamoDB.html) easier to use.  It makes it easier to:\n\n- [build request objects](https://giftbit.github.io/dynameh/modules/_requestbuilder_.html)\n- [unwrap response objects](https://giftbit.github.io/dynameh/modules/_responseunwrapper_.html)\n- [build a projection expression](https://giftbit.github.io/dynameh/modules/_requestbuilder_.html#addprojection)\n- [build a condition expression](https://giftbit.github.io/dynameh/modules/_requestbuilder_.html#addcondition)\n- [run oversized batch requests](https://giftbit.github.io/dynameh/modules/_batchhelper_.html)\n- [run requests concurrently that can't be run in batch](https://giftbit.github.io/dynameh/modules/_concurrenthelper_.html)\n- [implement optimistic locking](https://giftbit.github.io/dynameh/interfaces/_tableschema_.tableschema.html#versionkeyfield)\n- [configure Date serialization](https://giftbit.github.io/dynameh/interfaces/_tableschema_.tableschema.html#dateserializationfunction)\n\n## Installation\n\nDynameh is your typical NPM package.\n\n```bash\nnpm install --save dynameh\n```\n\n## Usage\n\n```javascript\nimport * as dynameh from \"dynameh\";\n// or\nconst dynameh = require(\"dynameh\");\n```\n\nSee the [documentation](https://giftbit.github.io/dynameh/) for details on each module and its methods.\n\n### A Simple Example\n\nThis example is written using async/await which is available in TypeScript and ES2017.\n\n```javascript\nimport * as aws from \"aws-sdk\";\nimport * as dynameh from \"dynameh\";\n\n// Initialize the DynamoDB client.\nconst dynamodb = new aws.DynamoDB({\n    apiVersion: \"2012-08-10\",\n    region: \"us-west-1\"\n});\n\n// Set up the table schema.\nconst tableSchema = {\n    tableName: \"motorcycles\",\n    partitionKeyField: \"id\",\n    partitionKeyType: \"string\"\n};\n\nasync function updateMotorcycleHorsePower(motorcycleId, bhp) {\n    // Fetch the item from the database.\n    const getRequest = dynameh.requestBuilder.buildGetInput(tableSchema, motorcycleId);\n    const getResult = await dynamodb.getItem(getRequest).promise();\n    let motorcycle = dynameh.responseUnwrapper.unwrapGetOutput(getResult);\n    \n    if (!motorcycle) {\n        // Item not found, create it.\n        motorcycle = {\n            id: motorcycleId\n        };\n    }\n    \n    // Update the horse power stat.\n    motorcycle.bhp = bhp;\n    \n    // Put the updated object in the database.\n    const putRequest = dynameh.requestBuilder.buildPutInput(tableSchema, motorcycle);\n    await dynamodb.putItem(putRequest).promise();\n}\n\nupdateMotorcycleHorsePower(\"sv-650\", 73.4);\n```\n\n### TableSchema\n\nThe key to easy building of requests in Dynameh is the [TableSchema](https://giftbit.github.io/dynameh/interfaces/_tableschema_.tableschema.html).  This simple object defines all the extra information Dynameh needs to build requests.\n\nFor a table called `MyTable` with a partition key `id` that is a number...\n\n```json\n{\n  \"tableName\": \"MyTable\",\n  \"partitionKeyField\": \"id\",\n  \"partitionKeyType\": \"number\"\n}\n```\n\nFor a table called `MyAdvancedTable` with a partition key `id` that is a string, a sort key `date` that is a number, and a version field `version`...\n\n```json\n{\n  \"tableName\": \"MyAdvancedTable\",\n  \"partitionKeyField\": \"id\",\n  \"partitionKeyType\": \"string\",\n  \"sortKeyField\": \"date\",\n  \"sortKeyType\": \"number\",\n  \"versionKeyField\": \"version\"\n}\n```\n\n### Optimistic Locking\n\nOptimistic locking is a strategy for preventing changes from clobbering each other.  For example two processes read from the database, make unrelated changes, and then both write to the database but the second write overwrites the first (clobbers).\n\nEnable optimistic locking by setting the `versionKeyField` on your TableSchema.  In the second TableSchema example that field is `version`.  The `versionKeyField` will be automatically incremented on the server side during a put request.  If the value for `versionKeyField` sent does not match the current value in the database then the contents have changed since the last get and the optimistic lock has failed.  In that case you should get the latest version from the database and replay the update against that.\n\n```javascript\nimport * as aws from \"aws-sdk\";\nimport * as dynameh from \"dynameh\";\n\n// Initialize the DynamoDB client.\nconst dynamodb = new aws.DynamoDB({\n    apiVersion: \"2012-08-10\",\n    region: \"us-west-1\"\n});\n\n// Set up the table schema.\nconst tableSchema = {\n    tableName: \"motorcycles\",\n    partitionKeyField: \"id\",\n    partitionKeyType: \"string\",\n    versionKeyField: \"version\"\n};\n\nasync function updateMotorcycleHorsePower(motorcycleId, bhp) {\n    // Fetch the item from the database.\n    const getRequest = dynameh.requestBuilder.buildGetInput(tableSchema, motorcycleId);\n    const getResult = await dynamodb.getItem(getRequest).promise();\n    let motorcycle = dynameh.responseUnwrapper.unwrapGetOutput(getResult);\n    \n    if (!motorcycle) {\n        // Item not found, create it.\n        // Note that we don't need to set the version on create.\n        motorcycle = {\n            id: motorcycleId\n        };\n    }\n    \n    // Update the horse power stat.\n    motorcycle.bhp = bhp;\n    \n    // Put the updated object in the database.\n    const putRequest = dynameh.requestBuilder.buildPutInput(tableSchema, motorcycle);\n    try {\n        await dynamodb.putItem(putRequest).promise();\n    } catch (err) {\n        if (err.code === \"ConditionalCheckFailedException\") {\n            // If this is the error code then the optimistic locking has failed\n            // and we should redo the update operation (done here with recursion).\n            updateMotorcycleHorsePower(motorcycleId, bhp);\n        } else {\n            throw err;\n        }\n    }\n}\n\nupdateMotorcycleHorsePower(\"sv-650\", 73.4);\n```\n\n### Conditions\n\nConditions can be added to a put or delete request to make the operation conditional.\n\nOne of the most useful conditions is that the item must not already exist (create but not update).  This is done by asserting `attribute_not_exists` on the primary key.  For example...\n\n```javascript\nconst tableSchema = {\n    tableName: \"Boats\",\n    partitionKeyField: \"name\",\n    partitionKeyType: \"string\"\n};\n\nasync function addNewBoat(boat) {\n    const putRequest = dynameh.requestBuilder.buildPutInput(tableSchema, boat);\n    const conditionalPutRequest = dynameh.requestBuilder.addCondition(tableSchema, putRequest, {attribute: \"name\", operator: \"attribute_not_exists\"});\n    // Note that addCondition() does not change the original object.\n    // putRequest != conditionalPutRequest\n    \n    try {\n        await dynamodb.putItem(conditionalPutRequest).promise();\n    } catch (err) {\n        if (err.code === \"ConditionalCheckFailedException\") {\n            throw new Error(\"This boat already exists!\");\n        } else {\n            throw err;\n        }\n    }\n}\n\naddNewBoat({\n    name: \"Boaty McBoatface\",\n    type: \"submarine\",\n    autonomous: true\n});\n```\n\nThe following conditions are available...\n\n| condition            | # of value parameters |\n|----------------------|-----------------------|\n| =                    | 1                     |\n| <>                   | 1                     |\n| <                    | 1                     |\n| <=                   | 1                     |\n| >                    | 1                     |\n| >=                   | 1                     |\n| BETWEEN              | 2                     |\n| IN                   | at least 1            |\n| attribute_exists     | 0                     |\n| attribute_not_exists | 0                     |\n| attribute_type       | 1                     |\n| begins_with          | 1                     |\n| contains             | 1                     |\n| size                 | 0                     |\n\n### Projections\n\nProjections can be added to a get, batch get or query request to control what attributes are returned.  This saves bandwidth on the request.\n\nFor example...\n\n```javascript\nconst tableSchema = {\n    tableName: \"Transactions\",\n    partitionKeyField: \"customerId\",\n    partitionKeyType: \"string\",\n    sortKeyField: \"transactionId\",\n    sortKeyType: \"string\",\n};\n\nasync function getTransactionDates(customerId) {\n    const queryRequest = dynameh.requestBuilder.buildQueryInput(tableSchema, customerId);\n    const projectedQueryRequest = dynameh.requestBuilder.addProjection(tableSchema, queryRequest, [\"date\"]);\n    // Note that addProjection() does not change the original object.\n    // queryRequest != projectedQueryRequest\n    \n    const queryResponse = await dynamodb.query(projectedQueryRequest).promise();\n    const transactions = dynameh.responseUnwrapper.unwrapQueryOutput(queryResponse);\n    return transactions.map(t => t.date);\n}\n\ngetTransactionDates(\"BusinessFactory\");\n```\n\n### Date Serialization\n\nDate serialization can be configured by setting `dateSerializationFunction` on your `TableSchema`.  It's a function that takes in a `Date` and returns a `string` or `number`.  By default Dates are serialized as ISO-8601 strings.\n\nFor example...\n\n```javascript\nconst tableSchema = {\n    tableName: \"MyTable\",\n    partitionKeyField: \"id\",\n    partitionKeyType: \"number\",\n    dateSerializationFunction: date => date.toISOString()   // same as default\n};\n```\n","readmeFilename":"README.md","gitHead":"c2d5beeab36af083a0af68c1490ee64aa2933d6e","_id":"dynameh@4.0.0-beta.4","_npmVersion":"6.1.0","_nodeVersion":"8.10.0","_npmUser":{"name":"pushplay","email":"pushplay@gmail.com"},"dist":{"integrity":"sha512-MBKQTUCkcorHMeFZ3uYbqxxrPgGX9KE5mcxs5EhzRJFTsOnKluSeCxGJNiVZ3YEmMg97B2B508AGmlrgiBkpHQ==","shasum":"498d865836573a754b724ef992c065e2d6d18235","tarball":"https://registry.npmjs.org/dynameh/-/dynameh-4.0.0-beta.4.tgz","fileCount":27,"unpackedSize":126261,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJcopmTCRA9TVsSAnZWagAAXz8QAJ4pLaOi9utneZFsMJYC\nmi9RVdNnEt7bKa7equ1CE2r/rFLzWaanBWBXsKDwGVZKmHjXzYv5rNfknvHj\nXlxpom59dxOX12cZ2pqHEQuP+xHcIJsfOQ1vdWMBV9/0Cv0DGHYHM5KuuHxm\nDNkRR9yUbprC5jNMcEmKKrSbU5Czauh4WlVMJNnnV4o+ecmfLhNVvu9rT6nB\nTcMFyjPHOllOJhXKXVsuI1C3mHgySjSUn3gGUe56pHwk8K96ekeBJLtYl+fD\n/6ojJQOpktZPdW0lgHOXrsbxQMlX7Ldk2oiayhtBBK1w1deSqbrGOiTVwyT3\ncMVt/n47U24/IbRBkVQqQRSsPPpsBYhWN01gW3rgxRW5JrsOCtu3ztHbJB2l\n4kmp3iFUxkXe1tXr1IjhBnLOaf1qhClv8i5N6HQ4QMDR40z2g7aO+kLNalpx\nR+QnS9NNWpEigXMTTrGyiOvinoycjfvW+j4T3YzXPT1fcPufNGz9EQxoZ017\nVptUh8g6ka0qzNIVAVAwv6mFTe7TchbIjTmgp8CfRer5D2Ui3B1hSP/3mjFi\ndwGzIwyS7EkhKlCQOMFblnp3MJDBv4qSCsdgcOmFyBCoqvxKgEgjFhuWuK4E\nLs//ECLE26q4u2MKgCV27BNQdg4rL2v2Omv8iYIA0jVP2UBpSNjY+hD0FD3b\nBXO/\r\n=z0v1\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIHReMZD/Vl6grSErRCeWp4wybBBAyox3nK9FpFGUNCMXAiAgYeuBUOv8Pox8je5l7KwZCyzRw+e0u4cWK79Ai4+9GA=="}]},"maintainers":[{"name":"pushplay","email":"pushplay@gmail.com"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/dynameh_4.0.0-beta.4_1554160019019_0.6066215145453182"},"_hasShrinkwrap":false},"4.0.0-beta.5":{"name":"dynameh","version":"4.0.0-beta.5","description":"DynamoDB on Node more easier","main":"dist/index.js","types":"dist/index.d.ts","scripts":{"build":"tsc","clean":"rimraf ./dist","docs":"rimraf ./docs && typedoc src/ --out docs --mode modules --module commonjs --target es6 --excludePrivate --excludeNotExported --exclude '**/*.test.ts' --name Dynameh && touch ./docs/.nojekyll && gh-pages -d docs -t","lint":"tslint --project tsconfig.json","prepublishOnly":"npm run clean && npm run build && npm run lint && npm run test && npm run docs","test":"mocha --recursive --throw-deprecation --require ts-node/register \"src/**/*.test.ts\""},"repository":{"type":"git","url":"git+https://github.com/Giftbit/dynameh.git"},"keywords":["dynamodb"],"contributors":[{"name":"Jeffery Grajkowski","email":"pushplay@gmail.com","url":"https://github.com/pushplay/"},{"name":"Graham Baradoy","email":"graham@giftbit.com","url":"https://github.com/Baradoy/"}],"license":"MIT","bugs":{"url":"https://github.com/Giftbit/dynameh/issues"},"homepage":"https://github.com/Giftbit/dynameh#readme","dependencies":{},"devDependencies":{"@types/chai":"^4.1.7","@types/mocha":"^5.2.6","@types/node":"^11.12.1","aws-sdk":"^2.431.0","chai":"^4.2.0","gh-pages":"^2.0.1","mocha":"^6.0.2","rimraf":"^2.6.3","touch":"^3.1.0","ts-node":"^8.0.3","tslint":"^5.14.0","typedoc":"^0.14.2","typescript":"^3.3.4000"},"peerDependencies":{"aws-sdk":"^2.431.0"},"readme":"# Dynameh\nDynamoDB on Node more easier\n\nDynameh makes the official [DynamoDB JavaScript API](http://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/DynamoDB.html) easier to use.  It makes it easier to:\n\n- [build request objects](https://giftbit.github.io/dynameh/modules/_requestbuilder_.html)\n- [unwrap response objects](https://giftbit.github.io/dynameh/modules/_responseunwrapper_.html)\n- [build a projection expression](https://giftbit.github.io/dynameh/modules/_requestbuilder_.html#addprojection)\n- [build a condition expression](https://giftbit.github.io/dynameh/modules/_requestbuilder_.html#addcondition)\n- [run oversized batch requests](https://giftbit.github.io/dynameh/modules/_batchhelper_.html)\n- [run requests concurrently that can't be run in batch](https://giftbit.github.io/dynameh/modules/_concurrenthelper_.html)\n- [implement optimistic locking](https://giftbit.github.io/dynameh/interfaces/_tableschema_.tableschema.html#versionkeyfield)\n- [configure Date serialization](https://giftbit.github.io/dynameh/interfaces/_tableschema_.tableschema.html#dateserializationfunction)\n\n## Installation\n\nDynameh is your typical NPM package.\n\n```bash\nnpm install --save dynameh\n```\n\n## Usage\n\n```javascript\nimport * as dynameh from \"dynameh\";\n// or\nconst dynameh = require(\"dynameh\");\n```\n\nSee the [documentation](https://giftbit.github.io/dynameh/) for details on each module and its methods.\n\n### A Simple Example\n\nThis example is written using async/await which is available in TypeScript and ES2017.\n\n```javascript\nimport * as aws from \"aws-sdk\";\nimport * as dynameh from \"dynameh\";\n\n// Initialize the DynamoDB client.\nconst dynamodb = new aws.DynamoDB({\n    apiVersion: \"2012-08-10\",\n    region: \"us-west-1\"\n});\n\n// Set up the table schema.\nconst tableSchema = {\n    tableName: \"motorcycles\",\n    partitionKeyField: \"id\",\n    partitionKeyType: \"string\"\n};\n\nasync function updateMotorcycleHorsePower(motorcycleId, bhp) {\n    // Fetch the item from the database.\n    const getRequest = dynameh.requestBuilder.buildGetInput(tableSchema, motorcycleId);\n    const getResult = await dynamodb.getItem(getRequest).promise();\n    let motorcycle = dynameh.responseUnwrapper.unwrapGetOutput(getResult);\n    \n    if (!motorcycle) {\n        // Item not found, create it.\n        motorcycle = {\n            id: motorcycleId\n        };\n    }\n    \n    // Update the horse power stat.\n    motorcycle.bhp = bhp;\n    \n    // Put the updated object in the database.\n    const putRequest = dynameh.requestBuilder.buildPutInput(tableSchema, motorcycle);\n    await dynamodb.putItem(putRequest).promise();\n}\n\nupdateMotorcycleHorsePower(\"sv-650\", 73.4);\n```\n\n### TableSchema\n\nThe key to easy building of requests in Dynameh is the [TableSchema](https://giftbit.github.io/dynameh/interfaces/_tableschema_.tableschema.html).  This simple object defines all the extra information Dynameh needs to build requests.\n\nFor a table called `MyTable` with a partition key `id` that is a number...\n\n```json\n{\n  \"tableName\": \"MyTable\",\n  \"partitionKeyField\": \"id\",\n  \"partitionKeyType\": \"number\"\n}\n```\n\nFor a table called `MyAdvancedTable` with a partition key `id` that is a string, a sort key `date` that is a number, and a version field `version`...\n\n```json\n{\n  \"tableName\": \"MyAdvancedTable\",\n  \"partitionKeyField\": \"id\",\n  \"partitionKeyType\": \"string\",\n  \"sortKeyField\": \"date\",\n  \"sortKeyType\": \"number\",\n  \"versionKeyField\": \"version\"\n}\n```\n\n### Optimistic Locking\n\nOptimistic locking is a strategy for preventing changes from clobbering each other.  For example two processes read from the database, make unrelated changes, and then both write to the database but the second write overwrites the first (clobbers).\n\nEnable optimistic locking by setting the `versionKeyField` on your TableSchema.  In the second TableSchema example that field is `version`.  The `versionKeyField` will be automatically incremented on the server side during a put request.  If the value for `versionKeyField` sent does not match the current value in the database then the contents have changed since the last get and the optimistic lock has failed.  In that case you should get the latest version from the database and replay the update against that.\n\n```javascript\nimport * as aws from \"aws-sdk\";\nimport * as dynameh from \"dynameh\";\n\n// Initialize the DynamoDB client.\nconst dynamodb = new aws.DynamoDB({\n    apiVersion: \"2012-08-10\",\n    region: \"us-west-1\"\n});\n\n// Set up the table schema.\nconst tableSchema = {\n    tableName: \"motorcycles\",\n    partitionKeyField: \"id\",\n    partitionKeyType: \"string\",\n    versionKeyField: \"version\"\n};\n\nasync function updateMotorcycleHorsePower(motorcycleId, bhp) {\n    // Fetch the item from the database.\n    const getRequest = dynameh.requestBuilder.buildGetInput(tableSchema, motorcycleId);\n    const getResult = await dynamodb.getItem(getRequest).promise();\n    let motorcycle = dynameh.responseUnwrapper.unwrapGetOutput(getResult);\n    \n    if (!motorcycle) {\n        // Item not found, create it.\n        // Note that we don't need to set the version on create.\n        motorcycle = {\n            id: motorcycleId\n        };\n    }\n    \n    // Update the horse power stat.\n    motorcycle.bhp = bhp;\n    \n    // Put the updated object in the database.\n    const putRequest = dynameh.requestBuilder.buildPutInput(tableSchema, motorcycle);\n    try {\n        await dynamodb.putItem(putRequest).promise();\n    } catch (err) {\n        if (err.code === \"ConditionalCheckFailedException\") {\n            // If this is the error code then the optimistic locking has failed\n            // and we should redo the update operation (done here with recursion).\n            updateMotorcycleHorsePower(motorcycleId, bhp);\n        } else {\n            throw err;\n        }\n    }\n}\n\nupdateMotorcycleHorsePower(\"sv-650\", 73.4);\n```\n\n### Conditions\n\nConditions can be added to a put or delete request to make the operation conditional.\n\nOne of the most useful conditions is that the item must not already exist (create but not update).  This is done by asserting `attribute_not_exists` on the primary key.  For example...\n\n```javascript\nconst tableSchema = {\n    tableName: \"Boats\",\n    partitionKeyField: \"name\",\n    partitionKeyType: \"string\"\n};\n\nasync function addNewBoat(boat) {\n    const putRequest = dynameh.requestBuilder.buildPutInput(tableSchema, boat);\n    const conditionalPutRequest = dynameh.requestBuilder.addCondition(tableSchema, putRequest, {attribute: \"name\", operator: \"attribute_not_exists\"});\n    // Note that addCondition() does not change the original object.\n    // putRequest != conditionalPutRequest\n    \n    try {\n        await dynamodb.putItem(conditionalPutRequest).promise();\n    } catch (err) {\n        if (err.code === \"ConditionalCheckFailedException\") {\n            throw new Error(\"This boat already exists!\");\n        } else {\n            throw err;\n        }\n    }\n}\n\naddNewBoat({\n    name: \"Boaty McBoatface\",\n    type: \"submarine\",\n    autonomous: true\n});\n```\n\nThe following conditions are available...\n\n| condition            | # of value parameters |\n|----------------------|-----------------------|\n| =                    | 1                     |\n| <>                   | 1                     |\n| <                    | 1                     |\n| <=                   | 1                     |\n| >                    | 1                     |\n| >=                   | 1                     |\n| BETWEEN              | 2                     |\n| IN                   | at least 1            |\n| attribute_exists     | 0                     |\n| attribute_not_exists | 0                     |\n| attribute_type       | 1                     |\n| begins_with          | 1                     |\n| contains             | 1                     |\n| size                 | 0                     |\n\n### Projections\n\nProjections can be added to a get, batch get or query request to control what attributes are returned.  This saves bandwidth on the request.\n\nFor example...\n\n```javascript\nconst tableSchema = {\n    tableName: \"Transactions\",\n    partitionKeyField: \"customerId\",\n    partitionKeyType: \"string\",\n    sortKeyField: \"transactionId\",\n    sortKeyType: \"string\",\n};\n\nasync function getTransactionDates(customerId) {\n    const queryRequest = dynameh.requestBuilder.buildQueryInput(tableSchema, customerId);\n    const projectedQueryRequest = dynameh.requestBuilder.addProjection(tableSchema, queryRequest, [\"date\"]);\n    // Note that addProjection() does not change the original object.\n    // queryRequest != projectedQueryRequest\n    \n    const queryResponse = await dynamodb.query(projectedQueryRequest).promise();\n    const transactions = dynameh.responseUnwrapper.unwrapQueryOutput(queryResponse);\n    return transactions.map(t => t.date);\n}\n\ngetTransactionDates(\"BusinessFactory\");\n```\n\n### Date Serialization\n\nDate serialization can be configured by setting `dateSerializationFunction` on your `TableSchema`.  It's a function that takes in a `Date` and returns a `string` or `number`.  By default Dates are serialized as ISO-8601 strings.\n\nFor example...\n\n```javascript\nconst tableSchema = {\n    tableName: \"MyTable\",\n    partitionKeyField: \"id\",\n    partitionKeyType: \"number\",\n    dateSerializationFunction: date => date.toISOString()   // same as default\n};\n```\n","readmeFilename":"README.md","gitHead":"ef51d49edc800b5d29959ddc5ae39b5322006b90","_id":"dynameh@4.0.0-beta.5","_npmVersion":"6.1.0","_nodeVersion":"8.10.0","_npmUser":{"name":"pushplay","email":"pushplay@gmail.com"},"dist":{"integrity":"sha512-1WpzKkNyu/TpnwicUl4hKlbqcwF42jaL04hrKfguQLsjwYrbgeICwQSqGBrmCIJo2cOF34418dM3X52yi7ZAuA==","shasum":"7b40c0a881e75857a0dfc8cb51fc81e7df4e938c","tarball":"https://registry.npmjs.org/dynameh/-/dynameh-4.0.0-beta.5.tgz","fileCount":27,"unpackedSize":120881,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJcoqQtCRA9TVsSAnZWagAA+mgP/2oM7u171JdwreAfHIz0\nCdcbjQhvwYwNEGNQO3LvihcPJtSMqfGEEGOROibaWExy+e0tTvOgcFywd0ck\nFE/Ygl3JfoLN6MX5xI5aTnxOvNWBBWB8MRgbc2NynZhBqIJHYMcJBFJns0Yy\no5T2RH9VrvsvmQUGB3pvbh+Jc0jtfAlL+9zrIbIDUxlIRqB/5gxQr3PWLoTO\nGngpnpFipGQKBf8wts3R11FgvRTz5qRKHjbgkwPrOGqylruw45yNsdBXu8XW\nj0TN4TVsx1qqVlEKujQh5yupCUYn/qvNUbpZXzcuUPoYg8PO9y+jm3f1y7uv\naUiUEQVs/BKP2HOXuRhtzkkMaxNc9vrq70GGmiOkQj02ixQiFIR1tieeTQT/\nx1CYNWzTxypfchxp4CKrhMifxLn6hpR4/8H90NHbRDXG83wbDnEudTWwqiGb\nvQi+oeIwEJiwuKTpii6eZ4cDpvtB0hGlCeE+C5NVokWzyUCFkQTSDiwCziuf\nP3Dh/xUd9IiPuRO/auDvF6A7GBpo3GuSj5JLALhYNbltE+bODaCK8kP8oH77\nhkV2FiKQzvM2Ok2vajemqxyBhrMLkfQTCo+uW82dLHQQdlhS4YlmKcwIZPwe\nM6LZfL5OuHNMh03v43xShI4YoZ3l9+89E7yYW2X5Eh8EZFkH+m/yGK572vkR\nVwv8\r\n=CN0E\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIDSLB1WfDWRcjyOSodpphm5Rhaa1ztwWUlwIHuYNxfhdAiAOfAdol9hd+8LhU9RnAscXZK42x5N7oqfbz4p2WgYBeQ=="}]},"maintainers":[{"name":"pushplay","email":"pushplay@gmail.com"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/dynameh_4.0.0-beta.5_1554162732830_0.5712174907582024"},"_hasShrinkwrap":false},"4.0.0":{"name":"dynameh","version":"4.0.0","description":"DynamoDB on Node more easier","main":"dist/index.js","types":"dist/index.d.ts","scripts":{"build":"tsc","clean":"rimraf ./dist","docs":"rimraf ./docs && typedoc src/ --out docs --mode modules --module commonjs --target es6 --excludePrivate --excludeNotExported --exclude '**/*.test.ts' --name Dynameh && touch ./docs/.nojekyll && gh-pages -d docs -t","lint":"tslint --project tsconfig.json","prepublishOnly":"npm run clean && npm run build && npm run lint && npm run test && npm run docs","test":"mocha --recursive --throw-deprecation --require ts-node/register \"src/**/*.test.ts\""},"repository":{"type":"git","url":"git+https://github.com/Giftbit/dynameh.git"},"keywords":["dynamodb"],"contributors":[{"name":"Jeffery Grajkowski","email":"pushplay@gmail.com","url":"https://github.com/pushplay/"},{"name":"Graham Baradoy","email":"graham@giftbit.com","url":"https://github.com/Baradoy/"}],"license":"MIT","bugs":{"url":"https://github.com/Giftbit/dynameh/issues"},"homepage":"https://github.com/Giftbit/dynameh#readme","dependencies":{},"devDependencies":{"@types/chai":"^4.1.7","@types/mocha":"^5.2.6","@types/node":"^11.12.1","aws-sdk":"^2.431.0","chai":"^4.2.0","gh-pages":"^2.0.1","mocha":"^6.0.2","rimraf":"^2.6.3","touch":"^3.1.0","ts-node":"^8.0.3","tslint":"^5.14.0","typedoc":"^0.14.2","typescript":"^3.3.4000"},"peerDependencies":{"aws-sdk":"^2.431.0"},"gitHead":"d20d9fb7cb0ec4f55535542e46330dd6308aba6c","_id":"dynameh@4.0.0","_npmVersion":"6.1.0","_nodeVersion":"8.10.0","_npmUser":{"name":"pushplay","email":"pushplay@gmail.com"},"dist":{"integrity":"sha512-qT0v+jxS6qtteQ18DhnQVQY8WiHhjVowu1ZHTRcFQ0c+pwmXrNAh3OYkP7I/K5+O1Np3/QMV7nHD8Ko+gVVKqg==","shasum":"45a35ca099c5fbcdf01200ee5c0ded0c2c020b59","tarball":"https://registry.npmjs.org/dynameh/-/dynameh-4.0.0.tgz","fileCount":27,"unpackedSize":121054,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJcrRooCRA9TVsSAnZWagAA/joP/R2JTbwFxkvOKhgmBraM\nQtH/DtKX2clNY4WxCkiHU8HYw57fOrwpiHL9nF1aISueQGf23B5Fxv2MLBlS\nBspJHFESnnjX0ezZmHo9mrUHKjyqTTqNxwzXYYuASgfSkiUmAb0SoTj3TpJb\no7Y09vnSD2nA91DxB+VVWC4UTkuFiJjoeNiI66yb/0nE5Z+7twlpzi3eNk/W\nGjHRMDTAWxv9aIWHkHQXYg2pIeIXzNBPLNDpHfIxBfy/MlTiEfEjuS83/D2X\nFSpIRouyYgLTxbLHgh3gnG4AlI0r8Zzv8jYMZR6XsASncHzl/ZxAgnvhc3KW\nzvaWWVQG7j6a+iPkvzHEqC/V2OMyceU3o7tNae8JiyadYsNbJ67mu1Uasu3k\n7AR2StC1q8ngPUZFclcfEmLxv8tUdGucIa4/c5X4RZH9JMYHAehAJdWMbqIE\n95+TtfAeS7CxXw61ggVdX6gxIS1kTisYy0OWW0UyPVjaLCC23IeVsbI9OFpF\nj3rUAvtfOD80vS++S6jdmqeBK0pXL1NmgZHOkq0xmMtQzU1jBnHxEAqvzhf+\n2UPiWoq7OfBNGerPyGYe9iFNFJvA0XeECS9tNZoZJMr4HM39bfHotLaf/UK8\n7Upq6IKgidtr+jr/HttpS8CjrZIBbbAb78MmakDCNuE+bCSo+L+UQhy6aAgb\nz+0Y\r\n=XFhA\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIFHVxQyEfgBO3i/G5n9UUVAKhfwWSBK8svYXiGokcnggAiAAvfR/6OPvPLxg9I0CZFGI1UWwSOnRzGtJLajhvlcNBg=="}]},"maintainers":[{"name":"pushplay","email":"pushplay@gmail.com"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/dynameh_4.0.0_1554848295565_0.5188073342524835"},"_hasShrinkwrap":false},"4.1.0":{"name":"dynameh","version":"4.1.0","description":"DynamoDB on Node more easier","main":"dist/index.js","types":"dist/index.d.ts","scripts":{"build":"tsc","clean":"rimraf ./dist","docs":"rimraf ./docs && typedoc src/ --out docs --mode modules --module commonjs --target es6 --excludePrivate --excludeNotExported --exclude '**/*.test.ts' --name Dynameh && touch ./docs/.nojekyll && gh-pages -d docs -t","lint":"eslint . --ext .ts,.tsx","prepublishOnly":"npm run clean && npm run build && npm run lint && npm run test && npm run docs","test":"mocha --recursive --throw-deprecation --require ts-node/register \"src/**/*.test.ts\""},"repository":{"type":"git","url":"git+https://github.com/Giftbit/dynameh.git"},"keywords":["dynamodb"],"contributors":[{"name":"Jeffery Grajkowski","email":"pushplay@gmail.com","url":"https://github.com/pushplay/"},{"name":"Graham Baradoy","email":"graham@giftbit.com","url":"https://github.com/Baradoy/"}],"license":"MIT","bugs":{"url":"https://github.com/Giftbit/dynameh/issues"},"homepage":"https://github.com/Giftbit/dynameh#readme","dependencies":{},"devDependencies":{"@types/chai":"^4.2.10","@types/mocha":"^7.0.2","@types/node":"12.x","@typescript-eslint/eslint-plugin":"^2.22.0","@typescript-eslint/parser":"^2.22.0","aws-sdk":"^2.580.0","chai":"^4.2.0","eslint":"^6.8.0","gh-pages":"^2.2.0","mocha":"^7.1.0","rimraf":"^3.0.2","touch":"^3.1.0","ts-node":"^8.6.2","typedoc":"^0.16.11","typescript":"^3.8.3"},"peerDependencies":{"aws-sdk":"^2.431.0"},"gitHead":"17c92234a3608d700ca0f6ce8de07eb8eee03348","_id":"dynameh@4.1.0","_nodeVersion":"10.16.0","_npmVersion":"6.13.7","dist":{"integrity":"sha512-TFYImERIuIGfrNEzzbA4JKSWXttnLez47yO9oopKWpSVOb49D3B28mSZuxlnJ0gtCEx1+igFbs7taqKDyDBj8g==","shasum":"d3ed59f895d367df05738c57d9763674d0f7e013","tarball":"https://registry.npmjs.org/dynameh/-/dynameh-4.1.0.tgz","fileCount":31,"unpackedSize":128824,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJeYYSmCRA9TVsSAnZWagAAIXwP/3WXyaLhLjteaO1wS13X\nhCrgZuPeHu+tR8nOAbdVfJtPb1dOSLJsm+6RCyS1VqpNnjuNY5cC8azpSZQe\nPYLbchF09dv66uhTbAwksXPsLj5n7dIItwz2QQd9FIRbViJH9u7Omn2TbwDv\nlwyLIWhiAWsINFJJrfj6ZtBFskUPMOPeN3LGSThX8F/s1gOoTgbQevax2lk5\n4EGVEhwWHnnivIKyT3msHJIv6C8ZYKfg5X1wDAGVnxRfawdkboliqD0vk8Q/\nGgpyRoxZ+NsRQXrd77W8KChq3elPpEAIXxogljvMRgU1V2L2IZKl+JzChb5b\nMozM9mpTgek8KRi9jMfKyoW51wWHYsQ2ZqyQC/gOi42KrfX6zmGCabB6DuNd\niFHcFlwatZpN2j6PWpVcF78RhtPce/U9PIUNKXFHL8hIiUGw+5jsRpA8obSz\n4CSHL4LmwPnfautgOEbgZGqLqiC4BUWRcHP3kLp5TMB+hNNRelhf9DoQmfz6\nlIydl6jcjl8X+wxntAceZIOXE6hVSTyBmNfb5Q+ArGeFDlYmLejOHcuyO6i8\nFhpGFTkdTrF3wRE2QsUfCjlYehIvXaJIiPHF8ZrbXj6KP895CdjXV+qgL0mf\nE401u9gasnNdVPFPkc+/FWdGUYsW8I4uSHr+1PRQUDkFvByquNe/rwbmVjPI\n08Ud\r\n=1NJy\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIAVBB2hoY/2lqNYbn68Gb2IikXWV+B2qTcVTozs1WJLIAiBr035BnHm2a1j4ESkTl/+4RJtT8zNrBqSrL4OJBQAh3A=="}]},"maintainers":[{"name":"pushplay","email":"pushplay@gmail.com"}],"_npmUser":{"name":"pushplay","email":"pushplay@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/dynameh_4.1.0_1583449254065_0.18275215036624504"},"_hasShrinkwrap":false},"4.2.1":{"name":"dynameh","version":"4.2.1","description":"DynamoDB on Node more easier","main":"dist/index.js","types":"dist/index.d.ts","scripts":{"build":"tsc","clean":"rimraf ./dist","docs":"rimraf ./docs && typedoc src/ --out docs --mode modules --module commonjs --target es6 --excludePrivate --excludeNotExported --exclude '**/*.test.ts' --name Dynameh && touch ./docs/.nojekyll && gh-pages -d docs -t","lint":"eslint . --ext .ts,.tsx","prepublishOnly":"npm run clean && npm run build && npm run lint && npm run test && npm run docs","test":"mocha --recursive --throw-deprecation --require ts-node/register \"src/**/*.test.ts\""},"repository":{"type":"git","url":"git+https://github.com/Giftbit/dynameh.git"},"keywords":["dynamodb"],"contributors":[{"name":"Jeffery Grajkowski","email":"pushplay@gmail.com","url":"https://github.com/pushplay/"},{"name":"Graham Baradoy","email":"graham@giftbit.com","url":"https://github.com/Baradoy/"}],"license":"MIT","bugs":{"url":"https://github.com/Giftbit/dynameh/issues"},"homepage":"https://github.com/Giftbit/dynameh#readme","dependencies":{},"devDependencies":{"@types/chai":"^4.2.10","@types/mocha":"^7.0.2","@types/node":"12.x","@typescript-eslint/eslint-plugin":"^2.22.0","@typescript-eslint/parser":"^2.22.0","aws-sdk":"^2.580.0","chai":"^4.2.0","eslint":"^6.8.0","gh-pages":"^2.2.0","mocha":"^7.1.0","rimraf":"^3.0.2","touch":"^3.1.0","ts-node":"^8.6.2","typedoc":"^0.16.11","typescript":"^3.8.3"},"peerDependencies":{"aws-sdk":"^2.431.0"},"gitHead":"90b736bdb0a1fb840d963152cd74f5d9cd66123f","_id":"dynameh@4.2.1","_nodeVersion":"10.16.0","_npmVersion":"6.13.7","dist":{"integrity":"sha512-MH1BAlaLx2s4nhjdXtBmhET1Gr2hZOAGq5HouGxcZYeXumZLWF8kHA+I3u72znBXUW6taVCIr0DH4PEj2185Rg==","shasum":"26c5557bafbdd1549ef380d7363916f1e3d0179b","tarball":"https://registry.npmjs.org/dynameh/-/dynameh-4.2.1.tgz","fileCount":31,"unpackedSize":134197,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJeZ9pKCRA9TVsSAnZWagAAUbQP/jgr5IveVSxY6pYdQr6X\nt9sA0/0q1BHcjjFkQy/P3eu9RP4W5j19udW1Z++3pulMYgEjq/wefbl7Q0Hq\nB23HBPOS5i5GmuKEU4pzCiYgf1kAcPI9dZPxueY56be5cwSym7Q7+spTqVSj\neoN78WjSoje6nsO8NVIp2LPPmwjFbRz2Oklg5j826ci4H6VkD90eyuJMPO8s\nwztK0ei7lMuJ3WifGpR/4N4dk+gWI7ZERn4jkEGiFbVcvpmJ0+0fcpVjJ9Ea\nah1ZCrhSZEYjp0rHaiUgoM2hPcVKGNZgkI6CHEwjiqiETYAtp8+RmpZEQdFf\nU8hH5VCw8/YZQG9XBucU/Ra7BjAiikB66QW2kAlvbqWlNFOx5UBkJFqt5acg\nfRMzvxRGoJMqk5D/4O0TYOdvWMH3YDBL4XoroBGL6Tf3a8RGWuAj9Mx5xvIN\nyTJ/E/p45uEpscOB0coiZxW7h/02A9BBJwqLGOjtmgl8oKfwtapbT/FbRzSv\nHAFsqUvt0u0SOfMopriwTBvuT4jAFhLoo+dnuYD9A8FV1Frz5gMU8f5/RSi5\niDeZ0Dnt0QcacRSYFTcl0XE1x1b2f4b0HD6dq6m32u0ciuo6AKivGyBvcbfj\nA3gRFlm/ay0Uc2m9wKK5BDh69XoexbbmqQp08tsXAa+fE4Da1+ckjiKDN0RJ\noGl3\r\n=Ut81\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQD+t+zDrX5KHxmLfkd/hbp2evxIh/e0epTaRgdypNmuzAIgYErYp0NCSPFJw2SAnPBp/ZvsbbERrXuY9ah77Z8K20s="}]},"maintainers":[{"name":"pushplay","email":"pushplay@gmail.com"}],"_npmUser":{"name":"pushplay","email":"pushplay@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/dynameh_4.2.1_1583864393523_0.3711713048283658"},"_hasShrinkwrap":false},"4.3.0":{"name":"dynameh","version":"4.3.0","description":"DynamoDB on Node more easier","main":"dist/index.js","types":"dist/index.d.ts","scripts":{"build":"tsc","clean":"rimraf ./dist","docs":"rimraf ./docs && typedoc src/ --out docs --mode modules --module commonjs --target es6 --excludePrivate --excludeNotExported --exclude '**/*.test.ts' --name Dynameh && touch ./docs/.nojekyll && gh-pages -d docs -t","lint":"eslint . --ext .ts,.tsx","prepublishOnly":"npm run clean && npm run build && npm run lint && npm run test && npm run docs","test":"mocha --recursive --throw-deprecation --require ts-node/register \"src/**/*.test.ts\""},"repository":{"type":"git","url":"git+https://github.com/Giftbit/dynameh.git"},"keywords":["dynamodb"],"contributors":[{"name":"Jeffery Grajkowski","email":"pushplay@gmail.com","url":"https://github.com/pushplay/"},{"name":"Graham Baradoy","email":"graham@giftbit.com","url":"https://github.com/Baradoy/"}],"license":"MIT","bugs":{"url":"https://github.com/Giftbit/dynameh/issues"},"homepage":"https://github.com/Giftbit/dynameh#readme","dependencies":{},"devDependencies":{"@types/chai":"^4.2.10","@types/mocha":"^7.0.2","@types/node":"12.x","@typescript-eslint/eslint-plugin":"^2.22.0","@typescript-eslint/parser":"^2.22.0","aws-sdk":"^2.580.0","chai":"^4.2.0","eslint":"^6.8.0","gh-pages":"^2.2.0","mocha":"^7.1.0","rimraf":"^3.0.2","touch":"^3.1.0","ts-node":"^8.6.2","typedoc":"^0.16.11","typescript":"^3.8.3"},"peerDependencies":{"aws-sdk":"^2.431.0"},"gitHead":"bac1ed65601e7ee95cda50f006e72ef085c38f07","_id":"dynameh@4.3.0","_nodeVersion":"10.16.0","_npmVersion":"6.13.7","dist":{"integrity":"sha512-sC99iMMGC1lmCXRPAk/F932fD7mSp1ZNO7EsHjEM20ndP5n+4tZUtJUcayhmQZqz7+58+CCqCdm8i/LAZbbNww==","shasum":"859d9fb8cd20f1cd49c282c1abc4447d3d08fc3e","tarball":"https://registry.npmjs.org/dynameh/-/dynameh-4.3.0.tgz","fileCount":31,"unpackedSize":136393,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJeZ+g5CRA9TVsSAnZWagAAw+QP/iG9u2V32Nr35xuUEePx\nVbq6XWI30O+Gx35J73+q39ARVX/2V0CZOZiRx5bEt8hXB22LzlANZf92jXl3\ncLGgayKgNeUygzKTiMOnaIjeFk3PpIzy8oWLFSVHlztajXIWgVpxNgo3QBsp\ncFeyEvZlZWtT/yD4gG3bAvTYxtMiKROKH75VG7m6fJ3PYRKUXHvYcGgRW37H\nGBNNDWnNlzYK3fdA7BBPhuSpqCCWddqoJS4hA+PgcVvxHarM104/our+2t/D\nF0y5BOYB4sT/IYeKzx6NmVuOSlPtz+FGR2RN9det2GVMQfygPfIQ2txxh4fy\nyClxHx8vCnF7rB/54Ojowze6T5WthJ/GCRwQ3oXUs0FB0soNDugSgBs4j6sS\neRPbUNoCKGG36/X8BM4a2ABodiiGmGsEdnCzBvTtA8tKGAlkg+p0FxArgef+\n4W7IKj4kMj+70AeMHukKTW3czqSnS1i+Fa3AhwbO5LB+LXUeffG3JO4JMGvy\n5e7RL9dWPFql1bTFIKCcqR53pYZ5APkVwK8Xm8eicAuXEvLFNTlbdr7igkro\nuBtlkO+kpEjieP0nDdQRWJwPgxXp1A/X3agyml3AB7vgjGBq51MBG1+7KpAr\nzGnjLT8q73MMqEkuhtzbt3qNHG1lnVCFAdPWxf/VFIP2WYdRC0EAjDsRdQ1H\nrKLs\r\n=pKLQ\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIElI85ma3Pg9Eb8YY9pXGXbERoCMl+cWaa9myroLbUuzAiBkHESgWqwwGwvQ92BSxewJzQrMTG1z/zf30v2zFOsW4w=="}]},"maintainers":[{"name":"pushplay","email":"pushplay@gmail.com"}],"_npmUser":{"name":"pushplay","email":"pushplay@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/dynameh_4.3.0_1583867960763_0.8931670631722799"},"_hasShrinkwrap":false},"4.3.1":{"name":"dynameh","version":"4.3.1","description":"DynamoDB on Node more easier","main":"dist/index.js","types":"dist/index.d.ts","scripts":{"build":"tsc","clean":"rimraf ./dist","docs":"rimraf ./docs && typedoc src/ --out docs --mode modules --module commonjs --target es6 --excludePrivate --excludeNotExported --exclude '**/*.test.ts' --name Dynameh && touch ./docs/.nojekyll && gh-pages -d docs -t","lint":"eslint . --ext .ts,.tsx","prepublishOnly":"npm run clean && npm run build && npm run lint && npm run test && npm run docs","test":"mocha --recursive --throw-deprecation --require ts-node/register \"src/**/*.test.ts\""},"repository":{"type":"git","url":"git+https://github.com/Giftbit/dynameh.git"},"keywords":["dynamodb"],"contributors":[{"name":"Jeffery Grajkowski","email":"pushplay@gmail.com","url":"https://github.com/pushplay/"},{"name":"Graham Baradoy","email":"graham@giftbit.com","url":"https://github.com/Baradoy/"}],"license":"MIT","bugs":{"url":"https://github.com/Giftbit/dynameh/issues"},"homepage":"https://github.com/Giftbit/dynameh#readme","dependencies":{},"devDependencies":{"@types/chai":"^4.2.10","@types/mocha":"^7.0.2","@types/node":"12.x","@typescript-eslint/eslint-plugin":"^2.22.0","@typescript-eslint/parser":"^2.22.0","aws-sdk":"^2.580.0","chai":"^4.2.0","eslint":"^6.8.0","gh-pages":"^2.2.0","mocha":"^7.1.0","rimraf":"^3.0.2","touch":"^3.1.0","ts-node":"^8.6.2","typedoc":"^0.16.11","typescript":"^3.8.3"},"peerDependencies":{"aws-sdk":"^2.431.0"},"gitHead":"1f759f5da51b5c59b86e35da1074f45f2b6ead69","_id":"dynameh@4.3.1","_nodeVersion":"10.16.0","_npmVersion":"6.13.7","dist":{"integrity":"sha512-jKGP7A9+vemr9m0FgX5O4pZjj5BWz1m5qnX5PXn1kK2ecW7pZfOgWaTxiRb4yeF0wPe1d/+XWiVisN6ZVK1F1A==","shasum":"9cef7d2098c5785b3be1f2e2762c5483a2c0929b","tarball":"https://registry.npmjs.org/dynameh/-/dynameh-4.3.1.tgz","fileCount":31,"unpackedSize":138720,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJea/3xCRA9TVsSAnZWagAAMKQP/RezWp0EKCL0gNrGnU/X\nSwpt1M3IUWMzo3IFeEi8TshuXE412/p3METm/QrqTsaXUgZq1RhexfDOaou2\n/H1PejpClMPGgT08zcFPiQSPMBkvYVzcucXwYKqm0GzfthpfKJCmfZhNFSF8\npaf5M+v5u46Z71mKJKLpTt2SjTs2kNRaHZBHldcEs0NL0kVyNh8fFFj8qMzR\nkpy7XuCdPxMlXzR5pSBYHyiIv7ATvmiNppjwW853e8G+5r/9geREdfR68tik\nu61H1KWJD2hKRYx9R7NrVohxe8okqfnHJUP+39GuoHXcC9DI0AfdRmxddWuD\nwnuMAhi6eaLtQ+c9w5DLITxNgFJM2sMqoAZ1OC4L6ull69xpQu8rplSMc0uz\nM2yfqsslJ8yHiT9UH0R9qSA8yCieyaxiP6J0iLbLFjAJxEz/xIAwEcAw8e9v\nD0XzowdKmLe16tB928ZHCBPW1hfHRj1p9zUpSHPkRhRFtwsRRSldF3rcmBiS\nTDHCpfT2JmTSCFi9lmrCoWVXfItvo0QdMaXw4aSS+QoR85V9uii3ZprRlC+7\nS8IUOcxqytGzH4GtAHVBOyJMieKscjInowWPgmMcHf4ZIr58VvnSKjsWNCOb\nKZvodoOkr1a9Nqd/9U8IJ0skrXGn7zB5aifQJ8zEkOP31Xurv1F+Ri4CZ0l3\nUvO2\r\n=yhIx\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDcjzFMN8T+vgaa++erXtzKk8QzjX9yX49TbVnuFqUzBwIgNVqEyIidb45TXV48XTmddffBdVwPhnJMuM1yBI1H09c="}]},"maintainers":[{"name":"pushplay","email":"pushplay@gmail.com"}],"_npmUser":{"name":"pushplay","email":"pushplay@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/dynameh_4.3.1_1584135665223_0.23528684592191196"},"_hasShrinkwrap":false},"4.4.0":{"name":"dynameh","version":"4.4.0","description":"DynamoDB on Node more easier","main":"dist/index.js","types":"dist/index.d.ts","scripts":{"build":"tsc","clean":"rimraf ./dist","docs":"rimraf ./docs && typedoc src/ --out docs --mode modules --module commonjs --target es6 --excludePrivate --excludeNotExported --exclude '**/*.test.ts' --name Dynameh && touch ./docs/.nojekyll && gh-pages -d docs -t","lint":"eslint . --ext .ts,.tsx","prepublishOnly":"npm run clean && npm run build && npm run lint && npm run test && npm run docs","test":"mocha --recursive --throw-deprecation --require ts-node/register \"src/**/*.test.ts\""},"repository":{"type":"git","url":"git+https://github.com/Giftbit/dynameh.git"},"keywords":["dynamodb"],"contributors":[{"name":"Jeffery Grajkowski","email":"pushplay@gmail.com","url":"https://github.com/pushplay/"},{"name":"Graham Baradoy","email":"graham@giftbit.com","url":"https://github.com/Baradoy/"}],"license":"MIT","bugs":{"url":"https://github.com/Giftbit/dynameh/issues"},"homepage":"https://github.com/Giftbit/dynameh#readme","dependencies":{},"devDependencies":{"@types/chai":"^4.2.11","@types/mocha":"^7.0.2","@types/node":"12.x","@typescript-eslint/eslint-plugin":"^3.6.0","@typescript-eslint/parser":"^3.6.0","aws-sdk":"^2.713.0","chai":"^4.2.0","eslint":"^7.4.0","gh-pages":"^3.1.0","mocha":"^8.0.1","rimraf":"^3.0.2","touch":"^3.1.0","ts-node":"^8.10.2","typedoc":"^0.17.8","typescript":"^3.9.6"},"peerDependencies":{"aws-sdk":"^2.431.0"},"gitHead":"ef8cacb1f5e575ad02a4f0ddb00f75ea073b88ba","_id":"dynameh@4.4.0","_nodeVersion":"10.16.0","_npmVersion":"6.14.5","dist":{"integrity":"sha512-CSc80lRgPj09mFcv9ahHQSUbWFJg/wegUVthzp3voVOjJLKSchYbTfkPgdQHz5jxKD98HG/tyiSRAL9Xt7Gwwg==","shasum":"4f2495dbf5ff1e2c36c985d7cbe024f95f432bb8","tarball":"https://registry.npmjs.org/dynameh/-/dynameh-4.4.0.tgz","fileCount":31,"unpackedSize":142331,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJfB3WXCRA9TVsSAnZWagAAgcgP/RvceYeQKmwi1r2uGrtK\nkKmss52HSRUpaiEqGCrzYCJgtZvhO8YCiV9yB8/kWk7wYBBH83we82dkO2N1\nXu7NAEKUIpbZE55+4iI9svCKsCuA8oXh/9ZI0uZT6mtwMVfUyX14+4gRao/u\nUg4Z5xJBbi5lw1DFPmNiNmDrLdk2huscnvWAxGcaaOiDONwn0PiyGSEsSJQl\nrqqEfNCD5FfIOqcAF8TeTrfbHKJX1/VBw8qHCJ/4lVsIiNZncMFP471+p8vT\ncPSUnbAT/WBwkkED52J1yQZT6FQN6tzGe/srw57Z3SdyvJLBMRdLAUZzj6WZ\nmGhZwTbs9ZFKRGn7vqI8aZ93znRqJgfokDaOqe8MB/jfGaWIZzQitXIexJQd\n2E+ykz+B8CyhCS1PmcEAGLPzHkV4SEcxWu1tW4kZnAEODSMRirKVzS45RuGw\nTiUxMF9l3/QCg1TgfAfM5WbWSvqCbLyqyIxfwN1mWOmZWpkXkPCfqaLPOA1e\nASPzg+gFJPderJkiGPqNDuZgVhjRnHozH1g8HDzAxAXGvIzDEvm+Ct7UpZIF\nZwHxd+Q6UzcmNmgNMTI6U+EHJ3Uxk8k4oYKLYV0WE2j708oV/P4v+PXoumM/\nD4SX/mb1d3y76JN5tuOYt3aPCn35pvZBUbolpUpDmNLJ3hD4i3NklKNU0qZU\nEdL8\r\n=RwaS\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIAdL3C7T7tiaVzTePcuj0Dp3/sUi3piSNBDr3oD65YXzAiEAvfZtkeP8JmKdQ9MMN0xtBRWNyOX5gh8AW/ZBZ0fa8qE="}]},"maintainers":[{"name":"pushplay","email":"pushplay@gmail.com"}],"_npmUser":{"name":"pushplay","email":"pushplay@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/dynameh_4.4.0_1594324374518_0.43577267673146647"},"_hasShrinkwrap":false},"4.5.0":{"name":"dynameh","version":"4.5.0","description":"DynamoDB on Node more easier","main":"dist/index.js","types":"dist/index.d.ts","scripts":{"build":"tsc","clean":"rimraf ./dist","docs":"rimraf ./docs && typedoc && touch ./docs/.nojekyll && gh-pages -d docs -t","lint":"eslint . --ext .ts,.tsx","prepublishOnly":"npm run clean && npm run build && npm run lint && npm run test && npm run docs","test":"mocha --recursive --throw-deprecation --require ts-node/register \"src/**/*.test.ts\""},"repository":{"type":"git","url":"git+https://github.com/pushplay/dynameh.git"},"keywords":["dynamodb"],"contributors":[{"name":"Jeffery Grajkowski","email":"pushplay@gmail.com","url":"https://github.com/pushplay/"},{"name":"Graham Baradoy","email":"graham@giftbit.com","url":"https://github.com/Baradoy/"}],"license":"MIT","bugs":{"url":"https://github.com/pushplay/dynameh/issues"},"homepage":"https://pushplay.github.io/dynameh/","dependencies":{},"devDependencies":{"@types/chai":"^4.2.19","@types/mocha":"^8.2.2","@types/node":"12.x","@typescript-eslint/eslint-plugin":"^4.28.1","@typescript-eslint/parser":"^4.28.1","aws-sdk":"^2.937.0","chai":"^4.3.4","eslint":"^7.29.0","gh-pages":"^3.2.3","mocha":"^9.0.1","rimraf":"^3.0.2","touch":"^3.1.0","ts-node":"^10.0.0","typedoc":"^0.21.2","typescript":"^4.3.4"},"peerDependencies":{"aws-sdk":"^2.431.0"},"gitHead":"fbfa56334cee717aa84a24ecae8512975a5a1e43","_id":"dynameh@4.5.0","_nodeVersion":"16.3.0","_npmVersion":"7.18.1","dist":{"integrity":"sha512-lyx5AczPxDPdD74Bj9MsqQEscaQpz/8MPQ00xRHjgdXW1PAJRB1LsWj7QO/0d0YEkaaZss0ZXYWuLnX+Yhg8fA==","shasum":"b47a864a6bd50f14b7371fad46af43c533e740f3","tarball":"https://registry.npmjs.org/dynameh/-/dynameh-4.5.0.tgz","fileCount":31,"unpackedSize":142225,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJg3MX1CRA9TVsSAnZWagAAVVQQAJWnP3X3+C7Ff8Wphnde\nexRFa0kWv1jJ2hMOPFteRPLbgRfQE8jhC8E/KuH89zB7GSLZnRwLmDUPC3kg\nrNC5MFkZ8tmVK7nxGZ23US82RmCoCNpZRSRbEwzcNP2AScubN/URwdjz5KfQ\n25ZoBMExXMyBGsobHh3giXDC8dXcuej4gseNENxnkvv20CZMsKiK5HQ4Rwp2\nTczyoYI5OgDD7LJndVQMeE4njq7KZxCAJzfns4qY6Y8FeGZC1yoBi1CTzeKn\nE1NZzVR87mihO8hnKYUmhIzz9osAUg1sQw352c6EfZaG5CgnvNQDQSLlW/Pf\nUxGj1V4gv6zCPNUWBn+elIv36q+LAcsJmPEN0V2dH795iFgK7eiZeXiVZg8r\nxqetJxt9bA/1FTnTwCXCSgKxNbd6ms+aiM8ypjUh5xykwL6twuVG4b8wPcdn\n+24PqwB4mhnzHVV7Uv3jjgqIRXGoKx6yu/k/nhDKDsMw1dl4yyjbUNnNnmyA\nj4X9BOS31Wgcqe2cw9djHy0lUYqpjtLsJokDbwyDlnEYAH6yBfRb1c+8UKjx\nTj5e0Wja/8punN4XgungCg1iBfZUbkuN+cmOdNMr73xbeQsXqpipj0gRSMxO\n13I1In9VfPNbIkVUXUNQXQHptjll4xl+87VY4K3gXQq9rGDT0r2IadWz+Ql4\ntGAq\r\n=341t\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIHTxfvUGoDfuFsu5QMuQsy2W37UwH6yYVsydJ6Q8j9vBAiB+RO0ahIbxd2L+FtN6BvJFM7hF2HmPe02amI9UDnH+Rg=="}]},"_npmUser":{"name":"pushplay","email":"pushplay@gmail.com"},"directories":{},"maintainers":[{"name":"pushplay","email":"pushplay@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/dynameh_4.5.0_1625081332879_0.6630804463770279"},"_hasShrinkwrap":false},"4.5.1":{"name":"dynameh","version":"4.5.1","description":"DynamoDB on Node more easier","main":"dist/index.js","types":"dist/index.d.ts","scripts":{"build":"tsc","clean":"rimraf ./dist","docs":"rimraf ./docs && typedoc && touch ./docs/.nojekyll && gh-pages -d docs -t","lint":"eslint . --ext .ts,.tsx","prepublishOnly":"npm run clean && npm run build && npm run lint && npm run test && npm run docs","test":"mocha --recursive --throw-deprecation --require ts-node/register \"src/**/*.test.ts\""},"repository":{"type":"git","url":"git+https://github.com/pushplay/dynameh.git"},"keywords":["dynamodb"],"contributors":[{"name":"Jeffery Grajkowski","email":"pushplay@gmail.com","url":"https://github.com/pushplay/"},{"name":"Graham Baradoy","email":"graham@giftbit.com","url":"https://github.com/Baradoy/"}],"license":"MIT","bugs":{"url":"https://github.com/pushplay/dynameh/issues"},"homepage":"https://pushplay.github.io/dynameh/","dependencies":{},"devDependencies":{"@types/chai":"^4.3.1","@types/mocha":"^9.1.1","@types/node":"12.x","@typescript-eslint/eslint-plugin":"^5.23.0","@typescript-eslint/parser":"^5.23.0","aws-sdk":"^2.1132.0","chai":"^4.3.6","eslint":"^8.15.0","gh-pages":"^4.0.0","mocha":"^9.0.1","rimraf":"^3.0.2","touch":"^3.1.0","ts-node":"^10.7.0","typedoc":"^0.22.15","typescript":"^4.6.4"},"peerDependencies":{"aws-sdk":"^2.431.0"},"gitHead":"ae979c1111db75d77cdd424c837477f6414aea98","_id":"dynameh@4.5.1","_nodeVersion":"16.13.1","_npmVersion":"8.8.0","dist":{"integrity":"sha512-U99Ioxj9VXwy83hLUxmL35GEvTMyFYoy+ULb+HpDXsCSAPgM3GWjpHKqLxAb989taKdqyf84hbRWczB8cXDWqw==","shasum":"71525c77418301b2cbb133469d9801718a67ce88","tarball":"https://registry.npmjs.org/dynameh/-/dynameh-4.5.1.tgz","fileCount":31,"unpackedSize":142589,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIAZfziIfzwLLSuoXNbLU1szNhyY8EyA9zHfpJj8+i9TdAiEAlxLWiQDElsuVPhKUBazRxAJlauLy4okIUlxXBc+ABzA="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJie9sAACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmo6uw/+Mgb9ktBt3yAKl57ZyMgPCvgA3C6rFcwfkvpvZl5jWkOx06y8\r\nQcWuuok9oKLY+C/5zkQ72ToeQB3Ncx35p4+5zrE0ZLqYNm1HHGtBCjfXQ5iU\r\ngGYoFgZDzyxs+meia6rKb1pMMFTGuPvUQVEYym4AVgB2ZBmEKC93Xq02ahH4\r\ngH8JdAjtgfetimMH42Ctymcblg90ANFL9aKztvdoFdPeGEuGrMbKI1vCe9g0\r\nZE/PpIWISTUZNy3PA1PuC6rGwXOmsN3VEqBioGTo+tDJYdPULoxpJbnEdZ9n\r\nt2KbcugT3iVEHVvysif06wl52sBOkxapB7qXtxpGRdts3ASz6prr8Oy7lvw8\r\nczfBtHUIlcEbY7U6FKu2cgrQXA4l1eVEx9fOXo4MT9QJbaLAhJgs1EXV5iY5\r\nTQOJun2YblLNNnZ1L2sV5lGpwg8w/zbeScv4Y1w0NwhdJ0qk7XSTL9Cr9AHf\r\nnMG/I+CpExU4kInsApSAPj0U+vbJnqktFBhk7tNngU0j+rZvd90hl2KaYOYF\r\n2uKZGwjLQE67nPw4SpWYpSSPYmQTYIT12BQM52NJR8SNeDvSRgRnlJBCOAWj\r\nS7OAz9vRlJ2UAk7uYOW9ZWtMrUl7OIVvWV+cRPsoUXY/lBxOhD2BOfDXPRR7\r\nfc2xc4PR6WxnSthoVJVl+qkHHpLCDOtvkoE=\r\n=SrAL\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"pushplay","email":"pushplay@gmail.com"},"directories":{},"maintainers":[{"name":"pushplay","email":"pushplay@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/dynameh_4.5.1_1652284160114_0.4494840878216946"},"_hasShrinkwrap":false}},"readme":"# Dynameh\nDynamoDB on Node more easier\n\nDynameh makes the official [DynamoDB JavaScript API](http://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/DynamoDB.html) easier to use.  It makes it easier to:\n\n- [build request objects](https://pushplay.github.io/dynameh/modules/_requestbuilder_.html)\n- [unwrap response objects](https://pushplay.github.io/dynameh/modules/_responseunwrapper_.html)\n- [build a projection expression](https://pushplay.github.io/dynameh/modules/_requestbuilder_.html#addprojection)\n- [build a condition expression](https://pushplay.github.io/dynameh/modules/_requestbuilder_.html#addcondition)\n- [run oversized batch requests](https://pushplay.github.io/dynameh/modules/_batchhelper_.html)\n- [paginate through queries](https://pushplay.github.io/dynameh/modules/_queryhelper_.html)\n- [paginate through scans](https://pushplay.github.io/dynameh/modules/_scanhelper_.html)\n- [run requests concurrently that can't be run in batch](https://pushplay.github.io/dynameh/modules/_concurrenthelper_.html)\n- [implement optimistic locking](https://pushplay.github.io/dynameh/interfaces/_tableschema_.tableschema.html#versionkeyfield)\n- [configure Date serialization](https://pushplay.github.io/dynameh/interfaces/_tableschema_.tableschema.html#dateserializationfunction)\n\nClick above for API-specifics or read on for a general overview.\n\n## Installation\n\nDynameh is your typical NPM package.\n\n```bash\nnpm install --save dynameh\n```\n\n`aws-sdk` is a peer dependency.  There are no other runtime dependencies.\n\n## Usage\n\n```javascript\nimport * as dynameh from \"dynameh\";\n// or\nconst dynameh = require(\"dynameh\");\n```\n\nSee the [documentation](https://pushplay.github.io/dynameh/) for details on each module and its methods.\n\n### A Simple Example\n\nThis example is written using async/await which is available in TypeScript and ES2017.\n\n```javascript\nimport * as aws from \"aws-sdk\";\nimport * as dynameh from \"dynameh\";\n\n// Initialize the DynamoDB client.\nconst dynamodb = new aws.DynamoDB({\n    apiVersion: \"2012-08-10\",\n    region: \"us-west-1\"\n});\n\n// Set up the table schema.\nconst tableSchema = {\n    tableName: \"motorcycles\",\n    partitionKeyField: \"id\",\n    partitionKeyType: \"string\"\n};\n\nasync function updateMotorcycleHorsePower(motorcycleId, bhp) {\n    // Fetch the item from the database.\n    const getRequest = dynameh.requestBuilder.buildGetInput(tableSchema, motorcycleId);\n    const getResult = await dynamodb.getItem(getRequest).promise();\n    let motorcycle = dynameh.responseUnwrapper.unwrapGetOutput(getResult);\n    \n    if (!motorcycle) {\n        // Item not found, create it.\n        motorcycle = {\n            id: motorcycleId\n        };\n    }\n    \n    // Update the horse power stat.\n    motorcycle.bhp = bhp;\n    \n    // Put the updated object in the database.\n    const putRequest = dynameh.requestBuilder.buildPutInput(tableSchema, motorcycle);\n    await dynamodb.putItem(putRequest).promise();\n}\n\nupdateMotorcycleHorsePower(\"sv-650\", 73.4);\n```\n\n### TableSchema\n\nThe key to easy building of requests in Dynameh is the [TableSchema](https://pushplay.github.io/dynameh/interfaces/_tableschema_.tableschema.html).  This simple object defines all the extra information Dynameh needs to build requests.\n\nFor a table called `MyTable` with a partition key `id` that is a number...\n\n```json\n{\n  \"tableName\": \"MyTable\",\n  \"partitionKeyField\": \"id\",\n  \"partitionKeyType\": \"number\"\n}\n```\n\nFor a table called `MyAdvancedTable` with a partition key `id` that is a string, a sort key `date` that is a number, and a version field `version`...\n\n```json\n{\n  \"tableName\": \"MyAdvancedTable\",\n  \"partitionKeyField\": \"id\",\n  \"partitionKeyType\": \"string\",\n  \"sortKeyField\": \"date\",\n  \"sortKeyType\": \"number\",\n  \"versionKeyField\": \"version\"\n}\n```\n\n### Optimistic Locking\n\nOptimistic locking is a strategy for preventing changes from clobbering each other.  For example two processes read from the database, make unrelated changes, and then both write to the database but the second write overwrites the first (clobbers).\n\nEnable optimistic locking by setting the `versionKeyField` on your TableSchema.  In the second TableSchema example that field is `version`.  The `versionKeyField` will be automatically incremented on the server side during a put request.  If the value for `versionKeyField` sent does not match the current value in the database then the contents have changed since the last get and the optimistic lock has failed.  In that case you should get the latest version from the database and replay the update against that.\n\n```javascript\nimport * as aws from \"aws-sdk\";\nimport * as dynameh from \"dynameh\";\n\n// Initialize the DynamoDB client.\nconst dynamodb = new aws.DynamoDB({\n    apiVersion: \"2012-08-10\",\n    region: \"us-west-1\"\n});\n\n// Set up the table schema.\nconst tableSchema = {\n    tableName: \"motorcycles\",\n    partitionKeyField: \"id\",\n    partitionKeyType: \"string\",\n    versionKeyField: \"version\"\n};\n\nasync function updateMotorcycleHorsePower(motorcycleId, bhp) {\n    // Fetch the item from the database.\n    const getRequest = dynameh.requestBuilder.buildGetInput(tableSchema, motorcycleId);\n    const getResult = await dynamodb.getItem(getRequest).promise();\n    let motorcycle = dynameh.responseUnwrapper.unwrapGetOutput(getResult);\n    \n    if (!motorcycle) {\n        // Item not found, create it.\n        // Note that we don't need to set the version on create.\n        motorcycle = {\n            id: motorcycleId\n        };\n    }\n    \n    // Update the horse power stat.\n    motorcycle.bhp = bhp;\n    \n    // Put the updated object in the database.\n    const putRequest = dynameh.requestBuilder.buildPutInput(tableSchema, motorcycle);\n    try {\n        await dynamodb.putItem(putRequest).promise();\n    } catch (err) {\n        if (err.code === \"ConditionalCheckFailedException\") {\n            // If this is the error code then the optimistic locking has failed\n            // and we should redo the update operation (done here with recursion).\n            updateMotorcycleHorsePower(motorcycleId, bhp);\n        } else {\n            throw err;\n        }\n    }\n}\n\nupdateMotorcycleHorsePower(\"sv-650\", 73.4);\n```\n\n### Query and Scan\n\nBoth query and scan are paginated operations.  They may return a limited set of results and you must make repeated calls to get all the results.  [queryHelper](https://pushplay.github.io/dynameh/modules/_queryhelper_.html) and [scanHelper](https://pushplay.github.io/dynameh/modules/_scanhelper_.html) provide utilities that go through the pagination for you.\n\n`queryAll()` and `scanAll()` will collect all results in a single array.  For small result sets this is easiest to work with but for large result sets this may require a lot of memory to store all results at once.\n\n`queryByCallback()` and `scanByCallback()` take a callback parameter that processes each page of results.  Processing one page at a time reduces the amount of memory required.\n\nThis example function scans the table for items and deletes them in batches:\n\n```javascript\nasync function deleteAllItems(dynamodbClient, tableSchema) {\n    const scanInput = dynameh.requestBuilder.buildScanInput(tableSchema);\n    let deleteCount = 0;\n    await dynameh.scanHelper.scanByCallback(dynamodbClient, scanInput, async items => {\n        const keysToDelete = objectSchema.sortKeyField ?\n            items.map(item => [item[tableSchema.partitionKeyField], item[tableSchema.sortKeyField]]) :\n            items.map(item => item[tableSchema.partitionKeyField]);\n\n        const batchDeleteInput = dynameh.requestBuilder.buildBatchDeleteInput(tableSchema, keysToDelete);\n        await dynameh.batchHelper.batchWriteAll(dynamodbClient, batchDeleteInput);\n        return true;\n    });\n}\n```\n\n### Conditions\n\nConditions can be added to a put or delete request to make the operation conditional.\n\nOne of the most useful conditions is that the item must not already exist (create but not update).  This is done by asserting `attribute_not_exists` on the primary key.  For example...\n\n```javascript\nconst tableSchema = {\n    tableName: \"Boats\",\n    partitionKeyField: \"name\",\n    partitionKeyType: \"string\"\n};\n\nasync function addNewBoat(boat) {\n    const putRequest = dynameh.requestBuilder.buildPutInput(tableSchema, boat);\n    dynameh.requestBuilder.addCondition(tableSchema, putRequest, {attribute: \"name\", operator: \"attribute_not_exists\"});\n    \n    try {\n        await dynamodb.putItem(putRequest).promise();\n    } catch (err) {\n        if (err.code === \"ConditionalCheckFailedException\") {\n            throw new Error(\"This boat already exists!\");\n        } else {\n            throw err;\n        }\n    }\n}\n\naddNewBoat({\n    name: \"Boaty McBoatface\",\n    type: \"submarine\",\n    autonomous: true,\n    commissioned: 2016\n});\n```\n\nThe following conditions are available...\n\n| condition            | # of value parameters | description |\n|----------------------|-----------------------|-------------|\n| =                    | 1                     | the attribute's value equals the supplied value |\n| <>                   | 1                     | the attribute's value does not equal the supplied value |\n| <                    | 1                     | the attribute's value is less than the supplied value |\n| <=                   | 1                     | the attribute's value is less than or equal to the supplied value |\n| >                    | 1                     | the attribute's value is greater than the supplied value |\n| >=                   | 1                     | the attribute's value is greater than or equal to the supplied value |\n| BETWEEN              | 2                     | the attribute's value is between the supplied values |\n| IN                   | at least 1            | the attribute's value is in the list of supplied values |\n| attribute_exists     | 0                     | the attribute has a value |\n| attribute_not_exists | 0                     | the attribute does not have a value |\n| attribute_type       | 1                     | the attribute's value is of the supplied type (S, SS, N, NS, B, BS, BOOL, NULL, L, M) |\n| begins_with          | 1                     | the attribute's value begins with the supplied value |\n| contains             | 1                     | the attribute's value is a string that contains the supplied substring or a set that contains the supplied element  |\n\nSee [the official documentation](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Expressions.OperatorsAndFunctions.html) for more info.\n\n### Filters\n\nFilters can be added to query and scan operations to refine what objects are returned to you.  Query conditions operate on indexed fields (partition and sort) and filters operate on non-indexed fields.  Because filters are for non-indexed fields each object must be read from the database, consuming read capacity.  This makes them slower and more expensive than a well-chosen index.  A filter may still be a good idea to save bandwidth on an infrequent operation.\n\nThe filter object and the operators available are the same as conditions above.\n\nThis example scans for boats commissioned exactly 20 years ago for an anniversary announcement (an infrequent operation).\n\n```javascript\nconst tableSchema = {\n    tableName: \"Boats\",\n    partitionKeyField: \"name\",\n    partitionKeyType: \"string\"\n};\n\nasync function getVigentennialBoats() {\n    const anniversaryYear = new Date().getFullYear() - 20;\n    const scanRequest = dynameh.requestBuilder.buildScanInput(tableSchema);\n    dynameh.requestBuilder.addFilter(tableSchema, scanRequest, {attribute: \"year\", operator: \"=\", values: [anniversaryYear]});\n    \n    return await dynameh.scanHelper.scanAll(dynamodb, scanRequest);\n}\n```\n\n### Projections\n\nProjections can be added to a get, batch get or query request to control what attributes are returned.  This saves bandwidth on the request.\n\nFor example...\n\n```javascript\nconst tableSchema = {\n    tableName: \"Transactions\",\n    partitionKeyField: \"customerId\",\n    partitionKeyType: \"string\",\n    sortKeyField: \"transactionId\",\n    sortKeyType: \"string\",\n};\n\nasync function getTransactionDates(customerId) {\n    const queryRequest = dynameh.requestBuilder.buildQueryInput(tableSchema, customerId);\n    const projectedQueryRequest = dynameh.requestBuilder.addProjection(tableSchema, queryRequest, [\"date\"]);\n    // Note that addProjection() does not change the original object.\n    // queryRequest != projectedQueryRequest\n    \n    const queryResponse = await dynamodb.query(projectedQueryRequest).promise();\n    const transactions = dynameh.responseUnwrapper.unwrapQueryOutput(queryResponse);\n    return transactions.map(t => t.date);\n}\n\ngetTransactionDates(\"BusinessFactory\");\n```\n\n### Date Serialization\n\nDate serialization can be configured by setting `dateSerializationFunction` on your `TableSchema`.  It's a function that takes in a `Date` and returns a `string` or `number`.  By default Dates are serialized as ISO-8601 strings (the only correct date format).\n\nFor example...\n\n```javascript\nconst tableSchema = {\n    tableName: \"MyTable\",\n    partitionKeyField: \"id\",\n    partitionKeyType: \"number\",\n    dateSerializationFunction: date => date.toISOString()   // same as default\n};\n```\n","maintainers":[{"name":"pushplay","email":"pushplay@gmail.com"}],"time":{"modified":"2022-06-16T02:31:32.745Z","created":"2017-03-23T00:03:13.907Z","2.2.1":"2017-03-23T00:03:13.907Z","2.2.2":"2017-03-23T19:34:14.077Z","2.3.0":"2017-03-23T23:38:40.334Z","2.4.0":"2017-03-30T20:27:28.683Z","2.5.0":"2017-05-10T17:23:46.618Z","2.5.1":"2017-07-05T21:21:13.141Z","2.6.0":"2017-08-01T15:50:10.964Z","2.7.0":"2017-08-01T18:11:00.432Z","2.7.1":"2017-08-01T18:42:09.717Z","2.7.2":"2017-08-14T18:35:39.172Z","2.8.0":"2017-08-18T21:16:58.617Z","2.9.0":"2017-09-08T15:27:52.828Z","2.9.1":"2017-09-08T19:54:37.400Z","2.10.0":"2017-12-30T07:27:43.318Z","2.10.1":"2018-01-04T21:22:17.704Z","2.10.2":"2018-02-09T19:23:15.771Z","2.10.3":"2018-02-13T23:04:18.734Z","3.0.0":"2019-01-29T00:24:51.479Z","3.1.0":"2019-03-20T18:52:09.222Z","3.2.0":"2019-03-21T19:50:12.623Z","3.3.0-beta.1":"2019-03-25T18:31:32.615Z","3.3.0-beta.2":"2019-03-25T22:06:42.740Z","3.3.0-beta.3":"2019-03-28T17:35:30.354Z","3.3.0-beta.4":"2019-03-29T21:51:16.839Z","3.3.0-beta.5":"2019-03-29T22:30:49.968Z","4.0.0-beta.1":"2019-04-01T17:11:31.987Z","4.0.0-beta.2":"2019-04-01T18:41:10.050Z","4.0.0-beta.3":"2019-04-01T22:00:19.395Z","4.0.0-beta.4":"2019-04-01T23:06:59.199Z","4.0.0-beta.5":"2019-04-01T23:52:13.099Z","4.0.0":"2019-04-09T22:18:15.703Z","4.1.0":"2020-03-05T23:00:54.210Z","4.2.0":"2020-03-10T18:04:56.426Z","4.2.1":"2020-03-10T18:19:53.686Z","4.3.0":"2020-03-10T19:19:20.898Z","4.3.1":"2020-03-13T21:41:05.389Z","4.4.0":"2020-07-09T19:52:54.652Z","4.5.0":"2021-06-30T19:28:52.999Z","4.5.1":"2022-05-11T15:49:20.526Z"},"homepage":"https://pushplay.github.io/dynameh/","keywords":["dynamodb"],"repository":{"type":"git","url":"git+https://github.com/pushplay/dynameh.git"},"contributors":[{"name":"Jeffery Grajkowski","email":"pushplay@gmail.com","url":"https://github.com/pushplay/"},{"name":"Graham Baradoy","email":"graham@giftbit.com","url":"https://github.com/Baradoy/"}],"bugs":{"url":"https://github.com/pushplay/dynameh/issues"},"license":"MIT","readmeFilename":"README.md"}