{"_id":"@crossfox/elysia-logs","_rev":"3-371813d592b93897375a7a9c4c3abf5e","name":"@crossfox/elysia-logs","dist-tags":{"latest":"0.1.2"},"versions":{"0.1.0":{"name":"@crossfox/elysia-logs","version":"0.1.0","keywords":["elysia","bun","logging","audit-log","activity-log","error-log","crossfox"],"author":{"name":"Oleksii Fursov","email":"nodepro777@gmail.com"},"license":"PolyForm-Noncommercial-1.0.0","_id":"@crossfox/elysia-logs@0.1.0","maintainers":[{"name":"nodepro","email":"nodepro777@gmail.com"}],"homepage":"https://crossfox.online","bugs":{"url":"https://github.com/OleksiiFursov/packages/issues","email":"nodepro777@gmail.com"},"dist":{"shasum":"9f5843ebc2bdb5f8955dae47ef838729ffc27669","tarball":"https://registry.npmjs.org/@crossfox/elysia-logs/-/elysia-logs-0.1.0.tgz","fileCount":25,"integrity":"sha512-xN9Cn9cLdBAaizExK0dpjJMu5/qtQVpwtd9jb/CVkygxHxC8zAOvIWQecUukgvSP24CeKUcnnc26N7rOMAcHyQ==","signatures":[{"sig":"MEUCIQD2/XleqMDQGFenXNJMrBCUkjjLZlZkM5hI1P5LAa2mHwIgakK3PAka6VxIX1xzXewp1/s5dGkwJbTBnK6kRlIIv6c=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":56817},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","engines":{"bun":">=1.1.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","default":"./dist/index.js"},"./package.json":"./package.json"},"gitHead":"c40bccd03b6163148d6b911293feaa77271359cc","scripts":{"test":"bun test","build":"tsc -p tsconfig.build.json","check":"bun run typecheck && bun test","typecheck":"tsc --noEmit","prepublishOnly":"bun run check && bun run build"},"_npmUser":{"name":"nodepro","email":"nodepro777@gmail.com"},"repository":{"url":"git+https://github.com/OleksiiFursov/packages.git","type":"git","directory":"elysia-logs"},"_npmVersion":"11.9.0","description":"Universal DB-backed logging for Elysia apps: activity/audit log with entity+actor diffing, error log (backend+frontend), client ingestion, admin query API, unread badge, retention.","directories":{},"sideEffects":false,"_nodeVersion":"24.14.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"redis":"^5.12.1","elysia":"^1.4.28","@types/bun":"^1.3.14","typescript":"6.0.3","@crossfox/db":"^0.1.2","@crossfox/elysia-kit":"^0.1.0","@crossfox/query-handler":"^0.1.1"},"peerDependencies":{"redis":">=5","elysia":">=1.4","@crossfox/db":">=0.1.0","@crossfox/elysia-kit":">=0.1.0","@crossfox/query-handler":">=0.1.0"},"peerDependenciesMeta":{"redis":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/elysia-logs_0.1.0_1786826392054_0.29366593713217615","host":"s3://npm-registry-packages-npm-production"}},"0.1.1":{"name":"@crossfox/elysia-logs","version":"0.1.1","keywords":["elysia","bun","logging","audit-log","activity-log","error-log","crossfox"],"author":{"name":"Oleksii Fursov","email":"nodepro777@gmail.com"},"license":"PolyForm-Noncommercial-1.0.0","_id":"@crossfox/elysia-logs@0.1.1","maintainers":[{"name":"nodepro","email":"nodepro777@gmail.com"}],"homepage":"https://crossfox.online","bugs":{"url":"https://github.com/OleksiiFursov/packages/issues","email":"nodepro777@gmail.com"},"dist":{"shasum":"116509c6fc9d12a3b60c4485124a5c410c8e30c5","tarball":"https://registry.npmjs.org/@crossfox/elysia-logs/-/elysia-logs-0.1.1.tgz","fileCount":25,"integrity":"sha512-bEPrBUooDItdoauvR+93BpukZsZJzg03UQbr08Cgn5RZ4OFyw53VsOkdSLkQ0AdSBKlwVFyhHF582j5xzk2DVA==","signatures":[{"sig":"MEUCIQCIirOVwGovmvAugKhk/4Doectds+b7LSQUi+40F6sKfgIgb82xhXD/I2rjXKToQBvw94bI0jg0LjzrE2+dgKaWloA=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":56834},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","engines":{"bun":">=1.1.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","default":"./dist/index.js"},"./package.json":"./package.json"},"gitHead":"c40bccd03b6163148d6b911293feaa77271359cc","scripts":{"test":"bun test","build":"tsc -p tsconfig.build.json","check":"bun run typecheck && bun test","typecheck":"tsc --noEmit","prepublishOnly":"bun run check && bun run build"},"_npmUser":{"name":"nodepro","email":"nodepro777@gmail.com"},"repository":{"url":"git+https://github.com/OleksiiFursov/packages.git","type":"git","directory":"elysia-logs"},"_npmVersion":"11.9.0","description":"Universal DB-backed logging for Elysia apps: activity/audit log with entity+actor diffing, error log (backend+frontend), client ingestion, admin query API, unread badge, retention.","directories":{},"sideEffects":false,"_nodeVersion":"24.14.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"redis":"^5.12.1","elysia":"^1.4.28","@types/bun":"^1.3.14","typescript":"6.0.3","@crossfox/db":"^0.1.2","@crossfox/elysia-kit":"^0.1.0","@crossfox/query-handler":"^0.1.1"},"peerDependencies":{"redis":">=5","elysia":">=1.4","@crossfox/db":">=0.1.0","@crossfox/elysia-kit":">=0.1.0","@crossfox/query-handler":">=0.1.0"},"peerDependenciesMeta":{"redis":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/elysia-logs_0.1.1_1786835949702_0.4354316269767713","host":"s3://npm-registry-packages-npm-production"}},"0.1.2":{"name":"@crossfox/elysia-logs","version":"0.1.2","description":"Universal DB-backed logging for Elysia apps: activity/audit log with entity+actor diffing, error log (backend+frontend), client ingestion, admin query API, unread badge, retention.","license":"PolyForm-Noncommercial-1.0.0","author":{"name":"Oleksii Fursov","email":"nodepro777@gmail.com"},"homepage":"https://crossfox.online","repository":{"type":"git","url":"git+https://github.com/OleksiiFursov/packages.git","directory":"elysia-logs"},"bugs":{"url":"https://github.com/OleksiiFursov/packages/issues","email":"nodepro777@gmail.com"},"type":"module","sideEffects":false,"engines":{"bun":">=1.1.0"},"main":"./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":"tsc -p tsconfig.build.json","typecheck":"tsc --noEmit","test":"bun test","check":"bun run typecheck && bun test","prepublishOnly":"bun run check && bun run build"},"peerDependencies":{"@crossfox/db":">=0.1.0","@crossfox/elysia-kit":">=0.1.0","@crossfox/query-handler":">=0.1.0","elysia":">=1.4","redis":">=5"},"peerDependenciesMeta":{"redis":{"optional":true}},"devDependencies":{"@crossfox/db":"^0.1.2","@crossfox/elysia-kit":"^0.1.0","@crossfox/query-handler":"^0.1.1","@types/bun":"^1.3.14","elysia":"^1.4.28","redis":"^5.12.1","typescript":"6.0.3"},"keywords":["elysia","bun","logging","audit-log","activity-log","error-log","crossfox"],"publishConfig":{"access":"public"},"gitHead":"0ab463820051ff0aa81fb65b948a621c877f305f","_id":"@crossfox/elysia-logs@0.1.2","_nodeVersion":"24.14.0","_npmVersion":"11.9.0","dist":{"integrity":"sha512-7LvCH+IJTrMYywMCQVgYwJkTA02Q3/N4/1zMhImKuG+D0JctjUQxOyOgfaRn1tgfNHLHNl+dHt2Y/lC7zki8zA==","shasum":"f19bbe5dda05917e12f0d7d30172c8691afbfe94","tarball":"https://registry.npmjs.org/@crossfox/elysia-logs/-/elysia-logs-0.1.2.tgz","fileCount":25,"unpackedSize":57223,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEQCIA4cFxl6BD0j+WmT+vJT1rz4mGBvHjjKY3FAYhHdvOJ+AiBmgOIupO9YhnXLiYRXdXG08GdXcZ5OeIqoO5bBADQ2DQ=="}]},"_npmUser":{"name":"nodepro","email":"nodepro777@gmail.com"},"directories":{},"maintainers":[{"name":"nodepro","email":"nodepro777@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/elysia-logs_0.1.2_1787090995186_0.8988666643454881"},"_hasShrinkwrap":false}},"time":{"created":"2026-08-15T20:39:51.889Z","modified":"2026-08-18T22:09:55.507Z","0.1.0":"2026-08-15T20:39:52.237Z","0.1.1":"2026-08-15T23:19:09.831Z","0.1.2":"2026-08-18T22:09:55.330Z"},"bugs":{"url":"https://github.com/OleksiiFursov/packages/issues","email":"nodepro777@gmail.com"},"author":{"name":"Oleksii Fursov","email":"nodepro777@gmail.com"},"license":"PolyForm-Noncommercial-1.0.0","homepage":"https://crossfox.online","keywords":["elysia","bun","logging","audit-log","activity-log","error-log","crossfox"],"repository":{"type":"git","url":"git+https://github.com/OleksiiFursov/packages.git","directory":"elysia-logs"},"description":"Universal DB-backed logging for Elysia apps: activity/audit log with entity+actor diffing, error log (backend+frontend), client ingestion, admin query API, unread badge, retention.","maintainers":[{"name":"nodepro","email":"nodepro777@gmail.com"}],"readme":"# @crossfox/elysia-logs\n\nУниверсальный DB-логгер для Elysia-приложений на Bun: **activity/audit-лог** (кто что сделал, structured diff, актёр + сущность как две независимые оси) + **error-лог** (backend и frontend, с приёмом от клиентов), REST для админки, бейдж непрочитанных событий, ретеншн.\n\nСобирает лучшее из двух внутренних проектов: structured diff-лог CrystalTask (`entity_type`/`entity_id`/`actor_user_id`) + error-лог/client-ingestion/Redis-бейдж pstryku.\n\n## Быстрый старт\n\n```ts\nimport { setupLogs, createLoggingOnError, createClientLogsPlugin, createLogsAdminPlugin } from \"@crossfox/elysia-logs\";\nimport { createOnErrorHandler } from \"@crossfox/elysia-kit\";\n\nconst { cfg, schemas, service: logs } = await setupLogs({\n  multiTenant: true,\n  actionsEnum: [\"create\", \"update\", \"delete\", \"assign\", \"accept\", \"submit\"] as const,\n  redis: redisClient, // опционально — для /logs/badge\n});\n\napp\n  .onError(createOnErrorHandler({ onLog: createLoggingOnError(logs, { app: \"api\" }) }))\n  .use(createClientLogsPlugin(logs, { resolveActor: async (headers) => resolveMyActor(headers) }))\n  .use(createLogsAdminPlugin(schemas, cfg, { resolveActor: (ctx) => myAdminActor(ctx), badge: true }));\n\n// в бизнес-коде:\nawait logs.writeLog({\n  actorUserId: auth.userId,\n  entityType: \"job\",\n  entityId: jobId,\n  action: \"accept\",\n});\n```\n\n## Связка исполнитель ↔ сущность (\"супер-лог\")\n\nКаждая строка activity-лога несёт **две независимые оси**: `actor_user_id` (кто сделал) и `entity_type`/`entity_id` (над чем). `GET /logs?actor_user_id=` и `GET /logs?entity_id=&entity_type=` фильтруют по каждой оси отдельно — админ переходит и на исполнителя, и на заказ из одной и той же строки лога.\n\n## Ретеншн\n\nПакет не тащит cron сам — вызывайте чистую функцию `purgeOldLogs(schemas, retentionDays)` из своего event bus/cron (пример — `services/cron` в CrystalTask).\n\n## Лицензия\n\n[PolyForm Noncommercial 1.0.0](https://polyformproject.org/licenses/noncommercial/1.0.0) — некоммерческое использование бесплатно. Коммерческое — nodepro777@gmail.com.\n","readmeFilename":"README.md"}