{"_id":"@darksol/logpilot","_rev":"2-e4d39927c9b822397bc1cc513a4fec0f","name":"@darksol/logpilot","dist-tags":{"latest":"1.0.2"},"versions":{"1.0.0":{"name":"@darksol/logpilot","version":"1.0.0","author":{"name":"darksol"},"license":"MIT","_id":"@darksol/logpilot@1.0.0","maintainers":[{"name":"darksol","email":"chris00claw@gmail.com"}],"dist":{"shasum":"6ab5e0b9c27e86924bf3ad30feff312f3b5ed208","tarball":"https://registry.npmjs.org/@darksol/logpilot/-/logpilot-1.0.0.tgz","fileCount":51,"integrity":"sha512-E0ytB4+KN0WBZetJqWaOhyQWr2sn0aqUFhnwYI17fbVev3NY6DFlP6mmREltYTlQ0BioD8qN1fy7BZ+RpEQi9Q==","signatures":[{"sig":"MEYCIQDFz7q/A12Szs/C/4Zd5trxdO9ZqrOf9NG6y7G8stQJ0wIhAPoCX5jfi18yuN75xuZYDYoGwUOL92hsuPxdXbodPjTF","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":69113},"main":"./dist/cjs/index.cjs","type":"module","types":"./dist/esm/index.d.ts","module":"./dist/esm/index.js","engines":{"node":">=18"},"exports":{".":{"types":"./dist/esm/index.d.ts","import":"./dist/esm/index.js","require":"./dist/cjs/index.cjs"}},"gitHead":"a27f4a1570ec87b0cf7ccb060eb57d9429ae1a19","scripts":{"test":"npm run build:tests && node --test \"dist-tests/tests/*.test.js\"","build":"npm run clean && npm run build:esm && npm run build:cjs","clean":"node -e \"const fs=require('fs'); fs.rmSync('dist',{recursive:true,force:true}); fs.rmSync('dist-tests',{recursive:true,force:true});\"","build:cjs":"tsc -p tsconfig.cjs.json && node -e \"const fs=require('fs'); const path=require('path'); function walk(dir){ for(const entry of fs.readdirSync(dir,{withFileTypes:true})){ const full=path.join(dir,entry.name); if(entry.isDirectory()) walk(full); else if(entry.isFile() && full.endsWith('.js')) fs.renameSync(full, full.slice(0,-3)+'.cjs'); }} if(fs.existsSync('dist/cjs')) walk('dist/cjs');\"","build:esm":"tsc -p tsconfig.esm.json","build:tests":"tsc -p tsconfig.tests.json"},"_npmUser":{"name":"darksol","email":"chris00claw@gmail.com"},"_npmVersion":"11.8.0","description":"Zero-config function-level structured logging for Node.js and TypeScript","directories":{},"sideEffects":false,"_nodeVersion":"24.13.1","_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.8.2","@types/node":"^22.13.10"},"_npmOperationalInternal":{"tmp":"tmp/logpilot_1.0.0_1772251504579_0.2479948106643881","host":"s3://npm-registry-packages-npm-production"}},"1.0.2":{"name":"@darksol/logpilot","version":"1.0.2","description":"Zero-config function-level structured logging for JavaScript and TypeScript services.","author":{"name":"darksol"},"license":"MIT","type":"module","main":"./dist/cjs/index.cjs","module":"./dist/esm/index.js","types":"./dist/esm/index.d.ts","exports":{".":{"types":"./dist/esm/index.d.ts","import":"./dist/esm/index.js","require":"./dist/cjs/index.cjs"}},"sideEffects":false,"engines":{"node":">=18"},"repository":{"type":"git","url":"git+https://github.com/darks0l/logpilot.git"},"homepage":"https://github.com/darks0l/logpilot#readme","bugs":{"url":"https://github.com/darks0l/logpilot/issues"},"scripts":{"clean":"node -e \"const fs=require('fs'); fs.rmSync('dist',{recursive:true,force:true}); fs.rmSync('dist-tests',{recursive:true,force:true});\"","build:esm":"tsc -p tsconfig.esm.json","build:cjs":"tsc -p tsconfig.cjs.json && node -e \"const fs=require('fs'); const path=require('path'); function walk(dir){ for(const entry of fs.readdirSync(dir,{withFileTypes:true})){ const full=path.join(dir,entry.name); if(entry.isDirectory()) walk(full); else if(entry.isFile() && full.endsWith('.js')) fs.renameSync(full, full.slice(0,-3)+'.cjs'); }} if(fs.existsSync('dist/cjs')) walk('dist/cjs');\"","build":"npm run clean && npm run build:esm && npm run build:cjs","build:tests":"tsc -p tsconfig.tests.json","test":"npm run build:tests && node --test \"dist-tests/tests/*.test.js\""},"devDependencies":{"@types/node":"^22.13.10","typescript":"^5.8.2"},"gitHead":"7fbe872d782358c7565caa1cc511523f77d2c529","_id":"@darksol/logpilot@1.0.2","_nodeVersion":"24.13.1","_npmVersion":"11.8.0","dist":{"integrity":"sha512-ZbLYbf1bHmz6BBG4FLMmCEe/eNTpglYZA5UAmvgWlU81srzTUnDulOoc/V36DUiiQkmlS2S/QZHraCuQdlv3kw==","shasum":"e59c7510b89e0e673f0ed441976709bfba13a702","tarball":"https://registry.npmjs.org/@darksol/logpilot/-/logpilot-1.0.2.tgz","fileCount":52,"unpackedSize":76310,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIQCF9t1rbHMtLxp0AInWIluc/Xe7LCQGLmp1bxeaErUkmgIgW7ZuHbIdyL8TUMoSVpS558aMgu3l+qixrNs0LptbfPg="}]},"_npmUser":{"name":"darksol","email":"chris00claw@gmail.com"},"directories":{},"maintainers":[{"name":"darksol","email":"chris00claw@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/logpilot_1.0.2_1772891875377_0.3108438223139518"},"_hasShrinkwrap":false}},"time":{"created":"2026-02-28T04:05:04.489Z","modified":"2026-03-07T13:57:55.644Z","1.0.0":"2026-02-28T04:05:04.734Z","1.0.2":"2026-03-07T13:57:55.518Z"},"author":{"name":"darksol"},"license":"MIT","description":"Zero-config function-level structured logging for JavaScript and TypeScript services.","maintainers":[{"name":"darksol","email":"chris00claw@gmail.com"}],"readme":"<p align=\"center\">\r\n  <img src=\"assets/darksol-banner.png\" alt=\"DARKSOL\" width=\"600\" />\r\n</p>\r\n\r\n<h3 align=\"center\">Built by DARKSOL ??</h3>\r\n<p align=\"center\">\r\n  <img src=\"./assets/darksol-logo.png\" alt=\"DARKSOL\" width=\"140\" />\r\n</p>\r\n\r\n# logpilot\r\n\r\nZero-config function-level structured logging for JavaScript and TypeScript services.\r\n\r\n[![npm version](https://img.shields.io/npm/v/%40darksol%2Flogpilot)](https://www.npmjs.com/package/@darksol/logpilot)\r\n[![license: MIT](https://img.shields.io/badge/license-MIT-blue.svg)](./LICENSE)\r\n[![node >=18](https://img.shields.io/badge/node-%3E%3D18-339933.svg)](https://nodejs.org)\r\n\r\n## Why this exists\r\n\r\nMost app logs are either too noisy or not structured enough to debug production issues quickly. `logpilot` wraps your functions and emits consistent events (args, duration, result/error, context) without forcing a logger migration.\r\n\r\n## What it does\r\n\r\n- Wraps sync/async functions with structured success/error events\r\n- Adds timestamps, duration, and function metadata automatically\r\n- Supports redaction of sensitive keys (`password`, `token`, etc.)\r\n- Offers global config + scoped child loggers\r\n- Includes Express/Fastify-compatible middleware helper\r\n- Can wrap object/class methods for bulk instrumentation\r\n\r\n## Quickstart\r\n\r\n```bash\r\nnpm install @darksol/logpilot\r\n```\r\n\r\n```ts\r\nimport { pilot } from \"@darksol/logpilot\";\r\n\r\npilot.configure({\r\n  level: \"info\",\r\n  format: \"auto\",\r\n  context: { service: \"billing-api\" }\r\n});\r\n\r\nconst sum = pilot((a: number, b: number) => a + b);\r\nconst result = await sum(2, 3);\r\n```\r\n\r\n## Real examples\r\n\r\n```ts\r\nimport { pilot } from \"@darksol/logpilot\";\r\n\r\nconst getUser = pilot(async (id: string) => ({ id, role: \"admin\" }));\r\nawait getUser(\"u_1\");\r\n\r\nconst reqLog = pilot.child({ requestId: \"req-42\" });\r\nreqLog.info(\"request started\", { route: \"/users/:id\" });\r\n```\r\n\r\n```ts\r\n// Wrap methods on an existing object\r\nclass Service {\r\n  getOrder(id: string) {\r\n    return { id, status: \"ok\" };\r\n  }\r\n}\r\n\r\nconst service = pilot.wrap(new Service());\r\nservice.getOrder(\"o_100\");\r\n```\r\n\r\n## Config / options\r\n\r\n| Option | Type | Default | Description |\r\n|---|---|---|---|\r\n| `level` | `\"debug\" \\| \"info\" \\| \"warn\" \\| \"error\"` | `\"info\"` | Minimum log level |\r\n| `format` | `\"auto\" \\| \"pretty\" \\| \"json\"` | `\"auto\"` | Output format (`auto` picks pretty unless `NODE_ENV=production`) |\r\n| `output` | logger-like object | `console` | Destination with `info/warn/error/debug/log` or `.write()` |\r\n| `redact` | `string[]` | sensible defaults | Case-insensitive key masking list |\r\n| `context` | `Record<string, unknown>` | `{}` | Global fields merged into each event |\r\n| `onError` | callback | `undefined` | Hook invoked when wrapper/middleware catches errors |\r\n| `silent` | `boolean` | `false` | Disable log output entirely |\r\n\r\n## Architecture / flow\r\n\r\n1. `pilot(fn)` creates a thin wrapper around your function.\r\n2. On invocation, it captures start time + context.\r\n3. On success/failure, it emits one structured event with metadata.\r\n4. Formatter renders event as pretty text or JSON.\r\n5. Output is written to configured destination.\r\n\r\n## Benchmarks / perf notes\r\n\r\n`logpilot` is intentionally lightweight (zero runtime dependencies). It adds small wrapper overhead from timing, serialization, and output I/O. For latency-sensitive paths, prefer JSON output and conservative payload sizes.\r\n\r\n## Limitations + roadmap\r\n\r\n### Current limitations\r\n\r\n- No built-in log shipping (expects host platform/collector)\r\n- Redaction is key-based (not full PII detection)\r\n- Middleware helper targets common Express/Fastify request shapes\r\n\r\n### Roadmap\r\n\r\n- Optional custom serializer hooks\r\n- Additional middleware adapters with typed helpers\r\n- Extended docs for high-throughput production setups\r\n\r\n## License + links\r\n\r\n- License: [MIT](./LICENSE)\r\n- Changelog: [CHANGELOG.md](./CHANGELOG.md)\r\n- npm: <https://www.npmjs.com/package/@darksol/logpilot>\r\n- Issues: <https://github.com/darks0l/logpilot/issues>\r\n","readmeFilename":"README.md","homepage":"https://github.com/darks0l/logpilot#readme","repository":{"type":"git","url":"git+https://github.com/darks0l/logpilot.git"},"bugs":{"url":"https://github.com/darks0l/logpilot/issues"}}