{"_id":"@castore/event-storage-adapter-dynamodb","_rev":"8-f5f6fcaba1f52768645ae51feb8c95fa","name":"@castore/event-storage-adapter-dynamodb","dist-tags":{"latest":"2.4.2"},"versions":{"2.0.0":{"name":"@castore/event-storage-adapter-dynamodb","version":"2.0.0","keywords":["event","source","store","typescript"],"license":"MIT","_id":"@castore/event-storage-adapter-dynamodb@2.0.0","maintainers":[{"name":"thomasaribart","email":"thomas.aribart@gmail.com"},{"name":"valentinbeggi","email":"valentinbe@theodo.fr"},{"name":"charlesgery","email":"charles.gery@gmail.com"},{"name":"julietteff","email":"juliettef@theodo.fr"}],"homepage":"https://github.com/castore-dev/castore#readme","bugs":{"url":"https://github.com/castore-dev/castore/issues"},"nx":{"targets":{"package":{"outputs":["packages/event-storage-adapter-dynamodb/dist"]}}},"dist":{"shasum":"70731c36bd19a03cfff0f768974a4d087fa283d4","tarball":"https://registry.npmjs.org/@castore/event-storage-adapter-dynamodb/-/event-storage-adapter-dynamodb-2.0.0.tgz","fileCount":61,"integrity":"sha512-ZQNA5HSAkISG4LMB89+acuZ32mdAoNFEOi29/LvyWyFzBQtCm+XW/I6aUfGnK4HWaz2M0dsOL5/cN+3dxwrvdg==","signatures":[{"sig":"MEQCIGzDo+P3tks9JXS0ZEzXnHp9yq1kOyDrU8g2LfC1VodZAiAuVoFMdURhG2HbqggJzLWXt+aJgY6PBf1QFMDCfcETjA==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":380034},"main":"dist/cjs/index.js","types":"dist/types/index.d.ts","module":"dist/esm/index.js","gitHead":"a00ddf6ae99fbe78737f648da21dc7aad4883733","scripts":{"test":"yarn test-type && yarn test-unit && yarn test-circular && yarn test-linter","watch":"rm -rf dist && concurrently 'yarn:package-* --watch'","package":"rm -rf dist && yarn package-cjs && yarn package-esm && yarn package-types","lint-fix":"yarn linter-base-config --fix","test-type":"tsc --noEmit --emitDeclarationOnly false","test-unit":"yarn vitest run --passWithNoTests","transpile":"babel src --extensions .ts --quiet","package-cjs":"NODE_ENV=cjs yarn transpile --out-dir dist/cjs --source-maps","package-esm":"NODE_ENV=esm yarn transpile --out-dir dist/esm --source-maps","test-linter":"yarn linter-base-config .","lint-fix-all":"yarn lint-fix .","package-types":"tsc -p tsconfig.build.json && tsc-alias -p tsconfig.build.json","test-circular":"yarn depcruise --validate dependency-cruiser.js .","linter-base-config":"eslint --ext=js,ts"},"_npmUser":{"name":"thomasaribart","email":"thomas.aribart@gmail.com"},"repository":{"url":"git+https://github.com/castore-dev/castore.git","type":"git"},"_npmVersion":"9.8.1","description":"DRY Castore EventStorageAdapter implementation using DynamoDB","directories":{},"sideEffects":false,"_nodeVersion":"18.18.2","dependencies":{"@aws-sdk/util-dynamodb":"^3.319.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"eslint":"^8.14.0","vitest":"^0.26.2","ts-node":"^10.7.0","mockdate":"^3.0.5","prettier":"^2.6.2","tsc-alias":"^1.8.7","@babel/cli":"^7.17.6","typescript":"^4.6.3","@babel/core":"^7.17.9","@types/node":"^17.0.29","lodash.omit":"^4.5.0","concurrently":"^7.1.0","@castore/core":"workspace:","@babel/preset-env":"^7.16.11","@types/lodash.omit":"^4.5.7","dependency-cruiser":"^11.7.0","aws-sdk-client-mock":"^2.1.1","@serverless/typescript":"^3.15.2","@castore/demo-blueprint":"workspace:","@aws-sdk/client-dynamodb":"^3.2.0","@babel/preset-typescript":"^7.16.7","babel-plugin-module-resolver":"^4.1.0","@babel/plugin-transform-runtime":"^7.17.0"},"peerDependencies":{"@castore/core":"^2.0.0","@aws-sdk/client-dynamodb":"^3.0.0"},"_npmOperationalInternal":{"tmp":"tmp/event-storage-adapter-dynamodb_2.0.0_1698427496426_0.16163173376386064","host":"s3://npm-registry-packages"}},"2.1.0":{"name":"@castore/event-storage-adapter-dynamodb","version":"2.1.0","keywords":["event","source","store","typescript"],"license":"MIT","_id":"@castore/event-storage-adapter-dynamodb@2.1.0","maintainers":[{"name":"thomasaribart","email":"thomas.aribart@gmail.com"},{"name":"valentinbeggi","email":"valentinbe@theodo.fr"},{"name":"charlesgery","email":"charles.gery@gmail.com"},{"name":"julietteff","email":"juliettef@theodo.fr"}],"homepage":"https://github.com/castore-dev/castore#readme","bugs":{"url":"https://github.com/castore-dev/castore/issues"},"nx":{"targets":{"package":{"outputs":["packages/event-storage-adapter-dynamodb/dist"]}}},"dist":{"shasum":"ab82c03a4f7a260e186c754b159f8c870f408b92","tarball":"https://registry.npmjs.org/@castore/event-storage-adapter-dynamodb/-/event-storage-adapter-dynamodb-2.1.0.tgz","fileCount":61,"integrity":"sha512-Yac5hdXFvABMYmJt/eiT6HLAPzFYUp6X77Y+cL29NPQChsq0vsh4kEY+dJWx7EEXM8jdh/DYVFm4XP0IstvJqA==","signatures":[{"sig":"MEYCIQDgzO0V4MhhVIohr+fO+dmej8lymTu8CQ8mGxui+TpEFAIhANw9chw7E08WP2lIEboIELy5jEFCGPw61o4L5TbKgd2j","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":380034},"main":"dist/cjs/index.js","types":"dist/types/index.d.ts","module":"dist/esm/index.js","gitHead":"80c3a1f242e1f30f789312fc5a421789f189beb5","scripts":{"test":"yarn test-type && yarn test-unit && yarn test-circular && yarn test-linter","watch":"rm -rf dist && concurrently 'yarn:package-* --watch'","package":"rm -rf dist && yarn package-cjs && yarn package-esm && yarn package-types","lint-fix":"yarn linter-base-config --fix","test-type":"tsc --noEmit --emitDeclarationOnly false","test-unit":"yarn vitest run --passWithNoTests","transpile":"babel src --extensions .ts --quiet","package-cjs":"NODE_ENV=cjs yarn transpile --out-dir dist/cjs --source-maps","package-esm":"NODE_ENV=esm yarn transpile --out-dir dist/esm --source-maps","test-linter":"yarn linter-base-config .","lint-fix-all":"yarn lint-fix .","package-types":"tsc -p tsconfig.build.json && tsc-alias -p tsconfig.build.json","test-circular":"yarn depcruise --validate dependency-cruiser.js .","linter-base-config":"eslint --ext=js,ts"},"_npmUser":{"name":"thomasaribart","email":"thomas.aribart@gmail.com"},"repository":{"url":"git+https://github.com/castore-dev/castore.git","type":"git"},"_npmVersion":"9.8.1","description":"DRY Castore EventStorageAdapter implementation using DynamoDB","directories":{},"sideEffects":false,"_nodeVersion":"18.18.2","dependencies":{"@aws-sdk/util-dynamodb":"^3.319.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"eslint":"^8.14.0","vitest":"^0.26.2","ts-node":"^10.7.0","mockdate":"^3.0.5","prettier":"^2.6.2","tsc-alias":"^1.8.7","@babel/cli":"^7.17.6","typescript":"^4.6.3","@babel/core":"^7.17.9","@types/node":"^17.0.29","lodash.omit":"^4.5.0","concurrently":"^7.1.0","@castore/core":"workspace:","@babel/preset-env":"^7.16.11","@types/lodash.omit":"^4.5.7","dependency-cruiser":"^11.7.0","aws-sdk-client-mock":"^2.1.1","@serverless/typescript":"^3.15.2","@castore/demo-blueprint":"workspace:","@aws-sdk/client-dynamodb":"^3.2.0","@babel/preset-typescript":"^7.16.7","babel-plugin-module-resolver":"^4.1.0","@babel/plugin-transform-runtime":"^7.17.0"},"peerDependencies":{"@castore/core":"^2.0.0","@aws-sdk/client-dynamodb":"^3.0.0"},"_npmOperationalInternal":{"tmp":"tmp/event-storage-adapter-dynamodb_2.1.0_1699022231429_0.09108742779726753","host":"s3://npm-registry-packages"}},"2.2.0":{"name":"@castore/event-storage-adapter-dynamodb","version":"2.2.0","keywords":["event","source","store","typescript"],"license":"MIT","_id":"@castore/event-storage-adapter-dynamodb@2.2.0","maintainers":[{"name":"thomasaribart","email":"thomas.aribart@gmail.com"},{"name":"valentinbeggi","email":"valentinbe@theodo.fr"},{"name":"charlesgery","email":"charles.gery@gmail.com"},{"name":"julietteff","email":"juliettef@theodo.fr"}],"homepage":"https://github.com/castore-dev/castore#readme","bugs":{"url":"https://github.com/castore-dev/castore/issues"},"nx":{"targets":{"package":{"outputs":["packages/event-storage-adapter-dynamodb/dist"]}}},"dist":{"shasum":"0218be134597732855e5ade04c8202ce83959ddf","tarball":"https://registry.npmjs.org/@castore/event-storage-adapter-dynamodb/-/event-storage-adapter-dynamodb-2.2.0.tgz","fileCount":61,"integrity":"sha512-VjiK4fsunixxAjzfiQDKDU5VYsOH8GiJz0NCpsGxXlqJUH8d4bWahX7c2/ZdRMS4OcGHvIutZEQudkWBT0Xf8Q==","signatures":[{"sig":"MEUCIQD/COHkLQEwUdS1Q1Yp1HKzKZx39E8HH2WOAQC/d61+RAIgT/HxjG6KLEKcrdozTua5XEbkwgqGKQ1h1Apyn5TDMXg=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":379877},"main":"dist/cjs/index.js","types":"dist/types/index.d.ts","module":"dist/esm/index.js","gitHead":"3cedccd6195f6afd90b6dcb30fd3511bacb4b5e7","scripts":{"test":"yarn test-type && yarn test-unit && yarn test-circular && yarn test-linter","watch":"rm -rf dist && concurrently 'yarn:package-* --watch'","package":"rm -rf dist && yarn package-cjs && yarn package-esm && yarn package-types","lint-fix":"yarn linter-base-config --fix","test-type":"tsc --noEmit --emitDeclarationOnly false","test-unit":"yarn vitest run --passWithNoTests","transpile":"babel src --extensions .ts --quiet","package-cjs":"NODE_ENV=cjs yarn transpile --out-dir dist/cjs --source-maps","package-esm":"NODE_ENV=esm yarn transpile --out-dir dist/esm --source-maps","test-linter":"yarn linter-base-config .","lint-fix-all":"yarn lint-fix .","package-types":"tsc -p tsconfig.build.json && tsc-alias -p tsconfig.build.json","test-circular":"yarn depcruise --validate dependency-cruiser.js .","linter-base-config":"eslint --ext=js,ts"},"_npmUser":{"name":"thomasaribart","email":"thomas.aribart@gmail.com"},"repository":{"url":"git+https://github.com/castore-dev/castore.git","type":"git"},"_npmVersion":"10.2.3","description":"DRY Castore EventStorageAdapter implementation using DynamoDB","directories":{},"sideEffects":false,"_nodeVersion":"18.19.0","dependencies":{"@aws-sdk/util-dynamodb":"^3.319.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"eslint":"^8.14.0","vitest":"^0.26.2","ts-node":"^10.7.0","mockdate":"^3.0.5","prettier":"^2.6.2","tsc-alias":"^1.8.7","@babel/cli":"^7.17.6","typescript":"^4.6.3","@babel/core":"^7.17.9","@types/node":"^17.0.29","lodash.omit":"^4.5.0","concurrently":"^7.1.0","@castore/core":"workspace:","@babel/preset-env":"^7.16.11","@types/lodash.omit":"^4.5.7","dependency-cruiser":"^11.7.0","aws-sdk-client-mock":"^2.1.1","@serverless/typescript":"^3.15.2","@castore/demo-blueprint":"workspace:","@aws-sdk/client-dynamodb":"^3.2.0","@babel/preset-typescript":"^7.16.7","babel-plugin-module-resolver":"^4.1.0","@babel/plugin-transform-runtime":"^7.17.0"},"peerDependencies":{"@castore/core":"^2.0.0","@aws-sdk/client-dynamodb":"^3.0.0"},"_npmOperationalInternal":{"tmp":"tmp/event-storage-adapter-dynamodb_2.2.0_1705427170776_0.2746019165527198","host":"s3://npm-registry-packages"}},"2.3.0":{"name":"@castore/event-storage-adapter-dynamodb","version":"2.3.0","keywords":["event","source","store","typescript"],"license":"MIT","_id":"@castore/event-storage-adapter-dynamodb@2.3.0","maintainers":[{"name":"thomasaribart","email":"thomas.aribart@gmail.com"},{"name":"valentinbeggi","email":"valentinbe@theodo.fr"},{"name":"charlesgery","email":"charles.gery@gmail.com"},{"name":"julietteff","email":"juliettef@theodo.fr"}],"homepage":"https://github.com/castore-dev/castore#readme","bugs":{"url":"https://github.com/castore-dev/castore/issues"},"nx":{"targets":{"package":{"outputs":["packages/event-storage-adapter-dynamodb/dist"]}}},"dist":{"shasum":"1d4ac3607a832655b730dfc8dad00f6cc41ed917","tarball":"https://registry.npmjs.org/@castore/event-storage-adapter-dynamodb/-/event-storage-adapter-dynamodb-2.3.0.tgz","fileCount":61,"integrity":"sha512-QI5NhJ/xBqh81aqx9hcSye4IWZ0gYL5AHwksvbvS8FPQAG8BrxI+a18agI8qvrKCyBEBSIUc8Ql1JEl6pz6UjA==","signatures":[{"sig":"MEUCIQC6WfNC1XWaGKlV/hzMNA+6D3Kb/08/X/ZvmZo827bp1QIgazb4GlpnDIiKAn486fzc1cVDmefAQF8W7YU7dziWFZw=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":379928},"main":"dist/cjs/index.js","types":"dist/types/index.d.ts","module":"dist/esm/index.js","gitHead":"aa8c8f824db8f4e38afd58f7b9f389c7211acd26","scripts":{"test":"yarn test-type && yarn test-unit && yarn test-circular && yarn test-linter","watch":"rm -rf dist && concurrently 'yarn:package-* --watch'","package":"rm -rf dist && yarn package-cjs && yarn package-esm && yarn package-types","lint-fix":"yarn linter-base-config --fix","test-type":"tsc --noEmit --emitDeclarationOnly false","test-unit":"yarn vitest run --passWithNoTests","transpile":"babel src --extensions .ts --quiet","package-cjs":"NODE_ENV=cjs yarn transpile --out-dir dist/cjs --source-maps","package-esm":"NODE_ENV=esm yarn transpile --out-dir dist/esm --source-maps","test-linter":"yarn linter-base-config .","lint-fix-all":"yarn lint-fix .","package-types":"tsc -p tsconfig.build.json && tsc-alias -p tsconfig.build.json","test-circular":"yarn depcruise --validate dependency-cruiser.js .","linter-base-config":"eslint --ext=js,ts"},"_npmUser":{"name":"thomasaribart","email":"thomas.aribart@gmail.com"},"repository":{"url":"git+https://github.com/castore-dev/castore.git","type":"git"},"_npmVersion":"10.2.4","description":"DRY Castore EventStorageAdapter implementation using DynamoDB","directories":{},"sideEffects":false,"_nodeVersion":"18.19.1","dependencies":{"@aws-sdk/util-dynamodb":"^3.319.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"eslint":"^8.14.0","vitest":"^0.26.2","ts-node":"^10.7.0","mockdate":"^3.0.5","prettier":"^2.6.2","tsc-alias":"^1.8.7","@babel/cli":"^7.17.6","typescript":"^4.6.3","@babel/core":"^7.17.9","@types/node":"^17.0.29","lodash.omit":"^4.5.0","concurrently":"^7.1.0","@castore/core":"workspace:","@babel/preset-env":"^7.16.11","@types/lodash.omit":"^4.5.7","dependency-cruiser":"^11.7.0","aws-sdk-client-mock":"^2.1.1","@serverless/typescript":"^3.15.2","@castore/demo-blueprint":"workspace:","@aws-sdk/client-dynamodb":"^3.2.0","@babel/preset-typescript":"^7.16.7","babel-plugin-module-resolver":"^4.1.0","@babel/plugin-transform-runtime":"^7.17.0"},"peerDependencies":{"@castore/core":"^2.0.0","@aws-sdk/client-dynamodb":"^3.0.0"},"_npmOperationalInternal":{"tmp":"tmp/event-storage-adapter-dynamodb_2.3.0_1710957056536_0.08978727940213793","host":"s3://npm-registry-packages"}},"2.3.1":{"name":"@castore/event-storage-adapter-dynamodb","version":"2.3.1","keywords":["event","source","store","typescript"],"license":"MIT","_id":"@castore/event-storage-adapter-dynamodb@2.3.1","maintainers":[{"name":"thomasaribart","email":"thomas.aribart@gmail.com"},{"name":"valentinbeggi","email":"valentinbe@theodo.fr"},{"name":"charlesgery","email":"charles.gery@gmail.com"},{"name":"julietteff","email":"juliettef@theodo.fr"}],"homepage":"https://github.com/castore-dev/castore#readme","bugs":{"url":"https://github.com/castore-dev/castore/issues"},"nx":{"targets":{"package":{"outputs":["packages/event-storage-adapter-dynamodb/dist"]}}},"dist":{"shasum":"8718be00545a3d4eada8ebdd50b6ab5696fcb303","tarball":"https://registry.npmjs.org/@castore/event-storage-adapter-dynamodb/-/event-storage-adapter-dynamodb-2.3.1.tgz","fileCount":61,"integrity":"sha512-qEQzSKBx6quAasZMzT/8EdeE6O/zBibNU/HE/PcoHQ9X8wtIbDXYFUXOLx1KDfOixOzrh7EgSMhRfbvfUuqglA==","signatures":[{"sig":"MEUCIFDuVn+1eQsPH35wa3sNFzA0HDpxEWnJybBU7DrMkYtHAiEAyfqhyLhj2MFDN2rL61hMzEGlpHn5fuMjuz2D2uKpLjA=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":379928},"main":"dist/cjs/index.js","types":"dist/types/index.d.ts","module":"dist/esm/index.js","gitHead":"ec117c540dcadb351b35e349f04dc9f4d7937a38","scripts":{"test":"yarn test-type && yarn test-unit && yarn test-circular && yarn test-linter","watch":"rm -rf dist && concurrently 'yarn:package-* --watch'","package":"rm -rf dist && yarn package-cjs && yarn package-esm && yarn package-types","lint-fix":"yarn linter-base-config --fix","test-type":"tsc --noEmit --emitDeclarationOnly false","test-unit":"yarn vitest run --passWithNoTests","transpile":"babel src --extensions .ts --quiet","package-cjs":"NODE_ENV=cjs yarn transpile --out-dir dist/cjs --source-maps","package-esm":"NODE_ENV=esm yarn transpile --out-dir dist/esm --source-maps","test-linter":"yarn linter-base-config .","lint-fix-all":"yarn lint-fix .","package-types":"tsc -p tsconfig.build.json && tsc-alias -p tsconfig.build.json","test-circular":"yarn depcruise --validate dependency-cruiser.js .","linter-base-config":"eslint --ext=js,ts"},"_npmUser":{"name":"thomasaribart","email":"thomas.aribart@gmail.com"},"repository":{"url":"git+https://github.com/castore-dev/castore.git","type":"git"},"_npmVersion":"10.5.0","description":"DRY Castore EventStorageAdapter implementation using DynamoDB","directories":{},"sideEffects":false,"_nodeVersion":"18.20.2","dependencies":{"@aws-sdk/util-dynamodb":"^3.319.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"eslint":"^8.14.0","vitest":"^0.26.2","ts-node":"^10.7.0","mockdate":"^3.0.5","prettier":"^2.6.2","tsc-alias":"^1.8.7","@babel/cli":"^7.17.6","typescript":"^4.6.3","@babel/core":"^7.17.9","@types/node":"^17.0.29","lodash.omit":"^4.5.0","concurrently":"^7.1.0","@castore/core":"workspace:","@babel/preset-env":"^7.16.11","@types/lodash.omit":"^4.5.7","dependency-cruiser":"^11.7.0","aws-sdk-client-mock":"^2.1.1","@serverless/typescript":"^3.15.2","@castore/demo-blueprint":"workspace:","@aws-sdk/client-dynamodb":"^3.2.0","@babel/preset-typescript":"^7.16.7","babel-plugin-module-resolver":"^4.1.0","@babel/plugin-transform-runtime":"^7.17.0"},"peerDependencies":{"@castore/core":"^2.0.0","@aws-sdk/client-dynamodb":"^3.0.0"},"_npmOperationalInternal":{"tmp":"tmp/event-storage-adapter-dynamodb_2.3.1_1714035414888_0.8669555373901288","host":"s3://npm-registry-packages"}},"2.4.0":{"name":"@castore/event-storage-adapter-dynamodb","version":"2.4.0","keywords":["event","source","store","typescript"],"license":"MIT","_id":"@castore/event-storage-adapter-dynamodb@2.4.0","maintainers":[{"name":"julietteff","email":"juliettef@theodo.fr"},{"name":"charlesgery","email":"charles.gery@gmail.com"},{"name":"valentinbeggi","email":"valentinbe@theodo.fr"},{"name":"thomasaribart","email":"thomas.aribart@gmail.com"}],"homepage":"https://github.com/castore-dev/castore#readme","bugs":{"url":"https://github.com/castore-dev/castore/issues"},"nx":{"targets":{"package":{"outputs":["packages/event-storage-adapter-dynamodb/dist"]}}},"dist":{"shasum":"90cd4771fcd309cd72e88b4038e787e6b7213eb8","tarball":"https://registry.npmjs.org/@castore/event-storage-adapter-dynamodb/-/event-storage-adapter-dynamodb-2.4.0.tgz","fileCount":61,"integrity":"sha512-jArw3S7DMGf/VcGDWUv8A7b4n0TrwWqSrLE4wl2Nd4NRhKhoba01b4K2FFZptfwB8sHtAoYvJkoG93BjQQJkZw==","signatures":[{"sig":"MEUCIDs2yucMHlQKNoA2Mzj/PJm0xzIb+1fFyKz+hVVURQEOAiEA1hOME4K8rpW6qPE49xJwa7t03zV6GQRPY62tQQMAoFk=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":379928},"main":"dist/cjs/index.js","types":"dist/types/index.d.ts","module":"dist/esm/index.js","gitHead":"313e001988903763e7eb169751114c5f71cc3efe","scripts":{"test":"yarn test-type && yarn test-unit && yarn test-circular && yarn test-linter","watch":"rm -rf dist && concurrently 'yarn:package-* --watch'","package":"rm -rf dist && yarn package-cjs && yarn package-esm && yarn package-types","lint-fix":"yarn linter-base-config --fix","test-type":"tsc --noEmit --emitDeclarationOnly false","test-unit":"yarn vitest run --passWithNoTests","transpile":"babel src --extensions .ts --quiet","package-cjs":"NODE_ENV=cjs yarn transpile --out-dir dist/cjs --source-maps","package-esm":"NODE_ENV=esm yarn transpile --out-dir dist/esm --source-maps","test-linter":"yarn linter-base-config .","lint-fix-all":"yarn lint-fix .","package-types":"tsc -p tsconfig.build.json && tsc-alias -p tsconfig.build.json","test-circular":"yarn depcruise --validate dependency-cruiser.js .","linter-base-config":"eslint --ext=js,ts"},"_npmUser":{"name":"thomasaribart","email":"thomas.aribart@gmail.com"},"repository":{"url":"git+https://github.com/castore-dev/castore.git","type":"git"},"_npmVersion":"10.8.2","description":"DRY Castore EventStorageAdapter implementation using DynamoDB","directories":{},"sideEffects":false,"_nodeVersion":"20.18.2","dependencies":{"@aws-sdk/util-dynamodb":"^3.319.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"eslint":"^8.14.0","vitest":"^0.26.2","ts-node":"^10.7.0","mockdate":"^3.0.5","prettier":"^2.6.2","tsc-alias":"^1.8.7","@babel/cli":"^7.17.6","typescript":"^4.6.3","@babel/core":"^7.17.9","@types/node":"^17.0.29","lodash.omit":"^4.5.0","concurrently":"^7.1.0","@castore/core":"workspace:","@babel/preset-env":"^7.16.11","@types/lodash.omit":"^4.5.7","dependency-cruiser":"^11.7.0","aws-sdk-client-mock":"^2.1.1","@serverless/typescript":"^3.15.2","@castore/demo-blueprint":"workspace:","@aws-sdk/client-dynamodb":"^3.2.0","@babel/preset-typescript":"^7.16.7","babel-plugin-module-resolver":"^4.1.0","@babel/plugin-transform-runtime":"^7.17.0"},"peerDependencies":{"@castore/core":"^2.0.0","@aws-sdk/client-dynamodb":"^3.0.0"},"_npmOperationalInternal":{"tmp":"tmp/event-storage-adapter-dynamodb_2.4.0_1739877925366_0.35260474656521446","host":"s3://npm-registry-packages-npm-production"}},"2.4.1":{"name":"@castore/event-storage-adapter-dynamodb","version":"2.4.1","keywords":["event","source","store","typescript"],"license":"MIT","_id":"@castore/event-storage-adapter-dynamodb@2.4.1","maintainers":[{"name":"julietteff","email":"juliettef@theodo.fr"},{"name":"charlesgery","email":"charles.gery@gmail.com"},{"name":"valentinbeggi","email":"valentinbe@theodo.fr"},{"name":"thomasaribart","email":"thomas.aribart@gmail.com"}],"homepage":"https://github.com/castore-dev/castore#readme","bugs":{"url":"https://github.com/castore-dev/castore/issues"},"nx":{"targets":{"package":{"outputs":["packages/event-storage-adapter-dynamodb/dist"]}}},"dist":{"shasum":"ff6ad0fcbd078b4ed1cfe2ea6bebbac07988942c","tarball":"https://registry.npmjs.org/@castore/event-storage-adapter-dynamodb/-/event-storage-adapter-dynamodb-2.4.1.tgz","fileCount":61,"integrity":"sha512-q5rPoTFSdpwObGK1Z93kXK6ueoUXtlPj5apW+BD3v6dXHgRvmgdpD0dFm5dpTpvs0vpkBhu5/9Iizgkv9HT4hw==","signatures":[{"sig":"MEUCIBGV6nQ9UxMZJpBQiWlAD8nYXKnGrNANbyiTzn3jZ/7BAiEAiaLkd7gOAqLra1DCgtDAUidri36dFxnR52zHtt7ymfk=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":379928},"main":"dist/cjs/index.js","types":"dist/types/index.d.ts","module":"dist/esm/index.js","gitHead":"28c9f4e5c7c7527b6d3b5e5d9834789c2e64fd5e","scripts":{"test":"yarn test-type && yarn test-unit && yarn test-circular && yarn test-linter","watch":"rm -rf dist && concurrently 'yarn:package-* --watch'","package":"rm -rf dist && yarn package-cjs && yarn package-esm && yarn package-types","lint-fix":"yarn linter-base-config --fix","test-type":"tsc --noEmit --emitDeclarationOnly false","test-unit":"yarn vitest run --passWithNoTests","transpile":"babel src --extensions .ts --quiet","package-cjs":"NODE_ENV=cjs yarn transpile --out-dir dist/cjs --source-maps","package-esm":"NODE_ENV=esm yarn transpile --out-dir dist/esm --source-maps","test-linter":"yarn linter-base-config .","lint-fix-all":"yarn lint-fix .","package-types":"tsc -p tsconfig.build.json && tsc-alias -p tsconfig.build.json","test-circular":"yarn depcruise --validate dependency-cruiser.js .","linter-base-config":"eslint --ext=js,ts"},"_npmUser":{"name":"thomasaribart","email":"thomas.aribart@gmail.com"},"repository":{"url":"git+https://github.com/castore-dev/castore.git","type":"git"},"_npmVersion":"10.8.2","description":"DRY Castore EventStorageAdapter implementation using DynamoDB","directories":{},"sideEffects":false,"_nodeVersion":"20.18.2","dependencies":{"@aws-sdk/util-dynamodb":"^3.319.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"eslint":"^8.14.0","vitest":"^0.26.2","ts-node":"^10.7.0","mockdate":"^3.0.5","prettier":"^2.6.2","tsc-alias":"^1.8.7","@babel/cli":"^7.17.6","typescript":"^4.6.3","@babel/core":"^7.17.9","@types/node":"^17.0.29","lodash.omit":"^4.5.0","concurrently":"^7.1.0","@castore/core":"workspace:","@babel/preset-env":"^7.16.11","@types/lodash.omit":"^4.5.7","dependency-cruiser":"^11.7.0","aws-sdk-client-mock":"^2.1.1","@serverless/typescript":"^3.15.2","@castore/demo-blueprint":"workspace:","@aws-sdk/client-dynamodb":"^3.2.0","@babel/preset-typescript":"^7.16.7","babel-plugin-module-resolver":"^4.1.0","@babel/plugin-transform-runtime":"^7.17.0"},"peerDependencies":{"@castore/core":"^2.0.0","@aws-sdk/client-dynamodb":"^3.0.0"},"_npmOperationalInternal":{"tmp":"tmp/event-storage-adapter-dynamodb_2.4.1_1740488524529_0.6160152615353498","host":"s3://npm-registry-packages-npm-production"}},"2.4.2":{"name":"@castore/event-storage-adapter-dynamodb","description":"DRY Castore EventStorageAdapter implementation using DynamoDB","license":"MIT","homepage":"https://github.com/castore-dev/castore#readme","bugs":{"url":"https://github.com/castore-dev/castore/issues"},"repository":{"type":"git","url":"git+https://github.com/castore-dev/castore.git"},"keywords":["event","source","store","typescript"],"publishConfig":{"access":"public"},"sideEffects":false,"main":"dist/cjs/index.js","module":"dist/esm/index.js","types":"dist/types/index.d.ts","scripts":{"lint-fix":"yarn linter-base-config --fix","lint-fix-all":"yarn lint-fix .","linter-base-config":"eslint --ext=js,ts","package":"rm -rf dist && yarn package-cjs && yarn package-esm && yarn package-types","package-cjs":"NODE_ENV=cjs yarn transpile --out-dir dist/cjs --source-maps","package-esm":"NODE_ENV=esm yarn transpile --out-dir dist/esm --source-maps","package-types":"tsc -p tsconfig.build.json && tsc-alias -p tsconfig.build.json","test":"yarn test-type && yarn test-unit && yarn test-circular && yarn test-linter","test-circular":"yarn depcruise --validate dependency-cruiser.js .","test-linter":"yarn linter-base-config .","test-type":"tsc --noEmit --emitDeclarationOnly false","test-unit":"yarn vitest run --passWithNoTests","transpile":"babel src --extensions .ts --quiet","watch":"rm -rf dist && concurrently 'yarn:package-* --watch'"},"dependencies":{"@aws-sdk/util-dynamodb":"^3.319.0"},"devDependencies":{"@aws-sdk/client-dynamodb":"^3.2.0","@babel/cli":"^7.17.6","@babel/core":"^7.17.9","@babel/plugin-transform-runtime":"^7.17.0","@babel/preset-env":"^7.16.11","@babel/preset-typescript":"^7.16.7","@castore/core":"workspace:","@castore/demo-blueprint":"workspace:","@serverless/typescript":"^3.15.2","@types/lodash.omit":"^4.5.7","@types/node":"^17.0.29","aws-sdk-client-mock":"^2.1.1","babel-plugin-module-resolver":"^4.1.0","concurrently":"^7.1.0","dependency-cruiser":"^11.7.0","eslint":"^8.14.0","lodash.omit":"^4.5.0","mockdate":"^3.0.5","prettier":"^2.6.2","ts-node":"^10.7.0","tsc-alias":"^1.8.7","typescript":"^4.6.3","vitest":"^0.26.2"},"maintainers":[{"name":"julietteff","email":"juliettef@theodo.fr"},{"name":"charlesgery","email":"charles.gery@gmail.com"},{"name":"valentinbeggi","email":"valentinbe@theodo.fr"},{"name":"thomasaribart","email":"thomas.aribart@gmail.com"}],"nx":{"targets":{"package":{"outputs":["packages/event-storage-adapter-dynamodb/dist"]}}},"peerDependencies":{"@aws-sdk/client-dynamodb":"^3.0.0","@castore/core":"^2.0.0"},"version":"2.4.2","_id":"@castore/event-storage-adapter-dynamodb@2.4.2","gitHead":"fd79dfcc42ef28d216b08007edacd21208ba1876","_nodeVersion":"20.19.0","_npmVersion":"10.8.2","dist":{"integrity":"sha512-B8ImjkZVjHTuBUQoR/DFLnyuXU4Mwd5kpsR0EX+hOhSlHoAxmJ5EM++krm2wchcLG17fjYOnqDBx6FrrqDnbdQ==","shasum":"97cf4dae4f58a8443d2ad9237b0d2f647b946eb6","tarball":"https://registry.npmjs.org/@castore/event-storage-adapter-dynamodb/-/event-storage-adapter-dynamodb-2.4.2.tgz","fileCount":61,"unpackedSize":379928,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIFY6kwbyV2XX0sb0zx27gkwte1RbUbs4Q1DfcUwJAoCWAiEAzKPC2+cFMAEjzo/VC5dk5hjTdlUqLqdTju23ug9f1LM="}]},"_npmUser":{"name":"thomasaribart","email":"thomas.aribart@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/event-storage-adapter-dynamodb_2.4.2_1744991088234_0.7236791299779346"},"_hasShrinkwrap":false}},"time":{"created":"2023-10-27T17:24:56.307Z","modified":"2025-04-18T15:44:48.657Z","2.0.0":"2023-10-27T17:24:56.683Z","2.1.0":"2023-11-03T14:37:11.726Z","2.2.0":"2024-01-16T17:46:10.933Z","2.3.0":"2024-03-20T17:50:56.737Z","2.3.1":"2024-04-25T08:56:55.179Z","2.4.0":"2025-02-18T11:25:25.632Z","2.4.1":"2025-02-25T13:02:04.800Z","2.4.2":"2025-04-18T15:44:48.427Z"},"bugs":{"url":"https://github.com/castore-dev/castore/issues"},"license":"MIT","homepage":"https://github.com/castore-dev/castore#readme","keywords":["event","source","store","typescript"],"repository":{"type":"git","url":"git+https://github.com/castore-dev/castore.git"},"description":"DRY Castore EventStorageAdapter implementation using DynamoDB","maintainers":[{"name":"julietteff","email":"juliettef@theodo.fr"},{"name":"charlesgery","email":"charles.gery@gmail.com"},{"name":"valentinbeggi","email":"valentinbe@theodo.fr"},{"name":"thomasaribart","email":"thomas.aribart@gmail.com"}],"readme":"# DynamoDB Event Storage Adapter\n\nDRY Castore [`EventStorageAdapter`](https://castore-dev.github.io/castore/docs/event-sourcing/fetching-events/) implementation using [AWS DynamoDB](https://aws.amazon.com/dynamodb/).\n\n## 📥 Installation\n\n```bash\n# npm\nnpm install @castore/event-storage-adapter-dynamodb\n\n# yarn\nyarn add @castore/event-storage-adapter-dynamodb\n```\n\nThis package has `@castore/core` and `@aws-sdk/client-dynamodb` (above v3) as peer dependencies, so you will have to install them as well:\n\n```bash\n# npm\nnpm install @castore/core @aws-sdk/client-dynamodb\n\n# yarn\nyarn add @castore/core @aws-sdk/client-dynamodb\n```\n\n## Table of content\n\nThis library exposes two adapters:\n\n- `DynamoDBSingleTableEventStorageAdapter` which can plug several event stores to a single DynamoDB table.\n- (_deprecated_) `DynamoDBEventStorageAdapter` which needs a DynamoDB table per event store.\n\nThe legacy `DynamoDBEventStorageAdapter` is still exposed for backward compatibility. It will be deprecated and renamed `LegacyDynamoDBEventStorageAdapter` in the v2, to be finally removed in the v3.\n\nDocumentation:\n\n- [`DynamoDBSingleTableEventStorageAdapter`](#dynamodbsingletableeventstorageadapter)\n  - [👩‍💻 Usage](#-usage)\n  - [🤔 How it works](#-how-it-works)\n  - [📝 Examples](#-examples)\n    - [CloudFormation](#cloudformation)\n    - [CDK](#cdk)\n    - [Terraform](#terraform)\n  - [🤝 EventGroups](#-eventgroups)\n  - [🔑 IAM](#-iam)\n  - [📸 `ImageParser`](#-imageparser)\n- [`DynamoDBEventStorageAdapter`](#legacy-dynamodbeventstorageadapter)\n\n## `DynamoDBSingleTableEventStorageAdapter`\n\n### 👩‍💻 Usage\n\n```ts\nimport { DynamoDBClient } from '@aws-sdk/client-dynamodb';\n\nimport { DynamoDBSingleTableEventStorageAdapter } from '@castore/event-storage-adapter-dynamodb';\n\nconst dynamoDBClient = new DynamoDBClient({});\n\nconst pokemonsEventStorageAdapter = new DynamoDBSingleTableEventStorageAdapter(\n  {\n    tableName: 'my-table-name',\n    dynamoDBClient,\n  },\n);\n\n// 👇 Alternatively, provide a getter\nconst pokemonsEventStorageAdapter =\n  new DynamoDBSingleTableEventStorageAdapter({\n    tableName: () => process.env.MY_TABLE_NAME,\n    dynamoDBClient,\n  });\n\nconst pokemonsEventStore = new EventStore({\n  ...\n  eventStorageAdapter: pokemonsEventStorageAdapter,\n});\n```\n\nThis will directly plug your EventStore to DynamoDB 🙌\n\n### 🤔 How it works\n\nThis adapter persists aggregates in **separate partitions**: When persisting an event, its `aggregateId`, prefixed by the `eventStoreId`, is used as partition key (_string_ attribute) and its `version` is used as sort key (_number_ attribute).\n\nA [Global Secondary Index](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/GSI.html) is also required to efficiently retrieve the event store aggregates ids (`listAggregateIds` operation). Only initial events (`version = 1`) are projected. A `KEYS_ONLY` projection type is sufficient.\n\n```ts\n// 👇 Initial event\n{\n  \"aggregateId\": \"POKEMONS#123\", // <= Partition key\n  \"version\": 1, // <= Sort key\n  \"eventStoreId\": \"POKEMONS\", // <= initialEvents index partition key\n  \"timestamp\": \"2022-01-01T00:00:00.000Z\", // <= initialEvents index sort key\n  \"type\": \"POKEMON_APPEARED\",\n  \"payload\": { \"name\": \"Pikachu\", \"level\": 42 },\n  \"metadata\": { \"trigger\": \"random\" }\n}\n\n// 👇 Non-initial event\n{\n  \"aggregateId\": \"POKEMONS#123\",\n  \"version\": 2,\n  // Event is not projected on initialEvents index (to limit costs)\n  \"timestamp\": \"2023-01-01T00:00:00.000Z\",\n  \"type\": \"POKEMON_LEVELED_UP\"\n}\n```\n\nThe `getEvents` method (which is used by the `getAggregate` and `getExistingAggregate` methods of the `EventStore` class) uses consistent reads, so is **always consistent**.\n\nThe `pushEvent` method is a write operation and so is **always consistent**. It is conditioned to avoid race conditions, as required by the [Castore specifications](https://github.com/castore-dev/castore/blob/main/docs/building-your-own-event-storage-adapter.md).\n\nBy design, the `listAggregateIds` operation can only be **eventually consistent** (GSIs reads cannot be consistent).\n\n### 📝 Examples\n\nNote that if you define your infrastructure as code in TypeScript, you can directly use this package instead of hard-coding the below values:\n\n```ts\nimport {\n  EVENT_TABLE_PK, // => aggregateId\n  EVENT_TABLE_SK, // => version\n  EVENT_TABLE_INITIAL_EVENT_INDEX_NAME, // => initialEvents\n  EVENT_TABLE_EVENT_STORE_ID_KEY, // => eventStoreId\n  EVENT_TABLE_TIMESTAMP_KEY, // => timestamp\n} from '@castore/event-storage-adapter-dynamodb';\n```\n\n#### CloudFormation\n\n```json\n{\n  \"Type\": \"AWS::DynamoDB::Table\",\n  \"Properties\": {\n    \"AttributeDefinitions\": [\n      { \"AttributeName\": \"aggregateId\", \"AttributeType\": \"S\" },\n      { \"AttributeName\": \"version\", \"AttributeType\": \"N\" }\n      { \"AttributeName\": \"eventStoreId\", \"AttributeType\": \"S\" },\n      { \"AttributeName\": \"timestamp\", \"AttributeType\": \"S\" }\n    ],\n    \"KeySchema\": [\n      { \"AttributeName\": \"aggregateId\", \"KeyType\": \"HASH\" },\n      { \"AttributeName\": \"version\", \"KeyType\": \"RANGE\" }\n    ],\n    \"GlobalSecondaryIndexes\": [\n      {\n        \"IndexName\": \"initialEvents\",\n        \"KeySchema\": [\n          { \"AttributeName\": \"eventStoreId\", \"KeyType\": \"HASH\" },\n          { \"AttributeName\": \"timestamp\", \"KeyType\": \"RANGE\" }\n        ],\n        \"Projection\": \"KEYS_ONLY\"\n      }\n    ]\n  }\n}\n```\n\n#### CDK\n\n```ts\nimport { Table, AttributeType, ProjectionType } from 'aws-cdk-lib/aws-dynamodb';\n\nconst { STRING, NUMBER } = AttributeType;\nconst { KEYS_ONLY } = ProjectionType;\n\nconst pokemonsEventsTable = new Table(scope, 'PokemonEvents', {\n  partitionKey: {\n    name: 'aggregateId',\n    type: STRING,\n  },\n  sortKey: {\n    name: 'version',\n    type: NUMBER,\n  },\n});\n\npokemonsEventsTable.addGlobalSecondaryIndex({\n  indexName: 'initialEvents',\n  partitionKey: {\n    name: 'eventStoreId',\n    type: STRING,\n  },\n  sortKey: {\n    name: 'timestamp',\n    type: STRING,\n  },\n  projectionType: KEYS_ONLY,\n});\n```\n\n#### Terraform\n\n```h\nresource \"aws_dynamodb_table\" \"pokemons-events-table\" {\n  hash_key       = \"aggregateId\"\n  range_key      = \"version\"\n\n  attribute {\n    name = \"aggregateId\"\n    type = \"S\"\n  }\n\n  attribute {\n    name = \"version\"\n    type = \"N\"\n  }\n\n  attribute {\n    name = \"eventStoreId\"\n    type = \"S\"\n  }\n\n  attribute {\n    name = \"timestamp\"\n    type = \"S\"\n  }\n\n  global_secondary_index {\n    name               = \"initialEvents\"\n    hash_key           = \"eventStoreId\"\n    range_key          = \"timestamp\"\n    projection_type    = \"KEYS_ONLY\"\n  }\n}\n```\n\n### 🤝 EventGroups\n\nThis adapter implements the [EventGroups](https://castore-dev.github.io/castore/docs/event-sourcing/joining-data/) API using the [DynamoDB Transactions API](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/transaction-apis.html):\n\n```ts\nimport { EventStore } from '@castore/core';\n\n// 👇 TransactWriteItems N events simultaneously\nawait EventStore.pushEventGroup(\n  // events are correctly typed 🙌\n  eventStoreA.groupEvent(eventA1),\n  eventStoreA.groupEvent(eventA2),\n  eventStoreB.groupEvent(eventB),\n  ...\n);\n```\n\nNote that:\n\n- All the event stores involved in the transaction need to use the `DynamoDBSingleTableEventStorageAdapter`\n- This util inherits of the [`TransactWriteItem` API](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/transaction-apis.html#transaction-apis-txwriteitems) limitations: It can target up to 100 distinct events in one or more DynamoDB tables within the same AWS account and in the same Region.\n\n### 🔑 IAM\n\nRequired IAM permissions for each operations:\n\n- `getEvents` (+ `getAggregate`, `getExistingAggregate`): `dynamodb:Query`\n- `pushEvent`: `dynamodb:PutItem`\n- `listAggregateIds`: `dynamodb:Query` on the `initialEvents` index\n\n### 📸 `ImageParser`\n\nThis library also exposes a useful `ImageParser` class to parse [DynamoDB stream](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Streams.html) images from a `DynamoDBSingleTableEventStorageAdapter`. It will build a correctly typed `NotificationMessage` ouf of a stream image, unmarshalling it, removing the prefix of the `aggregateId` in the process and validating the `eventStoreId`:\n\n```ts\nimport { ImageParser } from '@castore/event-storage-adapter-dynamodb';\n\nconst imageParser = new ImageParser({\n  sourceEventStores: [pokemonsEventStore, trainersEventStore],\n});\n\n// 🙌 Typed as EventStoreNotificationMessage<\n//  typeof pokemonsEventStore\n//  | typeof trainersEventStore...\n// >\nconst notificationMessage = imageParser.parseImage(\n  streamImage,\n  // 👇 Optional options\n  unmarshallOptions,\n);\n```\n\n## Legacy `DynamoDBEventStorageAdapter`\n\n<details>\n<summary><b>🔧 Documentation</b></summary>\n\n### 👩‍💻 Usage\n\n```ts\nimport { DynamoDBClient } from '@aws-sdk/client-dynamodb';\n\nimport { DynamoDBEventStorageAdapter } from '@castore/event-storage-adapter-dynamodb';\n\nconst dynamoDBClient = new DynamoDBClient({});\n\nconst pokemonsEventStorageAdapter = new DynamoDBEventStorageAdapter({\n  tableName: 'my-table-name',\n  dynamoDBClient,\n});\n\n// 👇 Alternatively, provide a getter\nconst pokemonsEventStorageAdapter = new DynamoDBEventStorageAdapter({\n  tableName: () => process.env.MY_TABLE_NAME,\n  dynamoDBClient,\n});\n\nconst pokemonsEventStore = new EventStore({\n  ...\n  eventStorageAdapter: pokemonsEventStorageAdapter\n})\n```\n\nThis will directly plug your EventStore to DynamoDB 🙌\n\n### 🤔 How it works\n\nThis adapter persists aggregates in **separate partitions**: When persisting an event, its `aggregateId` is used as partition key (_string_ attribute) and its `version` is used as sort key (_number_ attribute).\n\nA [Global Secondary Index](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/GSI.html) is also required to efficiently retrieve the event store aggregates ids (`listAggregateIds` operation). Only initial events (`version = 1`) are projected. A `KEYS_ONLY` projection type is sufficient.\n\n```ts\n// 👇 Initial event\n{\n  \"aggregateId\": \"123\", // <= Partition key\n  \"version\": 1, // <= Sort key\n  \"isInitialEvent\": 1, // <= initialEvents index partition key\n  \"timestamp\": \"2022-01-01T00:00:00.000Z\", // <= initialEvents index sort key\n  \"type\": \"POKEMON_APPEARED\",\n  \"payload\": { \"name\": \"Pikachu\", \"level\": 42 },\n  \"metadata\": { \"trigger\": \"random\" }\n}\n\n// 👇 Non-initial event\n{\n  \"aggregateId\": \"123\",\n  \"version\": 2,\n  // Event is not projected on initialEvents index (to limit costs)\n  \"timestamp\": \"2023-01-01T00:00:00.000Z\",\n  \"type\": \"POKEMON_LEVELED_UP\"\n}\n```\n\nThe `getEvents` method (which is used by the `getAggregate` and `getExistingAggregate` methods of the `EventStore` class) uses consistent reads, so is **always consistent**.\n\nThe `pushEvent` method is a write operation and so is **always consistent**. It is conditioned to avoid race conditions, as required by the [Castore specifications](https://github.com/castore-dev/castore/blob/main/docs/building-your-own-event-storage-adapter.md).\n\nBy design, the `listAggregateIds` operation can only be **eventually consistent** (GSIs reads cannot be consistent).\n\n### 📝 Examples\n\nNote that if you define your infrastructure as code in TypeScript, you can directly use this package instead of hard-coding the below values:\n\n```ts\nimport {\n  EVENT_TABLE_PK, // => aggregateId\n  EVENT_TABLE_SK, // => version\n  EVENT_TABLE_INITIAL_EVENT_INDEX_NAME, // => initialEvents\n  EVENT_TABLE_IS_INITIAL_EVENT_KEY, // => isInitialEvent\n  EVENT_TABLE_TIMESTAMP_KEY, // => timestamp\n} from '@castore/event-storage-adapter-dynamodb';\n```\n\n#### CloudFormation\n\n```json\n{\n  \"Type\": \"AWS::DynamoDB::Table\",\n  \"Properties\": {\n    \"AttributeDefinitions\": [\n      { \"AttributeName\": \"aggregateId\", \"AttributeType\": \"S\" },\n      { \"AttributeName\": \"version\", \"AttributeType\": \"N\" }\n      { \"AttributeName\": \"isInitialEvent\", \"AttributeType\": \"N\" },\n      { \"AttributeName\": \"timestamp\", \"AttributeType\": \"S\" }\n    ],\n    \"KeySchema\": [\n      { \"AttributeName\": \"aggregateId\", \"KeyType\": \"HASH\" },\n      { \"AttributeName\": \"version\", \"KeyType\": \"RANGE\" }\n    ],\n    \"GlobalSecondaryIndexes\": [\n      {\n        \"IndexName\": \"initialEvents\",\n        \"KeySchema\": [\n          { \"AttributeName\": \"isInitialEvent\", \"KeyType\": \"HASH\" },\n          { \"AttributeName\": \"timestamp\", \"KeyType\": \"RANGE\" }\n        ],\n        \"Projection\": \"KEYS_ONLY\"\n      }\n    ]\n  }\n}\n```\n\n#### CDK\n\n```ts\nimport { Table, AttributeType, ProjectionType } from 'aws-cdk-lib/aws-dynamodb';\n\nconst { STRING, NUMBER } = AttributeType;\nconst { KEYS_ONLY } = ProjectionType;\n\nconst pokemonsEventsTable = new Table(scope, 'PokemonEvents', {\n  partitionKey: {\n    name: 'aggregateId',\n    type: STRING,\n  },\n  sortKey: {\n    name: 'version',\n    type: NUMBER,\n  },\n});\n\npokemonsEventsTable.addGlobalSecondaryIndex({\n  indexName: 'initialEvents',\n  partitionKey: {\n    name: 'isInitialEvent',\n    type: NUMBER,\n  },\n  sortKey: {\n    name: 'timestamp',\n    type: STRING,\n  },\n  projectionType: KEYS_ONLY,\n});\n```\n\n#### Terraform\n\n```h\nresource \"aws_dynamodb_table\" \"pokemons-events-table\" {\n  hash_key       = \"aggregateId\"\n  range_key      = \"version\"\n\n  attribute {\n    name = \"aggregateId\"\n    type = \"S\"\n  }\n\n  attribute {\n    name = \"version\"\n    type = \"N\"\n  }\n\n  attribute {\n    name = \"isInitialEvent\"\n    type = \"N\"\n  }\n\n  attribute {\n    name = \"timestamp\"\n    type = \"S\"\n  }\n\n  global_secondary_index {\n    name               = \"initialEvents\"\n    hash_key           = \"isInitialEvent\"\n    range_key          = \"timestamp\"\n    projection_type    = \"KEYS_ONLY\"\n  }\n}\n```\n\n### 🤝 EventGroups\n\nThis adapter implements the [EventGroups](https://castore-dev.github.io/castore/docs/event-sourcing/joining-data/) API using the [DynamoDB Transactions API](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/transaction-apis.html):\n\n```ts\nimport { EventStore } from '@castore/core';\n\n// 👇 TransactWriteItems N events simultaneously\nawait EventStore.pushEventGroup(\n  // events are correctly typed 🙌\n  eventStoreA.groupEvent(eventA1),\n  eventStoreA.groupEvent(eventA2),\n  eventStoreB.groupEvent(eventB),\n  ...\n);\n```\n\nNote that:\n\n- All the event stores involved in the transaction need to use the `DynamoDBEventStorageAdapter`\n- This util inherits of the [`TransactWriteItem` API](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/transaction-apis.html#transaction-apis-txwriteitems) limitations: It can target up to 100 distinct events in one or more DynamoDB tables within the same AWS account and in the same Region.\n\n### 🔑 IAM\n\nRequired IAM permissions for each operations:\n\n- `getEvents` (+ `getAggregate`, `getExistingAggregate`): `dynamodb:Query`\n- `pushEvent`: `dynamodb:PutItem`\n- `listAggregateIds`: `dynamodb:Query` on the `initialEvents` index\n\n</details>\n","readmeFilename":"README.md"}