{"_id":"@arthurfiddich/analytics-service","_rev":"4-08493458946d77f6bee6be9ce4942df2","name":"@arthurfiddich/analytics-service","dist-tags":{"latest":"0.1.3"},"versions":{"0.1.0":{"name":"@arthurfiddich/analytics-service","version":"0.1.0","keywords":["analytics","tracking","events","firebase","mixpanel"],"license":"MIT","_id":"@arthurfiddich/analytics-service@0.1.0","maintainers":[{"name":"arthurfiddich","email":"arthurfiddich@gmail.com"}],"dist":{"shasum":"0aaf5ffc7bd4b4da4e291598698c1ed49b77132d","tarball":"https://registry.npmjs.org/@arthurfiddich/analytics-service/-/analytics-service-0.1.0.tgz","fileCount":30,"integrity":"sha512-9hcWTGkd6z3jA9X6w0YIsGKu9CIl+ixs2GPLpC1NkziAVgYXZTp9KDZT9oqSOwpTPABgFh2mvL95fplLSw5mZw==","signatures":[{"sig":"MEUCIQDQznuXd1EpTTQQ12cnkNLbAQwlHgarb7ZxSfVWw/6aogIgEbn0B8r3oSJeKGKTZ/tTS/lFFEKGFlr4dn8kSuZb2XI=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":21203},"main":"dist/index.js","type":"module","types":"dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"scripts":{"dev":"tsc --watch","build":"tsc","clean":"rm -rf dist","prepublishOnly":"npm run clean && npm run build"},"_npmUser":{"name":"arthurfiddich","email":"arthurfiddich@gmail.com"},"_npmVersion":"10.9.3","description":"Provider-agnostic analytics service for frontend and backend","directories":{},"_nodeVersion":"22.19.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.9.3"},"_npmOperationalInternal":{"tmp":"tmp/analytics-service_0.1.0_1776684970541_0.36826144974341646","host":"s3://npm-registry-packages-npm-production"}},"0.1.1":{"name":"@arthurfiddich/analytics-service","version":"0.1.1","keywords":["analytics","tracking","events","firebase","mixpanel"],"license":"MIT","_id":"@arthurfiddich/analytics-service@0.1.1","maintainers":[{"name":"arthurfiddich","email":"arthurfiddich@gmail.com"}],"dist":{"shasum":"62f35413e416c326a00b357190496fe0ec2df18b","tarball":"https://registry.npmjs.org/@arthurfiddich/analytics-service/-/analytics-service-0.1.1.tgz","fileCount":30,"integrity":"sha512-yWWdX8Q/lFx/5B9RfMZGluVQRQ4mLhSq5nY2Deb1yQZiaJY+QNzwmExWRaDn6ZQ6WKVipZUXvaHkFPcajbsMMQ==","signatures":[{"sig":"MEQCIDenltW/fn+wvDP/vq8F5zOoa+zTIPnCZvhtkixxS+YtAiACDhO9bWO1hxH5ZCZ96tmMmhqz+rlIfMJXdRv+eW5oWQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":19846},"main":"dist/index.js","type":"module","types":"dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"scripts":{"dev":"tsc --watch","build":"tsc","clean":"rm -rf dist","prepublishOnly":"npm run clean && npm run build"},"_npmUser":{"name":"arthurfiddich","email":"arthurfiddich@gmail.com"},"_npmVersion":"10.9.3","description":"Provider-agnostic analytics service for frontend and backend","directories":{},"_nodeVersion":"22.19.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.9.3"},"_npmOperationalInternal":{"tmp":"tmp/analytics-service_0.1.1_1776685675967_0.31210037904101773","host":"s3://npm-registry-packages-npm-production"}},"0.1.2":{"name":"@arthurfiddich/analytics-service","version":"0.1.2","keywords":["analytics","tracking","events","firebase","mixpanel"],"license":"MIT","_id":"@arthurfiddich/analytics-service@0.1.2","maintainers":[{"name":"arthurfiddich","email":"arthurfiddich@gmail.com"}],"dist":{"shasum":"d79b82b703a875b29a02bcbe719a04eded5a3600","tarball":"https://registry.npmjs.org/@arthurfiddich/analytics-service/-/analytics-service-0.1.2.tgz","fileCount":34,"integrity":"sha512-tna9jM27Ohis+Zl7EriAyvqnxLcZcMeT42zAj9terTXgkmvG2nDgOJCOUL2IB7DNzvyrHesbQPJgUtORKqaxWA==","signatures":[{"sig":"MEUCIGXFVA6uKFprNZoYpwuzuTYlC4SY1GlTkM7OvIrKbFv+AiEAv6qBGAHJlCPjSLD7eTOwG0i9+Eto3RbfDaQeEIqkfRM=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":22644},"main":"dist/index.js","type":"module","types":"dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"scripts":{"dev":"tsc --watch","build":"tsc","clean":"rm -rf dist","prepublishOnly":"npm run clean && npm run build"},"_npmUser":{"name":"arthurfiddich","email":"arthurfiddich@gmail.com"},"_npmVersion":"10.9.3","description":"Provider-agnostic analytics service for frontend and backend","directories":{},"_nodeVersion":"22.19.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.9.3"},"_npmOperationalInternal":{"tmp":"tmp/analytics-service_0.1.2_1776686648076_0.7286471372923167","host":"s3://npm-registry-packages-npm-production"}},"0.1.3":{"name":"@arthurfiddich/analytics-service","version":"0.1.3","description":"Provider-agnostic analytics service for frontend and backend","type":"module","main":"dist/index.js","types":"dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"scripts":{"build":"tsc","dev":"tsc --watch","clean":"rm -rf dist","prepublishOnly":"npm run clean && npm run build"},"keywords":["analytics","tracking","events","firebase","mixpanel"],"license":"MIT","publishConfig":{"access":"public"},"devDependencies":{"typescript":"^5.9.3"},"_id":"@arthurfiddich/analytics-service@0.1.3","gitHead":"54c30ae552904b6918b31c328b2c239523a5aff8","_nodeVersion":"22.19.0","_npmVersion":"10.9.3","dist":{"integrity":"sha512-m04xRIIaGnixjBuy62lPfjcZNrtWLpurtPm2I2X5NAJPxDEkL16F1HQzNJVYPagSqTqdic7WxOreOKqDmzQo7Q==","shasum":"318fab7f3bcb6c1dbd560dcfb90ec31b1ae8497c","tarball":"https://registry.npmjs.org/@arthurfiddich/analytics-service/-/analytics-service-0.1.3.tgz","fileCount":42,"unpackedSize":33749,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIQCyJfyhJPuPqPyVPM2iYTRqT83KVaowjQEr60lf57jY2QIgf7sTd1pUmSMCI42hRV4P8CGK/AF2zav/yLQmfYHNzRw="}]},"_npmUser":{"name":"arthurfiddich","email":"arthurfiddich@gmail.com"},"directories":{},"maintainers":[{"name":"arthurfiddich","email":"arthurfiddich@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/analytics-service_0.1.3_1776736579928_0.682469972820752"},"_hasShrinkwrap":false}},"time":{"created":"2026-04-20T11:36:10.444Z","modified":"2026-04-21T01:56:20.195Z","0.1.0":"2026-04-20T11:36:10.664Z","0.1.1":"2026-04-20T11:47:56.112Z","0.1.2":"2026-04-20T12:04:08.224Z","0.1.3":"2026-04-21T01:56:20.085Z"},"license":"MIT","keywords":["analytics","tracking","events","firebase","mixpanel"],"description":"Provider-agnostic analytics service for frontend and backend","maintainers":[{"name":"arthurfiddich","email":"arthurfiddich@gmail.com"}],"readme":"# @arthurfiddich/analytics-service\n\nProvider-agnostic analytics service for mobile apps and backend services.\n\n## Goals\n\n- Keep event tracking API stable across providers.\n- Support frontend and backend with one package.\n- Start with no-op or console providers, then plug Firebase or Mixpanel.\n\n## Quick Start\n\n```ts\nimport {\n  AnalyticsService,\n  ConsoleAnalyticsProvider,\n} from \"@arthurfiddich/analytics-service\";\n\nconst analytics = new AnalyticsService({\n  providers: [new ConsoleAnalyticsProvider()],\n  globalContext: { app: \"natupicks-frontend\", env: \"development\" },\n});\n\nawait analytics.track(\"product_viewed\", {\n  productId: \"abc123\",\n  source: \"product-detail\",\n});\n```\n\n## Core API\n\n- `track(eventName, properties?, context?)`\n- `identify(userId, traits?, context?)`\n- `setUserProperties(userId, properties, context?)`\n- `flush()`\n\n## Built-in Providers\n\n- `NoopAnalyticsProvider`\n- `ConsoleAnalyticsProvider`\n\n## Shared Event Dedupe Utility\n\nUse the package-level dedupe utility to prevent duplicate event emissions across frontend and backend.\n\n```ts\nimport { createEventDedupe } from \"@arthurfiddich/analytics-service\";\n\nconst dedupe = createEventDedupe();\n\nconst onceKey = \"purchase_completed:pay_abc123\";\nif (dedupe.shouldTrackOnce(onceKey)) {\n  await analytics.track(\"purchase_completed\", { paymentId: \"pay_abc123\" });\n}\n\nconst throttleKey = \"search_performed:organic honey\";\nif (dedupe.shouldTrackThrottled(throttleKey, 1500)) {\n  await analytics.track(\"search_performed\", { query: \"organic honey\" });\n}\n```\n\nRecommended dedupe key patterns:\n\n- Payment success: `purchase_completed:<paymentId>`\n- Order creation: `order_created:<orderId>`\n- Refund initiated: `refund_initiated:<orderId>:<source>`\n- Search action: `search_performed:<normalizedQuery>`\n\nTip:\nUse `dedupe.clear(key)` when a flow is intentionally retried, or `dedupe.clear()` to reset all in-memory keys for a new app/session lifecycle.\n","readmeFilename":"README.md"}