{"_id":"@codeforbreakfast/eventsourcing-projections","_rev":"24-48bd8133d5c9675ebd5fa6633aeee1c3","name":"@codeforbreakfast/eventsourcing-projections","dist-tags":{"latest":"0.5.14"},"versions":{"0.2.0":{"name":"@codeforbreakfast/eventsourcing-projections","version":"0.2.0","keywords":["event-sourcing","cqrs","projections","read-model","event-processing","effect","functional-programming"],"author":{"name":"Code for Breakfast"},"license":"MIT","_id":"@codeforbreakfast/eventsourcing-projections@0.2.0","maintainers":[{"name":"graemef","email":"graemef@gmail.com"}],"homepage":"https://github.com/codeforbreakfast/eventsourcing#readme","bugs":{"url":"https://github.com/codeforbreakfast/eventsourcing/issues"},"dist":{"shasum":"9e35fe985420cb1ceaedcfb265f7f4d4b3b6f061","tarball":"https://registry.npmjs.org/@codeforbreakfast/eventsourcing-projections/-/eventsourcing-projections-0.2.0.tgz","fileCount":5,"integrity":"sha512-/GGUrlysTuV05+K3tVqund2Ms5aJ91n6niP5SQtx0Q55WWHCTGKJr6/1O5K9QlpiBA1btTwe+iISljdzx9cs2w==","signatures":[{"sig":"MEUCIQDFAuUAoEBLKDGVu7jPeedvLWPtnYiDu00EcIt5uRHbEQIgKCzz+r3vcIiHM96bOj1Mi6DXebrgNGGe1hQRdRJONmk=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":8259},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=18.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","default":"./dist/index.js"},"./package.json":"./package.json"},"gitHead":"a1cd158103971be49c0fc80bf6cec2efdd9785d6","scripts":{"lint":"eslint . --ext .ts,.tsx","build":"bun build ./src/index.ts --outdir ./dist --target bun --format esm --external effect --external @effect/* --external @codeforbreakfast/* && bun x tsc --build","clean":"rm -rf dist","typecheck":"tsc --noEmit","prepublishOnly":"bun run clean && bun run build","publish:package":"bun publish --access public"},"_npmUser":{"name":"graemef","email":"graemef@gmail.com"},"repository":{"url":"git+https://github.com/codeforbreakfast/eventsourcing.git","type":"git","directory":"packages/eventsourcing-projections"},"_npmVersion":"10.8.2","description":"Projection patterns for event sourcing with Effect","directories":{},"sideEffects":false,"_nodeVersion":"20.19.5","dependencies":{"@codeforbreakfast/eventsourcing-store":"workspace:*"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"effect":"3.17.14","eslint":"9.36.0","vitest":"3.2.4","typescript":"5.9.2","@types/node":"24.5.2"},"peerDependencies":{"effect":"^3.17.0"},"_npmOperationalInternal":{"tmp":"tmp/eventsourcing-projections_0.2.0_1758449814173_0.8757476129062318","host":"s3://npm-registry-packages-npm-production"}},"0.2.1":{"name":"@codeforbreakfast/eventsourcing-projections","version":"0.2.1","keywords":["event-sourcing","cqrs","projections","read-model","event-processing","effect","functional-programming"],"author":{"name":"Code for Breakfast"},"license":"MIT","_id":"@codeforbreakfast/eventsourcing-projections@0.2.1","maintainers":[{"name":"graemef","email":"graemef@gmail.com"}],"homepage":"https://github.com/codeforbreakfast/eventsourcing#readme","bugs":{"url":"https://github.com/codeforbreakfast/eventsourcing/issues"},"dist":{"shasum":"85a11275f184907aa4f2eafecae03105d7c13e26","tarball":"https://registry.npmjs.org/@codeforbreakfast/eventsourcing-projections/-/eventsourcing-projections-0.2.1.tgz","fileCount":5,"integrity":"sha512-0cFVNxGazrRFOjl6EDAI6sv6aAAd/sgBL0aNx/7mHrmcXbdvxm593UVg5F07VzquaQI6AG6pt5gdm7ic2JQlTA==","signatures":[{"sig":"MEUCIQDyMB005ufdNJToQJ6nl0OY8UklVM7kSaQ3/n6FuHX1pAIgKm9eIIWrJALIL620kDZq5rDL7UObpRk+ptzpO3s+aZc=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":8259},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=18.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","default":"./dist/index.js"},"./package.json":"./package.json"},"gitHead":"fb64ff2d03d1d1940de91d498ce77963573ea2e5","scripts":{"lint":"eslint . --ext .ts,.tsx","build":"bun build ./src/index.ts --outdir ./dist --target bun --format esm --external effect --external @effect/* --external @codeforbreakfast/* && bun x tsc --build","clean":"rm -rf dist","typecheck":"tsc --noEmit","prepublishOnly":"bun run clean && bun run build","publish:package":"bun publish --access public"},"_npmUser":{"name":"graemef","email":"graemef@gmail.com"},"repository":{"url":"git+https://github.com/codeforbreakfast/eventsourcing.git","type":"git","directory":"packages/eventsourcing-projections"},"_npmVersion":"10.8.2","description":"Projection patterns for event sourcing with Effect","directories":{},"sideEffects":false,"_nodeVersion":"20.19.5","dependencies":{"@codeforbreakfast/eventsourcing-store":"workspace:*"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"effect":"3.17.14","eslint":"9.36.0","vitest":"3.2.4","typescript":"5.9.2","@types/node":"24.5.2"},"peerDependencies":{"effect":"^3.17.0"},"_npmOperationalInternal":{"tmp":"tmp/eventsourcing-projections_0.2.1_1758455504055_0.193214596997493","host":"s3://npm-registry-packages-npm-production"}},"0.3.0":{"name":"@codeforbreakfast/eventsourcing-projections","version":"0.3.0","keywords":["event-sourcing","projections","read-model","cqrs","event-processing","event-streaming","effect","effect-ts","functional-programming","fp","typescript","type-safe","streaming","view-models","query-models","composable","event-handlers"],"author":{"name":"Code for Breakfast"},"license":"MIT","_id":"@codeforbreakfast/eventsourcing-projections@0.3.0","maintainers":[{"name":"graemef","email":"graemef@gmail.com"}],"homepage":"https://github.com/codeforbreakfast/eventsourcing#readme","bugs":{"url":"https://github.com/codeforbreakfast/eventsourcing/issues"},"dist":{"shasum":"40de680bfe8f05815bbc0029614639da55387cf7","tarball":"https://registry.npmjs.org/@codeforbreakfast/eventsourcing-projections/-/eventsourcing-projections-0.3.0.tgz","fileCount":6,"integrity":"sha512-MPsTRUFMVRKV45mc+TWpG3KLAr/o0HYnwwdcbm4kH6aROiVTcwMUIJ6YaNMPIbhJYvm9nWe6bmKNfOuxoZjtRA==","signatures":[{"sig":"MEYCIQDWjKpZ/wPwhzzsPFS41dnKel92WdDKUoVXFH8gb4qUCgIhAO7nfU8VaBQbcZpOEfrS3cxKyTkkkCbh6tupmOur5ziF","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":22351},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=18.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","default":"./dist/index.js"},"./package.json":"./package.json"},"gitHead":"91a605488848987629e10ba81fdec39412844f8b","scripts":{"lint":"eslint . --ext .ts,.tsx","build":"bun build ./src/index.ts --outdir ./dist --target bun --format esm --external effect --external @effect/* --external @codeforbreakfast/* && bun x tsc --build","clean":"rm -rf dist","typecheck":"tsc --noEmit","prepublishOnly":"bun run clean && bun run build","publish:package":"bun publish --access public"},"_npmUser":{"name":"graemef","email":"graemef@gmail.com"},"repository":{"url":"git+https://github.com/codeforbreakfast/eventsourcing.git","type":"git","directory":"packages/eventsourcing-projections"},"_npmVersion":"10.8.2","description":"Functional event projections and read models with Effect - Transform event streams into queryable views with type-safe, composable projection builders","directories":{},"sideEffects":false,"_nodeVersion":"20.19.5","dependencies":{"@codeforbreakfast/eventsourcing-store":"workspace:*"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"effect":"3.17.14","eslint":"9.36.0","vitest":"3.2.4","typescript":"5.9.2","@types/node":"24.5.2"},"peerDependencies":{"effect":"^3.17.0"},"_npmOperationalInternal":{"tmp":"tmp/eventsourcing-projections_0.3.0_1758457381284_0.13847520284855364","host":"s3://npm-registry-packages-npm-production"}},"0.3.1":{"name":"@codeforbreakfast/eventsourcing-projections","version":"0.3.1","keywords":["event-sourcing","projections","read-model","cqrs","event-processing","event-streaming","effect","effect-ts","functional-programming","fp","typescript","type-safe","streaming","view-models","query-models","composable","event-handlers"],"author":{"name":"Code for Breakfast"},"license":"MIT","_id":"@codeforbreakfast/eventsourcing-projections@0.3.1","maintainers":[{"name":"graemef","email":"graemef@gmail.com"}],"homepage":"https://github.com/codeforbreakfast/eventsourcing#readme","bugs":{"url":"https://github.com/codeforbreakfast/eventsourcing/issues"},"dist":{"shasum":"8adcb7542fac226146a835ed65986a02055eb470","tarball":"https://registry.npmjs.org/@codeforbreakfast/eventsourcing-projections/-/eventsourcing-projections-0.3.1.tgz","fileCount":6,"integrity":"sha512-4s31VWnOJtW792n/avkOjZ1o1d1bEF7sfn9wZrkgFjjEsmNSoBr1Beuc2SLXdUEZo0ahcGdPx1sDmNZca8fxog==","signatures":[{"sig":"MEYCIQCxuKld7M9od0rFecqmRJmm+nIriI/hLuUVyvLQBERMFwIhAOyRkWRmKYJHI4QswiImTYP0rG2SLkUabeps9QW1MGYc","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":22351},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=18.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","default":"./dist/index.js"},"./package.json":"./package.json"},"gitHead":"d66a71f2237dac8eb5a2b344fa6bc474ec6cce72","scripts":{"lint":"eslint . --ext .ts,.tsx","build":"bun build ./src/index.ts --outdir ./dist --target bun --format esm --external effect --external @effect/* --external @codeforbreakfast/* && bun x tsc --build","clean":"rm -rf dist","typecheck":"tsc --noEmit","prepublishOnly":"bun run clean && bun run build","publish:package":"bun publish --access public"},"_npmUser":{"name":"graemef","email":"graemef@gmail.com"},"repository":{"url":"git+https://github.com/codeforbreakfast/eventsourcing.git","type":"git","directory":"packages/eventsourcing-projections"},"_npmVersion":"10.8.2","description":"Functional event projections and read models with Effect - Transform event streams into queryable views with type-safe, composable projection builders","directories":{},"sideEffects":false,"_nodeVersion":"20.19.5","dependencies":{"@codeforbreakfast/eventsourcing-store":"workspace:*"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"effect":"3.17.14","eslint":"9.36.0","vitest":"3.2.4","typescript":"5.9.2","@types/node":"24.5.2"},"peerDependencies":{"effect":"^3.17.0"},"_npmOperationalInternal":{"tmp":"tmp/eventsourcing-projections_0.3.1_1758459656188_0.6724341915735794","host":"s3://npm-registry-packages-npm-production"}},"0.4.0":{"name":"@codeforbreakfast/eventsourcing-projections","version":"0.4.0","keywords":["event-sourcing","projections","read-model","cqrs","event-processing","event-streaming","effect","effect-ts","functional-programming","fp","typescript","type-safe","streaming","view-models","query-models","composable","event-handlers"],"author":{"name":"Code for Breakfast"},"license":"MIT","_id":"@codeforbreakfast/eventsourcing-projections@0.4.0","maintainers":[{"name":"graemef","email":"graemef@gmail.com"}],"homepage":"https://github.com/codeforbreakfast/eventsourcing#readme","bugs":{"url":"https://github.com/codeforbreakfast/eventsourcing/issues"},"dist":{"shasum":"b80dab392e566dcc2c2c5f010da7514f3d7b2108","tarball":"https://registry.npmjs.org/@codeforbreakfast/eventsourcing-projections/-/eventsourcing-projections-0.4.0.tgz","fileCount":6,"integrity":"sha512-fV9TKKeSqAXIxxEmfNu4uCC1hApMGdSWEPuHcEuMEH1087UjnhMWKKVe8e/FrO9J9PrPRzW2PRxayWGlBSKJDQ==","signatures":[{"sig":"MEYCIQCGpyjNOTSvb3RAmE6RE3beb/uQX7mZZ8dp6LEWTO6PTAIhAO8u+0sxvgh8I9nczjc7HpCzpHzohGp9ficlwvS2bgpn","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":22078},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=18.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","default":"./dist/index.js"},"./package.json":"./package.json"},"gitHead":"cb3f8719089467198209dafda72aedfa33f910db","scripts":{"lint":"eslint . --ext .ts,.tsx","build":"bun build ./src/index.ts --outdir ./dist --target bun --format esm --external effect --external @effect/* --external @codeforbreakfast/* && bun x tsc --build","clean":"rm -rf dist","typecheck":"tsc --noEmit","prepublishOnly":"bun run clean && bun run build","publish:package":"bun publish --access public"},"_npmUser":{"name":"graemef","email":"graemef@gmail.com"},"repository":{"url":"git+https://github.com/codeforbreakfast/eventsourcing.git","type":"git","directory":"packages/eventsourcing-projections"},"_npmVersion":"10.8.2","description":"Functional event projections and read models with Effect - Transform event streams into queryable views with type-safe, composable projection builders","directories":{},"sideEffects":false,"_nodeVersion":"20.19.5","dependencies":{"@codeforbreakfast/eventsourcing-store":"workspace:*"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"effect":"3.17.14","eslint":"9.36.0","vitest":"3.2.4","typescript":"5.9.2","@types/node":"24.5.2"},"peerDependencies":{"effect":"^3.17.0"},"_npmOperationalInternal":{"tmp":"tmp/eventsourcing-projections_0.4.0_1758462658588_0.603784560026629","host":"s3://npm-registry-packages-npm-production"}},"0.4.1":{"name":"@codeforbreakfast/eventsourcing-projections","version":"0.4.1","keywords":["event-sourcing","projections","read-model","cqrs","event-processing","event-streaming","effect","effect-ts","functional-programming","fp","typescript","type-safe","streaming","view-models","query-models","composable","event-handlers"],"author":{"name":"Code for Breakfast"},"license":"MIT","_id":"@codeforbreakfast/eventsourcing-projections@0.4.1","maintainers":[{"name":"graemef","email":"graemef@gmail.com"}],"homepage":"https://github.com/codeforbreakfast/eventsourcing#readme","bugs":{"url":"https://github.com/codeforbreakfast/eventsourcing/issues"},"dist":{"shasum":"8637616a2c5217cbaff600110e00a2fabb43e791","tarball":"https://registry.npmjs.org/@codeforbreakfast/eventsourcing-projections/-/eventsourcing-projections-0.4.1.tgz","fileCount":6,"integrity":"sha512-lVzQMzH39552ALQKPmnGecot7YhnY26nlqbEshVZ1zsv/szuwZGEF1a05AjDPODsYPy5t20CNeFE6mkH6mkZqA==","signatures":[{"sig":"MEQCIQCyXMp6haKI+Fl2IBPgHCp+tk3N879RGcD8WE9pi6R2egIfUyNEwOu7IoKb4UCJ4eDPdv31rAfcZoNeNqFAtGU3uQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":22078},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=18.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","default":"./dist/index.js"},"./package.json":"./package.json"},"gitHead":"d2171855d7ad9b419abb1b213586048a0199001e","scripts":{"lint":"eslint . --ext .ts,.tsx","build":"bun build ./src/index.ts --outdir ./dist --target bun --format esm --external effect --external @effect/* --external @codeforbreakfast/* && bun x tsc --build","clean":"rm -rf dist","typecheck":"tsc --noEmit","prepublishOnly":"bun run clean && bun run build","publish:package":"bun publish --access public"},"_npmUser":{"name":"graemef","email":"graemef@gmail.com"},"repository":{"url":"git+https://github.com/codeforbreakfast/eventsourcing.git","type":"git","directory":"packages/eventsourcing-projections"},"_npmVersion":"10.8.2","description":"Functional event projections and read models with Effect - Transform event streams into queryable views with type-safe, composable projection builders","directories":{},"sideEffects":false,"_nodeVersion":"20.19.5","dependencies":{"@codeforbreakfast/eventsourcing-store":"workspace:*"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"effect":"3.17.14","eslint":"9.36.0","vitest":"3.2.4","typescript":"5.9.2","@types/node":"24.5.2"},"peerDependencies":{"effect":"^3.17.0"},"_npmOperationalInternal":{"tmp":"tmp/eventsourcing-projections_0.4.1_1758469474490_0.25117047948204707","host":"s3://npm-registry-packages-npm-production"}},"0.4.2":{"name":"@codeforbreakfast/eventsourcing-projections","version":"0.4.2","keywords":["event-sourcing","projections","read-model","cqrs","event-processing","event-streaming","effect","effect-ts","functional-programming","fp","typescript","type-safe","streaming","view-models","query-models","composable","event-handlers"],"author":"Code for Breakfast","license":"MIT","_id":"@codeforbreakfast/eventsourcing-projections@0.4.2","maintainers":[{"name":"graemef","email":"graemef@gmail.com"}],"homepage":"https://github.com/codeforbreakfast/eventsourcing#readme","bugs":{"url":"https://github.com/codeforbreakfast/eventsourcing/issues"},"dist":{"shasum":"ca2d31a3f30085751979b2abd7b57ed5eb13a21d","tarball":"https://registry.npmjs.org/@codeforbreakfast/eventsourcing-projections/-/eventsourcing-projections-0.4.2.tgz","fileCount":6,"integrity":"sha512-C49lhuGeLkySdMZ92HerpSIy9OX/AS84FNRoDv2CkJPlZpfEQhbb2I1AQHixCnsVjyXuPzOcfVpe9vYAgRCd2A==","signatures":[{"sig":"MEUCIF6QqpkO6Cj+4CW5EG3gUCzG9FP/MX7X2LKz+yiPyGpoAiEArfiTiHimwg8hRuD7YNJG6tb6pUeKkKE7seq+3dAk3tQ=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":22072},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","shasum":"ca2d31a3f30085751979b2abd7b57ed5eb13a21d","engines":{"node":">=18.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","default":"./dist/index.js"},"./package.json":"./package.json"},"scripts":{"lint":"eslint . --ext .ts,.tsx","build":"bun build ./src/index.ts --outdir ./dist --target bun --format esm --external effect --external @effect/* --external @codeforbreakfast/* && bun x tsc --build","clean":"rm -rf dist","typecheck":"tsc --noEmit","prepublishOnly":"bun run clean && bun run build","publish:package":"bun publish --access public"},"_npmUser":{"name":"graemef","email":"graemef@gmail.com"},"_integrity":"sha512-C49lhuGeLkySdMZ92HerpSIy9OX/AS84FNRoDv2CkJPlZpfEQhbb2I1AQHixCnsVjyXuPzOcfVpe9vYAgRCd2A==","repository":{"url":"https://github.com/codeforbreakfast/eventsourcing.git","type":"git","directory":"packages/eventsourcing-projections"},"_npmVersion":"10.8.3","description":"Functional event projections and read models with Effect - Transform event streams into queryable views with type-safe, composable projection builders","directories":{},"sideEffects":false,"_nodeVersion":"24.3.0","dependencies":{"@codeforbreakfast/eventsourcing-store":"0.6.2"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"effect":"3.17.14","eslint":"9.36.0","vitest":"3.2.4","typescript":"5.9.2","@types/node":"24.5.2"},"peerDependencies":{"effect":"^3.17.0"},"_npmOperationalInternal":{"tmp":"tmp/eventsourcing-projections_0.4.2_1758470928602_0.9965910966216005","host":"s3://npm-registry-packages-npm-production"}},"0.4.4":{"name":"@codeforbreakfast/eventsourcing-projections","version":"0.4.4","keywords":["event-sourcing","projections","read-model","cqrs","event-processing","event-streaming","effect","effect-ts","functional-programming","fp","typescript","type-safe","streaming","view-models","query-models","composable","event-handlers"],"author":"Code for Breakfast","license":"MIT","_id":"@codeforbreakfast/eventsourcing-projections@0.4.4","maintainers":[{"name":"graemef","email":"graemef@gmail.com"}],"homepage":"https://github.com/codeforbreakfast/eventsourcing#readme","bugs":{"url":"https://github.com/codeforbreakfast/eventsourcing/issues"},"dist":{"shasum":"42bbd1c9b7c0f7f6b6673f988ae691a0fcb75d27","tarball":"https://registry.npmjs.org/@codeforbreakfast/eventsourcing-projections/-/eventsourcing-projections-0.4.4.tgz","fileCount":12,"integrity":"sha512-Lk4gp8FXKL7N5G0QuZUUh+9BNkABo35D2VhIW+0A4KFYi1Swfs4Of9gNtVnQMO6N99q6gDP7TqUF8zsYh5E3Yw==","signatures":[{"sig":"MEYCIQC1W/FjbT5y6+E0EMwknewOkciXGqq66q2EWTKDCXFJBgIhAJaI/fgS7aQDBpxqmxEATtiLdp8Bq9bMMf/LI/ry2+Fc","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":26406},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","shasum":"42bbd1c9b7c0f7f6b6673f988ae691a0fcb75d27","engines":{"node":">=18.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","default":"./dist/index.js"},"./package.json":"./package.json"},"scripts":{"lint":"eslint . --ext .ts,.tsx","build":"bun build ./src/index.ts --outdir ./dist --target bun --format esm --external effect --external @effect/* --external @codeforbreakfast/* && bun x tsc --build --force","clean":"rm -rf dist","typecheck":"tsc --noEmit","prepublishOnly":"bun run build","publish:package":"bun publish --access public"},"_npmUser":{"name":"graemef","email":"graemef@gmail.com"},"_integrity":"sha512-Lk4gp8FXKL7N5G0QuZUUh+9BNkABo35D2VhIW+0A4KFYi1Swfs4Of9gNtVnQMO6N99q6gDP7TqUF8zsYh5E3Yw==","repository":{"url":"https://github.com/codeforbreakfast/eventsourcing.git","type":"git","directory":"packages/eventsourcing-projections"},"_npmVersion":"10.8.3","description":"Functional event projections and read models with Effect - Transform event streams into queryable views with type-safe, composable projection builders","directories":{},"sideEffects":false,"_nodeVersion":"24.3.0","dependencies":{"@codeforbreakfast/eventsourcing-store":"0.6.4"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"effect":"3.17.14","eslint":"9.36.0","vitest":"3.2.4","typescript":"5.9.2","@types/node":"24.5.2"},"peerDependencies":{"effect":"^3.17.0"},"_npmOperationalInternal":{"tmp":"tmp/eventsourcing-projections_0.4.4_1758474860718_0.9177042040861014","host":"s3://npm-registry-packages-npm-production"}},"0.4.5":{"name":"@codeforbreakfast/eventsourcing-projections","version":"0.4.5","keywords":["event-sourcing","projections","read-model","cqrs","event-processing","event-streaming","effect","effect-ts","functional-programming","fp","typescript","type-safe","streaming","view-models","query-models","composable","event-handlers"],"author":"Code for Breakfast","license":"MIT","_id":"@codeforbreakfast/eventsourcing-projections@0.4.5","maintainers":[{"name":"graemef","email":"graemef@gmail.com"}],"homepage":"https://github.com/codeforbreakfast/eventsourcing#readme","bugs":{"url":"https://github.com/codeforbreakfast/eventsourcing/issues"},"dist":{"shasum":"4a7e71acbb9bcde6cf00d36b179f39bf7fab4cb3","tarball":"https://registry.npmjs.org/@codeforbreakfast/eventsourcing-projections/-/eventsourcing-projections-0.4.5.tgz","fileCount":12,"integrity":"sha512-U6xSBrpL84Ji/kV4x9FONg8+vb9AuRGwMdu2//aR3Oy0bgYKCPd5edUSR3x2p+EfiY9Av31AM/BJhRy6JPF8Ug==","signatures":[{"sig":"MEYCIQDYoA8cjquK5u0nRR96YIuoECJxFAYNd4XfVgiMYwgaQwIhAP2m/BitJEf/fetFVt1dslxPBsqoiROr/RXH0ty59MRv","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":26406},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","shasum":"4a7e71acbb9bcde6cf00d36b179f39bf7fab4cb3","engines":{"node":">=18.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","default":"./dist/index.js"},"./package.json":"./package.json"},"scripts":{"lint":"eslint . --ext .ts,.tsx","build":"bun build ./src/index.ts --outdir ./dist --target bun --format esm --external effect --external @effect/* --external @codeforbreakfast/* && bun x tsc --build --force","clean":"rm -rf dist","typecheck":"tsc --noEmit","prepublishOnly":"bun run build","publish:package":"bun publish --access public"},"_npmUser":{"name":"graemef","email":"graemef@gmail.com"},"_integrity":"sha512-U6xSBrpL84Ji/kV4x9FONg8+vb9AuRGwMdu2//aR3Oy0bgYKCPd5edUSR3x2p+EfiY9Av31AM/BJhRy6JPF8Ug==","repository":{"url":"https://github.com/codeforbreakfast/eventsourcing.git","type":"git","directory":"packages/eventsourcing-projections"},"_npmVersion":"10.8.3","description":"Functional event projections and read models with Effect - Transform event streams into queryable views with type-safe, composable projection builders","directories":{},"sideEffects":false,"_nodeVersion":"24.3.0","dependencies":{"@codeforbreakfast/eventsourcing-store":"0.6.5"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"effect":"3.17.14","eslint":"9.36.0","vitest":"3.2.4","typescript":"5.9.2","@types/node":"24.5.2"},"peerDependencies":{"effect":"^3.17.0"},"_npmOperationalInternal":{"tmp":"tmp/eventsourcing-projections_0.4.5_1758476921493_0.26201584288393054","host":"s3://npm-registry-packages-npm-production"}},"0.4.6":{"name":"@codeforbreakfast/eventsourcing-projections","version":"0.4.6","keywords":["event-sourcing","projections","read-model","cqrs","event-processing","event-streaming","effect","effect-ts","functional-programming","fp","typescript","type-safe","streaming","view-models","query-models","composable","event-handlers"],"author":"Code for Breakfast","license":"MIT","_id":"@codeforbreakfast/eventsourcing-projections@0.4.6","maintainers":[{"name":"graemef","email":"graemef@gmail.com"}],"homepage":"https://github.com/codeforbreakfast/eventsourcing#readme","bugs":{"url":"https://github.com/codeforbreakfast/eventsourcing/issues"},"dist":{"shasum":"91671e4bdce6cb6792fbf49eb697cfa08a102ea8","tarball":"https://registry.npmjs.org/@codeforbreakfast/eventsourcing-projections/-/eventsourcing-projections-0.4.6.tgz","fileCount":12,"integrity":"sha512-u5c68RDNMjxOk6rxGMQcB55ICh2J6Ln1aj8Av2xDVJ9VLiYjnQdD0ZSu63vBBJ/RV+7ne1ErJLI+3MsKOww67g==","signatures":[{"sig":"MEQCIGEIWcwTmg0d2nHmXBUeAyw8NOuCE76hMWIxu5OsZUSUAiBdarc8n7BOuwbPPtPyWxkGEOYQYLmo9uFOpMKywi4kgg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":26406},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","shasum":"91671e4bdce6cb6792fbf49eb697cfa08a102ea8","engines":{"node":">=18.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","default":"./dist/index.js"},"./package.json":"./package.json"},"scripts":{"lint":"eslint . --ext .ts,.tsx","build":"bun build ./src/index.ts --outdir ./dist --target bun --format esm --external effect --external @effect/* --external @codeforbreakfast/* && bun x tsc --build --force","clean":"rm -rf dist","typecheck":"tsc --noEmit","prepublishOnly":"bun run build","publish:package":"bun publish --access public"},"_npmUser":{"name":"graemef","email":"graemef@gmail.com"},"_integrity":"sha512-u5c68RDNMjxOk6rxGMQcB55ICh2J6Ln1aj8Av2xDVJ9VLiYjnQdD0ZSu63vBBJ/RV+7ne1ErJLI+3MsKOww67g==","repository":{"url":"https://github.com/codeforbreakfast/eventsourcing.git","type":"git","directory":"packages/eventsourcing-projections"},"_npmVersion":"10.8.3","description":"Functional event projections and read models with Effect - Transform event streams into queryable views with type-safe, composable projection builders","directories":{},"sideEffects":false,"_nodeVersion":"24.3.0","dependencies":{"@codeforbreakfast/eventsourcing-store":"0.6.6"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"effect":"3.17.14","eslint":"9.36.0","vitest":"3.2.4","typescript":"5.9.2","@types/node":"24.5.2"},"peerDependencies":{"effect":"^3.17.0"},"_npmOperationalInternal":{"tmp":"tmp/eventsourcing-projections_0.4.6_1758697845081_0.4570301428442043","host":"s3://npm-registry-packages-npm-production"}},"0.4.7":{"name":"@codeforbreakfast/eventsourcing-projections","version":"0.4.7","keywords":["event-sourcing","projections","read-model","cqrs","event-processing","event-streaming","effect","effect-ts","functional-programming","fp","typescript","type-safe","streaming","view-models","query-models","composable","event-handlers"],"author":{"name":"Code for Breakfast"},"license":"MIT","_id":"@codeforbreakfast/eventsourcing-projections@0.4.7","maintainers":[{"name":"graemef","email":"graemef@gmail.com"}],"homepage":"https://github.com/codeforbreakfast/eventsourcing#readme","bugs":{"url":"https://github.com/codeforbreakfast/eventsourcing/issues"},"dist":{"shasum":"29ae0aa07fd1d3c60d77c3a50380cdcd6659596f","tarball":"https://registry.npmjs.org/@codeforbreakfast/eventsourcing-projections/-/eventsourcing-projections-0.4.7.tgz","fileCount":12,"integrity":"sha512-3VPNT/2M86V+UxWdkcMHm/4L4vzcDTcQOJCcJEoPWHzsUGPPPu8ok3q8zkG9ZI0gHF5F8OqeGyuSAMiNUNGzGA==","signatures":[{"sig":"MEQCIEiIAM0emgybJxdR64HQOvbFmK+bge6C0XQaHVycPy/1AiBHiyKf2/Ezzk7/lRjHgIlrCJ+z35j5+EL7hnJCDqkuAA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":26373},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=18.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","default":"./dist/index.js"},"./package.json":"./package.json"},"gitHead":"9510ad686c016cbbf486f3572a78ce3b8e031131","scripts":{"lint":"eslint . --ext .ts,.tsx","build":"bun build ./src/index.ts --outdir ./dist --target bun --format esm --external effect --external @effect/* --external @codeforbreakfast/* && bun x tsc --build --force","clean":"rm -rf dist","typecheck":"tsc --noEmit","publish:package":"npm publish --access public"},"_npmUser":{"name":"graemef","email":"graemef@gmail.com"},"repository":{"url":"git+https://github.com/codeforbreakfast/eventsourcing.git","type":"git","directory":"packages/eventsourcing-projections"},"_npmVersion":"10.8.2","description":"Functional event projections and read models with Effect - Transform event streams into queryable views with type-safe, composable projection builders","directories":{},"sideEffects":false,"_nodeVersion":"20.19.5","dependencies":{"@codeforbreakfast/eventsourcing-store":"workspace:*"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"effect":"3.17.14","eslint":"9.36.0","vitest":"3.2.4","typescript":"5.9.2","@types/node":"24.5.2"},"peerDependencies":{"effect":"^3.17.0"},"_npmOperationalInternal":{"tmp":"tmp/eventsourcing-projections_0.4.7_1758706996902_0.39162523591612475","host":"s3://npm-registry-packages-npm-production"}},"0.5.0":{"name":"@codeforbreakfast/eventsourcing-projections","version":"0.5.0","keywords":["event-sourcing","projections","read-model","cqrs","event-processing","event-streaming","effect","effect-ts","functional-programming","fp","typescript","type-safe","streaming","view-models","query-models","composable","event-handlers"],"author":{"name":"Code for Breakfast"},"license":"MIT","_id":"@codeforbreakfast/eventsourcing-projections@0.5.0","maintainers":[{"name":"graemef","email":"graemef@gmail.com"}],"homepage":"https://github.com/codeforbreakfast/eventsourcing#readme","bugs":{"url":"https://github.com/codeforbreakfast/eventsourcing/issues"},"dist":{"shasum":"aa3d544f9e46b443e99c1fdf8edfd6041972a916","tarball":"https://registry.npmjs.org/@codeforbreakfast/eventsourcing-projections/-/eventsourcing-projections-0.5.0.tgz","fileCount":12,"integrity":"sha512-j+tJb1Z2MZ6d+qNhX4mCf2PE9ywyFLApjM8P3PgomsrFC0DuZL37iDyfrJnsRoehx6cLOc4/lZnRuW3/9o19oQ==","signatures":[{"sig":"MEUCIFaiRlKQCwiepzrLPStP5TOkFW1ikTUmYMeSVgwPoWBPAiEAtogC5LRX0uY+c8RUeND23KkuS6Kr5+Yk5bPcasDAe4E=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":26338},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=18.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","default":"./dist/index.js"},"./package.json":"./package.json"},"gitHead":"18e324d0d06e1524923d166cf7f6d84958155b5a","scripts":{"lint":"eslint . --ext .ts,.tsx","build":"bun build ./src/index.ts --outdir ./dist --target bun --format esm --external effect --external @effect/* --external @codeforbreakfast/* && bun x tsc --build --force","clean":"rm -rf dist","typecheck":"tsc --noEmit","publish:package":"npm publish --access public"},"_npmUser":{"name":"graemef","email":"graemef@gmail.com"},"repository":{"url":"git+https://github.com/codeforbreakfast/eventsourcing.git","type":"git","directory":"packages/eventsourcing-projections"},"_npmVersion":"10.8.2","description":"Functional event projections and read models with Effect - Transform event streams into queryable views with type-safe, composable projection builders","directories":{},"sideEffects":false,"_nodeVersion":"20.19.5","dependencies":{"@codeforbreakfast/eventsourcing-store":"workspace:*"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"effect":"3.17.14","eslint":"9.36.0","typescript":"5.9.2","@types/node":"24.5.2"},"peerDependencies":{"effect":"^3.17.0"},"_npmOperationalInternal":{"tmp":"tmp/eventsourcing-projections_0.5.0_1759054232725_0.1004070401518129","host":"s3://npm-registry-packages-npm-production"}},"0.5.3":{"name":"@codeforbreakfast/eventsourcing-projections","version":"0.5.3","keywords":["event-sourcing","projections","read-model","cqrs","event-processing","event-streaming","effect","effect-ts","functional-programming","fp","typescript","type-safe","streaming","view-models","query-models","composable","event-handlers"],"author":{"name":"Code for Breakfast"},"license":"MIT","_id":"@codeforbreakfast/eventsourcing-projections@0.5.3","maintainers":[{"name":"graemef","email":"graemef@gmail.com"}],"homepage":"https://github.com/codeforbreakfast/eventsourcing#readme","bugs":{"url":"https://github.com/codeforbreakfast/eventsourcing/issues"},"dist":{"shasum":"de9513e1c40c9aa942c2a47a6baa5fa0949a2b9c","tarball":"https://registry.npmjs.org/@codeforbreakfast/eventsourcing-projections/-/eventsourcing-projections-0.5.3.tgz","fileCount":12,"integrity":"sha512-JolpZd+6D2bhqlnigBkM6SG4XfcEaVTcE6aNVf0mnl8CHX+eRrBdo8W74WZmQS9oQUnFmZiJfssLT59pkwqHCQ==","signatures":[{"sig":"MEQCIGv5MLBgMNa6Mdg32s9EmGxAuqXGibAcZcQ4YkMuDhBCAiAZxV73cM5PC2af2JJQJXs7rO8Z7hKFI1hbZn0G0X1EBg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@codeforbreakfast%2feventsourcing-projections@0.5.3","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":26500},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=18.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","default":"./dist/index.js"},"./package.json":"./package.json"},"gitHead":"b51721207db43b5ba8b9228b79cfa36219146005","scripts":{"lint":"eslint . --ext .ts,.tsx","build":"bun build ./src/index.ts --outdir ./dist --target bun --format esm --external effect --external @effect/* --external @codeforbreakfast/* && bun x tsc --build --force","clean":"rm -rf dist","typecheck":"tsc --noEmit","validate:pack":"bun pm pack --dry-run","publish:package":"npm publish --access public","check:publishable":"npm view $npm_package_name@$npm_package_version version >/dev/null 2>&1 && exit 1 || exit 0"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:13fa57d4-95af-41e8-9b68-bdf796d41fb9"}},"repository":{"url":"git+https://github.com/CodeForBreakfast/eventsourcing.git","type":"git","directory":"packages/eventsourcing-projections"},"_npmVersion":"11.6.1","description":"Functional event projections and read models with Effect - Transform event streams into queryable views with type-safe, composable projection builders","directories":{},"sideEffects":false,"_nodeVersion":"20.19.5","dependencies":{"@codeforbreakfast/eventsourcing-store":"workspace:*"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"effect":"3.17.14","eslint":"9.36.0","typescript":"5.9.2","@types/node":"24.5.2"},"peerDependencies":{"effect":"^3.17.0"},"_npmOperationalInternal":{"tmp":"tmp/eventsourcing-projections_0.5.3_1759068014316_0.359504531155697","host":"s3://npm-registry-packages-npm-production"}},"0.5.4":{"name":"@codeforbreakfast/eventsourcing-projections","version":"0.5.4","keywords":["event-sourcing","projections","read-model","cqrs","event-processing","event-streaming","effect","effect-ts","functional-programming","fp","typescript","type-safe","streaming","view-models","query-models","composable","event-handlers"],"author":{"name":"Code for Breakfast"},"license":"MIT","_id":"@codeforbreakfast/eventsourcing-projections@0.5.4","maintainers":[{"name":"graemef","email":"graemef@gmail.com"}],"homepage":"https://github.com/codeforbreakfast/eventsourcing#readme","bugs":{"url":"https://github.com/codeforbreakfast/eventsourcing/issues"},"dist":{"shasum":"bf1a3d545657986c38a1c5d2455f242c85c4c950","tarball":"https://registry.npmjs.org/@codeforbreakfast/eventsourcing-projections/-/eventsourcing-projections-0.5.4.tgz","fileCount":12,"integrity":"sha512-sTP/n4sXx4pjgfaBhIp6LlrOsPAJLUhHsh0QhmhXs+Acw1Qsm7AJ8Y6gvxdBOi03m4FUhw1hqtu1kIzIDIepOA==","signatures":[{"sig":"MEYCIQD3pA2msMbPq8pICkMFJJG6ymmQEjp9Qsp5l6/cFoLEtQIhAJqicE88j5S6CQzgaCTx//EpIEdk0RnvazuvVbf3hQG3","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@codeforbreakfast%2feventsourcing-projections@0.5.4","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":26780},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=18.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","default":"./dist/index.js"},"./package.json":"./package.json"},"gitHead":"35106a1245f942e488807eea940f69a8a8af3b13","scripts":{"lint":"eslint . --ext .ts,.tsx","build":"bun build ./src/index.ts --outdir ./dist --target bun --format esm --external effect --external @effect/* --external @codeforbreakfast/* && bun x tsc --build --force","clean":"rm -rf dist","typecheck":"tsc --noEmit","validate:pack":"bun pm pack --dry-run","publish:package":"npm publish --access public","check:publishable":"npm view $npm_package_name@$npm_package_version version >/dev/null 2>&1 && exit 1 || exit 0"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:13fa57d4-95af-41e8-9b68-bdf796d41fb9"}},"repository":{"url":"git+https://github.com/CodeForBreakfast/eventsourcing.git","type":"git","directory":"packages/eventsourcing-projections"},"_npmVersion":"11.6.1","description":"Functional event projections and read models with Effect - Transform event streams into queryable views with type-safe, composable projection builders","directories":{},"sideEffects":false,"_nodeVersion":"20.19.5","dependencies":{"type-fest":"5.0.1","@codeforbreakfast/eventsourcing-store":"workspace:*"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"effect":"3.17.14","eslint":"9.36.0","typescript":"5.9.2","@types/node":"24.5.2"},"peerDependencies":{"effect":"^3.17.0"},"_npmOperationalInternal":{"tmp":"tmp/eventsourcing-projections_0.5.4_1759154766217_0.5014146123713039","host":"s3://npm-registry-packages-npm-production"}},"0.5.5":{"name":"@codeforbreakfast/eventsourcing-projections","version":"0.5.5","keywords":["event-sourcing","projections","read-model","cqrs","event-processing","event-streaming","effect","effect-ts","functional-programming","fp","typescript","type-safe","streaming","view-models","query-models","composable","event-handlers"],"author":{"name":"Code for Breakfast"},"license":"MIT","_id":"@codeforbreakfast/eventsourcing-projections@0.5.5","maintainers":[{"name":"graemef","email":"graemef@gmail.com"}],"homepage":"https://github.com/codeforbreakfast/eventsourcing#readme","bugs":{"url":"https://github.com/codeforbreakfast/eventsourcing/issues"},"dist":{"shasum":"51261999331c8d6b6a14405eb488c068ccb73fcf","tarball":"https://registry.npmjs.org/@codeforbreakfast/eventsourcing-projections/-/eventsourcing-projections-0.5.5.tgz","fileCount":12,"integrity":"sha512-yAaMdL7TycPOE7Wl5adfKLMj5FvUUNOui6Km1CdrEiXaRLfRqHnh9d7bgGFBvgoXiP93PP2Dg9wp/WTLqtxMqA==","signatures":[{"sig":"MEUCID8VyUsNsb8hI8wTS/xOkRyUqUE0UfJYewWJw94XZN+BAiEAilQWicOkmWkRIHOPyfc33eAQ3PKI5K/+LySwtoiFW0I=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@codeforbreakfast%2feventsourcing-projections@0.5.5","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":39798},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=18.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","default":"./dist/index.js"},"./package.json":"./package.json"},"gitHead":"25c05b1804fe30d707ce5508addc73813ed6ebfc","scripts":{"lint":"eslint . --ext .ts,.tsx","build":"bun build ./src/index.ts --outdir ./dist --target bun --format esm --external effect --external @effect/* --external @codeforbreakfast/* && bun x tsc --build --force","clean":"rm -rf dist","typecheck":"tsc --noEmit","validate:docs":"bun ../../scripts/validate-markdown-examples.ts","validate:pack":"bun pm pack --dry-run","publish:package":"npm publish --access public","check:publishable":"npm view $npm_package_name@$npm_package_version version >/dev/null 2>&1 && exit 1 || exit 0"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:13fa57d4-95af-41e8-9b68-bdf796d41fb9"}},"repository":{"url":"git+https://github.com/CodeForBreakfast/eventsourcing.git","type":"git","directory":"packages/eventsourcing-projections"},"_npmVersion":"11.6.1","description":"Functional event projections and read models with Effect - Transform event streams into queryable views with type-safe, composable projection builders","directories":{},"sideEffects":false,"_nodeVersion":"20.19.5","dependencies":{"type-fest":"5.0.1","@codeforbreakfast/eventsourcing-store":"workspace:*"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"effect":"3.18.1","eslint":"9.36.0","typescript":"5.9.3","@types/node":"24.6.2"},"peerDependencies":{"effect":"^3.17.0"},"_npmOperationalInternal":{"tmp":"tmp/eventsourcing-projections_0.5.5_1759677753839_0.5174891574489116","host":"s3://npm-registry-packages-npm-production"}},"0.5.6":{"name":"@codeforbreakfast/eventsourcing-projections","version":"0.5.6","keywords":["event-sourcing","projections","read-model","cqrs","event-processing","event-streaming","effect","effect-ts","functional-programming","fp","typescript","type-safe","streaming","view-models","query-models","composable","event-handlers"],"author":{"name":"Code for Breakfast"},"license":"MIT","_id":"@codeforbreakfast/eventsourcing-projections@0.5.6","maintainers":[{"name":"graemef","email":"graemef@gmail.com"}],"homepage":"https://github.com/codeforbreakfast/eventsourcing#readme","bugs":{"url":"https://github.com/codeforbreakfast/eventsourcing/issues"},"dist":{"shasum":"d8a11767439cff102330f4518744a6e8cdb81e9b","tarball":"https://registry.npmjs.org/@codeforbreakfast/eventsourcing-projections/-/eventsourcing-projections-0.5.6.tgz","fileCount":12,"integrity":"sha512-A04/7qo8hGOeBspzG62AYtTOy7pRADVuxBqYbNR/fdB7uw1UXE9eedvyM0ura9kToKU3rDn5iKl2MsYiTmQuCQ==","signatures":[{"sig":"MEYCIQCzOLtczvZz4eXNVkEwX95zdRwpePdpZKDUJ+wTNcwDNQIhAOi4YQpakft4VcNmfaqbC1ISCA/dDn0pIekVtFmvqB9X","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@codeforbreakfast%2feventsourcing-projections@0.5.6","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":39798},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=18.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","default":"./dist/index.js"},"./package.json":"./package.json"},"gitHead":"64395671cd2e58b786dc4f009dca9a0db2e22214","scripts":{"lint":"eslint . --ext .ts,.tsx","build":"bun build ./src/index.ts --outdir ./dist --target bun --format esm --external effect --external @effect/* --external @codeforbreakfast/* && bun x tsc --build --force","clean":"rm -rf dist","typecheck":"tsc --noEmit","validate:docs":"bun ../../scripts/validate-markdown-examples.ts","validate:pack":"bun pm pack --dry-run","publish:package":"npm publish --access public","check:publishable":"npm view $npm_package_name@$npm_package_version version >/dev/null 2>&1 && exit 1 || exit 0"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:13fa57d4-95af-41e8-9b68-bdf796d41fb9"}},"repository":{"url":"git+https://github.com/CodeForBreakfast/eventsourcing.git","type":"git","directory":"packages/eventsourcing-projections"},"_npmVersion":"11.6.1","description":"Functional event projections and read models with Effect - Transform event streams into queryable views with type-safe, composable projection builders","directories":{},"sideEffects":false,"_nodeVersion":"20.19.5","dependencies":{"type-fest":"5.0.1","@codeforbreakfast/eventsourcing-store":"workspace:*"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"effect":"3.18.1","eslint":"9.36.0","typescript":"5.9.3","@types/node":"24.6.2"},"peerDependencies":{"effect":"^3.17.0"},"_npmOperationalInternal":{"tmp":"tmp/eventsourcing-projections_0.5.6_1759689712599_0.8133366367365233","host":"s3://npm-registry-packages-npm-production"}},"0.5.7":{"name":"@codeforbreakfast/eventsourcing-projections","version":"0.5.7","keywords":["event-sourcing","projections","read-model","cqrs","event-processing","event-streaming","effect","effect-ts","functional-programming","fp","typescript","type-safe","streaming","view-models","query-models","composable","event-handlers"],"author":{"name":"Code for Breakfast"},"license":"MIT","_id":"@codeforbreakfast/eventsourcing-projections@0.5.7","maintainers":[{"name":"graemef","email":"graemef@gmail.com"}],"homepage":"https://github.com/codeforbreakfast/eventsourcing#readme","bugs":{"url":"https://github.com/codeforbreakfast/eventsourcing/issues"},"dist":{"shasum":"318174f4da532f7060945216d194364b0f616d46","tarball":"https://registry.npmjs.org/@codeforbreakfast/eventsourcing-projections/-/eventsourcing-projections-0.5.7.tgz","fileCount":12,"integrity":"sha512-yoBjl4dM32QVafAjVLDzxBJw9QfsxA6rwARhHR11Cq2QHSRj+/a6bO+ddP2OhA8RFtjtRhOlqZ/jA//sCXlGxg==","signatures":[{"sig":"MEQCIGj1K4THW9s8AP9oD/0LFchktFh+yiAhbKi7YfDLXcV7AiASguG60ICpGPpWx+ntYwgj3xohk9hCRXTpmmE9QRepbw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@codeforbreakfast%2feventsourcing-projections@0.5.7","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":39741},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=18.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","default":"./dist/index.js"},"./package.json":"./package.json"},"gitHead":"37f4fc8c1953c6018760271ab3d6b8c4d30ec88c","scripts":{"lint":"eslint . --ext .ts,.tsx","build":"bun build ./src/index.ts --outdir ./dist --target bun --format esm --external effect --external @effect/* --external @codeforbreakfast/* && bun x tsc --build","clean":"rm -rf dist","typecheck":"tsc --noEmit","validate:docs":"bun ../../scripts/validate-markdown-examples.ts","validate:pack":"bun pm pack --dry-run","publish:package":"npm publish --access public","check:publishable":"npm view $npm_package_name@$npm_package_version version >/dev/null 2>&1 && exit 1 || exit 0"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:13fa57d4-95af-41e8-9b68-bdf796d41fb9"}},"repository":{"url":"git+https://github.com/CodeForBreakfast/eventsourcing.git","type":"git","directory":"packages/eventsourcing-projections"},"_npmVersion":"11.6.1","description":"Functional event projections and read models with Effect - Transform event streams into queryable views with type-safe, composable projection builders","directories":{},"sideEffects":false,"_nodeVersion":"20.19.5","dependencies":{"type-fest":"5.0.1","@codeforbreakfast/eventsourcing-store":"workspace:*"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"effect":"3.18.1","eslint":"9.36.0","typescript":"5.9.3","@types/node":"24.6.2"},"peerDependencies":{"effect":"^3.17.0"},"_npmOperationalInternal":{"tmp":"tmp/eventsourcing-projections_0.5.7_1759854550171_0.6788227818122186","host":"s3://npm-registry-packages-npm-production"}},"0.5.8":{"name":"@codeforbreakfast/eventsourcing-projections","version":"0.5.8","keywords":["event-sourcing","projections","read-model","cqrs","event-processing","event-streaming","effect","effect-ts","functional-programming","fp","typescript","type-safe","streaming","view-models","query-models","composable","event-handlers"],"author":{"name":"Code for Breakfast"},"license":"MIT","_id":"@codeforbreakfast/eventsourcing-projections@0.5.8","maintainers":[{"name":"graemef","email":"graemef@gmail.com"}],"homepage":"https://github.com/codeforbreakfast/eventsourcing#readme","bugs":{"url":"https://github.com/codeforbreakfast/eventsourcing/issues"},"dist":{"shasum":"994fc56c2d85edfb6e01c9fb343ae02af70c53e0","tarball":"https://registry.npmjs.org/@codeforbreakfast/eventsourcing-projections/-/eventsourcing-projections-0.5.8.tgz","fileCount":12,"integrity":"sha512-d/+m+gwyM+UeZ4sz3q8Ucp7mdj/+1uY7gppQVzPu8KHijcQIxXzw0Jef6C0aGUdwRtJ9kuiAMGurWcbNiWtkjw==","signatures":[{"sig":"MEQCIGHvVQKGdGdjXo2e7+zBzqe1fbZMF5/aQ6s4v4bXbBNWAiBaSoY4XEW+nkn6haOVkcG4ylQc9FKpAj9higGvJMRbFQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@codeforbreakfast%2feventsourcing-projections@0.5.8","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":39743},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=18.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","default":"./dist/index.js"},"./package.json":"./package.json"},"gitHead":"6b33e587b5948de08c6fcfd7bebc0f93e22cd24b","scripts":{"lint":"eslint . --ext .ts,.tsx","build":"bun build ./src/index.ts --outdir ./dist --target bun --format esm --external effect --external @effect/* --external @codeforbreakfast/* && bun x tsc --project tsconfig.build.json","clean":"rm -rf dist","typecheck":"tsc --noEmit","validate:docs":"bun ../../scripts/validate-markdown-examples.ts","validate:pack":"bun pm pack --dry-run","publish:package":"npm publish --access public","check:publishable":"npm view $npm_package_name@$npm_package_version version >/dev/null 2>&1 && exit 1 || exit 0"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:13fa57d4-95af-41e8-9b68-bdf796d41fb9"}},"repository":{"url":"git+https://github.com/CodeForBreakfast/eventsourcing.git","type":"git","directory":"packages/eventsourcing-projections"},"_npmVersion":"11.6.1","description":"Functional event projections and read models with Effect - Transform event streams into queryable views with type-safe, composable projection builders","directories":{},"sideEffects":false,"_nodeVersion":"20.19.5","dependencies":{"type-fest":"5.0.1","@codeforbreakfast/eventsourcing-store":"workspace:*"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"effect":"3.18.4","eslint":"9.36.0","typescript":"5.9.3","@types/node":"24.6.2"},"peerDependencies":{"effect":"^3.17.0"},"_npmOperationalInternal":{"tmp":"tmp/eventsourcing-projections_0.5.8_1760267627084_0.13583044442834913","host":"s3://npm-registry-packages-npm-production"}},"0.5.9":{"name":"@codeforbreakfast/eventsourcing-projections","version":"0.5.9","keywords":["event-sourcing","projections","read-model","cqrs","event-processing","event-streaming","effect","effect-ts","functional-programming","fp","typescript","type-safe","streaming","view-models","query-models","composable","event-handlers"],"author":{"name":"Code for Breakfast"},"license":"MIT","_id":"@codeforbreakfast/eventsourcing-projections@0.5.9","maintainers":[{"name":"graemef","email":"graemef@gmail.com"}],"homepage":"https://github.com/codeforbreakfast/eventsourcing#readme","bugs":{"url":"https://github.com/codeforbreakfast/eventsourcing/issues"},"dist":{"shasum":"eb183d47f565c3a02084c477aaf11266f3f20003","tarball":"https://registry.npmjs.org/@codeforbreakfast/eventsourcing-projections/-/eventsourcing-projections-0.5.9.tgz","fileCount":12,"integrity":"sha512-t9ApN6kBs+Rrv7b0UXEOOlPViNwl/TYmWtUP4eMgykSJBvBhCLi/wSLTkbpY9sLKKhvRZYKOgKlGdxMg9XNc8g==","signatures":[{"sig":"MEUCIQCiP45/KHwpsNAj067keILe0c3gfipLu83urnUDwgZvVAIgYBDZQdo2eMHTcN9E9rbRqFj32/4LKKQU0AtlTEvHu/M=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@codeforbreakfast%2feventsourcing-projections@0.5.9","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":39706},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=18.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","default":"./dist/index.js"},"./package.json":"./package.json"},"gitHead":"209ef435978ce052d57ea888fdc847b07011a674","scripts":{"lint":"eslint . --ext .ts,.tsx","build":"bun build ./src/index.ts --outdir ./dist --target node --format esm --external effect --external @effect/* --external @codeforbreakfast/* && bun x tsc","clean":"rm -rf dist","typecheck":"tsc --noEmit","validate:docs":"bun ../../scripts/validate-markdown-examples.ts","validate:pack":"bun pm pack --dry-run","publish:package":"npm publish --access public","check:publishable":"npm view $npm_package_name@$npm_package_version version >/dev/null 2>&1 && exit 1 || exit 0"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:13fa57d4-95af-41e8-9b68-bdf796d41fb9"}},"repository":{"url":"git+https://github.com/CodeForBreakfast/eventsourcing.git","type":"git","directory":"packages/eventsourcing-projections"},"_npmVersion":"11.6.2","description":"Functional event projections and read models with Effect - Transform event streams into queryable views with type-safe, composable projection builders","directories":{},"sideEffects":false,"_nodeVersion":"20.19.5","dependencies":{"type-fest":"5.0.1","@codeforbreakfast/eventsourcing-store":"workspace:*"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"effect":"3.18.4","eslint":"9.37.0","typescript":"5.9.3","@types/node":"24.7.1"},"peerDependencies":{"effect":"^3.17.0"},"_npmOperationalInternal":{"tmp":"tmp/eventsourcing-projections_0.5.9_1760430178457_0.4801773713495099","host":"s3://npm-registry-packages-npm-production"}},"0.5.10":{"name":"@codeforbreakfast/eventsourcing-projections","version":"0.5.10","keywords":["event-sourcing","projections","read-model","cqrs","event-processing","event-streaming","effect","effect-ts","functional-programming","fp","typescript","type-safe","streaming","view-models","query-models","composable","event-handlers"],"author":{"name":"Code for Breakfast"},"license":"MIT","_id":"@codeforbreakfast/eventsourcing-projections@0.5.10","maintainers":[{"name":"graemef","email":"graemef@gmail.com"}],"homepage":"https://github.com/codeforbreakfast/eventsourcing#readme","bugs":{"url":"https://github.com/codeforbreakfast/eventsourcing/issues"},"dist":{"shasum":"7badcc25b698534922d74aeda8a30c369feb8105","tarball":"https://registry.npmjs.org/@codeforbreakfast/eventsourcing-projections/-/eventsourcing-projections-0.5.10.tgz","fileCount":12,"integrity":"sha512-w2fMXV9EV7kpkh4Rtyi+AupkX4qJGLTJvA3j/zn6Zr6nPH7uGLati0eeeZLB6IX52zSJZ0HejQPKsoKvrycpjw==","signatures":[{"sig":"MEQCIGnd1FvPg80NYd6vVzjT2vhOR17axTewhX9yAPx5kQuZAiBeW7je+DQ3MHu0IVkzAnwXQGlUbpNPVXURXFUKE9elNQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@codeforbreakfast%2feventsourcing-projections@0.5.10","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":39707},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=18.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","default":"./dist/index.js"},"./package.json":"./package.json"},"gitHead":"b86d91ea14ffcb2c9209ebfcbf6c48b4a9ff5876","scripts":{"lint":"eslint . --ext .ts,.tsx","build":"bun build ./src/index.ts --outdir ./dist --target node --format esm --external effect --external @effect/* --external @codeforbreakfast/* && bun x tsc","clean":"rm -rf dist","typecheck":"tsc --noEmit","validate:docs":"bun ../../scripts/validate-markdown-examples.ts","validate:pack":"bun pm pack --dry-run","publish:package":"npm publish --access public","check:publishable":"npm view $npm_package_name@$npm_package_version version >/dev/null 2>&1 && exit 1 || exit 0"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:13fa57d4-95af-41e8-9b68-bdf796d41fb9"}},"repository":{"url":"git+https://github.com/CodeForBreakfast/eventsourcing.git","type":"git","directory":"packages/eventsourcing-projections"},"_npmVersion":"11.6.2","description":"Functional event projections and read models with Effect - Transform event streams into queryable views with type-safe, composable projection builders","directories":{},"sideEffects":false,"_nodeVersion":"20.19.5","dependencies":{"type-fest":"5.1.0","@codeforbreakfast/eventsourcing-store":"workspace:*"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"effect":"3.18.4","eslint":"9.37.0","typescript":"5.9.3","@types/node":"24.7.2"},"peerDependencies":{"effect":"^3.17.0"},"_npmOperationalInternal":{"tmp":"tmp/eventsourcing-projections_0.5.10_1760796634079_0.33084681618120015","host":"s3://npm-registry-packages-npm-production"}},"0.5.11":{"name":"@codeforbreakfast/eventsourcing-projections","version":"0.5.11","keywords":["event-sourcing","projections","read-model","cqrs","event-processing","event-streaming","effect","effect-ts","functional-programming","fp","typescript","type-safe","streaming","view-models","query-models","composable","event-handlers"],"author":{"name":"Code for Breakfast"},"license":"MIT","_id":"@codeforbreakfast/eventsourcing-projections@0.5.11","maintainers":[{"name":"graemef","email":"graemef@gmail.com"}],"homepage":"https://github.com/codeforbreakfast/eventsourcing#readme","bugs":{"url":"https://github.com/codeforbreakfast/eventsourcing/issues"},"dist":{"shasum":"0f12234d3904ad4016f21c5592e8c3dd54546fbd","tarball":"https://registry.npmjs.org/@codeforbreakfast/eventsourcing-projections/-/eventsourcing-projections-0.5.11.tgz","fileCount":12,"integrity":"sha512-hnuILCfTOAM0fYUZXNTxZYg+uiN0NNC0R8jEvcgIdxVQ0EmWjhY+cEp16zUVDd78rrXdFl5z0TDfMJ58Ii04AQ==","signatures":[{"sig":"MEUCIEdaUHz+lTpBnpY82EKHV9CTDeBVS1aqaYLFOHl9NJhwAiEAxroiiDscoh2d2zj1kF1N8Ql63A96Yj1NBb0OmynqDnY=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@codeforbreakfast%2feventsourcing-projections@0.5.11","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":39707},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=18.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","default":"./dist/index.js"},"./package.json":"./package.json"},"gitHead":"8aeb86d53d72d178720c7a9543b57a8a85177f25","scripts":{"lint":"eslint . --ext .ts,.tsx","build":"bun build ./src/index.ts --outdir ./dist --target node --format esm --external effect --external @effect/* --external @codeforbreakfast/* && bun x tsc","clean":"rm -rf dist","typecheck":"tsc --noEmit","validate:docs":"bun ../../scripts/validate-markdown-examples.ts","validate:pack":"bun pm pack --dry-run","publish:package":"npm publish --access public","check:publishable":"npm view $npm_package_name@$npm_package_version version >/dev/null 2>&1 && exit 1 || exit 0"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:13fa57d4-95af-41e8-9b68-bdf796d41fb9"}},"repository":{"url":"git+https://github.com/CodeForBreakfast/eventsourcing.git","type":"git","directory":"packages/eventsourcing-projections"},"_npmVersion":"11.6.2","description":"Functional event projections and read models with Effect - Transform event streams into queryable views with type-safe, composable projection builders","directories":{},"sideEffects":false,"_nodeVersion":"20.19.5","dependencies":{"type-fest":"5.1.0","@codeforbreakfast/eventsourcing-store":"workspace:*"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"effect":"3.18.4","eslint":"9.38.0","typescript":"5.9.3","@types/node":"24.9.1"},"peerDependencies":{"effect":"^3.17.0"},"_npmOperationalInternal":{"tmp":"tmp/eventsourcing-projections_0.5.11_1761488004186_0.05454030278472444","host":"s3://npm-registry-packages-npm-production"}},"0.5.12":{"name":"@codeforbreakfast/eventsourcing-projections","version":"0.5.12","keywords":["event-sourcing","projections","read-model","cqrs","event-processing","event-streaming","effect","effect-ts","functional-programming","fp","typescript","type-safe","streaming","view-models","query-models","composable","event-handlers"],"author":{"name":"Code for Breakfast"},"license":"MIT","_id":"@codeforbreakfast/eventsourcing-projections@0.5.12","maintainers":[{"name":"graemef","email":"graemef@gmail.com"}],"homepage":"https://github.com/codeforbreakfast/eventsourcing#readme","bugs":{"url":"https://github.com/codeforbreakfast/eventsourcing/issues"},"dist":{"shasum":"e70036ebb6cae066cfb5b9adf1a0ab5bf3ea844b","tarball":"https://registry.npmjs.org/@codeforbreakfast/eventsourcing-projections/-/eventsourcing-projections-0.5.12.tgz","fileCount":12,"integrity":"sha512-JjVlLE6xRrwfAKNVQvAopkMXSNycsQSx3wW23v2aJByf38hWDa/y1QpD0pXQei4R39IGhurcqY/5iD5QpSLv8w==","signatures":[{"sig":"MEUCIDtlQo7V2oJ0POadjeutTFXdZpfU3MknA7TZnLUUoFhtAiEAvBfZpJ19QsXtEVpFgwLze54/AiRDXerBNRTfNaWWhn4=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@codeforbreakfast%2feventsourcing-projections@0.5.12","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":39707},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=18.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","default":"./dist/index.js"},"./package.json":"./package.json"},"gitHead":"7f67156700fc3a5d4036c8d9fd4f905897e41917","scripts":{"lint":"eslint . --ext .ts,.tsx","build":"bun build ./src/index.ts --outdir ./dist --target node --format esm --external effect --external @effect/* --external @codeforbreakfast/* && bun x tsc","clean":"rm -rf dist","typecheck":"tsc --noEmit","validate:docs":"bun ../../scripts/validate-markdown-examples.ts","validate:pack":"bun pm pack --dry-run","publish:package":"npm publish --access public","check:publishable":"npm view $npm_package_name@$npm_package_version version >/dev/null 2>&1 && exit 1 || exit 0"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:13fa57d4-95af-41e8-9b68-bdf796d41fb9"}},"repository":{"url":"git+https://github.com/CodeForBreakfast/eventsourcing.git","type":"git","directory":"packages/eventsourcing-projections"},"_npmVersion":"11.6.2","description":"Functional event projections and read models with Effect - Transform event streams into queryable views with type-safe, composable projection builders","directories":{},"sideEffects":false,"_nodeVersion":"20.19.5","dependencies":{"type-fest":"5.1.0","@codeforbreakfast/eventsourcing-store":"workspace:*"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"effect":"3.18.4","eslint":"9.38.0","typescript":"5.9.3","@types/node":"24.9.2"},"peerDependencies":{"effect":"^3.17.0"},"_npmOperationalInternal":{"tmp":"tmp/eventsourcing-projections_0.5.12_1762159721854_0.46851002827890076","host":"s3://npm-registry-packages-npm-production"}},"0.5.13":{"name":"@codeforbreakfast/eventsourcing-projections","version":"0.5.13","keywords":["event-sourcing","projections","read-model","cqrs","event-processing","event-streaming","effect","effect-ts","functional-programming","fp","typescript","type-safe","streaming","view-models","query-models","composable","event-handlers"],"author":{"name":"Code for Breakfast"},"license":"MIT","_id":"@codeforbreakfast/eventsourcing-projections@0.5.13","maintainers":[{"name":"graemef","email":"graemef@gmail.com"}],"homepage":"https://github.com/codeforbreakfast/eventsourcing#readme","bugs":{"url":"https://github.com/codeforbreakfast/eventsourcing/issues"},"dist":{"shasum":"8a2fa45942994fe4b898c8e0d0cfa36d7fd2ca8e","tarball":"https://registry.npmjs.org/@codeforbreakfast/eventsourcing-projections/-/eventsourcing-projections-0.5.13.tgz","fileCount":12,"integrity":"sha512-MyT0Ox20baXs91qbVXcT91zrNSAjf2PBUP0T3x8MncQYEekzznz23bpGUkvryOZQ+Z5WGQ0YoP4POi+oK+cSUw==","signatures":[{"sig":"MEYCIQCiHnFcNVMmVT92St+fAGUMZeEXERKKQs9rJ4kYL2K7BQIhAKKNoh2if1534NHa/aDUGxHYsH+iMSdZ9++U+RjQEQmk","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@codeforbreakfast%2feventsourcing-projections@0.5.13","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":39708},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=18.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","default":"./dist/index.js"},"./package.json":"./package.json"},"gitHead":"572968daaa6a79b98fb010df951d5f75bcd7f1c7","scripts":{"lint":"eslint . --ext .ts,.tsx","build":"bun build ./src/index.ts --outdir ./dist --target node --format esm --external effect --external @effect/* --external @codeforbreakfast/* && bun x tsc","clean":"rm -rf dist","typecheck":"tsc --noEmit","validate:docs":"bun ../../scripts/validate-markdown-examples.ts","validate:pack":"bun pm pack --dry-run","publish:package":"npm publish --access public","check:publishable":"npm view $npm_package_name@$npm_package_version version >/dev/null 2>&1 && exit 1 || exit 0"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:13fa57d4-95af-41e8-9b68-bdf796d41fb9"}},"repository":{"url":"git+https://github.com/CodeForBreakfast/eventsourcing.git","type":"git","directory":"packages/eventsourcing-projections"},"_npmVersion":"11.6.2","description":"Functional event projections and read models with Effect - Transform event streams into queryable views with type-safe, composable projection builders","directories":{},"sideEffects":false,"_nodeVersion":"20.19.5","dependencies":{"type-fest":"5.2.0","@codeforbreakfast/eventsourcing-store":"workspace:*"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"effect":"3.18.4","eslint":"9.39.1","typescript":"5.9.3","@types/node":"24.10.0"},"peerDependencies":{"effect":"^3.17.0"},"_npmOperationalInternal":{"tmp":"tmp/eventsourcing-projections_0.5.13_1764059357045_0.10637849504728214","host":"s3://npm-registry-packages-npm-production"}},"0.5.14":{"name":"@codeforbreakfast/eventsourcing-projections","version":"0.5.14","description":"Functional event projections and read models with Effect - Transform event streams into queryable views with type-safe, composable projection builders","type":"module","main":"./dist/index.js","module":"./dist/index.js","types":"./dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","default":"./dist/index.js"},"./package.json":"./package.json"},"scripts":{"build":"bun build ./src/index.ts --outdir ./dist --target node --format esm --external effect --external @effect/* --external @codeforbreakfast/* && bun x tsc","lint":"eslint . --ext .ts,.tsx","typecheck":"tsc --noEmit","clean":"rm -rf dist","publish:package":"npm publish --access public","validate:pack":"bun pm pack --dry-run","check:publishable":"npm view $npm_package_name@$npm_package_version version >/dev/null 2>&1 && exit 1 || exit 0","validate:docs":"bun ../../scripts/validate-markdown-examples.ts"},"keywords":["event-sourcing","projections","read-model","cqrs","event-processing","event-streaming","effect","effect-ts","functional-programming","fp","typescript","type-safe","streaming","view-models","query-models","composable","event-handlers"],"author":{"name":"Code for Breakfast"},"license":"MIT","repository":{"type":"git","url":"git+https://github.com/CodeForBreakfast/eventsourcing.git","directory":"packages/eventsourcing-projections"},"bugs":{"url":"https://github.com/codeforbreakfast/eventsourcing/issues"},"homepage":"https://github.com/codeforbreakfast/eventsourcing#readme","peerDependencies":{"effect":"^3.17.0"},"dependencies":{"@codeforbreakfast/eventsourcing-store":"workspace:*","type-fest":"5.2.0"},"devDependencies":{"@types/node":"24.10.0","effect":"3.19.9","typescript":"5.9.3","eslint":"9.39.1"},"publishConfig":{"access":"public"},"sideEffects":false,"engines":{"node":">=18.0.0"},"gitHead":"dc9291553d278cb59572e9fb1569fe0c01194eea","_id":"@codeforbreakfast/eventsourcing-projections@0.5.14","_nodeVersion":"20.19.6","_npmVersion":"11.6.2","dist":{"integrity":"sha512-+bSvKU3FOhWPQ7CZI0CmVponVYo9Qcxze3R3zZeN703q7VD1gYstaFeOfKgnpxHn1kfv6VduMFCTEocEH9ZF8g==","shasum":"a516ce1a019e71248362f79763e121718b7cc3c3","tarball":"https://registry.npmjs.org/@codeforbreakfast/eventsourcing-projections/-/eventsourcing-projections-0.5.14.tgz","fileCount":12,"unpackedSize":39708,"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@codeforbreakfast%2feventsourcing-projections@0.5.14","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEYCIQDWrRjlek1UsNMAHA/8nLVcDIRpXxdr2V/QftqkgDhkegIhANFjLdRbaSRJMlMt4TOPsGLnhAdQAbIwPjB0KG4b5Lqj"}]},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:13fa57d4-95af-41e8-9b68-bdf796d41fb9"}},"directories":{},"maintainers":[{"name":"graemef","email":"graemef@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/eventsourcing-projections_0.5.14_1765443327393_0.528499827483548"},"_hasShrinkwrap":false}},"time":{"created":"2025-09-21T10:16:54.078Z","modified":"2025-12-11T08:55:27.900Z","0.2.0":"2025-09-21T10:16:54.413Z","0.2.1":"2025-09-21T11:51:44.260Z","0.3.0":"2025-09-21T12:23:01.494Z","0.3.1":"2025-09-21T13:00:56.354Z","0.4.0":"2025-09-21T13:50:58.835Z","0.4.1":"2025-09-21T15:44:34.703Z","0.4.2":"2025-09-21T16:08:48.785Z","0.4.4":"2025-09-21T17:14:20.919Z","0.4.5":"2025-09-21T17:48:41.695Z","0.4.6":"2025-09-24T07:10:45.259Z","0.4.7":"2025-09-24T09:43:17.100Z","0.5.0":"2025-09-28T10:10:32.937Z","0.5.3":"2025-09-28T14:00:14.523Z","0.5.4":"2025-09-29T14:06:06.411Z","0.5.5":"2025-10-05T15:22:34.052Z","0.5.6":"2025-10-05T18:41:52.795Z","0.5.7":"2025-10-07T16:29:10.390Z","0.5.8":"2025-10-12T11:13:47.284Z","0.5.9":"2025-10-14T08:22:58.703Z","0.5.10":"2025-10-18T14:10:34.284Z","0.5.11":"2025-10-26T14:13:24.361Z","0.5.12":"2025-11-03T08:48:42.050Z","0.5.13":"2025-11-25T08:29:17.219Z","0.5.14":"2025-12-11T08:55:27.540Z"},"bugs":{"url":"https://github.com/codeforbreakfast/eventsourcing/issues"},"author":{"name":"Code for Breakfast"},"license":"MIT","homepage":"https://github.com/codeforbreakfast/eventsourcing#readme","keywords":["event-sourcing","projections","read-model","cqrs","event-processing","event-streaming","effect","effect-ts","functional-programming","fp","typescript","type-safe","streaming","view-models","query-models","composable","event-handlers"],"repository":{"type":"git","url":"git+https://github.com/CodeForBreakfast/eventsourcing.git","directory":"packages/eventsourcing-projections"},"description":"Functional event projections and read models with Effect - Transform event streams into queryable views with type-safe, composable projection builders","maintainers":[{"name":"graemef","email":"graemef@gmail.com"}],"readme":"# @codeforbreakfast/eventsourcing-projections\n\nProjection patterns for event sourcing with Effect integration. This package provides powerful abstractions for building read-side projections that transform event streams into optimized query models.\n\n## Installation\n\n```bash\nnpm install @codeforbreakfast/eventsourcing-projections effect\n```\n\n```bash\nbun add @codeforbreakfast/eventsourcing-projections effect\n```\n\n## Key Features\n\n- **Read-Side Projections**: Build optimized query models from event streams\n- **Effect Integration**: Functional, composable projection processing\n- **Type-Safe Event Handling**: Strongly-typed event processing with automatic type inference\n- **Flexible Processing**: Support for both real-time and batch projection updates\n- **Error Recovery**: Built-in error handling and retry mechanisms\n- **Performance Optimized**: Efficient stream processing with backpressure handling\n\n## Quick Start\n\n```typescript\nimport { Context, Effect, Option, ParseResult, pipe } from 'effect';\nimport {\n  loadProjection,\n  MissingProjectionError,\n  Projection,\n  ProjectionEventStore,\n} from '@codeforbreakfast/eventsourcing-projections';\n\ninterface UserRegistered {\n  type: 'UserRegistered';\n  userId: string;\n  email: string;\n  timestamp: string;\n}\n\ninterface UserEmailUpdated {\n  type: 'UserEmailUpdated';\n  userId: string;\n  oldEmail: string;\n  newEmail: string;\n  timestamp: string;\n}\n\ntype UserEvent = UserRegistered | UserEmailUpdated;\n\ninterface UserProfile {\n  userId: string;\n  email: string;\n  lastUpdated: string;\n  registrationDate: string;\n}\n\nconst applyUserEvent =\n  (currentData: Option.Option<UserProfile>) =>\n  (\n    event: UserEvent\n  ): Effect.Effect<UserProfile, ParseResult.ParseError | MissingProjectionError> => {\n    switch (event.type) {\n      case 'UserRegistered':\n        return Effect.succeed({\n          userId: event.userId,\n          email: event.email,\n          lastUpdated: event.timestamp,\n          registrationDate: event.timestamp,\n        });\n\n      case 'UserEmailUpdated':\n        return pipe(\n          currentData,\n          Option.match({\n            onNone: () =>\n              Effect.fail(\n                new MissingProjectionError({\n                  message: `User ${event.userId} not found for email update`,\n                })\n              ),\n            onSome: (profile) =>\n              Effect.succeed({\n                ...profile,\n                email: event.newEmail,\n                lastUpdated: event.timestamp,\n              }),\n          })\n        );\n\n      default:\n        return pipe(\n          currentData,\n          Option.match({\n            onNone: () =>\n              Effect.fail(\n                new MissingProjectionError({\n                  message: 'Cannot process unknown event on empty projection',\n                })\n              ),\n            onSome: (profile) => Effect.succeed(profile),\n          })\n        );\n    }\n  };\n\nconst UserEventStoreTag = Context.GenericTag<ProjectionEventStore<UserEvent>>(\n  '@services/UserEventStore'\n);\n\nconst loadUserProfile = loadProjection(UserEventStoreTag, applyUserEvent);\n\nconst program = pipe(\n  loadUserProfile('user-123'),\n  Effect.tap((userProjection) =>\n    pipe(\n      Effect.logInfo(`User profile: ${JSON.stringify(userProjection.data)}`),\n      Effect.flatMap(() => Effect.logInfo(`Next event number: ${userProjection.nextEventNumber}`))\n    )\n  )\n);\n```\n\n## Core Concepts\n\n### Projection Interface\n\n```typescript\nimport { Option } from 'effect';\nimport { EventNumber } from '@codeforbreakfast/eventsourcing-projections';\n\ninterface Projection<TData> {\n  readonly nextEventNumber: EventNumber;\n  readonly data: Option.Option<TData>;\n}\n```\n\nThe projection tracks both the data and the position in the event stream, enabling incremental updates.\n\n### Loading Projections\n\nThe `loadProjection` function reconstructs projection state from events:\n\n```typescript\nimport { Context, Effect, Option, ParseResult, pipe } from 'effect';\nimport {\n  loadProjection,\n  MissingProjectionError,\n  ProjectionEventStore,\n} from '@codeforbreakfast/eventsourcing-projections';\n\ninterface MyEvent {\n  type: string;\n}\n\ninterface MyData {\n  value: string;\n}\n\nconst applyEventToProjection =\n  (data: Option.Option<MyData>) =>\n  (event: MyEvent): Effect.Effect<MyData, ParseResult.ParseError | MissingProjectionError> =>\n    Effect.succeed({ value: 'example' });\n\nconst MyEventStoreTag = Context.GenericTag<ProjectionEventStore<MyEvent>>('@services/MyEventStore');\n\nconst loadMyProjection = loadProjection(MyEventStoreTag, applyEventToProjection);\n\nconst loadSpecificProjection = pipe(\n  loadMyProjection('projection-id'),\n  Effect.map((projection) => projection)\n);\n```\n\n## Advanced Projection Patterns\n\n### Multi-Event Type Projections\n\nHandle multiple related event types in a single projection:\n\n```typescript\nimport { Effect, Option, ParseResult, pipe } from 'effect';\nimport { MissingProjectionError } from '@codeforbreakfast/eventsourcing-projections';\n\ninterface OrderCreated {\n  type: 'OrderCreated';\n  orderId: string;\n  totalAmount: number;\n}\n\ninterface OrderShipped {\n  type: 'OrderShipped';\n  orderId: string;\n  timestamp: string;\n}\n\ninterface OrderCancelled {\n  type: 'OrderCancelled';\n  orderId: string;\n}\n\ninterface PaymentProcessed {\n  type: 'PaymentProcessed';\n  orderId: string;\n}\n\ninterface PaymentFailed {\n  type: 'PaymentFailed';\n  orderId: string;\n}\n\ninterface PaymentRefunded {\n  type: 'PaymentRefunded';\n  orderId: string;\n}\n\ntype OrderEvent = OrderCreated | OrderShipped | OrderCancelled;\ntype PaymentEvent = PaymentProcessed | PaymentFailed | PaymentRefunded;\ntype AllEvents = OrderEvent | PaymentEvent;\n\ninterface OrderSummary {\n  orderId: string;\n  status: 'pending' | 'shipped' | 'cancelled';\n  paymentStatus: 'pending' | 'paid' | 'failed' | 'refunded';\n  totalAmount: number;\n  shippedDate?: string;\n}\n\nconst applyOrderSummaryEvent =\n  (current: Option.Option<OrderSummary>) =>\n  (\n    event: AllEvents\n  ): Effect.Effect<OrderSummary, ParseResult.ParseError | MissingProjectionError> => {\n    switch (event.type) {\n      case 'OrderCreated':\n        return Effect.succeed({\n          orderId: event.orderId,\n          status: 'pending' as const,\n          paymentStatus: 'pending' as const,\n          totalAmount: event.totalAmount,\n        });\n\n      case 'OrderShipped':\n        return pipe(\n          current,\n          Option.match({\n            onNone: () => Effect.fail(new MissingProjectionError({ message: 'Order not found' })),\n            onSome: (summary) =>\n              Effect.succeed({\n                ...summary,\n                status: 'shipped' as const,\n                shippedDate: event.timestamp,\n              }),\n          })\n        );\n\n      case 'PaymentProcessed':\n        return pipe(\n          current,\n          Option.match({\n            onNone: () => Effect.fail(new MissingProjectionError({ message: 'Order not found' })),\n            onSome: (summary) =>\n              Effect.succeed({\n                ...summary,\n                paymentStatus: 'paid' as const,\n              }),\n          })\n        );\n\n      case 'OrderCancelled':\n        return pipe(\n          current,\n          Option.match({\n            onNone: () => Effect.fail(new MissingProjectionError({ message: 'Order not found' })),\n            onSome: (summary) =>\n              Effect.succeed({\n                ...summary,\n                status: 'cancelled' as const,\n              }),\n          })\n        );\n\n      case 'PaymentFailed':\n        return pipe(\n          current,\n          Option.match({\n            onNone: () => Effect.fail(new MissingProjectionError({ message: 'Order not found' })),\n            onSome: (summary) =>\n              Effect.succeed({\n                ...summary,\n                paymentStatus: 'failed' as const,\n              }),\n          })\n        );\n\n      case 'PaymentRefunded':\n        return pipe(\n          current,\n          Option.match({\n            onNone: () => Effect.fail(new MissingProjectionError({ message: 'Order not found' })),\n            onSome: (summary) =>\n              Effect.succeed({\n                ...summary,\n                paymentStatus: 'refunded' as const,\n              }),\n          })\n        );\n    }\n  };\n```\n\n### Projection with Validation\n\nAdd Schema validation to ensure data integrity:\n\n```typescript\nimport { Effect, Option, ParseResult, Schema, pipe } from 'effect';\nimport { MissingProjectionError } from '@codeforbreakfast/eventsourcing-projections';\n\ninterface UserProfile {\n  userId: string;\n  email: string;\n  lastUpdated: string;\n  registrationDate: string;\n}\n\ninterface UserEvent {\n  type: string;\n  userId: string;\n}\n\nconst UserProfileSchema = Schema.Struct({\n  userId: Schema.String,\n  email: Schema.String.pipe(Schema.pattern(/^[^@]+@[^@]+$/)),\n  lastUpdated: Schema.String,\n  registrationDate: Schema.String,\n});\n\nconst applyUserEvent =\n  (current: Option.Option<UserProfile>) =>\n  (event: UserEvent): Effect.Effect<UserProfile, ParseResult.ParseError | MissingProjectionError> =>\n    Effect.succeed({\n      userId: 'user-1',\n      email: 'test@example.com',\n      lastUpdated: '2024-01-01',\n      registrationDate: '2024-01-01',\n    });\n\nconst applyValidatedUserEvent =\n  (current: Option.Option<UserProfile>) =>\n  (event: UserEvent): Effect.Effect<UserProfile, ParseResult.ParseError | MissingProjectionError> =>\n    pipe(applyUserEvent(current)(event), Effect.flatMap(Schema.decode(UserProfileSchema)));\n```\n\n### Conditional Projection Updates\n\nOnly update projections based on certain conditions:\n\n```typescript\nimport { Effect, Option, ParseResult, pipe } from 'effect';\nimport { MissingProjectionError } from '@codeforbreakfast/eventsourcing-projections';\n\ninterface UserProfile {\n  userId: string;\n  email: string;\n  isActive: boolean;\n}\n\ninterface UserEvent {\n  type: string;\n  userId: string;\n}\n\nconst applyUserEvent =\n  (current: Option.Option<UserProfile>) =>\n  (event: UserEvent): Effect.Effect<UserProfile, ParseResult.ParseError | MissingProjectionError> =>\n    Effect.succeed({ userId: 'user-1', email: 'test@example.com', isActive: true });\n\nconst applyConditionalEvent =\n  (current: Option.Option<UserProfile>) =>\n  (\n    event: UserEvent\n  ): Effect.Effect<UserProfile, ParseResult.ParseError | MissingProjectionError> => {\n    if (\n      pipe(\n        current,\n        Option.exists((profile) => !profile.isActive)\n      )\n    ) {\n      return pipe(\n        current,\n        Option.match({\n          onNone: () => Effect.fail(new MissingProjectionError({ message: 'No current state' })),\n          onSome: (profile) => Effect.succeed(profile),\n        })\n      );\n    }\n\n    return applyUserEvent(current)(event);\n  };\n```\n\n## Real-Time Projection Updates\n\nProcess events as they arrive:\n\n```typescript\nimport { Context, Effect, Option, ParseResult, Schema, Stream, pipe } from 'effect';\nimport {\n  EventNumber,\n  MissingProjectionError,\n  Projection,\n  ProjectionEventStore,\n  loadProjection,\n} from '@codeforbreakfast/eventsourcing-projections';\n\ninterface UserEvent {\n  type: string;\n  userId: string;\n}\n\ninterface UserProfile {\n  userId: string;\n  email: string;\n}\n\nconst applyUserEvent =\n  (data: Option.Option<UserProfile>) =>\n  (event: UserEvent): Effect.Effect<UserProfile, ParseResult.ParseError | MissingProjectionError> =>\n    Effect.succeed({ userId: event.userId, email: 'test@example.com' });\n\nconst UserEventStoreTag = Context.GenericTag<ProjectionEventStore<UserEvent>>(\n  '@services/UserEventStore'\n);\n\nconst loadUserProfile = loadProjection(UserEventStoreTag, applyUserEvent);\n\nconst saveProjection = (id: string, projection: Projection<UserProfile>): Effect.Effect<void> =>\n  Effect.void;\n\nconst processEventStream = (eventStream: Stream.Stream<UserEvent, never>) =>\n  pipe(\n    eventStream,\n    Stream.runForEach((event: UserEvent) =>\n      pipe(\n        loadUserProfile(event.userId),\n        Effect.flatMap((projection) =>\n          pipe(\n            applyUserEvent(projection.data)(event),\n            Effect.flatMap((updatedData) =>\n              pipe(\n                projection.nextEventNumber + 1,\n                Schema.decode(EventNumber),\n                Effect.flatMap((nextEventNumber) =>\n                  saveProjection(event.userId, {\n                    nextEventNumber,\n                    data: Option.some(updatedData),\n                  })\n                )\n              )\n            )\n          )\n        )\n      )\n    )\n  );\n```\n\n## Batch Projection Rebuilding\n\nRebuild projections from historical events:\n\n```typescript\nimport { Context, Effect, Option, ParseResult, pipe } from 'effect';\nimport {\n  MissingProjectionError,\n  Projection,\n  ProjectionEventStore,\n  loadProjection,\n} from '@codeforbreakfast/eventsourcing-projections';\n\ninterface UserEvent {\n  type: string;\n  userId: string;\n}\n\ninterface UserProfile {\n  userId: string;\n  email: string;\n}\n\nconst applyUserEvent =\n  (data: Option.Option<UserProfile>) =>\n  (event: UserEvent): Effect.Effect<UserProfile, ParseResult.ParseError | MissingProjectionError> =>\n    Effect.succeed({ userId: event.userId, email: 'test@example.com' });\n\nconst UserEventStoreTag = Context.GenericTag<ProjectionEventStore<UserEvent>>(\n  '@services/UserEventStore'\n);\n\nconst loadUserProfile = loadProjection(UserEventStoreTag, applyUserEvent);\n\nconst saveProjection = (id: string, projection: Projection<UserProfile>): Effect.Effect<void> =>\n  Effect.void;\n\nconst rebuildUserProjections = (userIds: readonly string[]) =>\n  Effect.forEach(\n    userIds,\n    (userId) =>\n      pipe(\n        Effect.logInfo(`Rebuilding projection for user ${userId}`),\n        Effect.flatMap(() => loadUserProfile(userId)),\n        Effect.flatMap((projection) => saveProjection(userId, projection)),\n        Effect.flatMap(() => Effect.logInfo(`Completed rebuild for user ${userId}`))\n      ),\n    { concurrency: 10 }\n  );\n```\n\n## Error Handling and Recovery\n\nHandle projection errors gracefully:\n\n```typescript\nimport { Context, Data, Effect, Option, ParseResult, pipe } from 'effect';\nimport {\n  MissingProjectionError,\n  ProjectionEventStore,\n  loadProjection,\n} from '@codeforbreakfast/eventsourcing-projections';\n\ninterface UserEvent {\n  type: string;\n  userId: string;\n}\n\ninterface UserProfile {\n  userId: string;\n  email: string;\n}\n\nclass ProjectionError extends Data.TaggedError('ProjectionError')<{\n  projectionId: string;\n  eventType: string;\n  message: string;\n}> {}\n\nconst applyUserEvent =\n  (data: Option.Option<UserProfile>) =>\n  (event: UserEvent): Effect.Effect<UserProfile, ParseResult.ParseError | MissingProjectionError> =>\n    Effect.succeed({ userId: event.userId, email: 'test@example.com' });\n\nconst UserEventStoreTag = Context.GenericTag<ProjectionEventStore<UserEvent>>(\n  '@services/UserEventStore'\n);\n\nconst loadUserProfile = loadProjection(UserEventStoreTag, applyUserEvent);\n\nconst resilientProjectionUpdate = (projectionId: string, event: UserEvent) =>\n  pipe(\n    loadUserProfile(projectionId),\n    Effect.flatMap((projection) => applyUserEvent(projection.data)(event)),\n    Effect.map(Option.some),\n    Effect.catchAll((error) =>\n      pipe(\n        Effect.logError(`Projection update failed: ${String(error)}`),\n        Effect.flatMap(() => {\n          const errorMessage =\n            error instanceof MissingProjectionError ? error.message : String(error);\n          if (errorMessage.includes('not found')) {\n            return pipe(\n              Effect.logWarning(`Skipping event for missing projection ${projectionId}`),\n              Effect.map(() => Option.none<UserProfile>())\n            );\n          }\n\n          return Effect.fail(\n            new ProjectionError({\n              projectionId,\n              eventType: event.type,\n              message: errorMessage,\n            })\n          );\n        })\n      )\n    )\n  );\n```\n\n## Testing Projections\n\nTest projection logic in isolation:\n\n```typescript\nimport { Effect, Option, ParseResult, pipe } from 'effect';\nimport { MissingProjectionError } from '@codeforbreakfast/eventsourcing-projections';\n\ninterface UserRegistered {\n  type: 'UserRegistered';\n  userId: string;\n  email: string;\n  timestamp: string;\n}\n\ninterface UserEmailUpdated {\n  type: 'UserEmailUpdated';\n  userId: string;\n  oldEmail: string;\n  newEmail: string;\n  timestamp: string;\n}\n\ntype UserEvent = UserRegistered | UserEmailUpdated;\n\ninterface UserProfile {\n  userId: string;\n  email: string;\n  lastUpdated: string;\n  registrationDate: string;\n}\n\nconst applyUserEvent =\n  (currentData: Option.Option<UserProfile>) =>\n  (\n    event: UserEvent\n  ): Effect.Effect<UserProfile, ParseResult.ParseError | MissingProjectionError> => {\n    switch (event.type) {\n      case 'UserRegistered':\n        return Effect.succeed({\n          userId: event.userId,\n          email: event.email,\n          lastUpdated: event.timestamp,\n          registrationDate: event.timestamp,\n        });\n\n      case 'UserEmailUpdated':\n        return pipe(\n          currentData,\n          Option.match({\n            onNone: () =>\n              Effect.fail(\n                new MissingProjectionError({ message: `User ${event.userId} not found` })\n              ),\n            onSome: (profile) =>\n              Effect.succeed({\n                ...profile,\n                email: event.newEmail,\n                lastUpdated: event.timestamp,\n              }),\n          })\n        );\n    }\n  };\n\ndeclare const describe: (name: string, fn: () => void) => void;\ndeclare const test: (name: string, fn: () => void) => void;\ndeclare const expect: (value: unknown) => { toBe: (expected: unknown) => void };\n\ndescribe('User Profile Projection', () => {\n  test('should create profile on UserRegistered', () => {\n    const event: UserRegistered = {\n      type: 'UserRegistered',\n      userId: 'user-123',\n      email: 'test@example.com',\n      timestamp: '2023-01-01T00:00:00Z',\n    };\n\n    const result = Effect.runSync(applyUserEvent(Option.none())(event));\n\n    expect(result.userId).toBe('user-123');\n    expect(result.email).toBe('test@example.com');\n    expect(result.registrationDate).toBe('2023-01-01T00:00:00Z');\n  });\n\n  test('should update email on UserEmailUpdated', () => {\n    const existingProfile: UserProfile = {\n      userId: 'user-123',\n      email: 'old@example.com',\n      lastUpdated: '2023-01-01T00:00:00Z',\n      registrationDate: '2023-01-01T00:00:00Z',\n    };\n\n    const event: UserEmailUpdated = {\n      type: 'UserEmailUpdated',\n      userId: 'user-123',\n      oldEmail: 'old@example.com',\n      newEmail: 'new@example.com',\n      timestamp: '2023-01-02T00:00:00Z',\n    };\n\n    const result = Effect.runSync(applyUserEvent(Option.some(existingProfile))(event));\n\n    expect(result.email).toBe('new@example.com');\n    expect(result.lastUpdated).toBe('2023-01-02T00:00:00Z');\n  });\n});\n```\n\n## Performance Considerations\n\n### Optimize for Read Patterns\n\nDesign projections based on your query patterns:\n\n```typescript\nimport { Context, Effect, Option, ParseResult } from 'effect';\nimport {\n  MissingProjectionError,\n  ProjectionEventStore,\n  loadProjection,\n} from '@codeforbreakfast/eventsourcing-projections';\n\ninterface UserEvent {\n  type: string;\n  userId: string;\n  email?: string;\n  loginDate?: string;\n}\n\ninterface UserEmailLookup {\n  userId: string;\n  email: string;\n}\n\ninterface UserActivitySummary {\n  userId: string;\n  lastLoginDate: string;\n  loginCount: number;\n  isActive: boolean;\n}\n\nconst applyEmailEvents =\n  (data: Option.Option<UserEmailLookup>) =>\n  (\n    event: UserEvent\n  ): Effect.Effect<UserEmailLookup, ParseResult.ParseError | MissingProjectionError> =>\n    Effect.succeed({ userId: event.userId, email: event.email ?? 'unknown@example.com' });\n\nconst applyActivityEvents =\n  (data: Option.Option<UserActivitySummary>) =>\n  (\n    event: UserEvent\n  ): Effect.Effect<UserActivitySummary, ParseResult.ParseError | MissingProjectionError> =>\n    Effect.succeed({\n      userId: event.userId,\n      lastLoginDate: event.loginDate ?? '2024-01-01',\n      loginCount: 1,\n      isActive: true,\n    });\n\nconst UserEmailEventStoreTag = Context.GenericTag<ProjectionEventStore<UserEvent>>(\n  '@services/UserEmailEventStore'\n);\nconst UserActivityEventStoreTag = Context.GenericTag<ProjectionEventStore<UserEvent>>(\n  '@services/UserActivityEventStore'\n);\n\nconst loadUserEmail = loadProjection(UserEmailEventStoreTag, applyEmailEvents);\nconst loadUserActivity = loadProjection(UserActivityEventStoreTag, applyActivityEvents);\n```\n\n### Batch Processing\n\nProcess multiple events efficiently:\n\n```typescript\nimport { Array, Context, Effect, Option, ParseResult, Schema, pipe } from 'effect';\nimport {\n  EventNumber,\n  MissingProjectionError,\n  Projection,\n  ProjectionEventStore,\n  loadProjection,\n} from '@codeforbreakfast/eventsourcing-projections';\n\ninterface UserEvent {\n  type: string;\n  userId: string;\n}\n\ninterface UserProfile {\n  userId: string;\n  email: string;\n}\n\nconst applyUserEvent =\n  (data: Option.Option<UserProfile>) =>\n  (event: UserEvent): Effect.Effect<UserProfile, ParseResult.ParseError | MissingProjectionError> =>\n    Effect.succeed({ userId: event.userId, email: 'test@example.com' });\n\nconst UserEventStoreTag = Context.GenericTag<ProjectionEventStore<UserEvent>>(\n  '@services/UserEventStore'\n);\n\nconst loadUserProfile = loadProjection(UserEventStoreTag, applyUserEvent);\n\nconst saveProjection = (id: string, projection: Projection<UserProfile>): Effect.Effect<void> =>\n  Effect.void;\n\nconst groupBy = <T>(items: readonly T[], keyFn: (item: T) => string): Record<string, T[]> =>\n  items.reduce(\n    (acc, item) => {\n      const key = keyFn(item);\n      return { ...acc, [key]: [...(acc[key] ?? []), item] };\n    },\n    {} as Record<string, T[]>\n  );\n\nconst applyEventsToProjection = (\n  projection: Projection<UserProfile>,\n  events: readonly UserEvent[]\n): Effect.Effect<Projection<UserProfile>, ParseResult.ParseError | MissingProjectionError> => {\n  const applyEvent = (\n    currentProjection: Projection<UserProfile>,\n    event: UserEvent\n  ): Effect.Effect<Projection<UserProfile>, ParseResult.ParseError | MissingProjectionError> =>\n    pipe(\n      applyUserEvent(currentProjection.data)(event),\n      Effect.flatMap((updatedData) =>\n        pipe(\n          currentProjection.nextEventNumber + 1,\n          Schema.decode(EventNumber),\n          Effect.map(\n            (nextEventNumber): Projection<UserProfile> => ({\n              nextEventNumber,\n              data: Option.some(updatedData),\n            })\n          )\n        )\n      )\n    );\n\n  return pipe(\n    events,\n    Array.reduce(\n      Effect.succeed(projection) as Effect.Effect<\n        Projection<UserProfile>,\n        ParseResult.ParseError | MissingProjectionError\n      >,\n      (accEffect, event) =>\n        pipe(\n          accEffect,\n          Effect.flatMap((proj) => applyEvent(proj, event))\n        )\n    )\n  );\n};\n\nconst batchUpdateProjections = (events: readonly UserEvent[]) =>\n  pipe(\n    groupBy(events, (event) => event.userId),\n    Object.entries,\n    Effect.forEach(\n      ([userId, userEvents]) =>\n        pipe(\n          loadUserProfile(userId),\n          Effect.flatMap((initialProjection) =>\n            pipe(\n              applyEventsToProjection(initialProjection, userEvents),\n              Effect.flatMap((finalProjection) => saveProjection(userId, finalProjection))\n            )\n          )\n        ),\n      { concurrency: 5 }\n    )\n  );\n```\n\n## Integration with Event Store\n\nThis package works with the event store implementations:\n\n```typescript\nimport { Context, Effect, Layer, Option, ParseResult, pipe } from 'effect';\nimport {\n  MissingProjectionError,\n  ProjectionEventStore,\n  loadProjection,\n} from '@codeforbreakfast/eventsourcing-projections';\n\ninterface UserEvent {\n  type: string;\n  userId: string;\n}\n\ninterface UserProfile {\n  userId: string;\n  email: string;\n}\n\nconst applyUserEvent =\n  (data: Option.Option<UserProfile>) =>\n  (event: UserEvent): Effect.Effect<UserProfile, ParseResult.ParseError | MissingProjectionError> =>\n    Effect.succeed({ userId: event.userId, email: 'test@example.com' });\n\nconst UserEventStoreTag = Context.GenericTag<ProjectionEventStore<UserEvent>>(\n  '@services/UserEventStore'\n);\n\nconst loadUserProfile = loadProjection(UserEventStoreTag, applyUserEvent);\n\ndeclare const inMemoryEventStore: <TEvent>() => Layer.Layer<ProjectionEventStore<TEvent>>;\ndeclare const postgresEventStore: <TEvent>() => Layer.Layer<ProjectionEventStore<TEvent>>;\n\nconst testLayer = inMemoryEventStore<UserEvent>();\nconst prodLayer = postgresEventStore<UserEvent>();\n\nconst projection = loadUserProfile('user-123');\n\nconst runProjections = pipe(projection, Effect.provide(testLayer));\n```\n\n## Related Packages\n\n- **[@codeforbreakfast/eventsourcing-store](../eventsourcing-store)** - Core event store interfaces\n- **[@codeforbreakfast/eventsourcing-store-postgres](../eventsourcing-store-postgres)** - PostgreSQL implementation\n- **[@codeforbreakfast/eventsourcing-aggregates](../eventsourcing-aggregates)** - Write-side aggregate patterns\n- **[@codeforbreakfast/eventsourcing-websocket-transport](../eventsourcing-websocket-transport)** - Real-time event streaming\n\n## API Reference\n\nFor detailed API documentation, see the [TypeScript definitions](./src/index.ts) included with this package.\n\n## Contributing\n\nThis package is part of the [@codeforbreakfast/eventsourcing](https://github.com/codeforbreakfast/eventsourcing) monorepo. Please see the main repository for contributing guidelines.\n\n## License\n\nMIT\n","readmeFilename":"README.md"}