{"_id":"@emmett-community/emmett-google-realtime-db","_rev":"7-68d7fb025cbe6183af3e771cae05b3b5","name":"@emmett-community/emmett-google-realtime-db","dist-tags":{"latest":"0.7.0"},"versions":{"0.1.0":{"name":"@emmett-community/emmett-google-realtime-db","version":"0.1.0","keywords":["emmett","event-sourcing","projections","realtime-database","google-realtime-database","firebase","cqrs","event-driven","ddd"],"author":{"name":"Andre X Costa"},"license":"MIT","_id":"@emmett-community/emmett-google-realtime-db@0.1.0","maintainers":[{"name":"axcosta","email":"axcosta@gmail.com"}],"homepage":"https://github.com/emmett-community/emmett-google-realtime-db#readme","bugs":{"url":"https://github.com/emmett-community/emmett-google-realtime-db/issues"},"dist":{"shasum":"e22ba1c55bf4d14dbf6e4d818ff657dfe9fac905","tarball":"https://registry.npmjs.org/@emmett-community/emmett-google-realtime-db/-/emmett-google-realtime-db-0.1.0.tgz","fileCount":17,"integrity":"sha512-G0V4cWrZ9ysku+mXZLJfYMzzJMsbw1wLjlwYRqr29/l/ZEpIZHiW2aXQTGCHXnAgEEjsOhdxjWSeqSTL9NQAFw==","signatures":[{"sig":"MEUCIFnlAmfvBJaMB5VPjsCgjQ7pOUfJLn1iXfXf/7KYzhoOAiEA3vGBGcEYy0uRuqhtQItmkWtg9Iq3LWwJd0eZyVxM3gc=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":75862},"main":"./dist/index.js","types":"./dist/index.d.ts","module":"./dist/index.mjs","engines":{"node":">=18.0.0"},"exports":{".":{"import":{"types":"./dist/index.d.mts","default":"./dist/index.mjs"},"require":{"types":"./dist/index.d.ts","default":"./dist/index.js"}},"./testing":{"import":{"types":"./dist/testing/index.d.mts","default":"./dist/testing/index.mjs"},"require":{"types":"./dist/testing/index.d.ts","default":"./dist/testing/index.js"}}},"gitHead":"bdf3e76b434288cbbaae324355055b1958eeef8d","scripts":{"lint":"eslint . --ext .ts","test":"jest","build":"tsup","clean":"rm -rf dist","format":"prettier --write \"src/**/*.ts\" \"test/**/*.ts\"","build:ts":"tsc --noEmit","lint:fix":"eslint . --ext .ts --fix","test:e2e":"jest test/e2e","test:unit":"jest test/unit","typecheck":"tsc --noEmit","test:watch":"jest --watch","format:check":"prettier --check \"src/**/*.ts\" \"test/**/*.ts\"","test:coverage":"jest --coverage","prepublishOnly":"npm run clean && npm run build","test:integration":"jest test/integration"},"_npmUser":{"name":"axcosta","email":"axcosta@gmail.com"},"repository":{"url":"git+https://github.com/emmett-community/emmett-google-realtime-db.git","type":"git"},"_npmVersion":"11.1.0","description":"Google Realtime Database inline projections for Emmett","directories":{},"_nodeVersion":"22.11.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.7.0","tsup":"^8.3.5","eslint":"^9.16.0","ts-jest":"^29.2.5","ts-node":"^10.9.2","prettier":"^3.4.2","typescript":"^5.7.2","@types/jest":"^29.5.14","@types/node":"^22.10.1","firebase-admin":"^12.7.0","eslint-config-prettier":"^9.1.0","eslint-plugin-prettier":"^5.2.1","@event-driven-io/emmett":"^0.39.1","@typescript-eslint/parser":"^8.17.0","@typescript-eslint/eslint-plugin":"^8.17.0"},"peerDependencies":{"firebase-admin":"^12.0.0","@event-driven-io/emmett":"^0.39.0"},"_npmOperationalInternal":{"tmp":"tmp/emmett-google-realtime-db_0.1.0_1765743634952_0.8892678961986562","host":"s3://npm-registry-packages-npm-production"}},"0.2.0":{"name":"@emmett-community/emmett-google-realtime-db","version":"0.2.0","keywords":["emmett","event-sourcing","projections","realtime-database","google-realtime-database","firebase","cqrs","event-driven","ddd"],"author":{"name":"Andre X Costa"},"license":"MIT","_id":"@emmett-community/emmett-google-realtime-db@0.2.0","maintainers":[{"name":"axcosta","email":"axcosta@gmail.com"}],"homepage":"https://github.com/emmett-community/emmett-google-realtime-db#readme","bugs":{"url":"https://github.com/emmett-community/emmett-google-realtime-db/issues"},"dist":{"shasum":"8a2899fdc8380d328c9bc16c77c94c30bb1c6a40","tarball":"https://registry.npmjs.org/@emmett-community/emmett-google-realtime-db/-/emmett-google-realtime-db-0.2.0.tgz","fileCount":17,"integrity":"sha512-gVdyN2kAA2scqpcvnnbfEJvOPXT3xFS4lTXF11HepOShmyYuUj4cEAPFjTan+fwrY6Pu/3GgJ8+OSueQxBJJBA==","signatures":[{"sig":"MEUCIDdGsYQvf3I8nJWWDon0hiSRIehXjw142Y2BvmKsVcWUAiEAnJkU6+A5W/Fzv9kLptFGqTfh/szs8cXLokAMop0gQgY=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@emmett-community%2femmett-google-realtime-db@0.2.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":66215},"main":"./dist/index.js","types":"./dist/index.d.ts","module":"./dist/index.mjs","engines":{"node":">=18.0.0"},"exports":{".":{"import":{"types":"./dist/index.d.mts","default":"./dist/index.mjs"},"require":{"types":"./dist/index.d.ts","default":"./dist/index.js"}},"./testing":{"import":{"types":"./dist/testing/index.d.mts","default":"./dist/testing/index.mjs"},"require":{"types":"./dist/testing/index.d.ts","default":"./dist/testing/index.js"}}},"gitHead":"1840a6ad6ae1d3e79a1448f0c917335710913824","scripts":{"lint":"eslint . --ext .ts","test":"npm run test:unit && npm run test:int && npm run test:e2e","build":"tsup","clean":"rm -rf dist","format":"prettier --write \"src/**/*.ts\" \"test/**/*.ts\"","build:ts":"tsc --noEmit","lint:fix":"eslint . --ext .ts --fix","test:e2e":"jest --testMatch \"**/*.e2e.spec.ts\" --watchman=false","test:int":"jest --testMatch \"**/*.int.spec.ts\" --watchman=false","test:unit":"jest --testMatch \"**/*.unit.spec.ts\" --watchman=false","typecheck":"tsc --noEmit","test:watch":"jest --watch --watchman=false","format:check":"prettier --check \"src/**/*.ts\" \"test/**/*.ts\"","test:coverage":"jest --coverage --watchman=false","prepublishOnly":"npm run clean && npm run build","test:integration":"npm run test:int"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:712fdc66-621c-456d-9fc7-7ddd95923d26"}},"repository":{"url":"git+https://github.com/emmett-community/emmett-google-realtime-db.git","type":"git"},"_npmVersion":"11.6.2","description":"Google Realtime Database inline projections for Emmett","directories":{},"_nodeVersion":"24.12.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.7.0","tsup":"^8.3.5","eslint":"^9.16.0","ts-jest":"^29.2.5","ts-node":"^10.9.2","prettier":"^3.4.2","typescript":"^5.7.2","@types/jest":"^29.5.14","@types/node":"^22.10.1","firebase-admin":"^12.7.0","testcontainers":"^10.28.0","eslint-config-prettier":"^9.1.0","eslint-plugin-prettier":"^5.2.1","@event-driven-io/emmett":"^0.39.1","@typescript-eslint/parser":"^8.17.0","@typescript-eslint/eslint-plugin":"^8.17.0"},"peerDependencies":{"firebase-admin":"^12.0.0","@event-driven-io/emmett":"^0.39.0"},"_npmOperationalInternal":{"tmp":"tmp/emmett-google-realtime-db_0.2.0_1766848840303_0.8899900767355895","host":"s3://npm-registry-packages-npm-production"}},"0.3.0":{"name":"@emmett-community/emmett-google-realtime-db","version":"0.3.0","keywords":["emmett","event-sourcing","projections","realtime-database","google-realtime-database","firebase","cqrs","event-driven","ddd"],"author":{"name":"Andre X Costa"},"license":"MIT","_id":"@emmett-community/emmett-google-realtime-db@0.3.0","maintainers":[{"name":"axcosta","email":"axcosta@gmail.com"}],"homepage":"https://github.com/emmett-community/emmett-google-realtime-db#readme","bugs":{"url":"https://github.com/emmett-community/emmett-google-realtime-db/issues"},"dist":{"shasum":"98c43a51f07587995a865281f202b02845d67e92","tarball":"https://registry.npmjs.org/@emmett-community/emmett-google-realtime-db/-/emmett-google-realtime-db-0.3.0.tgz","fileCount":17,"integrity":"sha512-tzn0csyY9erj75hZI3sRqD9T38TssPbOdftNca5gKpW/OdNMASPL+OhwJ33Ly/sRips2+pQUGriUTlP6Vf+OYA==","signatures":[{"sig":"MEUCIQCCHUtiHXacCJ3tQRUpSSkshtDFGlTzUUZ9RuEBktJ6hAIgV+iSobqKwSRFu8zkRHYmj/kXC9uqaQaDoErvTusoMGo=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@emmett-community%2femmett-google-realtime-db@0.3.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":97206},"main":"./dist/index.js","types":"./dist/index.d.ts","module":"./dist/index.mjs","engines":{"node":">=18.0.0"},"exports":{".":{"import":{"types":"./dist/index.d.mts","default":"./dist/index.mjs"},"require":{"types":"./dist/index.d.ts","default":"./dist/index.js"}},"./testing":{"import":{"types":"./dist/testing/index.d.mts","default":"./dist/testing/index.mjs"},"require":{"types":"./dist/testing/index.d.ts","default":"./dist/testing/index.js"}}},"gitHead":"346bb8f7e472bf57c97e022d9a9245a8dcdf1de6","scripts":{"lint":"eslint . --ext .ts","test":"npm run test:unit && npm run test:int && npm run test:e2e","build":"tsup","clean":"rm -rf dist","format":"prettier --write \"src/**/*.ts\" \"test/**/*.ts\"","build:ts":"tsc --noEmit","lint:fix":"eslint . --ext .ts --fix","test:e2e":"jest --testMatch \"**/*.e2e.spec.ts\" --watchman=false","test:int":"jest --testMatch \"**/*.int.spec.ts\" --watchman=false","test:unit":"jest --testMatch \"**/*.unit.spec.ts\" --watchman=false","typecheck":"tsc --noEmit","test:watch":"jest --watch --watchman=false","format:check":"prettier --check \"src/**/*.ts\" \"test/**/*.ts\"","test:coverage":"jest --coverage --watchman=false","prepublishOnly":"npm run clean && npm run build","test:integration":"npm run test:int"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:712fdc66-621c-456d-9fc7-7ddd95923d26"}},"repository":{"url":"git+https://github.com/emmett-community/emmett-google-realtime-db.git","type":"git"},"_npmVersion":"11.6.2","description":"Google Realtime Database inline projections for Emmett","directories":{},"_nodeVersion":"24.12.0","dependencies":{"@opentelemetry/api":"^1.0.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.7.0","tsup":"^8.3.5","eslint":"^9.16.0","ts-jest":"^29.2.5","ts-node":"^10.9.2","prettier":"^3.4.2","typescript":"^5.7.2","@types/jest":"^29.5.14","@types/node":"^22.10.1","firebase-admin":"^12.7.0","testcontainers":"^10.28.0","eslint-config-prettier":"^9.1.0","eslint-plugin-prettier":"^5.2.1","@event-driven-io/emmett":"^0.39.1","@typescript-eslint/parser":"^8.17.0","@typescript-eslint/eslint-plugin":"^8.17.0"},"peerDependencies":{"firebase-admin":"^12.0.0","@event-driven-io/emmett":"^0.39.0"},"_npmOperationalInternal":{"tmp":"tmp/emmett-google-realtime-db_0.3.0_1767206300490_0.3828827920008995","host":"s3://npm-registry-packages-npm-production"}},"0.4.0":{"name":"@emmett-community/emmett-google-realtime-db","version":"0.4.0","keywords":["emmett","event-sourcing","projections","realtime-database","google-realtime-database","firebase","cqrs","event-driven","ddd"],"author":{"name":"Andre X Costa"},"license":"MIT","_id":"@emmett-community/emmett-google-realtime-db@0.4.0","maintainers":[{"name":"axcosta","email":"axcosta@gmail.com"}],"homepage":"https://github.com/emmett-community/emmett-google-realtime-db#readme","bugs":{"url":"https://github.com/emmett-community/emmett-google-realtime-db/issues"},"dist":{"shasum":"d9af77aa26016b40a7303569c81a828769b68445","tarball":"https://registry.npmjs.org/@emmett-community/emmett-google-realtime-db/-/emmett-google-realtime-db-0.4.0.tgz","fileCount":17,"integrity":"sha512-gjWVIyXGM23i7xvSW/5fxpohTankTpKYn2ZLdQADLXFEyk6UKod/lEjknkjzxWZ2eapCTUPueJGEpj5EQAjdEQ==","signatures":[{"sig":"MEUCIFWrlvRUxeMCp2rfc4gUjqc8bF3QgpDxSYUS/qVvV3K7AiEA4RzariOn/vGSVBehFSnaTenKYS1OOybXvOHRfUgcUcE=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@emmett-community%2femmett-google-realtime-db@0.4.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":109482},"main":"./dist/index.js","types":"./dist/index.d.ts","module":"./dist/index.mjs","engines":{"node":">=18.0.0"},"exports":{".":{"import":{"types":"./dist/index.d.mts","default":"./dist/index.mjs"},"require":{"types":"./dist/index.d.ts","default":"./dist/index.js"}},"./testing":{"import":{"types":"./dist/testing/index.d.mts","default":"./dist/testing/index.mjs"},"require":{"types":"./dist/testing/index.d.ts","default":"./dist/testing/index.js"}}},"gitHead":"93da182cca8a73f19e3eb73eac4cbb953f0f29b6","scripts":{"lint":"eslint . --ext .ts","test":"npm run test:unit && npm run test:int && npm run test:e2e","build":"tsup","clean":"rm -rf dist","format":"prettier --write \"src/**/*.ts\" \"test/**/*.ts\"","build:ts":"tsc --noEmit","lint:fix":"eslint . --ext .ts --fix","test:e2e":"jest --testMatch \"**/*.e2e.spec.ts\" --watchman=false","test:int":"jest --testMatch \"**/*.int.spec.ts\" --watchman=false","test:unit":"jest --testMatch \"**/*.unit.spec.ts\" --watchman=false","typecheck":"tsc --noEmit","test:watch":"jest --watch --watchman=false","format:check":"prettier --check \"src/**/*.ts\" \"test/**/*.ts\"","test:coverage":"jest --coverage --watchman=false","prepublishOnly":"npm run clean && npm run build","test:integration":"npm run test:int"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:712fdc66-621c-456d-9fc7-7ddd95923d26"}},"repository":{"url":"git+https://github.com/emmett-community/emmett-google-realtime-db.git","type":"git"},"_npmVersion":"11.6.2","description":"Google Realtime Database inline projections for Emmett","directories":{},"_nodeVersion":"24.12.0","dependencies":{"@opentelemetry/api":"^1.0.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.7.0","tsup":"^8.3.5","eslint":"^9.16.0","ts-jest":"^29.2.5","ts-node":"^10.9.2","prettier":"^3.4.2","typescript":"^5.7.2","@types/jest":"^29.5.14","@types/node":"^22.10.1","firebase-admin":"^12.7.0","testcontainers":"^10.28.0","eslint-config-prettier":"^9.1.0","eslint-plugin-prettier":"^5.2.1","@event-driven-io/emmett":"^0.39.1","@typescript-eslint/parser":"^8.17.0","@typescript-eslint/eslint-plugin":"^8.17.0"},"peerDependencies":{"firebase-admin":"^12.0.0","@event-driven-io/emmett":"^0.39.0"},"_npmOperationalInternal":{"tmp":"tmp/emmett-google-realtime-db_0.4.0_1767290155326_0.8099766659617793","host":"s3://npm-registry-packages-npm-production"}},"0.5.0":{"name":"@emmett-community/emmett-google-realtime-db","version":"0.5.0","keywords":["emmett","event-sourcing","projections","realtime-database","google-realtime-database","firebase","cqrs","event-driven","ddd"],"author":{"name":"Andre X Costa"},"license":"MIT","_id":"@emmett-community/emmett-google-realtime-db@0.5.0","maintainers":[{"name":"axcosta","email":"axcosta@gmail.com"}],"homepage":"https://github.com/emmett-community/emmett-google-realtime-db#readme","bugs":{"url":"https://github.com/emmett-community/emmett-google-realtime-db/issues"},"dist":{"shasum":"96c0cfcecf8785a9f05dfc46bdd942f1e81918c9","tarball":"https://registry.npmjs.org/@emmett-community/emmett-google-realtime-db/-/emmett-google-realtime-db-0.5.0.tgz","fileCount":17,"integrity":"sha512-/MgtT2vpI8x2MIqpfDy0qQJvhNnel8a7m/IdzrAHlKsX8Mj+WgTk4CcdDYYkB+x8PyMQljfwnqNGB4w3Qz93ZQ==","signatures":[{"sig":"MEUCIBkoVQhPomiaIqJy3qOTDxyXHF1lGVb/J9KJMneODqZ8AiEA9itrbgj0qGD2AUCNC4npVoqE8ZSMhl6vyGFBrgzp75U=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@emmett-community%2femmett-google-realtime-db@0.5.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":109482},"main":"./dist/index.js","types":"./dist/index.d.ts","module":"./dist/index.mjs","engines":{"node":">=18.0.0"},"exports":{".":{"import":{"types":"./dist/index.d.mts","default":"./dist/index.mjs"},"require":{"types":"./dist/index.d.ts","default":"./dist/index.js"}},"./testing":{"import":{"types":"./dist/testing/index.d.mts","default":"./dist/testing/index.mjs"},"require":{"types":"./dist/testing/index.d.ts","default":"./dist/testing/index.js"}}},"gitHead":"0eb1f873d006edf5910fcd4c6bff9bdf3c8acda3","scripts":{"lint":"eslint . --ext .ts","test":"npm run test:unit && npm run test:int && npm run test:e2e","build":"tsup","clean":"rm -rf dist","format":"prettier --write \"src/**/*.ts\" \"test/**/*.ts\"","build:ts":"tsc --noEmit","lint:fix":"eslint . --ext .ts --fix","test:e2e":"jest --testMatch \"**/*.e2e.spec.ts\" --watchman=false","test:int":"jest --testMatch \"**/*.int.spec.ts\" --watchman=false","test:unit":"jest --testMatch \"**/*.unit.spec.ts\" --watchman=false","typecheck":"tsc --noEmit","test:watch":"jest --watch --watchman=false","format:check":"prettier --check \"src/**/*.ts\" \"test/**/*.ts\"","test:coverage":"jest --coverage --watchman=false","prepublishOnly":"npm run clean && npm run build","test:integration":"npm run test:int"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:712fdc66-621c-456d-9fc7-7ddd95923d26"}},"repository":{"url":"git+https://github.com/emmett-community/emmett-google-realtime-db.git","type":"git"},"_npmVersion":"11.6.2","description":"Google Realtime Database inline projections for Emmett","directories":{},"_nodeVersion":"24.12.0","dependencies":{"@opentelemetry/api":"^1.0.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.7.0","tsup":"^8.3.5","eslint":"^9.16.0","ts-jest":"^29.2.5","ts-node":"^10.9.2","prettier":"^3.4.2","typescript":"^5.7.2","@types/jest":"^29.5.14","@types/node":"^22.10.1","firebase-admin":"^13.0.0","testcontainers":"^10.28.0","eslint-config-prettier":"^9.1.0","eslint-plugin-prettier":"^5.2.1","@event-driven-io/emmett":"^0.39.1","@typescript-eslint/parser":"^8.17.0","@typescript-eslint/eslint-plugin":"^8.17.0"},"peerDependencies":{"firebase-admin":"^13.0.0","@event-driven-io/emmett":"^0.39.0"},"_npmOperationalInternal":{"tmp":"tmp/emmett-google-realtime-db_0.5.0_1767623044580_0.8897670571933756","host":"s3://npm-registry-packages-npm-production"}},"0.6.0":{"name":"@emmett-community/emmett-google-realtime-db","version":"0.6.0","keywords":["emmett","event-sourcing","projections","realtime-database","google-realtime-database","firebase","cqrs","event-driven","ddd"],"author":{"name":"Andre X Costa"},"license":"MIT","_id":"@emmett-community/emmett-google-realtime-db@0.6.0","maintainers":[{"name":"axcosta","email":"axcosta@gmail.com"}],"homepage":"https://github.com/emmett-community/emmett-google-realtime-db#readme","bugs":{"url":"https://github.com/emmett-community/emmett-google-realtime-db/issues"},"dist":{"shasum":"f77d494546c39df56ecc08b27b2bf0a1c6f0bfa4","tarball":"https://registry.npmjs.org/@emmett-community/emmett-google-realtime-db/-/emmett-google-realtime-db-0.6.0.tgz","fileCount":17,"integrity":"sha512-ahjbI/ONGcPrgk4Cdy9QkQbWBHAxv2813WwRrYHjjKjU87ugshHZugxzjiGPdkHKiMZslyS3I+vQCH9c+TGduw==","signatures":[{"sig":"MEYCIQCtmQ6Qr+Dv9HpdKMda7YE8UFzTLUMf/77tmosSHfEAcQIhAKPYH2O+sIXmdo2pNotCfkSqD+PKuZvpUsLRPaxTTXz+","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@emmett-community%2femmett-google-realtime-db@0.6.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":123478},"main":"./dist/index.js","types":"./dist/index.d.ts","module":"./dist/index.mjs","engines":{"node":">=18.0.0"},"exports":{".":{"import":{"types":"./dist/index.d.mts","default":"./dist/index.mjs"},"require":{"types":"./dist/index.d.ts","default":"./dist/index.js"}},"./testing":{"import":{"types":"./dist/testing/index.d.mts","default":"./dist/testing/index.mjs"},"require":{"types":"./dist/testing/index.d.ts","default":"./dist/testing/index.js"}}},"gitHead":"ce91b1f10acd62f816a8815c8e46e6c6824eadbf","scripts":{"lint":"eslint . --ext .ts","test":"npm run test:unit && npm run test:int && npm run test:e2e","build":"tsup","clean":"rm -rf dist","format":"prettier --write \"src/**/*.ts\" \"test/**/*.ts\"","build:ts":"tsc --noEmit","lint:fix":"eslint . --ext .ts --fix","test:e2e":"jest --testMatch \"**/*.e2e.spec.ts\" --watchman=false","test:int":"jest --testMatch \"**/*.int.spec.ts\" --watchman=false","test:unit":"jest --testMatch \"**/*.unit.spec.ts\" --watchman=false","typecheck":"tsc --noEmit","test:watch":"jest --watch --watchman=false","format:check":"prettier --check \"src/**/*.ts\" \"test/**/*.ts\"","test:coverage":"jest --coverage --watchman=false","prepublishOnly":"npm run clean && npm run build","test:integration":"npm run test:int"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:712fdc66-621c-456d-9fc7-7ddd95923d26"}},"repository":{"url":"git+https://github.com/emmett-community/emmett-google-realtime-db.git","type":"git"},"_npmVersion":"11.6.2","description":"Google Realtime Database inline projections for Emmett","directories":{},"_nodeVersion":"24.12.0","dependencies":{"@opentelemetry/api":"^1.0.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.7.0","tsup":"^8.3.5","eslint":"^9.16.0","ts-jest":"^29.2.5","ts-node":"^10.9.2","prettier":"^3.4.2","typescript":"^5.7.2","@types/jest":"^29.5.14","@types/node":"^22.10.1","firebase-admin":"^13.0.0","testcontainers":"^10.28.0","eslint-config-prettier":"^9.1.0","eslint-plugin-prettier":"^5.2.1","@event-driven-io/emmett":"^0.39.1","@typescript-eslint/parser":"^8.17.0","@typescript-eslint/eslint-plugin":"^8.17.0"},"peerDependencies":{"firebase-admin":"^13.0.0","@event-driven-io/emmett":"^0.39.0"},"_npmOperationalInternal":{"tmp":"tmp/emmett-google-realtime-db_0.6.0_1768436325145_0.9977839571613234","host":"s3://npm-registry-packages-npm-production"}},"0.7.0":{"name":"@emmett-community/emmett-google-realtime-db","version":"0.7.0","description":"Google Realtime Database inline projections for Emmett","main":"./dist/index.js","module":"./dist/index.mjs","types":"./dist/index.d.ts","exports":{".":{"import":{"types":"./dist/index.d.mts","default":"./dist/index.mjs"},"require":{"types":"./dist/index.d.ts","default":"./dist/index.js"}},"./testing":{"import":{"types":"./dist/testing/index.d.mts","default":"./dist/testing/index.mjs"},"require":{"types":"./dist/testing/index.d.ts","default":"./dist/testing/index.js"}}},"scripts":{"build":"tsup","build:ts":"tsc --noEmit","test":"npm run test:unit && npm run test:int && npm run test:e2e","test:unit":"jest --testMatch \"**/*.unit.spec.ts\" --watchman=false","test:int":"jest --testMatch \"**/*.int.spec.ts\" --watchman=false","test:integration":"npm run test:int","test:e2e":"jest --testMatch \"**/*.e2e.spec.ts\" --watchman=false","test:watch":"jest --watch --watchman=false","test:coverage":"jest --coverage --watchman=false","lint":"eslint . --ext .ts","lint:fix":"eslint . --ext .ts --fix","format":"prettier --write \"src/**/*.ts\" \"test/**/*.ts\"","format:check":"prettier --check \"src/**/*.ts\" \"test/**/*.ts\"","typecheck":"tsc --noEmit","clean":"rm -rf dist","prepublishOnly":"npm run clean && npm run build"},"keywords":["emmett","event-sourcing","projections","realtime-database","google-realtime-database","firebase","cqrs","event-driven","ddd"],"author":{"name":"Andre X Costa"},"license":"MIT","repository":{"type":"git","url":"git+https://github.com/emmett-community/emmett-google-realtime-db.git"},"bugs":{"url":"https://github.com/emmett-community/emmett-google-realtime-db/issues"},"homepage":"https://github.com/emmett-community/emmett-google-realtime-db#readme","dependencies":{"@opentelemetry/api":"^1.0.0"},"peerDependencies":{"@event-driven-io/emmett":"^0.39.0","firebase-admin":"^13.0.0"},"devDependencies":{"@event-driven-io/emmett":"^0.39.1","@types/jest":"^29.5.14","@types/node":"^22.10.1","@typescript-eslint/eslint-plugin":"^8.17.0","@typescript-eslint/parser":"^8.17.0","eslint":"^9.16.0","eslint-config-prettier":"^9.1.0","eslint-plugin-prettier":"^5.2.1","firebase-admin":"^13.0.0","jest":"^29.7.0","prettier":"^3.4.2","ts-jest":"^29.2.5","ts-node":"^10.9.2","testcontainers":"^10.28.0","tsup":"^8.3.5","typescript":"^5.7.2"},"engines":{"node":">=18.0.0"},"publishConfig":{"access":"public"},"gitHead":"a0a9ba7129389013d0f6648912f206fd3d19523c","_id":"@emmett-community/emmett-google-realtime-db@0.7.0","_nodeVersion":"24.12.0","_npmVersion":"11.6.2","dist":{"integrity":"sha512-v+unr8Np7mvXjlD2gqUwQhp1NZchCT5XE4aVXly+FyCSwZvYg4OjHAW/7q/4KVlcpBSe760WaSzBkyfnlyrM7Q==","shasum":"684484695acbd39b43e2c4652f5c85b1d7a29dd6","tarball":"https://registry.npmjs.org/@emmett-community/emmett-google-realtime-db/-/emmett-google-realtime-db-0.7.0.tgz","fileCount":17,"unpackedSize":123527,"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@emmett-community%2femmett-google-realtime-db@0.7.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEYCIQDB7/yY43jROjL4CsBHOI896OySsLcpm++OsCW+eFD2lAIhANOXa2dWknufZCiZVv7j+LZwNVw9yty9wrQFzxavkOtq"}]},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:712fdc66-621c-456d-9fc7-7ddd95923d26"}},"directories":{},"maintainers":[{"name":"axcosta","email":"axcosta@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/emmett-google-realtime-db_0.7.0_1768509828381_0.2241836758084692"},"_hasShrinkwrap":false}},"time":{"created":"2025-12-14T20:20:34.843Z","modified":"2026-01-15T20:43:48.812Z","0.1.0":"2025-12-14T20:20:35.154Z","0.2.0":"2025-12-27T15:20:40.446Z","0.3.0":"2025-12-31T18:38:20.681Z","0.4.0":"2026-01-01T17:55:55.466Z","0.5.0":"2026-01-05T14:24:04.762Z","0.6.0":"2026-01-15T00:18:45.304Z","0.7.0":"2026-01-15T20:43:48.543Z"},"bugs":{"url":"https://github.com/emmett-community/emmett-google-realtime-db/issues"},"author":{"name":"Andre X Costa"},"license":"MIT","homepage":"https://github.com/emmett-community/emmett-google-realtime-db#readme","keywords":["emmett","event-sourcing","projections","realtime-database","google-realtime-database","firebase","cqrs","event-driven","ddd"],"repository":{"type":"git","url":"git+https://github.com/emmett-community/emmett-google-realtime-db.git"},"description":"Google Realtime Database inline projections for Emmett","maintainers":[{"name":"axcosta","email":"axcosta@gmail.com"}],"readme":"# @emmett-community/emmett-google-realtime-db\n\nGoogle Realtime Database inline projections for [Emmett](https://event-driven-io.github.io/emmett/), the Node.js event sourcing framework.\n\n[![npm version](https://img.shields.io/npm/v/@emmett-community/emmett-google-realtime-db.svg)](https://www.npmjs.com/package/@emmett-community/emmett-google-realtime-db) [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)\n\n## Features\n\n- ✅ **Inline Projections** - Update projections in Realtime Database after each append\n- ✅ **EventStore-Agnostic** - Works with any Emmett EventStore (Firestore, PostgreSQL, MongoDB, etc.)\n- ✅ **Type-Safe** - Full TypeScript support with projection metadata\n- ✅ **Real-time Read Models** - Queryable views stored in Firebase RTDB\n- ✅ **Testing Utilities** - Helpers for projection validation\n- ✅ **Simple Integration** - Wire projections with a single function call\n\n## Installation\n\n```bash\nnpm install @emmett-community/emmett-google-realtime-db firebase-admin\n```\n\n### Peer Dependencies\n\n- `@event-driven-io/emmett` ^0.39.0\n- `firebase-admin` ^12.0.0\n\n## Quick Start\n\n```typescript\nimport { realtimeDBInlineProjection, wireRealtimeDBProjections } from '@emmett-community/emmett-google-realtime-db';\nimport {\n  getFirestoreEventStore,\n  asEventStore,\n} from '@emmett-community/emmett-google-firestore';\nimport * as admin from 'firebase-admin';\n\nadmin.initializeApp({ /* config */ });\nconst database = admin.database();\nconst firestore = admin.firestore();\n\ntype ShoppingCartSummary = {\n  totalAmount: number;\n  itemCount: number;\n};\n\nconst shoppingCartSummaryProjection = realtimeDBInlineProjection<\n  ShoppingCartSummary,\n  ShoppingCartEvent\n>({\n  name: 'shoppingCartSummary',\n  canHandle: ['ProductItemAdded', 'ProductItemRemoved'],\n  initialState: () => ({ totalAmount: 0, itemCount: 0 }),\n  evolve: (state, event) => {\n    switch (event.type) {\n      case 'ProductItemAdded':\n        return {\n          totalAmount: state.totalAmount + event.data.price,\n          itemCount: state.itemCount + 1,\n        };\n      case 'ProductItemRemoved':\n        return {\n          totalAmount: state.totalAmount - event.data.price,\n          itemCount: state.itemCount - 1,\n        };\n      default:\n        return state;\n    }\n  },\n});\n\nconst baseEventStore = getFirestoreEventStore(firestore);\nconst eventStore = wireRealtimeDBProjections({\n  eventStore: asEventStore(baseEventStore),\n  database,\n  projections: [shoppingCartSummaryProjection],\n});\n\nawait eventStore.appendToStream(streamId, events);\n```\n\n```typescript\nconst summary = await database\n  .ref(`projections/shoppingCartSummary/${cartId}`)\n  .once('value')\n  .then((snapshot) => snapshot.val() ?? null);\n```\n\n## How It Works\n\n### Inline Projections\n\nInline projections are **updated immediately after** `appendToStream` completes. Updates run sequentially for matching projections, which makes them predictable, but they are **not transactional** with the event write. Keep projection handlers idempotent to handle retries safely.\n\n### Realtime Database Structure\n\nProjections are stored in Realtime Database at:\n\n```\n/projections/{projection-name}/{stream-id}\n```\n\nExample:\n\n```json\n{\n  \"projections\": {\n    \"shoppingCartSummary\": {\n      \"shopping_cart:client-123:current\": {\n        \"totalAmount\": 150,\n        \"itemCount\": 3,\n        \"_metadata\": {\n          \"streamId\": \"shopping_cart:client-123:current\",\n          \"name\": \"shoppingCartSummary\",\n          \"schemaVersion\": 1,\n          \"streamPosition\": \"5\"\n        }\n      }\n    }\n  }\n}\n```\n\n## API Reference\n\n### `realtimeDBInlineProjection`\n\nCreates an inline projection definition.\n\n```typescript\nfunction realtimeDBInlineProjection<Doc, EventType>(\n  options: RealtimeDBInlineProjectionOptions<Doc, EventType>\n): RealtimeDBInlineProjectionDefinition;\n```\n\n**Options:**\n\n- `name` (optional): Projection name (default: `'_default'`)\n- `schemaVersion` (optional): Schema version for migration support (default: `1`)\n- `canHandle`: Array of event types this projection handles\n- `evolve`: Function that applies events to the projection state\n- `initialState` (optional): Function that returns initial state (required for non-nullable evolve)\n\n**Note on Realtime DB reads:**\n\n`realtimeDBInlineProjection` wraps `ref(...).once('value')` with a timeout + retry mechanism to avoid hangs when the RTDB connection becomes stale. Current defaults: 3 attempts with timeouts of 5s, 8s, and 12s, with a short backoff between tries. When a timeout happens, the Realtime DB client is reset via `goOffline()` + `goOnline()` before retrying. If you need different timeout/retry behavior, you can still wrap RTDB reads in your application where needed.\n\n**Example:**\n\n```typescript\nconst projection = realtimeDBInlineProjection({\n  name: 'myProjection',\n  schemaVersion: 1,\n  canHandle: ['EventA', 'EventB'],\n  initialState: () => ({ count: 0 }),\n  evolve: (state, event) => ({ count: state.count + 1 }),\n});\n```\n\n### `wireRealtimeDBProjections`\n\nWires projections to an existing event store.\n\n```typescript\nfunction wireRealtimeDBProjections(\n  options: WireRealtimeDBProjectionsOptions\n): EventStore;\n```\n\n**Options:**\n\n- `eventStore`: Your Emmett event store\n- `database`: Firebase Realtime Database instance\n- `projections`: Array of projection definitions\n\n**Example:**\n\n```typescript\nconst eventStore = wireRealtimeDBProjections({\n  eventStore: myEventStore,\n  database: admin.database(),\n  projections: [projection1, projection2],\n});\n```\n\n## Examples\n\nSee the [shopping cart example](./examples/shopping-cart) for a complete, production-ready implementation featuring:\n\n- **Two projections**: `ShoppingCartDetails` (full data) and `ShoppingCartShortInfo` (summary)\n- **Express.js API** with OpenAPI validation\n- **Docker Compose** setup with Firebase emulators\n- **Comprehensive tests**: unit, integration, and E2E\n\n### Running the Example\n\n```bash\ncd examples/shopping-cart\n\n# Install dependencies\nnpm install\n\n# Start Firebase emulators\ndocker-compose up\n\n# Start the application\nnpm start\n\n# Run tests\nnpm test\n```\n\nVisit:\n\n- API: http://localhost:3000\n- Firebase UI: http://localhost:4000\n\n## Testing\n\n### Testing Your Projections\n\nThe package includes testing utilities for projection validation:\n\n```typescript\nimport {\n  testProjection,\n  getProjectionState,\n  clearProjection,\n  clearAllProjections,\n} from '@emmett-community/emmett-google-realtime-db/testing';\n\n// Test a projection\nawait testProjection(\n  myProjection,\n  [event1, event2],\n  { database, streamId: 'test-stream' }\n);\n\n// Get current state\nconst state = await getProjectionState(database, 'projectionName', 'streamId');\n\n// Clear specific projection\nawait clearProjection(database, 'projectionName', 'streamId');\n\n// Clear all projections\nawait clearAllProjections(database);\n```\n\n### Running Package Tests\n\n```bash\n# Unit tests\nnpm run test:unit\n\n# Integration tests (in-memory Realtime DB)\nnpm run test:int\n\n# E2E tests (Firebase emulators via Testcontainers, requires Docker)\nnpm run test:e2e\n\n# All tests\nnpm test\n\n# Coverage\nnpm run test:coverage\n```\n\nTest files live in `test/` and are selected by filename suffix:\n\n- `*.unit.spec.ts` (unit tests, pure logic)\n- `*.int.spec.ts` (integration tests, in-memory Realtime DB)\n- `*.e2e.spec.ts` (E2E tests, Firebase emulators via Testcontainers)\n\nSupport fixtures live under `test/support` (including Firebase emulator configs in `test/support/firebase`).\n\n### Using Firebase Emulator\n\nFor local development and manual testing:\n\n```bash\nfirebase emulators:start --only database --project demo-project\n```\n\nSet environment variables:\n\n```bash\nexport FIREBASE_DATABASE_EMULATOR_HOST=localhost:9000\n```\n\nE2E tests start the emulators automatically via Testcontainers.\n\n## Observability\n\n### Logging\n\nLogging is optional and opt-in. To enable logging, provide a logger instance:\n\n```typescript\nimport pino from 'pino';\n\nconst eventStore = wireRealtimeDBProjections({\n  eventStore: asEventStore(baseEventStore),\n  database,\n  projections: [shoppingCartSummaryProjection],\n  observability: {\n    logger: pino(),\n  },\n});\n```\n\nThe logger interface is compatible with Pino, Winston, and similar libraries:\n\n```typescript\ninterface Logger {\n  debug?(msg: string, data?: unknown): void;\n  info?(msg: string, data?: unknown): void;\n  warn?(msg: string, data?: unknown): void;\n  error?(msg: string, err?: unknown): void;\n}\n```\n\nWithout a logger, the library operates silently.\n\n### Tracing\n\nThis package emits OpenTelemetry spans at I/O boundaries. Tracing is passive:\n\n- Spans are created using `@opentelemetry/api`\n- If your application initializes OpenTelemetry, spans are captured\n- If not initialized, spans are no-ops with zero overhead\n- No configuration flags required\n\nSpan names follow the `emmett.realtime_db.*` pattern.\n\n## Architecture\n\n### EventStore-Agnostic Design\n\nThis package works with **any** Emmett event store:\n\n- ✅ Firestore (as shown in examples)\n- ✅ PostgreSQL (`@event-driven-io/emmett-postgresql`)\n- ✅ MongoDB (`@event-driven-io/emmett-mongodb`)\n- ✅ EventStoreDB (`@event-driven-io/emmett-esdb`)\n- ✅ In-memory (for testing)\n\nThe projections are triggered by intercepting `appendToStream`, making them compatible with any storage backend.\n\n### Integration with Firestore\n\nWhile this package is EventStore-agnostic, the most common pattern is:\n\n- **Events**: Stored in Firestore (using `@emmett-community/emmett-google-firestore`)\n- **Projections**: Stored in Realtime Database (using this package)\n\nThis combination provides:\n\n- Strong consistency for events (Firestore ACID transactions)\n- Projection updates immediately after appends\n- Real-time read models (Realtime Database synchronization)\n- Optimal cost/performance balance\n\n## Firebase Emulator Setup\n\nFor local development and testing:\n\n```json\n// firebase.json\n{\n  \"emulators\": {\n    \"ui\": {\n      \"enabled\": true,\n      \"host\": \"0.0.0.0\",\n      \"port\": 4000\n    },\n    \"firestore\": {\n      \"host\": \"0.0.0.0\",\n      \"port\": 8080\n    },\n    \"database\": {\n      \"host\": \"0.0.0.0\",\n      \"port\": 9000\n    }\n  }\n}\n```\n\n```bash\n# Start emulators\nfirebase emulators:start\n\n# Or with Docker\ndocker-compose up\n```\n\n## Comparison: Inline vs Async Projections\n\n| Feature | Inline Projections (this package) | Async Projections |\n|---------|-----------------------------------|-------------------|\n| Update Timing | Immediately after append | Asynchronous (background) |\n| Consistency | Consistent after append (not transactional) | Eventual |\n| Storage | Realtime Database | Separate collections/tables |\n| Use Cases | Critical read models, current state | Analytics, reports, denormalized views |\n| Complexity | Simple (no background workers) | Complex (requires consumers/subscriptions) |\n\n## Contributing\n\nContributions are welcome! Please feel free to submit a Pull Request.\n\n## License\n\nMIT\n\n## Related Packages\n\n- [@event-driven-io/emmett](https://github.com/event-driven-io/emmett) - Core Emmett framework\n- [@emmett-community/emmett-google-firestore](https://github.com/emmett-community/emmett-google-firestore) - Firestore event store\n- [@event-driven-io/emmett-mongodb](https://github.com/event-driven-io/emmett/tree/main/src/packages/emmett-mongodb) - MongoDB event store with inline projections (inspiration for this package)\n\n## Support\n\n- [GitHub Issues](https://github.com/emmett-community/emmett-google-realtime-db/issues)\n- [Emmett Documentation](https://event-driven-io.github.io/emmett/)\n\n---\n\nMade with ❤️ by the Emmett Community\n","readmeFilename":"README.md"}