{"_id":"@absolutejs/analytics","_rev":"2-53ad063f5c97df71231f6516c742af27","name":"@absolutejs/analytics","dist-tags":{"latest":"0.1.1"},"versions":{"0.1.0":{"name":"@absolutejs/analytics","version":"0.1.0","license":"BSL-1.1","_id":"@absolutejs/analytics@0.1.0","maintainers":[{"name":"alexkahndev","email":"alexkahn2019@gmail.com"}],"dist":{"shasum":"c510809f1f7cbd30de23e6f13c69d98224fa7d64","tarball":"https://registry.npmjs.org/@absolutejs/analytics/-/analytics-0.1.0.tgz","fileCount":7,"integrity":"sha512-yHWKsQS4wSRmTs0pJ9Cs8mJz7Ay+CEgwmqA0cHq5eBL6bEzUBWaP1jbzba0iBM9ImMUioygjvoBhGlczztCqDw==","signatures":[{"sig":"MEQCIBrJP6YvM+ZM4jf2D5t69CCOzmR1bC5F8FWLeRgFm15DAiBnTYOVZd3izjhhXcC/5BJncwZSda2vfNsrRhw0cJwY8A==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":29867},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","shasum":"c510809f1f7cbd30de23e6f13c69d98224fa7d64","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","default":"./dist/index.js"}},"scripts":{"test":"bun test","build":"rm -rf dist && bun build src/index.ts --outdir dist --root src --sourcemap --target=bun && tsc --project tsconfig.build.json","format":"prettier --write \"./**/*.{ts,json,md}\"","release":"bun run check:package && bun publish","typecheck":"tsc --noEmit","check:package":"bun run format && bun run typecheck && bun run test && bun run build"},"_npmUser":{"name":"alexkahndev","email":"alexkahn2019@gmail.com"},"_integrity":"sha512-yHWKsQS4wSRmTs0pJ9Cs8mJz7Ay+CEgwmqA0cHq5eBL6bEzUBWaP1jbzba0iBM9ImMUioygjvoBhGlczztCqDw==","repository":{"url":"git+https://github.com/absolutejs/analytics.git","type":"git"},"_npmVersion":"10.8.3","description":"Typed, tenant-fenced, privacy-thresholded product and operational analytics primitives for AbsoluteJS.","directories":{},"_nodeVersion":"24.3.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"prettier":"^3.8.3","@types/bun":"^1.3.14","typescript":"^5.9.3"},"_npmOperationalInternal":{"tmp":"tmp/analytics_0.1.0_1785165127184_0.7071005510539266","host":"s3://npm-registry-packages-npm-production"}},"0.1.1":{"name":"@absolutejs/analytics","version":"0.1.1","description":"Typed, tenant-fenced, privacy-thresholded product and operational analytics primitives for AbsoluteJS.","repository":{"type":"git","url":"git+https://github.com/absolutejs/analytics.git"},"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"}},"license":"BSL-1.1","publishConfig":{"access":"public"},"scripts":{"build":"rm -rf dist && bun build src/index.ts --outdir dist --root src --sourcemap --target=bun && tsc --project tsconfig.build.json","format":"prettier --write \"./**/*.{ts,json,md}\"","test":"bun test","typecheck":"tsc --noEmit","check:package":"bun run format && bun run typecheck && bun run test && bun run build","release":"bun run check:package && bun publish"},"devDependencies":{"@types/bun":"^1.3.14","prettier":"^3.8.3","typescript":"^5.9.3"},"_id":"@absolutejs/analytics@0.1.1","_integrity":"sha512-jXeQenWIqdWIWM+HD/jnQ1UMvtJTJgxk9zl8m7IKg+tl2tv7ZkYpqsfmyUCMcd0fYX2vO+xUuQK8rWNyJHSNEg==","_nodeVersion":"24.3.0","_npmVersion":"10.8.3","shasum":"01282a867103a030f74e1df4478d6b8c9218b6bf","dist":{"integrity":"sha512-jXeQenWIqdWIWM+HD/jnQ1UMvtJTJgxk9zl8m7IKg+tl2tv7ZkYpqsfmyUCMcd0fYX2vO+xUuQK8rWNyJHSNEg==","shasum":"01282a867103a030f74e1df4478d6b8c9218b6bf","tarball":"https://registry.npmjs.org/@absolutejs/analytics/-/analytics-0.1.1.tgz","fileCount":7,"unpackedSize":35996,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCICaQ1NoWEzCHjcQ4FMcQ5qqnBWMW6C3SM81MzdqlQ5deAiEAonv30XEEmDvDpA+5RW5gj1Hx4jzR+FYm4l0PpOwS4Ek="}]},"_npmUser":{"name":"alexkahndev","email":"alexkahn2019@gmail.com"},"directories":{},"maintainers":[{"name":"alexkahndev","email":"alexkahn2019@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/analytics_0.1.1_1785166055102_0.4796230528874934"},"_hasShrinkwrap":false}},"time":{"created":"2026-07-27T15:12:06.923Z","modified":"2026-07-27T15:27:35.406Z","0.1.0":"2026-07-27T15:12:07.311Z","0.1.1":"2026-07-27T15:27:35.246Z"},"license":"BSL-1.1","repository":{"type":"git","url":"git+https://github.com/absolutejs/analytics.git"},"description":"Typed, tenant-fenced, privacy-thresholded product and operational analytics primitives for AbsoluteJS.","maintainers":[{"name":"alexkahndev","email":"alexkahn2019@gmail.com"}],"readme":"# @absolutejs/analytics\n\nTyped product and operational analytics primitives for AbsoluteJS.\n\nThe package deliberately does not provide an unbounded client event collector.\nCallers declare every dimension and measure, identity-shaped dimensions are\nrejected, cardinality is bounded, and cohorts smaller than a configured privacy\nthreshold are suppressed. The result is deterministic aggregate evidence that\ncan feed dashboards, Outcomes, SLOs, incidents, and release gates without\nturning application telemetry into a shadow user database.\n\n```ts\nimport {\n  aggregateAnalytics,\n  defineAnalyticsSchema,\n} from \"@absolutejs/analytics\";\n\nconst schema = defineAnalyticsSchema({\n  name: \"route-performance\",\n  dimensions: [\"route\", \"release\"],\n  dimensionNormalizers: { route: normalizeRouteTemplate },\n  measures: [\"durationMs\"],\n  minimumCohortSize: 10,\n});\n\nconst snapshot = aggregateAnalytics(schema, observations, {\n  groupBy: [\"route\", \"release\"],\n  quantiles: [0.5, 0.75, 0.95, 0.99],\n});\n```\n\nTenant identity belongs at the storage/query authorization boundary and is not\nan analytics dimension. Prompts, tokens, email addresses, IP addresses, and\nuser identifiers do not belong in this package's event contract.\n\nPrivacy thresholds apply independently to every measure as well as to its\ngroup. Dimension values that are direct email or IP identifiers are rejected;\nroute-like values should use `normalizeRouteTemplate` or a stricter\ndomain-specific normalizer before grouping. Hosts remain responsible for\ntenant authorization, bounded query variation, retention, and erasure.\n\n`compareCohorts` requires both sample sizes to meet its configured minimum\nbefore it can label a directional change as a regression.\n","readmeFilename":"README.md"}