{"_id":"@avocadoblock/logger","name":"@avocadoblock/logger","dist-tags":{"latest":"0.1.3"},"versions":{"0.1.3":{"name":"@avocadoblock/logger","version":"0.1.3","description":"Avocado Block isomorphic logger: structured stdout on Node, buffered gateway transport in the browser","license":"UNLICENSED","type":"module","main":"./dist/index.js","types":"./dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"scripts":{"build":"tsc -p tsconfig.build.json","typecheck":"tsc --noEmit","test":"vitest run","lint":"eslint src test"},"devDependencies":{"@eslint/js":"^9.0.0","@types/node":"^22.0.0","ajv":"^8.17.0","ajv-formats":"^3.0.0","axios":"^1.7.0","eslint":"^9.0.0","jsdom":"^25.0.0","typescript":"^5.6.0","typescript-eslint":"^8.0.0","vitest":"^2.1.0"},"publishConfig":{"access":"public"},"gitHead":"ab965007d6a3c2f5e1e09dcbe99c7e511de96be0","_id":"@avocadoblock/logger@0.1.3","_nodeVersion":"25.2.1","_npmVersion":"11.6.2","dist":{"integrity":"sha512-wR7La5iQIrldbz/bcD+xy6FZ0VChxh+FE7sQs9HCQUz0F3aqsKUoZoZ1yut4VpCCW8P81BSEFpkkygzokPFk4A==","shasum":"e61ae7b47513e6cae510ca445ab958f92a28adf7","tarball":"https://registry.npmjs.org/@avocadoblock/logger/-/logger-0.1.3.tgz","fileCount":34,"unpackedSize":57713,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIQDflqRk6E5DSOiHo/GuWuVkKxwTb5A2aLpSmIyGy4nY3wIgKNAX8WHbCkRl9JjC4tMz4F5oGkPPa5zChWi83Qdn1Js="}]},"_npmUser":{"name":"crisvocado","email":"casboleda@avocadoblock.com"},"directories":{},"maintainers":[{"name":"markvocado","email":"marco.tamayo@avocadoblock.com"},{"name":"crisvocado","email":"casboleda@avocadoblock.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/logger_0.1.3_1785258688410_0.8274664663419984"},"_hasShrinkwrap":false}},"time":{"created":"2026-07-28T17:11:28.224Z","0.1.3":"2026-07-28T17:11:28.554Z","modified":"2026-07-28T17:11:28.893Z"},"maintainers":[{"name":"markvocado","email":"marco.tamayo@avocadoblock.com"},{"name":"crisvocado","email":"casboleda@avocadoblock.com"}],"description":"Avocado Block isomorphic logger: structured stdout on Node, buffered gateway transport in the browser","license":"UNLICENSED","readme":"# @ablock/logger\n\nIsomorphic structured logger for Avocado Block apps.\n\n- **Browser** → buffered batches to the logcore gateway (retry + backoff,\n  `sendBeacon` drain on page hide).\n- **Node** → one structured-JSON line per entry to stdout; the Cloud Run\n  agent / Ops Agent and the central sink do the rest. Zero network calls.\n\n## Install (private Artifact Registry)\n\n```bash\n# .npmrc (repo root)\n@ablock:registry=https://us-central1-npm.pkg.dev/<central-project>/ablock-npm/\n//us-central1-npm.pkg.dev/<central-project>/ablock-npm/:always-auth=true\n\nnpx google-artifactregistry-auth   # refresh token (uses gcloud ADC)\npnpm add @ablock/logger\n```\n\n## Browser\n\n```ts\nimport { Logger, GatewayTransport, startTrace, toTraceparent, getCurrentTrace, setCurrentTrace } from \"@ablock/logger\";\n\nconst logger = new Logger({\n  service: \"amps-frontend\",\n  env: \"prod\",\n  sourceProject: \"amps-1293912\",\n  transport: new GatewayTransport({\n    endpoint: \"https://logs.avocadoblock.com\",\n    apiKey: import.meta.env.VITE_ABLOCK_LOG_KEY,\n    onDrop: (n, reason) => console.warn(`dropped ${n} logs (${reason})`),\n  }),\n});\n\n// Start a trace and propagate it to your API so logs interleave end-to-end:\nsetCurrentTrace(startTrace(true));\nfetch(\"/api/checkout\", {\n  headers: { traceparent: toTraceparent(getCurrentTrace()!) },\n});\n\nlogger.error(\"checkout failed\", {\n  error: err,                          // stack captured, in-app frames marked\n  context: { cartId },\n  fingerprint: \"checkout-fail\",        // optional manual grouping\n});\n```\n\n## Node\n\n```ts\nimport { Logger, StdoutTransport, traceMiddleware } from \"@ablock/logger\";\n\napp.use(traceMiddleware); // binds incoming traceparent / X-Cloud-Trace-Context\n\nconst logger = new Logger({\n  service: \"persea-api\",\n  env: \"prod\",\n  sourceProject: \"persea-dev-2\",\n  transport: new StdoutTransport(\"persea-dev-2\"),\n});\n```\n\n## Plug-and-play integrations (browser)\n\nWire trace propagation and error capture once, then use `fetch`/`axios` normally:\n\n```ts\nimport { installFetchTracing, installAxiosTracing, installGlobalErrorHandlers, startInteraction } from \"@ablock/logger\";\n\ninstallGlobalErrorHandlers(logger);      // uncaught errors & rejections logged\ninstallFetchTracing();                   // same-origin fetch carries traceparent\ninstallAxiosTracing(axios, { logger });  // axios: header + auto-log failures\n\n// per user action:\nstartInteraction();                      // fresh trace; outgoing calls correlate\n```\n\n`installFetchTracing` only propagates to **same-origin** URLs by default (no\ntrace-id leakage to third parties; override via `propagateTo`). The axios helper\nis duck-typed — no axios dependency is added. Each `install*` returns an\nuninstall function.\n\n## Under the hood\n\nEvery entry carries a **deterministic `insertId`** computed at capture time\n(`sha256(ts|service|severity|message|context)[:32]`, byte-compatible with the\nPython package) so retried sends deduplicate natively in Cloud Logging, plus\nthe flat `trace_id` label that joins frontend + API + VM logs in the central\nbucket with a single filter.\n","readmeFilename":"README.md","_rev":"1-da58b2d8cd24cc0879adf2b10180828b"}