{"_id":"@bymax-one/nest-logger","_rev":"22-e9c89cb9d1d48869dc632d6c323d27eb","name":"@bymax-one/nest-logger","dist-tags":{"latest":"1.4.0"},"versions":{"1.0.0":{"name":"@bymax-one/nest-logger","version":"1.0.0","keywords":["nestjs","logger","pino","json-logging","structured-logging","opentelemetry","observability","tracing","request-id","pii-redaction"],"author":{"name":"Bymax One","email":"support@bymax.one"},"license":"MIT","_id":"@bymax-one/nest-logger@1.0.0","maintainers":[{"name":"bymax.one","email":"bymaxone.core@gmail.com"},{"name":"msalvatti","email":"msalvatti@gmail.com"}],"homepage":"https://github.com/bymaxone/nest-logger#readme","bugs":{"url":"https://github.com/bymaxone/nest-logger/issues"},"dist":{"shasum":"6553343f1599e330ee85014bbf1599aa7bbbd469","tarball":"https://registry.npmjs.org/@bymax-one/nest-logger/-/nest-logger-1.0.0.tgz","fileCount":12,"integrity":"sha512-EGwOEWmexhuv799TREC6ZARK/+tp18t5JqviFqvSGhhqXnikESCVhqH6z+QqnpasY3DjEJnEgoYshYBpAHD5hw==","signatures":[{"sig":"MEYCIQDv3qU9Mh7Y0JiDVY9Xhg/A3eRGHDl5faUHAjjxuTE+2AIhAIRvwiBLsWP520CV2bmqmPEZGy7qI5x/vkNaA4RC7iGI","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":245808},"type":"module","_from":"file:bymax-one-nest-logger-1.0.0.tgz","engines":{"node":">=24.0.0"},"exports":{".":{"types":"./dist/server/index.d.ts","import":"./dist/server/index.mjs","require":"./dist/server/index.cjs"},"./shared":{"types":"./dist/shared/index.d.ts","import":"./dist/shared/index.mjs","require":"./dist/shared/index.cjs"}},"scripts":{"lint":"eslint src","size":"node scripts/check-size.mjs","test":"jest","bench":"node --expose-gc --import tsx bench/throughput.bench.ts","build":"pnpm clean && tsup","clean":"rm -rf dist coverage","release":"pnpm publish --provenance","lint:fix":"eslint src --fix","mutation":"stryker run","test:all":"pnpm test && pnpm test:e2e","test:cov":"jest --coverage","test:e2e":"jest --config jest.e2e.config.ts","typecheck":"tsc --noEmit && tsc --noEmit -p tsconfig.server.json","test:watch":"jest --watch","test:cov:all":"jest --config jest.coverage.config.ts --coverage","mutation:dry-run":"stryker run --dryRunOnly","mutation:incremental":"stryker run --incremental"},"_npmUser":{"name":"bymax.one","email":"bymaxone.core@gmail.com"},"_resolved":"/private/var/folders/zf/_zr7t0ms60x6rcwj5zxk90cr0000gn/T/9a0ae24ae7a6173e2b7cfc3954a10c98/bymax-one-nest-logger-1.0.0.tgz","_integrity":"sha512-EGwOEWmexhuv799TREC6ZARK/+tp18t5JqviFqvSGhhqXnikESCVhqH6z+QqnpasY3DjEJnEgoYshYBpAHD5hw==","repository":{"url":"git+https://github.com/bymaxone/nest-logger.git","type":"git"},"_npmVersion":"11.13.0","description":"Structured JSON logging for NestJS based on Pino 10, with optional OpenTelemetry correlation.","directories":{},"lint-staged":{"*.{json,md,yml,yaml}":["prettier --write"],"*.{ts,tsx,js,mjs,cjs}":["eslint --fix","prettier --write"]},"sideEffects":false,"_nodeVersion":"24.16.0","dependencies":{},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.19.2","jest":"^30.4.2","pino":"^10.0.0","rxjs":"^7.8.0","tsup":"^8.5.1","husky":"^9.1.7","eslint":"^9.39.4","globals":"^17.6.0","ts-jest":"^29.4.9","ts-node":"^10.9.2","prettier":"^3.8.3","supertest":"^7.2.2","tinybench":"^6.0.2","@eslint/js":"^9.39.4","typescript":"^5.9.3","@types/jest":"^30.0.0","@types/node":"^25","lint-staged":"^17.0.7","pino-pretty":"^13.0.0","@nestjs/core":"^11.1.20","@nestjs/common":"^11.1.20","@types/express":"^5.0.6","@commitlint/cli":"^21.0.2","@nestjs/testing":"^11.1.20","@types/supertest":"^7.2.0","reflect-metadata":"^0.2.2","@opentelemetry/api":"^1.9.0","eslint-plugin-import":"^2.32.0","@stryker-mutator/core":"^9","eslint-config-prettier":"^10.1.8","eslint-plugin-prettier":"^5.5.5","eslint-plugin-security":"^4.0.0","@nestjs/platform-express":"^11.1.20","@typescript-eslint/parser":"^8.59.3","@stryker-mutator/jest-runner":"^9","@commitlint/config-conventional":"^21.0.2","@typescript-eslint/eslint-plugin":"^8.59.3","eslint-import-resolver-typescript":"^4.4.4","@stryker-mutator/typescript-checker":"^9"},"peerDependencies":{"pino":"^10.0.0","rxjs":"^7.8.0","pino-pretty":"^13.0.0","@nestjs/core":"^11.0.0","@nestjs/common":"^11.0.0","reflect-metadata":"^0.2.0","@opentelemetry/api":"^1.9.0"},"peerDependenciesMeta":{"pino-pretty":{"optional":true},"@opentelemetry/api":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/nest-logger_1.0.0_1781788222395_0.4564622102153746","host":"s3://npm-registry-packages-npm-production"}},"1.0.1":{"name":"@bymax-one/nest-logger","version":"1.0.1","keywords":["nestjs","logger","pino","json-logging","structured-logging","opentelemetry","observability","tracing","request-id","pii-redaction"],"author":{"name":"Bymax One","email":"support@bymax.one"},"license":"MIT","_id":"@bymax-one/nest-logger@1.0.1","maintainers":[{"name":"bymax.one","email":"bymaxone.core@gmail.com"},{"name":"msalvatti","email":"msalvatti@gmail.com"}],"homepage":"https://github.com/bymaxone/nest-logger#readme","bugs":{"url":"https://github.com/bymaxone/nest-logger/issues"},"dist":{"shasum":"97fda87cc44832d7f76b7cc942e6b870bba3e62a","tarball":"https://registry.npmjs.org/@bymax-one/nest-logger/-/nest-logger-1.0.1.tgz","fileCount":12,"integrity":"sha512-dqaQns73ZdGzl02oy8LUrBReuzO2Gn9ds1OCbQOIvdaigUbvQasIkqjOF03C9dxJTtP+pSCA9On66iQYRQs/Uw==","signatures":[{"sig":"MEYCIQDKV6SesgR/6Icy5aCIRTBDV6K3TIzyt9Bccdhu0XOqwgIhAJvwkxNi75HJk4W8J6JlFioePwTTzpyU9pgUH+hCTN8Q","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@bymax-one%2fnest-logger@1.0.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":247305},"type":"module","_from":"file:bymax-one-nest-logger-1.0.1.tgz","engines":{"node":">=24.0.0"},"exports":{".":{"types":"./dist/server/index.d.ts","import":"./dist/server/index.mjs","require":"./dist/server/index.cjs"},"./shared":{"types":"./dist/shared/index.d.ts","import":"./dist/shared/index.mjs","require":"./dist/shared/index.cjs"}},"scripts":{"lint":"eslint src","size":"node scripts/check-size.mjs","test":"jest","bench":"node --expose-gc --import tsx bench/throughput.bench.ts","build":"pnpm clean && tsup","clean":"rm -rf dist coverage","release":"pnpm publish --provenance","lint:fix":"eslint src --fix","mutation":"stryker run","test:all":"pnpm test && pnpm test:e2e","test:cov":"jest --coverage","test:e2e":"jest --config jest.e2e.config.ts","typecheck":"tsc --noEmit && tsc --noEmit -p tsconfig.server.json","test:watch":"jest --watch","test:cov:all":"jest --config jest.coverage.config.ts --coverage","mutation:dry-run":"stryker run --dryRunOnly","mutation:incremental":"stryker run --incremental"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:ba0cbcf9-3a81-42eb-b5b3-aadccdb90f58"}},"_resolved":"/tmp/82e3f4d8664ed6daa4580a4fa8fd8e04/bymax-one-nest-logger-1.0.1.tgz","_integrity":"sha512-dqaQns73ZdGzl02oy8LUrBReuzO2Gn9ds1OCbQOIvdaigUbvQasIkqjOF03C9dxJTtP+pSCA9On66iQYRQs/Uw==","repository":{"url":"git+https://github.com/bymaxone/nest-logger.git","type":"git"},"_npmVersion":"11.16.0","description":"Structured JSON logging for NestJS based on Pino 10, with optional OpenTelemetry correlation.","directories":{},"lint-staged":{"*.{json,md,yml,yaml}":["prettier --write"],"*.{ts,tsx,js,mjs,cjs}":["eslint --fix","prettier --write"]},"sideEffects":false,"_nodeVersion":"24.18.0","dependencies":{},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.19.2","jest":"^30.4.2","pino":"^10.0.0","rxjs":"^7.8.0","tsup":"^8.5.1","husky":"^9.1.7","eslint":"^9.39.4","globals":"^17.6.0","ts-jest":"^29.4.9","ts-node":"^10.9.2","prettier":"^3.8.3","supertest":"^7.2.2","tinybench":"^6.0.2","@eslint/js":"^9.39.4","typescript":"^5.9.3","@types/jest":"^30.0.0","@types/node":"^26","lint-staged":"^17.0.7","pino-pretty":"^13.0.0","@nestjs/core":"^11.1.20","@nestjs/common":"^11.1.20","@types/express":"^5.0.6","@commitlint/cli":"^21.0.2","@nestjs/testing":"^11.1.20","@types/supertest":"^7.2.0","reflect-metadata":"^0.2.2","@opentelemetry/api":"^1.9.0","eslint-plugin-import":"^2.32.0","@stryker-mutator/core":"^9","eslint-config-prettier":"^10.1.8","eslint-plugin-prettier":"^5.5.5","eslint-plugin-security":"^4.0.0","@nestjs/platform-express":"^11.1.20","@typescript-eslint/parser":"^8.59.3","@stryker-mutator/jest-runner":"^9","@commitlint/config-conventional":"^21.0.2","@typescript-eslint/eslint-plugin":"^8.59.3","eslint-import-resolver-typescript":"^4.4.4","@stryker-mutator/typescript-checker":"^9"},"peerDependencies":{"pino":"^10.0.0","rxjs":"^7.8.0","pino-pretty":"^13.0.0","@nestjs/core":"^11.0.0","@nestjs/common":"^11.0.0","reflect-metadata":"^0.2.0","@opentelemetry/api":"^1.9.0"},"peerDependenciesMeta":{"pino-pretty":{"optional":true},"@opentelemetry/api":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/nest-logger_1.0.1_1785344385067_0.34169760268263416","host":"s3://npm-registry-packages-npm-production"}},"1.0.2":{"name":"@bymax-one/nest-logger","version":"1.0.2","keywords":["nestjs","logger","pino","json-logging","structured-logging","opentelemetry","observability","tracing","request-id","pii-redaction"],"author":{"name":"Bymax One","email":"support@bymax.one"},"license":"MIT","_id":"@bymax-one/nest-logger@1.0.2","maintainers":[{"name":"bymax.one","email":"bymaxone.core@gmail.com"},{"name":"msalvatti","email":"msalvatti@gmail.com"}],"homepage":"https://github.com/bymaxone/nest-logger#readme","bugs":{"url":"https://github.com/bymaxone/nest-logger/issues"},"dist":{"shasum":"1fd5c8ece35400671acfb0641e81fb895b43ee80","tarball":"https://registry.npmjs.org/@bymax-one/nest-logger/-/nest-logger-1.0.2.tgz","fileCount":12,"integrity":"sha512-ZzMKdBwAxy9RhAUutAvsq3C6+ASGcBNLRg+Qquee71FshXooQs/AQoaNVSvx4kcPgL7CSr6HvuZaXH2dWTW37g==","signatures":[{"sig":"MEUCIDOa/vnzrvAevJKZRVBS78Mq2pSlfEi39cLgopuL0W3PAiEA8fGO3umRaoY6uqw0aVq59MqcqUF0UG6ypYQC9vVVf0s=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@bymax-one%2fnest-logger@1.0.2","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":260145},"main":"./dist/server/index.cjs","type":"module","_from":"file:bymax-one-nest-logger-1.0.2.tgz","types":"./dist/server/index.d.cts","module":"./dist/server/index.mjs","engines":{"node":">=24.0.0"},"exports":{".":{"import":{"types":"./dist/server/index.d.ts","default":"./dist/server/index.mjs"},"require":{"types":"./dist/server/index.d.cts","default":"./dist/server/index.cjs"}},"./shared":{"import":{"types":"./dist/shared/index.d.ts","default":"./dist/shared/index.mjs"},"require":{"types":"./dist/shared/index.d.cts","default":"./dist/shared/index.cjs"}},"./package.json":"./package.json"},"scripts":{"lint":"eslint src","size":"node scripts/check-size.mjs","test":"jest","bench":"node --expose-gc --import tsx bench/throughput.bench.ts","build":"pnpm clean && tsup","clean":"rm -rf dist coverage","release":"pnpm publish --provenance","lint:fix":"eslint src --fix","mutation":"stryker run","test:all":"pnpm test && pnpm test:e2e","test:cov":"jest --coverage","test:e2e":"jest --config jest.e2e.config.ts","typecheck":"tsc --noEmit && tsc --noEmit -p tsconfig.server.json","test:watch":"jest --watch","test:cov:all":"jest --config jest.coverage.config.ts --coverage","check:exports":"attw --pack .","mutation:dry-run":"stryker run --dryRunOnly","mutation:incremental":"stryker run --incremental"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:ba0cbcf9-3a81-42eb-b5b3-aadccdb90f58"}},"_resolved":"/tmp/fdc6c600fe944a1f7cc8765dc51929cb/bymax-one-nest-logger-1.0.2.tgz","_integrity":"sha512-ZzMKdBwAxy9RhAUutAvsq3C6+ASGcBNLRg+Qquee71FshXooQs/AQoaNVSvx4kcPgL7CSr6HvuZaXH2dWTW37g==","repository":{"url":"git+https://github.com/bymaxone/nest-logger.git","type":"git"},"_npmVersion":"11.16.0","description":"Structured JSON logging for NestJS based on Pino 10, with optional OpenTelemetry correlation.","directories":{},"lint-staged":{"*.{json,md,yml,yaml}":["prettier --write"],"*.{ts,tsx,js,mjs,cjs}":["eslint --fix","prettier --write"]},"sideEffects":false,"_nodeVersion":"24.18.0","dependencies":{},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"typesVersions":{"*":{"shared":["./dist/shared/index.d.cts"]}},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.19.2","jest":"^30.4.2","pino":"^10.0.0","rxjs":"^7.8.0","tsup":"^8.5.1","husky":"^9.1.7","eslint":"^9.39.4","globals":"^17.6.0","ts-jest":"^29.4.9","ts-node":"^10.9.2","prettier":"^3.8.3","supertest":"^7.2.2","tinybench":"^6.0.2","@eslint/js":"^9.39.4","typescript":"^5.9.3","@types/jest":"^30.0.0","@types/node":"^26","lint-staged":"^17.0.7","pino-pretty":"^13.0.0","@nestjs/core":"^11.1.20","@nestjs/common":"^11.1.20","@types/express":"^5.0.6","@commitlint/cli":"^21.0.2","@nestjs/testing":"^11.1.20","@types/supertest":"^7.2.0","reflect-metadata":"^0.2.2","@opentelemetry/api":"^1.9.0","eslint-plugin-import":"^2.32.0","@arethetypeswrong/cli":"^0.18.5","@stryker-mutator/core":"^9","eslint-config-prettier":"^10.1.8","eslint-plugin-prettier":"^5.5.5","eslint-plugin-security":"^4.0.0","@nestjs/platform-express":"^11.1.20","@typescript-eslint/parser":"^8.59.3","@stryker-mutator/jest-runner":"^9","@commitlint/config-conventional":"^21.0.2","@typescript-eslint/eslint-plugin":"^8.59.3","eslint-import-resolver-typescript":"^4.4.4","@stryker-mutator/typescript-checker":"^9"},"peerDependencies":{"pino":"^10.0.0","rxjs":"^7.8.0","pino-pretty":"^13.0.0","@nestjs/core":"^11.0.0","@nestjs/common":"^11.0.0","reflect-metadata":"^0.2.0","@opentelemetry/api":"^1.9.0"},"peerDependenciesMeta":{"pino-pretty":{"optional":true},"@opentelemetry/api":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/nest-logger_1.0.2_1785370892732_0.45887721762189826","host":"s3://npm-registry-packages-npm-production"}},"1.0.3":{"name":"@bymax-one/nest-logger","version":"1.0.3","keywords":["nestjs","logger","pino","json-logging","structured-logging","opentelemetry","observability","tracing","request-id","pii-redaction"],"author":{"name":"Bymax One","email":"support@bymax.one"},"license":"MIT","_id":"@bymax-one/nest-logger@1.0.3","maintainers":[{"name":"bymax.one","email":"bymaxone.core@gmail.com"},{"name":"msalvatti","email":"msalvatti@gmail.com"}],"homepage":"https://github.com/bymaxone/nest-logger#readme","bugs":{"url":"https://github.com/bymaxone/nest-logger/issues"},"dist":{"shasum":"9e636bac25f9b5a8ea57f78a592ef32909d0c85f","tarball":"https://registry.npmjs.org/@bymax-one/nest-logger/-/nest-logger-1.0.3.tgz","fileCount":12,"integrity":"sha512-Ukvhua1AEWfnbQc7fm6GxE8H8i0uDWij8ke+HbfgnWi9tSDPXTzKWjyaFRL9L/m+XtsFpCi3E4+DkWln+cFmew==","signatures":[{"sig":"MEUCIDZHS27Ap0eteC3CNt0qFaPV1kWqkNg8No9cjqib+B7fAiEA5Ip3Hq4ZjUxvrab8j8qM8VnG+77mrHihmC/3HMHK2p8=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@bymax-one%2fnest-logger@1.0.3","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":261921},"main":"./dist/server/index.cjs","type":"module","_from":"file:bymax-one-nest-logger-1.0.3.tgz","types":"./dist/server/index.d.cts","module":"./dist/server/index.mjs","engines":{"node":">=24.0.0"},"exports":{".":{"import":{"types":"./dist/server/index.d.ts","default":"./dist/server/index.mjs"},"require":{"types":"./dist/server/index.d.cts","default":"./dist/server/index.cjs"}},"./shared":{"import":{"types":"./dist/shared/index.d.ts","default":"./dist/shared/index.mjs"},"require":{"types":"./dist/shared/index.d.cts","default":"./dist/shared/index.cjs"}},"./package.json":"./package.json"},"scripts":{"lint":"eslint src","size":"node scripts/check-size.mjs","test":"jest","bench":"node --expose-gc --import tsx bench/throughput.bench.ts","build":"pnpm clean && tsup","clean":"rm -rf dist coverage","release":"pnpm publish --provenance","lint:fix":"eslint src --fix","mutation":"stryker run","test:all":"pnpm test && pnpm test:e2e","test:cov":"jest --coverage","test:e2e":"jest --config jest.e2e.config.ts","typecheck":"tsc --noEmit && tsc --noEmit -p tsconfig.server.json","test:watch":"jest --watch","test:cov:all":"jest --config jest.coverage.config.ts --coverage","check:exports":"attw --pack .","mutation:dry-run":"stryker run --dryRunOnly","mutation:incremental":"stryker run --incremental"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:ba0cbcf9-3a81-42eb-b5b3-aadccdb90f58"}},"_resolved":"/tmp/4f67a2b3a1da1f0d6e09ece4b57e8a4a/bymax-one-nest-logger-1.0.3.tgz","_integrity":"sha512-Ukvhua1AEWfnbQc7fm6GxE8H8i0uDWij8ke+HbfgnWi9tSDPXTzKWjyaFRL9L/m+XtsFpCi3E4+DkWln+cFmew==","repository":{"url":"git+https://github.com/bymaxone/nest-logger.git","type":"git"},"_npmVersion":"11.16.0","description":"Structured JSON logging for NestJS based on Pino 10, with optional OpenTelemetry correlation.","directories":{},"lint-staged":{"*.{json,md,yml,yaml}":["prettier --write"],"*.{ts,tsx,js,mjs,cjs}":["eslint --fix","prettier --write"]},"sideEffects":false,"_nodeVersion":"24.18.0","dependencies":{},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"typesVersions":{"*":{"shared":["./dist/shared/index.d.cts"]}},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.19.2","jest":"^30.4.2","pino":"^10.0.0","rxjs":"^7.8.0","tsup":"^8.5.1","husky":"^9.1.7","eslint":"^9.39.4","globals":"^17.6.0","ts-jest":"^29.4.9","ts-node":"^10.9.2","prettier":"^3.8.3","supertest":"^7.2.2","tinybench":"^6.0.2","@eslint/js":"^9.39.4","typescript":"^5.9.3","@types/jest":"^30.0.0","@types/node":"^26","lint-staged":"^17.0.7","pino-pretty":"^13.0.0","@nestjs/core":"^11.1.20","@nestjs/common":"^11.1.20","@types/express":"^5.0.6","@commitlint/cli":"^21.0.2","@nestjs/testing":"^11.1.20","@types/supertest":"^7.2.0","reflect-metadata":"^0.2.2","@opentelemetry/api":"^1.9.0","eslint-plugin-import":"^2.32.0","@arethetypeswrong/cli":"^0.18.5","@stryker-mutator/core":"^9","eslint-config-prettier":"^10.1.8","eslint-plugin-prettier":"^5.5.5","eslint-plugin-security":"^4.0.0","@nestjs/platform-express":"^11.1.20","@typescript-eslint/parser":"^8.59.3","@stryker-mutator/jest-runner":"^9","@commitlint/config-conventional":"^21.0.2","@typescript-eslint/eslint-plugin":"^8.59.3","eslint-import-resolver-typescript":"^4.4.4","@stryker-mutator/typescript-checker":"^9"},"peerDependencies":{"pino":"^10.0.0","rxjs":"^7.8.0","pino-pretty":"^13.0.0","@nestjs/core":"^11.0.0","@nestjs/common":"^11.0.0","@types/express":"^4.17.21 || ^5.0.0","reflect-metadata":"^0.2.0","@opentelemetry/api":"^1.9.0"},"peerDependenciesMeta":{"pino-pretty":{"optional":true},"@types/express":{"optional":true},"@opentelemetry/api":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/nest-logger_1.0.3_1785372014019_0.23143087368023685","host":"s3://npm-registry-packages-npm-production"}},"1.0.4":{"name":"@bymax-one/nest-logger","version":"1.0.4","keywords":["nestjs","logger","pino","json-logging","structured-logging","opentelemetry","observability","tracing","request-id","pii-redaction"],"author":{"name":"Bymax One","email":"support@bymax.one"},"license":"MIT","_id":"@bymax-one/nest-logger@1.0.4","maintainers":[{"name":"bymax.one","email":"bymaxone.core@gmail.com"},{"name":"msalvatti","email":"msalvatti@gmail.com"}],"homepage":"https://github.com/bymaxone/nest-logger#readme","bugs":{"url":"https://github.com/bymaxone/nest-logger/issues"},"dist":{"shasum":"48ff5d9e838b511b182c047dc0e491f3ca58671c","tarball":"https://registry.npmjs.org/@bymax-one/nest-logger/-/nest-logger-1.0.4.tgz","fileCount":12,"integrity":"sha512-zh6rlX0I7nR/JE5OyQhVleM8s0hKRhUGmwRpcohXnx8RHlkwraTSeGH0rYws3mkq+Ru9fZLtdclzsjkorJRqPQ==","signatures":[{"sig":"MEQCIATZuBA/xKLTOfUfm/0pJ0n27StdFFZcY/Bc/mm0VYJzAiAOQX2WnthtuZhmElxksOb0zghPuUbu6zj/f1iWb6tMkg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@bymax-one%2fnest-logger@1.0.4","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":269452},"main":"./dist/server/index.cjs","type":"module","_from":"file:bymax-one-nest-logger-1.0.4.tgz","types":"./dist/server/index.d.cts","module":"./dist/server/index.mjs","engines":{"node":">=24.0.0"},"exports":{".":{"import":{"types":"./dist/server/index.d.ts","default":"./dist/server/index.mjs"},"require":{"types":"./dist/server/index.d.cts","default":"./dist/server/index.cjs"}},"./shared":{"import":{"types":"./dist/shared/index.d.ts","default":"./dist/shared/index.mjs"},"require":{"types":"./dist/shared/index.d.cts","default":"./dist/shared/index.cjs"}},"./package.json":"./package.json"},"scripts":{"lint":"eslint src","size":"node scripts/check-size.mjs","test":"jest","bench":"node --expose-gc --import tsx bench/throughput.bench.ts","build":"pnpm clean && tsup","clean":"rm -rf dist coverage","release":"pnpm publish --provenance","lint:fix":"eslint src --fix","mutation":"stryker run","test:all":"pnpm test && pnpm test:e2e","test:cov":"jest --coverage","test:e2e":"jest --config jest.e2e.config.ts","typecheck":"tsc --noEmit && tsc --noEmit -p tsconfig.server.json","test:watch":"jest --watch","test:cov:all":"jest --config jest.coverage.config.ts --coverage","check:exports":"attw --pack .","mutation:dry-run":"stryker run --dryRunOnly","mutation:incremental":"stryker run --incremental"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:ba0cbcf9-3a81-42eb-b5b3-aadccdb90f58"}},"_resolved":"/tmp/893029f16949646d73b248496646532f/bymax-one-nest-logger-1.0.4.tgz","_integrity":"sha512-zh6rlX0I7nR/JE5OyQhVleM8s0hKRhUGmwRpcohXnx8RHlkwraTSeGH0rYws3mkq+Ru9fZLtdclzsjkorJRqPQ==","repository":{"url":"git+https://github.com/bymaxone/nest-logger.git","type":"git"},"_npmVersion":"11.16.0","description":"Structured JSON logging for NestJS based on Pino 10, with optional OpenTelemetry correlation.","directories":{},"lint-staged":{"*.{json,md,yml,yaml}":["prettier --write"],"*.{ts,tsx,js,mjs,cjs}":["eslint --fix","prettier --write"]},"sideEffects":false,"_nodeVersion":"24.18.0","dependencies":{},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"typesVersions":{"*":{"shared":["./dist/shared/index.d.cts"]}},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.19.2","jest":"^30.4.2","pino":"^10.0.0","rxjs":"^7.8.0","tsup":"^8.5.1","husky":"^9.1.7","eslint":"^9.39.4","globals":"^17.6.0","ts-jest":"^29.4.9","ts-node":"^10.9.2","prettier":"^3.8.3","supertest":"^7.2.2","tinybench":"^6.0.2","@eslint/js":"^9.39.4","typescript":"^5.9.3","@types/jest":"^30.0.0","@types/node":"^26","lint-staged":"^17.0.7","pino-pretty":"^13.0.0","@nestjs/core":"^11.1.20","@nestjs/common":"^11.1.20","@types/express":"^5.0.6","@commitlint/cli":"^21.0.2","@nestjs/testing":"^11.1.20","@types/supertest":"^7.2.0","reflect-metadata":"^0.2.2","@opentelemetry/api":"^1.9.0","eslint-plugin-import":"^2.32.0","@arethetypeswrong/cli":"^0.18.5","@stryker-mutator/core":"^9","eslint-config-prettier":"^10.1.8","eslint-plugin-prettier":"^5.5.5","eslint-plugin-security":"^4.0.0","@nestjs/platform-express":"^11.1.20","@typescript-eslint/parser":"^8.59.3","@stryker-mutator/jest-runner":"^9","@commitlint/config-conventional":"^21.0.2","@typescript-eslint/eslint-plugin":"^8.59.3","eslint-import-resolver-typescript":"^4.4.4","@stryker-mutator/typescript-checker":"^9"},"peerDependencies":{"pino":"^10.0.0","rxjs":"^7.8.0","pino-pretty":"^13.0.0","@nestjs/core":"^11.0.0","@nestjs/common":"^11.0.0","reflect-metadata":"^0.2.0","@opentelemetry/api":"^1.9.0"},"peerDependenciesMeta":{"pino-pretty":{"optional":true},"@opentelemetry/api":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/nest-logger_1.0.4_1785405679784_0.21673011194585046","host":"s3://npm-registry-packages-npm-production"}},"1.0.5":{"name":"@bymax-one/nest-logger","version":"1.0.5","keywords":["nestjs","logger","pino","json-logging","structured-logging","opentelemetry","observability","tracing","request-id","pii-redaction"],"author":{"name":"Bymax One","email":"support@bymax.one"},"license":"MIT","_id":"@bymax-one/nest-logger@1.0.5","maintainers":[{"name":"bymax.one","email":"bymaxone.core@gmail.com"},{"name":"msalvatti","email":"msalvatti@gmail.com"}],"homepage":"https://github.com/bymaxone/nest-logger#readme","bugs":{"url":"https://github.com/bymaxone/nest-logger/issues"},"dist":{"shasum":"8f23fac1c5e82664f3872630d18999fe5d07072d","tarball":"https://registry.npmjs.org/@bymax-one/nest-logger/-/nest-logger-1.0.5.tgz","fileCount":12,"integrity":"sha512-SwPqA2zIlFO549mVe8Vpbqr+AcJO04zPwOEniP7b1+9lnIeJG9f02SsetjlavrhpDXjXf+kV/LkFFqKaKJNk1g==","signatures":[{"sig":"MEUCIQC9POHd2kpvsO52SgRMeYTt+s1fZuW/NYxXJCBgHcmE6wIgXLarfWc89MOIo+OhVLRwR1CbOU+xZwPIrJ4k7DKO+Wc=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@bymax-one%2fnest-logger@1.0.5","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":273572},"main":"./dist/server/index.cjs","type":"module","_from":"file:bymax-one-nest-logger-1.0.5.tgz","types":"./dist/server/index.d.cts","module":"./dist/server/index.mjs","engines":{"node":">=24.0.0"},"exports":{".":{"import":{"types":"./dist/server/index.d.ts","default":"./dist/server/index.mjs"},"require":{"types":"./dist/server/index.d.cts","default":"./dist/server/index.cjs"}},"./shared":{"import":{"types":"./dist/shared/index.d.ts","default":"./dist/shared/index.mjs"},"require":{"types":"./dist/shared/index.d.cts","default":"./dist/shared/index.cjs"}},"./package.json":"./package.json"},"scripts":{"lint":"eslint src","size":"node scripts/check-size.mjs","test":"jest","bench":"node --expose-gc --import tsx bench/throughput.bench.ts","build":"pnpm clean && tsup","clean":"rm -rf dist coverage","release":"pnpm publish --provenance","lint:fix":"eslint src --fix","mutation":"stryker run","test:all":"pnpm test && pnpm test:e2e","test:cov":"jest --coverage","test:e2e":"jest --config jest.e2e.config.ts","typecheck":"tsc --noEmit && tsc --noEmit -p tsconfig.server.json","test:watch":"jest --watch","test:cov:all":"jest --config jest.coverage.config.ts --coverage","check:exports":"attw --pack .","check:published":"node scripts/check-published-surface.mjs","mutation:dry-run":"stryker run --dryRunOnly","mutation:incremental":"stryker run --incremental"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:ba0cbcf9-3a81-42eb-b5b3-aadccdb90f58"}},"_resolved":"/tmp/b5adad6bce8103a27cf059640139dc4c/bymax-one-nest-logger-1.0.5.tgz","_integrity":"sha512-SwPqA2zIlFO549mVe8Vpbqr+AcJO04zPwOEniP7b1+9lnIeJG9f02SsetjlavrhpDXjXf+kV/LkFFqKaKJNk1g==","repository":{"url":"git+https://github.com/bymaxone/nest-logger.git","type":"git"},"_npmVersion":"11.16.0","description":"Structured JSON logging for NestJS based on Pino 10, with optional OpenTelemetry correlation.","directories":{},"lint-staged":{"*.{json,md,yml,yaml}":["prettier --write"],"*.{ts,tsx,js,mjs,cjs}":["eslint --fix","prettier --write"]},"sideEffects":false,"_nodeVersion":"24.18.0","dependencies":{},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"typesVersions":{"*":{"shared":["./dist/shared/index.d.cts"]}},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.19.2","jest":"^30.4.2","pino":"^10.0.0","rxjs":"^7.8.0","tsup":"^8.5.1","husky":"^9.1.7","eslint":"^9.39.4","globals":"^17.6.0","ts-jest":"^29.4.9","ts-node":"^10.9.2","prettier":"^3.8.3","supertest":"^7.2.2","tinybench":"^6.0.2","@eslint/js":"^9.39.4","typescript":"^5.9.3","@types/jest":"^30.0.0","@types/node":"^26","lint-staged":"^17.0.7","pino-pretty":"^13.0.0","@nestjs/core":"^11.1.20","@nestjs/common":"^11.1.20","@types/express":"^5.0.6","@commitlint/cli":"^21.0.2","@nestjs/testing":"^11.1.20","@types/supertest":"^7.2.0","reflect-metadata":"^0.2.2","@opentelemetry/api":"^1.9.0","eslint-plugin-import":"^2.32.0","@arethetypeswrong/cli":"^0.18.5","@stryker-mutator/core":"^9","eslint-config-prettier":"^10.1.8","eslint-plugin-prettier":"^5.5.5","eslint-plugin-security":"^4.0.0","@nestjs/platform-express":"^11.1.20","@typescript-eslint/parser":"^8.59.3","@stryker-mutator/jest-runner":"^9","@commitlint/config-conventional":"^21.0.2","@typescript-eslint/eslint-plugin":"^8.59.3","eslint-import-resolver-typescript":"^4.4.4","@stryker-mutator/typescript-checker":"^9"},"peerDependencies":{"pino":"^10.0.0","rxjs":"^7.8.0","pino-pretty":"^13.0.0","@nestjs/core":"^11.1.18","@nestjs/common":"^11.0.16","reflect-metadata":"^0.2.0","@opentelemetry/api":"^1.9.0"},"peerDependenciesMeta":{"pino-pretty":{"optional":true},"@opentelemetry/api":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/nest-logger_1.0.5_1785607080715_0.5551876219226146","host":"s3://npm-registry-packages-npm-production"}},"1.0.6":{"name":"@bymax-one/nest-logger","version":"1.0.6","keywords":["nestjs","logger","pino","json-logging","structured-logging","opentelemetry","observability","tracing","request-id","pii-redaction"],"author":{"name":"Bymax One","email":"support@bymax.one"},"license":"MIT","_id":"@bymax-one/nest-logger@1.0.6","maintainers":[{"name":"bymax.one","email":"bymaxone.core@gmail.com"},{"name":"msalvatti","email":"msalvatti@gmail.com"}],"homepage":"https://github.com/bymaxone/nest-logger#readme","bugs":{"url":"https://github.com/bymaxone/nest-logger/issues"},"dist":{"shasum":"3e4e3d336e2940ab16e4ca1944f3923f3b434882","tarball":"https://registry.npmjs.org/@bymax-one/nest-logger/-/nest-logger-1.0.6.tgz","fileCount":12,"integrity":"sha512-kH41axDw5ej488zu8JoD762KjsrFSC0Bg9N5cTCBWmbUE9yyE/IeJCdVTI3UgSNzeWsSpSH7jCXKDpOAltwCig==","signatures":[{"sig":"MEYCIQDTPpV9+VPmEjcB273HlegR34vDSAr+WyhIKsIFEqCTkQIhAOM/fBr47BMiNTQ8z45DwkRggG0A8iz1ZB1Tum0dHAcf","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@bymax-one%2fnest-logger@1.0.6","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":275028},"main":"./dist/server/index.cjs","type":"module","types":"./dist/server/index.d.cts","module":"./dist/server/index.mjs","engines":{"node":">=24.0.0"},"exports":{".":{"import":{"types":"./dist/server/index.d.ts","default":"./dist/server/index.mjs"},"require":{"types":"./dist/server/index.d.cts","default":"./dist/server/index.cjs"}},"./shared":{"import":{"types":"./dist/shared/index.d.ts","default":"./dist/shared/index.mjs"},"require":{"types":"./dist/shared/index.d.cts","default":"./dist/shared/index.cjs"}},"./package.json":"./package.json"},"gitHead":"8e9f8e22779b93c4e2a05e15ab495a36d644b766","scripts":{"lint":"eslint src","size":"node scripts/check-size.mjs","test":"jest","bench":"node --expose-gc --import tsx bench/throughput.bench.ts","build":"pnpm clean && tsup","clean":"rm -rf dist coverage","prepare":"husky","release":"npm publish --provenance --access public","lint:fix":"eslint src --fix","mutation":"stryker run","test:all":"pnpm test && pnpm test:e2e","test:cov":"jest --coverage","test:e2e":"jest --config jest.e2e.config.ts","typecheck":"tsc --noEmit && tsc --noEmit -p tsconfig.server.json","test:watch":"jest --watch","test:cov:all":"jest --config jest.coverage.config.ts --coverage","check:exports":"attw --pack .","prepublishOnly":"pnpm clean && pnpm typecheck && pnpm lint && pnpm test:cov:all && pnpm build && pnpm check:published","check:published":"node scripts/check-published-surface.mjs","mutation:dry-run":"stryker run --dryRunOnly","mutation:incremental":"stryker run --incremental"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:ba0cbcf9-3a81-42eb-b5b3-aadccdb90f58"}},"repository":{"url":"git+https://github.com/bymaxone/nest-logger.git","type":"git"},"_npmVersion":"11.16.0","description":"Structured JSON logging for NestJS based on Pino 10, with optional OpenTelemetry correlation.","directories":{},"lint-staged":{"*.{json,md,yml,yaml}":["prettier --write"],"*.{ts,tsx,js,mjs,cjs}":["eslint --fix","prettier --write"]},"sideEffects":false,"_nodeVersion":"24.18.0","dependencies":{},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"typesVersions":{"*":{"shared":["./dist/shared/index.d.cts"]}},"_hasShrinkwrap":false,"packageManager":"pnpm@11.20.0","devDependencies":{"tsx":"^4.19.2","jest":"^30.4.2","pino":"^10.0.0","rxjs":"^7.8.0","tsup":"^8.5.1","husky":"^9.1.7","eslint":"^9.39.4","globals":"^17.6.0","ts-jest":"^29.4.9","ts-node":"^10.9.2","prettier":"^3.8.3","supertest":"^7.2.2","tinybench":"^6.0.2","@eslint/js":"^9.39.4","typescript":"^5.9.3","@types/jest":"^30.0.0","@types/node":"^26","lint-staged":"^17.0.7","pino-pretty":"^13.0.0","@nestjs/core":"^11.1.20","@nestjs/common":"^11.1.20","@types/express":"^5.0.6","@commitlint/cli":"^21.0.2","@nestjs/testing":"^11.1.20","@types/supertest":"^7.2.0","reflect-metadata":"^0.2.2","@opentelemetry/api":"^1.9.0","eslint-plugin-import":"^2.32.0","@arethetypeswrong/cli":"^0.18.5","@stryker-mutator/core":"^9","eslint-config-prettier":"^10.1.8","eslint-plugin-prettier":"^5.5.5","eslint-plugin-security":"^4.0.0","@nestjs/platform-express":"^11.1.20","@typescript-eslint/parser":"^8.59.3","@stryker-mutator/jest-runner":"^9","@commitlint/config-conventional":"^21.0.2","@typescript-eslint/eslint-plugin":"^8.59.3","eslint-import-resolver-typescript":"^4.4.4","@stryker-mutator/typescript-checker":"^9"},"peerDependencies":{"pino":"^10.0.0","rxjs":"^7.8.0","pino-pretty":"^13.0.0","@nestjs/core":"^11.1.18","@nestjs/common":"^11.0.16","reflect-metadata":"^0.2.0","@opentelemetry/api":"^1.9.0"},"peerDependenciesMeta":{"pino-pretty":{"optional":true},"@opentelemetry/api":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/nest-logger_1.0.6_1786016011476_0.5279067786457619","host":"s3://npm-registry-packages-npm-production"}},"1.0.7":{"name":"@bymax-one/nest-logger","version":"1.0.7","keywords":["nestjs","logger","pino","json-logging","structured-logging","opentelemetry","observability","tracing","request-id","pii-redaction"],"author":{"name":"Bymax One","email":"support@bymax.one"},"license":"MIT","_id":"@bymax-one/nest-logger@1.0.7","maintainers":[{"name":"bymax.one","email":"bymaxone.core@gmail.com"},{"name":"msalvatti","email":"msalvatti@gmail.com"}],"homepage":"https://github.com/bymaxone/nest-logger#readme","bugs":{"url":"https://github.com/bymaxone/nest-logger/issues"},"dist":{"shasum":"b81a5304393a5cc8f7a36ca8126fb2c64429d25f","tarball":"https://registry.npmjs.org/@bymax-one/nest-logger/-/nest-logger-1.0.7.tgz","fileCount":12,"integrity":"sha512-zAnhFcIxUOgS2Oor4RDOsSk+zMBesjs/BVKzDtkpNTQpGDTNY7B4pseVxPSHWa8fEEDpBZxzZWXG0MLb9Y7g5g==","signatures":[{"sig":"MEQCIHcQ749AFoylqTVaL38ON2+uf2U0475XQQ954cZfQp22AiBGykkHAi71xaVi5b2o1URDTN/KDVWjTtcjsMojToYHgQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@bymax-one%2fnest-logger@1.0.7","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":279208},"main":"./dist/server/index.cjs","type":"module","types":"./dist/server/index.d.cts","module":"./dist/server/index.mjs","engines":{"node":">=24.0.0"},"exports":{".":{"import":{"types":"./dist/server/index.d.ts","default":"./dist/server/index.mjs"},"require":{"types":"./dist/server/index.d.cts","default":"./dist/server/index.cjs"}},"./shared":{"import":{"types":"./dist/shared/index.d.ts","default":"./dist/shared/index.mjs"},"require":{"types":"./dist/shared/index.d.cts","default":"./dist/shared/index.cjs"}},"./package.json":"./package.json"},"gitHead":"70de3354cb046524113318e188db9217f48964ff","scripts":{"lint":"eslint src","size":"node scripts/check-size.mjs","test":"jest","bench":"node --expose-gc --import tsx bench/throughput.bench.ts","build":"pnpm clean && tsup","clean":"rm -rf dist coverage","prepare":"husky","release":"npm publish --provenance --access public","lint:fix":"eslint src --fix","mutation":"stryker run","test:all":"pnpm test && pnpm test:e2e","test:cov":"jest --coverage","test:e2e":"jest --config jest.e2e.config.ts","typecheck":"tsc --noEmit && tsc --noEmit -p tsconfig.server.json","test:watch":"jest --watch","test:cov:all":"jest --config jest.coverage.config.ts --coverage","check:exports":"attw --pack .","check:mutants":"node scripts/check-mutation-directives.mjs","prepublishOnly":"pnpm clean && pnpm typecheck && pnpm lint && pnpm check:mutants && pnpm test:cov:all && pnpm build && pnpm check:published","check:published":"node scripts/check-published-surface.mjs","mutation:dry-run":"stryker run --dryRunOnly","mutation:incremental":"stryker run --incremental"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:ba0cbcf9-3a81-42eb-b5b3-aadccdb90f58"}},"repository":{"url":"git+https://github.com/bymaxone/nest-logger.git","type":"git"},"_npmVersion":"11.16.0","description":"Structured JSON logging for NestJS based on Pino 10, with optional OpenTelemetry correlation.","directories":{},"lint-staged":{"*.{json,md,yml,yaml}":["prettier --write"],"*.{ts,tsx,js,mjs,cjs}":["eslint --fix","prettier --write"]},"sideEffects":false,"_nodeVersion":"24.18.0","dependencies":{},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"typesVersions":{"*":{"shared":["./dist/shared/index.d.cts"]}},"_hasShrinkwrap":false,"packageManager":"pnpm@11.20.0","devDependencies":{"tsx":"^4.19.2","jest":"^30.4.2","pino":"^10.0.0","rxjs":"^7.8.0","tsup":"^8.5.1","husky":"^9.1.7","eslint":"^9.39.4","globals":"^17.6.0","ts-jest":"^29.4.9","ts-node":"^10.9.2","prettier":"^3.8.3","supertest":"^7.2.2","tinybench":"^6.0.2","@eslint/js":"^9.39.4","typescript":"^5.9.3","@types/jest":"^30.0.0","@types/node":"^26","lint-staged":"^17.0.7","pino-pretty":"^13.0.0","@nestjs/core":"^11.1.20","@nestjs/common":"^11.1.20","@types/express":"^5.0.6","@commitlint/cli":"^21.0.2","@nestjs/testing":"^11.1.20","@types/supertest":"^7.2.0","reflect-metadata":"^0.2.2","@opentelemetry/api":"^1.9.0","eslint-plugin-import":"^2.32.0","@arethetypeswrong/cli":"^0.18.5","@stryker-mutator/core":"^9","eslint-config-prettier":"^10.1.8","eslint-plugin-prettier":"^5.5.5","eslint-plugin-security":"^4.0.0","@nestjs/platform-express":"^11.1.20","@typescript-eslint/parser":"^8.59.3","@stryker-mutator/jest-runner":"^9","@commitlint/config-conventional":"^21.0.2","@typescript-eslint/eslint-plugin":"^8.59.3","eslint-import-resolver-typescript":"^4.4.4","@stryker-mutator/typescript-checker":"^9"},"peerDependencies":{"pino":"^10.0.0","rxjs":"^7.8.0","pino-pretty":"^13.0.0","@nestjs/core":"^11.1.18","@nestjs/common":"^11.0.16","reflect-metadata":"^0.2.0","@opentelemetry/api":"^1.9.0"},"peerDependenciesMeta":{"pino-pretty":{"optional":true},"@opentelemetry/api":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/nest-logger_1.0.7_1786194035770_0.26639653885633185","host":"s3://npm-registry-packages-npm-production"}},"1.0.8":{"name":"@bymax-one/nest-logger","version":"1.0.8","keywords":["nestjs","logger","pino","json-logging","structured-logging","opentelemetry","observability","tracing","request-id","pii-redaction"],"author":{"name":"Bymax One","email":"support@bymax.one"},"license":"MIT","_id":"@bymax-one/nest-logger@1.0.8","maintainers":[{"name":"bymax.one","email":"bymaxone.core@gmail.com"},{"name":"msalvatti","email":"msalvatti@gmail.com"}],"homepage":"https://github.com/bymaxone/nest-logger#readme","bugs":{"url":"https://github.com/bymaxone/nest-logger/issues"},"dist":{"shasum":"d4ab0eef3e066bb5effbb01d0fd9c830d9020425","tarball":"https://registry.npmjs.org/@bymax-one/nest-logger/-/nest-logger-1.0.8.tgz","fileCount":12,"integrity":"sha512-VuSi+iASY1XPJLEeY8kOigXBej+VnxPjtZuoRKJeeRe2ZSLWD1Uo72RPLo37FY4O0wM1HiI32o0SO09xQpwspA==","signatures":[{"sig":"MEUCIQCOTbO7OqjHpPGdKhf6BHEOH6ev2LLs5WRUQrMOFn456wIgFCMTgPeohqKmQyhU3q0TiZ99CG6CkwykpsrKoBIlXnY=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@bymax-one%2fnest-logger@1.0.8","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":283185},"main":"./dist/server/index.cjs","type":"module","types":"./dist/server/index.d.cts","module":"./dist/server/index.mjs","engines":{"node":">=24.0.0"},"exports":{".":{"import":{"types":"./dist/server/index.d.ts","default":"./dist/server/index.mjs"},"require":{"types":"./dist/server/index.d.cts","default":"./dist/server/index.cjs"}},"./shared":{"import":{"types":"./dist/shared/index.d.ts","default":"./dist/shared/index.mjs"},"require":{"types":"./dist/shared/index.d.cts","default":"./dist/shared/index.cjs"}},"./package.json":"./package.json"},"gitHead":"ec8bd309342c084c4764763f3e4dc54a604b9c99","scripts":{"lint":"eslint src","size":"node scripts/check-size.mjs","test":"jest","bench":"node --expose-gc --import tsx bench/throughput.bench.ts","build":"pnpm clean && tsup","clean":"rm -rf dist coverage","prepare":"husky","release":"npm publish --provenance --access public","lint:fix":"eslint src --fix","mutation":"stryker run","test:all":"pnpm test && pnpm test:e2e","test:cov":"jest --coverage","test:e2e":"jest --config jest.e2e.config.ts","typecheck":"tsc --noEmit && tsc --noEmit -p tsconfig.server.json","test:watch":"jest --watch","test:cov:all":"jest --config jest.coverage.config.ts --coverage","check:exports":"attw --pack .","check:mutants":"node scripts/check-mutation-directives.mjs","mutation:full":"node -e \"require('node:fs').rmSync('reports/stryker-incremental.json',{force:true,recursive:true})\" && stryker run","prepublishOnly":"pnpm clean && pnpm typecheck && pnpm lint && pnpm check:mutants && pnpm test:cov:all && pnpm build && pnpm check:published","check:published":"node scripts/check-published-surface.mjs","mutation:dry-run":"stryker run --dryRunOnly"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:ba0cbcf9-3a81-42eb-b5b3-aadccdb90f58"}},"repository":{"url":"git+https://github.com/bymaxone/nest-logger.git","type":"git"},"_npmVersion":"11.16.0","description":"Structured JSON logging for NestJS based on Pino 10, with optional OpenTelemetry correlation.","directories":{},"lint-staged":{"*.{json,md,yml,yaml}":["prettier --write"],"*.{ts,tsx,js,mjs,cjs}":["eslint --fix","prettier --write"]},"sideEffects":false,"_nodeVersion":"24.18.0","dependencies":{},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"typesVersions":{"*":{"shared":["./dist/shared/index.d.cts"]}},"_hasShrinkwrap":false,"packageManager":"pnpm@11.20.0","devDependencies":{"tsx":"^4.19.2","jest":"^30.4.2","pino":"^10.0.0","rxjs":"^7.8.0","tsup":"^8.5.1","husky":"^9.1.7","eslint":"^9.39.4","globals":"^17.6.0","ts-jest":"^29.4.9","ts-node":"^10.9.2","prettier":"^3.8.3","supertest":"^7.2.2","tinybench":"^6.0.2","@eslint/js":"^9.39.4","typescript":"^5.9.3","@types/jest":"^30.0.0","@types/node":"^26","lint-staged":"^17.0.7","pino-pretty":"^13.0.0","@nestjs/core":"^11.1.20","@nestjs/common":"^11.1.20","@types/express":"^5.0.6","@commitlint/cli":"^21.0.2","@nestjs/testing":"^11.1.20","@types/supertest":"^7.2.0","reflect-metadata":"^0.2.2","@opentelemetry/api":"^1.9.0","eslint-plugin-import":"^2.32.0","@arethetypeswrong/cli":"^0.18.5","@stryker-mutator/core":"^9","eslint-config-prettier":"^10.1.8","eslint-plugin-prettier":"^5.5.5","eslint-plugin-security":"^4.0.0","@nestjs/platform-express":"^11.1.20","@typescript-eslint/parser":"^8.59.3","@stryker-mutator/jest-runner":"^9","@commitlint/config-conventional":"^21.0.2","@typescript-eslint/eslint-plugin":"^8.59.3","eslint-import-resolver-typescript":"^4.4.4","@stryker-mutator/typescript-checker":"^9"},"peerDependencies":{"pino":"^10.0.0","rxjs":"^7.8.0","pino-pretty":"^13.0.0","@nestjs/core":"^11.1.18","@nestjs/common":"^11.0.16","reflect-metadata":"^0.2.0","@opentelemetry/api":"^1.9.0"},"peerDependenciesMeta":{"pino-pretty":{"optional":true},"@opentelemetry/api":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/nest-logger_1.0.8_1786381334009_0.7310760865290242","host":"s3://npm-registry-packages-npm-production"}},"1.1.0":{"name":"@bymax-one/nest-logger","version":"1.1.0","keywords":["nestjs","logger","pino","json-logging","structured-logging","opentelemetry","observability","tracing","request-id","pii-redaction"],"author":{"name":"Bymax One","email":"support@bymax.one"},"license":"MIT","_id":"@bymax-one/nest-logger@1.1.0","maintainers":[{"name":"bymax.one","email":"bymaxone.core@gmail.com"},{"name":"msalvatti","email":"msalvatti@gmail.com"}],"homepage":"https://github.com/bymaxone/nest-logger#readme","bugs":{"url":"https://github.com/bymaxone/nest-logger/issues"},"dist":{"shasum":"582c0187e8e62a9555851ed4b44137a14f83ecc2","tarball":"https://registry.npmjs.org/@bymax-one/nest-logger/-/nest-logger-1.1.0.tgz","fileCount":12,"integrity":"sha512-655DuHhc2PPndn7qJH2AJUWEyz8ihOyMjAMz6Wtw0mavgQCSem2yyZK+FjL3OB3LrHkfR9ckU/T8Du+VTl0agw==","signatures":[{"sig":"MEQCIAnlSoS2hVTgWFDKwaJnbRQWgE3Ftrv/7vGmWzpBVHvZAiATGVDLrangimE8gr61I2pNunK+/VgnUBkswyAETE9CnQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@bymax-one%2fnest-logger@1.1.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":283627},"main":"./dist/server/index.cjs","type":"module","types":"./dist/server/index.d.cts","module":"./dist/server/index.mjs","engines":{"node":">=24.0.0"},"exports":{".":{"import":{"types":"./dist/server/index.d.ts","default":"./dist/server/index.mjs"},"require":{"types":"./dist/server/index.d.cts","default":"./dist/server/index.cjs"}},"./shared":{"import":{"types":"./dist/shared/index.d.ts","default":"./dist/shared/index.mjs"},"require":{"types":"./dist/shared/index.d.cts","default":"./dist/shared/index.cjs"}},"./package.json":"./package.json"},"gitHead":"614cde8732f54e0ed0e478be1cb1d5d6c230acbc","scripts":{"lint":"eslint src","size":"node scripts/check-size.mjs","test":"jest","bench":"node --expose-gc --import tsx bench/throughput.bench.ts","build":"pnpm clean && tsup","clean":"rm -rf dist coverage","prepare":"husky","release":"npm publish --provenance --access public","lint:fix":"eslint src --fix","mutation":"stryker run","test:all":"pnpm test && pnpm test:e2e","test:cov":"jest --coverage","test:e2e":"jest --config jest.e2e.config.ts","typecheck":"tsc --noEmit && tsc --noEmit -p tsconfig.server.json","test:watch":"jest --watch","test:cov:all":"jest --config jest.coverage.config.ts --coverage","check:exports":"attw --pack .","check:mutants":"node scripts/check-mutation-directives.mjs","mutation:full":"node -e \"require('node:fs').rmSync('reports/stryker-incremental.json',{force:true,recursive:true})\" && stryker run","prepublishOnly":"pnpm clean && pnpm typecheck && pnpm lint && pnpm check:mutants && pnpm test:cov:all && pnpm build && pnpm check:published","check:published":"node scripts/check-published-surface.mjs","mutation:dry-run":"stryker run --dryRunOnly"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:ba0cbcf9-3a81-42eb-b5b3-aadccdb90f58"}},"repository":{"url":"git+https://github.com/bymaxone/nest-logger.git","type":"git"},"_npmVersion":"11.16.0","description":"Structured JSON logging for NestJS based on Pino 10, with optional OpenTelemetry correlation.","directories":{},"lint-staged":{"*.{json,md,yml,yaml}":["prettier --write"],"*.{ts,tsx,js,mjs,cjs}":["eslint --fix","prettier --write"]},"sideEffects":false,"_nodeVersion":"24.18.0","dependencies":{},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"typesVersions":{"*":{"shared":["./dist/shared/index.d.cts"]}},"_hasShrinkwrap":false,"packageManager":"pnpm@11.20.0","devDependencies":{"tsx":"^4.19.2","jest":"^30.4.2","pino":"^10.0.0","rxjs":"^7.8.0","tsup":"^8.5.1","husky":"^9.1.7","eslint":"^9.39.4","globals":"^17.6.0","ts-jest":"^29.4.9","ts-node":"^10.9.2","prettier":"^3.8.3","supertest":"^7.2.2","tinybench":"^6.0.2","@eslint/js":"^9.39.4","typescript":"^5.9.3","@types/jest":"^30.0.0","@types/node":"^26","lint-staged":"^17.0.7","pino-pretty":"^13.0.0","@nestjs/core":"^11.1.20","@nestjs/common":"^11.1.20","@types/express":"^5.0.6","@commitlint/cli":"^21.0.2","@nestjs/testing":"^11.1.20","@types/supertest":"^7.2.0","reflect-metadata":"^0.2.2","@opentelemetry/api":"^1.9.0","eslint-plugin-import":"^2.32.0","@arethetypeswrong/cli":"^0.18.5","@stryker-mutator/core":"^9","eslint-config-prettier":"^10.1.8","eslint-plugin-prettier":"^5.5.5","eslint-plugin-security":"^4.0.0","@nestjs/platform-express":"^11.1.20","@typescript-eslint/parser":"^8.59.3","@stryker-mutator/jest-runner":"^9","@commitlint/config-conventional":"^21.0.2","@typescript-eslint/eslint-plugin":"^8.59.3","eslint-import-resolver-typescript":"^4.4.4","@stryker-mutator/typescript-checker":"^9"},"peerDependencies":{"pino":"^10.0.0","rxjs":"^7.8.0","pino-pretty":"^13.0.0","@nestjs/core":"^11.1.18","@nestjs/common":"^11.0.16","reflect-metadata":"^0.2.0","@opentelemetry/api":"^1.9.0"},"peerDependenciesMeta":{"pino-pretty":{"optional":true},"@opentelemetry/api":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/nest-logger_1.1.0_1786446191557_0.26749651766216886","host":"s3://npm-registry-packages-npm-production"}},"1.2.0":{"name":"@bymax-one/nest-logger","version":"1.2.0","keywords":["nestjs","logger","pino","json-logging","structured-logging","opentelemetry","observability","tracing","request-id","pii-redaction"],"author":{"name":"Bymax One","email":"support@bymax.one"},"license":"MIT","_id":"@bymax-one/nest-logger@1.2.0","maintainers":[{"name":"bymax.one","email":"bymaxone.core@gmail.com"},{"name":"msalvatti","email":"msalvatti@gmail.com"}],"homepage":"https://github.com/bymaxone/nest-logger#readme","bugs":{"url":"https://github.com/bymaxone/nest-logger/issues"},"dist":{"shasum":"fdd1dbce3cc2f9de1b7b4310d6832d4fddaa1d81","tarball":"https://registry.npmjs.org/@bymax-one/nest-logger/-/nest-logger-1.2.0.tgz","fileCount":12,"integrity":"sha512-uJ8kj4lZFQ6ZqLsxjoJ30YAQlG2xGRfx9uDvoDqGobcK1j1TfJ0CLv5+FoDALgHtxaqSjgLndXjzqlncujHugQ==","signatures":[{"sig":"MEYCIQDox8oCix7u9rjRDURJXuj64yrRAgQ8hO3FFMEIg1DGIwIhAK4+tiScb8e9lYCBrDKnEtxZ8O0jt22afVwLrytESsIn","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@bymax-one%2fnest-logger@1.2.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":384410},"main":"./dist/server/index.cjs","type":"module","types":"./dist/server/index.d.cts","module":"./dist/server/index.mjs","engines":{"node":">=24.0.0"},"exports":{".":{"import":{"types":"./dist/server/index.d.ts","default":"./dist/server/index.mjs"},"require":{"types":"./dist/server/index.d.cts","default":"./dist/server/index.cjs"}},"./shared":{"import":{"types":"./dist/shared/index.d.ts","default":"./dist/shared/index.mjs"},"require":{"types":"./dist/shared/index.d.cts","default":"./dist/shared/index.cjs"}},"./package.json":"./package.json"},"gitHead":"e9769a0b1c6bf7115d44e74dffcf2e1d6d1bb054","scripts":{"lint":"eslint src","size":"node scripts/check-size.mjs","test":"jest","bench":"node --expose-gc --import tsx bench/throughput.bench.ts","build":"pnpm clean && tsup","clean":"rm -rf dist coverage","prepare":"husky","release":"npm publish --provenance --access public","lint:fix":"eslint src --fix","mutation":"stryker run","test:all":"pnpm test && pnpm test:e2e","test:cov":"jest --coverage","test:e2e":"jest --config jest.e2e.config.ts","typecheck":"tsc --noEmit && tsc --noEmit -p tsconfig.server.json","test:watch":"jest --watch","test:cov:all":"jest --config jest.coverage.config.ts --coverage","check:exports":"attw --pack .","check:mutants":"node scripts/check-mutation-directives.mjs","mutation:full":"node -e \"require('node:fs').rmSync('reports/stryker-incremental.json',{force:true,recursive:true})\" && stryker run","prepublishOnly":"pnpm clean && pnpm typecheck && pnpm lint && pnpm check:mutants && pnpm test:cov:all && pnpm build && pnpm check:published","check:published":"node scripts/check-published-surface.mjs","mutation:dry-run":"stryker run --dryRunOnly"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:ba0cbcf9-3a81-42eb-b5b3-aadccdb90f58"}},"repository":{"url":"git+https://github.com/bymaxone/nest-logger.git","type":"git"},"_npmVersion":"11.17.0","description":"Structured JSON logging for NestJS based on Pino 10, with optional OpenTelemetry correlation.","directories":{},"lint-staged":{"*.{json,md,yml,yaml}":["prettier --write"],"*.{ts,tsx,js,mjs,cjs}":["eslint --fix","prettier --write"]},"sideEffects":false,"_nodeVersion":"24.19.0","dependencies":{},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"typesVersions":{"*":{"shared":["./dist/shared/index.d.cts"]}},"_hasShrinkwrap":false,"packageManager":"pnpm@11.20.0","devDependencies":{"tsx":"^4.19.2","jest":"^30.4.2","pino":"^10.0.0","rxjs":"^7.8.0","tsup":"^8.5.1","husky":"^9.1.7","eslint":"^9.39.4","globals":"^17.6.0","ts-jest":"^29.4.9","ts-node":"^10.9.2","prettier":"^3.8.3","supertest":"^7.2.2","tinybench":"^6.0.2","@eslint/js":"^9.39.4","typescript":"^5.9.3","@types/jest":"^30.0.0","@types/node":"^26","lint-staged":"^17.0.7","pino-pretty":"^13.0.0","@nestjs/core":"^11.1.20","@nestjs/common":"^11.1.20","@types/express":"^5.0.6","@commitlint/cli":"^21.0.2","@nestjs/testing":"^11.1.20","@types/supertest":"^7.2.0","reflect-metadata":"^0.2.2","@opentelemetry/api":"^1.9.0","eslint-plugin-import":"^2.32.0","@arethetypeswrong/cli":"^0.18.5","@stryker-mutator/core":"^9","eslint-config-prettier":"^10.1.8","eslint-plugin-prettier":"^5.5.5","eslint-plugin-security":"^4.0.0","@nestjs/platform-express":"^11.1.20","@typescript-eslint/parser":"^8.59.3","@stryker-mutator/jest-runner":"^9","@commitlint/config-conventional":"^21.0.2","@typescript-eslint/eslint-plugin":"^8.59.3","eslint-import-resolver-typescript":"^4.4.4","@stryker-mutator/typescript-checker":"^9"},"peerDependencies":{"pino":"^10.0.0","rxjs":"^7.8.0","pino-pretty":"^13.0.0","@nestjs/core":"^11.1.18","@nestjs/common":"^11.0.16","reflect-metadata":"^0.2.0","@opentelemetry/api":"^1.9.0"},"peerDependenciesMeta":{"pino-pretty":{"optional":true},"@opentelemetry/api":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/nest-logger_1.2.0_1786618692871_0.48136984605320565","host":"s3://npm-registry-packages-npm-production"}},"1.2.1":{"name":"@bymax-one/nest-logger","version":"1.2.1","keywords":["nestjs","logger","pino","json-logging","structured-logging","opentelemetry","observability","tracing","request-id","pii-redaction"],"author":{"name":"Bymax One","email":"support@bymax.one"},"license":"MIT","_id":"@bymax-one/nest-logger@1.2.1","maintainers":[{"name":"bymax.one","email":"bymaxone.core@gmail.com"},{"name":"msalvatti","email":"msalvatti@gmail.com"}],"homepage":"https://github.com/bymaxone/nest-logger#readme","bugs":{"url":"https://github.com/bymaxone/nest-logger/issues"},"dist":{"shasum":"63d1191ee6f7bc964507a9f145b6b0821838209f","tarball":"https://registry.npmjs.org/@bymax-one/nest-logger/-/nest-logger-1.2.1.tgz","fileCount":12,"integrity":"sha512-917CDyDA6dDF3RGt5PbSAefLZzX9RR7S0x63uOlco3/ASNPoRJrEKQeSd/3u9VIkZlFpiL9zPxLHEi49Jkrcyw==","signatures":[{"sig":"MEQCIBggSKCZ6JcwaYLcVdBrReO4K3ZnfAXZ9PQGhkRphUp5AiBSz7Zwa2xPUYK6op/w66oDMxhrw94J7aI/Iwk0V0ya4g==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@bymax-one%2fnest-logger@1.2.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":444677},"main":"./dist/server/index.cjs","type":"module","types":"./dist/server/index.d.cts","module":"./dist/server/index.mjs","engines":{"node":">=24.0.0"},"exports":{".":{"import":{"types":"./dist/server/index.d.ts","default":"./dist/server/index.mjs"},"require":{"types":"./dist/server/index.d.cts","default":"./dist/server/index.cjs"}},"./shared":{"import":{"types":"./dist/shared/index.d.ts","default":"./dist/shared/index.mjs"},"require":{"types":"./dist/shared/index.d.cts","default":"./dist/shared/index.cjs"}},"./package.json":"./package.json"},"gitHead":"a01460337fb25ea5b7a8a5ce42238391389e57bb","scripts":{"lint":"eslint src","size":"node scripts/check-size.mjs","test":"jest","bench":"node --expose-gc --import tsx bench/throughput.bench.ts","build":"pnpm clean && tsup","clean":"rm -rf dist coverage","prepare":"husky","release":"npm publish --provenance --access public","lint:fix":"eslint src --fix","mutation":"stryker run","test:all":"pnpm test && pnpm test:e2e","test:cov":"jest --coverage","test:e2e":"jest --config jest.e2e.config.ts","typecheck":"tsc --noEmit && tsc --noEmit -p tsconfig.server.json","test:watch":"jest --watch","test:cov:all":"jest --config jest.coverage.config.ts --coverage","check:exports":"attw --pack .","check:mutants":"node scripts/check-mutation-directives.mjs","mutation:full":"node -e \"require('node:fs').rmSync('reports/stryker-incremental.json',{force:true,recursive:true})\" && stryker run","prepublishOnly":"pnpm clean && pnpm typecheck && pnpm lint && pnpm check:mutants && pnpm test:cov:all && pnpm build && pnpm check:published","check:published":"node scripts/check-published-surface.mjs","mutation:dry-run":"stryker run --dryRunOnly"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:ba0cbcf9-3a81-42eb-b5b3-aadccdb90f58"}},"repository":{"url":"git+https://github.com/bymaxone/nest-logger.git","type":"git"},"_npmVersion":"11.16.0","description":"Structured JSON logging for NestJS based on Pino 10, with optional OpenTelemetry correlation.","directories":{},"lint-staged":{"*.{json,md,yml,yaml}":["prettier --write"],"*.{ts,tsx,js,mjs,cjs}":["eslint --fix","prettier --write"]},"sideEffects":false,"_nodeVersion":"24.18.0","dependencies":{},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"typesVersions":{"*":{"shared":["./dist/shared/index.d.cts"]}},"_hasShrinkwrap":false,"packageManager":"pnpm@11.20.0","devDependencies":{"tsx":"^4.19.2","jest":"^30.4.2","pino":"^10.0.0","rxjs":"^7.8.0","tsup":"^8.5.1","husky":"^9.1.7","eslint":"^9.39.4","globals":"^17.6.0","ts-jest":"^29.4.9","ts-node":"^10.9.2","prettier":"^3.8.3","supertest":"^7.2.2","tinybench":"^6.0.2","@eslint/js":"^9.39.4","typescript":"^5.9.3","@types/jest":"^30.0.0","@types/node":"^26","lint-staged":"^17.0.7","pino-pretty":"^13.0.0","@nestjs/core":"^11.1.20","@nestjs/common":"^11.1.20","@types/express":"^5.0.6","@commitlint/cli":"^21.0.2","@nestjs/testing":"^11.1.20","@types/supertest":"^7.2.0","reflect-metadata":"^0.2.2","@opentelemetry/api":"^1.9.0","eslint-plugin-import":"^2.32.0","@arethetypeswrong/cli":"^0.18.5","@stryker-mutator/core":"^9","eslint-config-prettier":"^10.1.8","eslint-plugin-prettier":"^5.5.5","eslint-plugin-security":"^4.0.0","@nestjs/platform-express":"^11.1.20","@typescript-eslint/parser":"^8.59.3","@stryker-mutator/jest-runner":"^9","@commitlint/config-conventional":"^21.0.2","@typescript-eslint/eslint-plugin":"^8.59.3","eslint-import-resolver-typescript":"^4.4.4","@stryker-mutator/typescript-checker":"^9"},"peerDependencies":{"pino":"^10.0.0","rxjs":"^7.8.0","pino-pretty":"^13.0.0","@nestjs/core":"^11.1.18","@nestjs/common":"^11.0.16","reflect-metadata":"^0.2.0","@opentelemetry/api":"^1.9.0"},"peerDependenciesMeta":{"pino-pretty":{"optional":true},"@opentelemetry/api":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/nest-logger_1.2.1_1786647997048_0.9540909941460842","host":"s3://npm-registry-packages-npm-production"}},"1.2.2":{"name":"@bymax-one/nest-logger","version":"1.2.2","keywords":["nestjs","logger","pino","json-logging","structured-logging","opentelemetry","observability","tracing","request-id","pii-redaction"],"author":{"name":"Bymax One","email":"support@bymax.one"},"license":"MIT","_id":"@bymax-one/nest-logger@1.2.2","maintainers":[{"name":"bymax.one","email":"bymaxone.core@gmail.com"},{"name":"msalvatti","email":"msalvatti@gmail.com"}],"homepage":"https://github.com/bymaxone/nest-logger#readme","bugs":{"url":"https://github.com/bymaxone/nest-logger/issues"},"dist":{"shasum":"147fc64fc5d4e1aaffd87147e35c3e283e3e61fc","tarball":"https://registry.npmjs.org/@bymax-one/nest-logger/-/nest-logger-1.2.2.tgz","fileCount":12,"integrity":"sha512-481udmkW9kOetxVHx24aPMNntXlQMU2zWrWspV9wZSmeprMJhzdY2mWX8uiryA4A6wXizpSrRe0epjlPU7OKQQ==","signatures":[{"sig":"MEUCIFTmVgb+dKr4TcqQMIhTUTfJ6Nf4PFzgtjRbbvk9CylQAiEA7pWG2MbLnYAtfHIl8F6mrsIde55iGmkowkl3djEx6sM=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@bymax-one%2fnest-logger@1.2.2","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":453414},"main":"./dist/server/index.cjs","type":"module","types":"./dist/server/index.d.cts","module":"./dist/server/index.mjs","engines":{"node":">=24.0.0"},"exports":{".":{"import":{"types":"./dist/server/index.d.ts","default":"./dist/server/index.mjs"},"require":{"types":"./dist/server/index.d.cts","default":"./dist/server/index.cjs"}},"./shared":{"import":{"types":"./dist/shared/index.d.ts","default":"./dist/shared/index.mjs"},"require":{"types":"./dist/shared/index.d.cts","default":"./dist/shared/index.cjs"}},"./package.json":"./package.json"},"gitHead":"3d88af511cf1d8fbf9eddcb4baf39fdee1360b2c","scripts":{"lint":"eslint src","size":"node scripts/check-size.mjs","test":"jest","bench":"node --expose-gc --import tsx bench/throughput.bench.ts","build":"pnpm clean && tsup","clean":"rm -rf dist coverage","prepare":"husky","release":"npm publish --provenance --access public","lint:fix":"eslint src --fix","mutation":"stryker run","test:all":"pnpm test && pnpm test:e2e","test:cov":"jest --coverage","test:e2e":"jest --config jest.e2e.config.ts","typecheck":"tsc --noEmit && tsc --noEmit -p tsconfig.server.json","test:watch":"jest --watch","test:cov:all":"jest --config jest.coverage.config.ts --coverage","check:exports":"attw --pack .","check:mutants":"node scripts/check-mutation-directives.mjs","mutation:full":"node -e \"require('node:fs').rmSync('reports/stryker-incremental.json',{force:true,recursive:true})\" && stryker run","prepublishOnly":"pnpm clean && pnpm typecheck && pnpm lint && pnpm check:mutants && pnpm test:cov:all && pnpm build && pnpm check:published","check:published":"node scripts/check-published-surface.mjs","mutation:dry-run":"stryker run --dryRunOnly"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:ba0cbcf9-3a81-42eb-b5b3-aadccdb90f58"}},"repository":{"url":"git+https://github.com/bymaxone/nest-logger.git","type":"git"},"_npmVersion":"11.16.0","description":"Structured JSON logging for NestJS based on Pino 10, with optional OpenTelemetry correlation.","directories":{},"lint-staged":{"*.{json,md,yml,yaml}":["prettier --write"],"*.{ts,tsx,js,mjs,cjs}":["eslint --fix","prettier --write"]},"sideEffects":false,"_nodeVersion":"24.18.0","dependencies":{},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"typesVersions":{"*":{"shared":["./dist/shared/index.d.cts"]}},"_hasShrinkwrap":false,"packageManager":"pnpm@11.20.0","devDependencies":{"tsx":"^4.19.2","jest":"^30.4.2","pino":"^10.0.0","rxjs":"^7.8.0","tsup":"^8.5.1","husky":"^9.1.7","eslint":"^9.39.4","globals":"^17.6.0","ts-jest":"^29.4.9","ts-node":"^10.9.2","prettier":"^3.8.3","supertest":"^7.2.2","tinybench":"^6.0.2","@eslint/js":"^9.39.4","typescript":"^5.9.3","@types/jest":"^30.0.0","@types/node":"^26","lint-staged":"^17.0.7","pino-pretty":"^13.0.0","@nestjs/core":"^11.1.20","@nestjs/common":"^11.1.20","@types/express":"^5.0.6","@commitlint/cli":"^21.0.2","@nestjs/testing":"^11.1.20","@types/supertest":"^7.2.0","reflect-metadata":"^0.2.2","@opentelemetry/api":"^1.9.0","eslint-plugin-import":"^2.32.0","@arethetypeswrong/cli":"^0.18.5","@stryker-mutator/core":"^9","eslint-config-prettier":"^10.1.8","eslint-plugin-prettier":"^5.5.5","eslint-plugin-security":"^4.0.0","@nestjs/platform-express":"^11.1.20","@typescript-eslint/parser":"^8.59.3","@stryker-mutator/jest-runner":"^9","@commitlint/config-conventional":"^21.0.2","@typescript-eslint/eslint-plugin":"^8.59.3","eslint-import-resolver-typescript":"^4.4.4","@stryker-mutator/typescript-checker":"^9"},"peerDependencies":{"pino":"^10.0.0","rxjs":"^7.8.0","pino-pretty":"^13.0.0","@nestjs/core":"^11.1.18","@nestjs/common":"^11.0.16","reflect-metadata":"^0.2.0","@opentelemetry/api":"^1.9.0"},"peerDependenciesMeta":{"pino-pretty":{"optional":true},"@opentelemetry/api":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/nest-logger_1.2.2_1786650381513_0.5095859353796723","host":"s3://npm-registry-packages-npm-production"}},"1.2.3":{"name":"@bymax-one/nest-logger","version":"1.2.3","keywords":["nestjs","logger","pino","json-logging","structured-logging","opentelemetry","observability","tracing","request-id","pii-redaction"],"author":{"name":"Bymax One","email":"support@bymax.one"},"license":"MIT","_id":"@bymax-one/nest-logger@1.2.3","maintainers":[{"name":"bymax.one","email":"bymaxone.core@gmail.com"},{"name":"msalvatti","email":"msalvatti@gmail.com"}],"homepage":"https://github.com/bymaxone/nest-logger#readme","bugs":{"url":"https://github.com/bymaxone/nest-logger/issues"},"dist":{"shasum":"8154b1fd2ed83e18eefc0e2c010c8c2493ead374","tarball":"https://registry.npmjs.org/@bymax-one/nest-logger/-/nest-logger-1.2.3.tgz","fileCount":12,"integrity":"sha512-iECJXb82koz50HQq4OIjpup8/adHC571rI3EmULfn4JHEzooFjQIVdi49xgXh56s4EjL0M+xk0gWTTiJ6SKkjA==","signatures":[{"sig":"MEUCIQC2zpTOomR3b+Il2dRsJmVeKiUYFZjI28bpfdxMysNoMwIgC9rMpmTCOx4dmoDfQ1Egmmc/31wJpaXzgQjeLFFtarA=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@bymax-one%2fnest-logger@1.2.3","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":471346},"main":"./dist/server/index.cjs","type":"module","types":"./dist/server/index.d.cts","module":"./dist/server/index.mjs","engines":{"node":">=24.0.0"},"exports":{".":{"import":{"types":"./dist/server/index.d.ts","default":"./dist/server/index.mjs"},"require":{"types":"./dist/server/index.d.cts","default":"./dist/server/index.cjs"}},"./shared":{"import":{"types":"./dist/shared/index.d.ts","default":"./dist/shared/index.mjs"},"require":{"types":"./dist/shared/index.d.cts","default":"./dist/shared/index.cjs"}},"./package.json":"./package.json"},"gitHead":"7c55f07869d13fbe6721315d7c24d7a339c94b9a","scripts":{"lint":"eslint src","size":"node scripts/check-size.mjs","test":"jest","bench":"node --expose-gc --import tsx bench/throughput.bench.ts","build":"pnpm clean && tsup","clean":"rm -rf dist coverage","prepare":"husky","release":"npm publish --provenance --access public","lint:fix":"eslint src --fix","mutation":"stryker run","test:all":"pnpm test && pnpm test:e2e","test:cov":"jest --coverage","test:e2e":"jest --config jest.e2e.config.ts","typecheck":"tsc --noEmit && tsc --noEmit -p tsconfig.server.json && tsc --noEmit -p tsconfig.bench.json","test:watch":"jest --watch","test:cov:all":"jest --config jest.coverage.config.ts --coverage","check:exports":"attw --pack .","check:mutants":"node scripts/check-mutation-directives.mjs","mutation:full":"node -e \"require('node:fs').rmSync('reports/stryker-incremental.json',{force:true,recursive:true})\" && stryker run","prepublishOnly":"pnpm clean && pnpm typecheck && pnpm lint && pnpm check:mutants && pnpm test:cov:all && pnpm build && pnpm check:published","check:published":"node scripts/check-published-surface.mjs","mutation:dry-run":"stryker run --dryRunOnly"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:ba0cbcf9-3a81-42eb-b5b3-aadccdb90f58"}},"repository":{"url":"git+https://github.com/bymaxone/nest-logger.git","type":"git"},"_npmVersion":"11.17.0","description":"Structured JSON logging for NestJS based on Pino 10, with optional OpenTelemetry correlation.","directories":{},"lint-staged":{"*.{json,md,yml,yaml}":["prettier --write"],"*.{ts,tsx,js,mjs,cjs}":["eslint --fix","prettier --write"]},"sideEffects":false,"_nodeVersion":"24.19.0","publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"typesVersions":{"*":{"shared":["./dist/shared/index.d.cts"]}},"_hasShrinkwrap":false,"packageManager":"pnpm@11.20.0","devDependencies":{"tsx":"^4.19.2","jest":"^30.4.2","pino":"^10.0.0","rxjs":"^7.8.0","tsup":"^8.5.1","husky":"^9.1.7","eslint":"^9.39.4","globals":"^17.6.0","ts-jest":"^29.4.9","ts-node":"^10.9.2","prettier":"^3.8.3","supertest":"^7.2.2","tinybench":"^6.0.2","@eslint/js":"^9.39.4","typescript":"^5.9.3","@types/jest":"^30.0.0","@types/node":"^26","lint-staged":"^17.0.7","pino-pretty":"^13.0.0","@nestjs/core":"^11.1.20","@nestjs/common":"^11.1.20","@types/express":"^5.0.6","@commitlint/cli":"^21.0.2","@nestjs/testing":"^11.1.20","@types/supertest":"^7.2.0","reflect-metadata":"^0.2.2","@opentelemetry/api":"^1.9.0","eslint-plugin-import":"^2.32.0","@arethetypeswrong/cli":"^0.18.5","@stryker-mutator/core":"^9","eslint-config-prettier":"^10.1.8","eslint-plugin-prettier":"^5.5.5","eslint-plugin-security":"^4.0.0","@nestjs/platform-express":"^11.1.20","@typescript-eslint/parser":"^8.59.3","@stryker-mutator/jest-runner":"^9","@commitlint/config-conventional":"^21.0.2","@typescript-eslint/eslint-plugin":"^8.59.3","eslint-import-resolver-typescript":"^4.4.4","@stryker-mutator/typescript-checker":"^9"},"peerDependencies":{"pino":"^10.0.0","rxjs":"^7.8.0","pino-pretty":"^13.0.0","@nestjs/core":"^11.1.18","@nestjs/common":"^11.0.16","reflect-metadata":"^0.2.0","@opentelemetry/api":"^1.9.0"},"peerDependenciesMeta":{"pino-pretty":{"optional":true},"@opentelemetry/api":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/nest-logger_1.2.3_1786747515652_0.33860712521225755","host":"s3://npm-registry-packages-npm-production"}},"1.2.4":{"name":"@bymax-one/nest-logger","version":"1.2.4","keywords":["nestjs","logger","pino","json-logging","structured-logging","opentelemetry","observability","tracing","request-id","pii-redaction"],"author":{"name":"Bymax One","email":"support@bymax.one"},"license":"MIT","_id":"@bymax-one/nest-logger@1.2.4","maintainers":[{"name":"bymax.one","email":"bymaxone.core@gmail.com"},{"name":"msalvatti","email":"msalvatti@gmail.com"}],"homepage":"https://github.com/bymaxone/nest-logger#readme","bugs":{"url":"https://github.com/bymaxone/nest-logger/issues"},"dist":{"shasum":"e978dfec82dd1baf3b0d3eb04087e48e1a34f818","tarball":"https://registry.npmjs.org/@bymax-one/nest-logger/-/nest-logger-1.2.4.tgz","fileCount":12,"integrity":"sha512-Ss0/KIQAMo8RApkvJI2MK6AGlvHpEme9svs89v54oFsx5uLKqkZob7GQRakXa3oQnJfid3Zfjqgo9h9hXRBuIw==","signatures":[{"sig":"MEUCIGNmWwnQc1aKtgAZnXswh5iuS9BuUVf0s/1R7B1pUF33AiEA31tNqaL5X6CLAUK/5MU18tMGJ/bR6fxuktz9Remp+PE=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@bymax-one%2fnest-logger@1.2.4","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":476060},"main":"./dist/server/index.cjs","type":"module","types":"./dist/server/index.d.cts","module":"./dist/server/index.mjs","engines":{"node":">=24.0.0"},"exports":{".":{"import":{"types":"./dist/server/index.d.ts","default":"./dist/server/index.mjs"},"require":{"types":"./dist/server/index.d.cts","default":"./dist/server/index.cjs"}},"./shared":{"import":{"types":"./dist/shared/index.d.ts","default":"./dist/shared/index.mjs"},"require":{"types":"./dist/shared/index.d.cts","default":"./dist/shared/index.cjs"}},"./package.json":"./package.json"},"gitHead":"9741e0f726c04a4a5f78a417ff7748fdd002d62d","scripts":{"lint":"eslint src","size":"node scripts/check-size.mjs","test":"jest","bench":"node --expose-gc --import tsx bench/throughput.bench.ts","build":"pnpm clean && tsup","clean":"rm -rf dist coverage","prepare":"husky","release":"npm publish --provenance --access public","lint:fix":"eslint src --fix","mutation":"stryker run","test:all":"pnpm test && pnpm test:e2e","test:cov":"jest --coverage","test:e2e":"jest --config jest.e2e.config.ts","typecheck":"tsc --noEmit && tsc --noEmit -p tsconfig.server.json && tsc --noEmit -p tsconfig.bench.json","test:watch":"jest --watch","test:cov:all":"jest --config jest.coverage.config.ts --coverage","check:exports":"attw --pack .","check:mutants":"node scripts/check-mutation-directives.mjs","mutation:full":"node -e \"require('node:fs').rmSync('reports/stryker-incremental.json',{force:true,recursive:true})\" && stryker run","prepublishOnly":"pnpm clean && pnpm typecheck && pnpm lint && pnpm check:mutants && pnpm test:cov:all && pnpm build && pnpm check:published","check:published":"node scripts/check-published-surface.mjs","mutation:dry-run":"stryker run --dryRunOnly"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:ba0cbcf9-3a81-42eb-b5b3-aadccdb90f58"}},"repository":{"url":"git+https://github.com/bymaxone/nest-logger.git","type":"git"},"_npmVersion":"11.17.0","description":"Structured JSON logging for NestJS based on Pino 10, with optional OpenTelemetry correlation.","directories":{},"lint-staged":{"*.{json,md,yml,yaml}":["prettier --write"],"*.{ts,tsx,js,mjs,cjs}":["eslint --fix","prettier --write"]},"sideEffects":false,"_nodeVersion":"24.19.0","publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"typesVersions":{"*":{"shared":["./dist/shared/index.d.cts"]}},"_hasShrinkwrap":false,"packageManager":"pnpm@11.20.0","devDependencies":{"tsx":"^4.19.2","jest":"^30.4.2","pino":"^10.0.0","rxjs":"^7.8.0","tsup":"^8.5.1","husky":"^9.1.7","eslint":"^9.39.4","globals":"^17.6.0","ts-jest":"^29.4.9","ts-node":"^10.9.2","prettier":"^3.8.3","supertest":"^7.2.2","tinybench":"^6.0.2","@eslint/js":"^9.39.4","typescript":"^5.9.3","@types/jest":"^30.0.0","@types/node":"^26","lint-staged":"^17.0.7","pino-pretty":"^13.0.0","@nestjs/core":"^11.1.20","@nestjs/common":"^11.1.20","@types/express":"^5.0.6","@commitlint/cli":"^21.0.2","@nestjs/testing":"^11.1.20","@types/supertest":"^7.2.0","reflect-metadata":"^0.2.2","@opentelemetry/api":"^1.9.0","eslint-plugin-import":"^2.32.0","@arethetypeswrong/cli":"^0.18.5","@stryker-mutator/core":"^9","eslint-config-prettier":"^10.1.8","eslint-plugin-prettier":"^5.5.5","eslint-plugin-security":"^4.0.0","@nestjs/platform-express":"^11.1.20","@typescript-eslint/parser":"^8.59.3","@stryker-mutator/jest-runner":"^9","@commitlint/config-conventional":"^21.0.2","@typescript-eslint/eslint-plugin":"^8.59.3","eslint-import-resolver-typescript":"^4.4.4","@stryker-mutator/typescript-checker":"^9"},"peerDependencies":{"pino":"^10.0.0","rxjs":"^7.8.0","pino-pretty":"^13.0.0","@nestjs/core":"^11.1.18","@nestjs/common":"^11.0.16","reflect-metadata":"^0.2.0","@opentelemetry/api":"^1.9.0"},"peerDependenciesMeta":{"pino-pretty":{"optional":true},"@opentelemetry/api":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/nest-logger_1.2.4_1786751214423_0.8867589087921177","host":"s3://npm-registry-packages-npm-production"}},"1.2.5":{"name":"@bymax-one/nest-logger","version":"1.2.5","keywords":["nestjs","logger","pino","json-logging","structured-logging","opentelemetry","observability","tracing","request-id","pii-redaction"],"author":{"name":"Bymax One","email":"support@bymax.one"},"license":"MIT","_id":"@bymax-one/nest-logger@1.2.5","maintainers":[{"name":"bymax.one","email":"bymaxone.core@gmail.com"},{"name":"msalvatti","email":"msalvatti@gmail.com"}],"homepage":"https://github.com/bymaxone/nest-logger#readme","bugs":{"url":"https://github.com/bymaxone/nest-logger/issues"},"dist":{"shasum":"41aaf62102b85bf05eba3c5e72c92c4aa8c38d69","tarball":"https://registry.npmjs.org/@bymax-one/nest-logger/-/nest-logger-1.2.5.tgz","fileCount":12,"integrity":"sha512-dU3pBH4EAMZ7ArxDZ/nq5ZjR1BL0qQ9IV2kOpTkhbvv5hfxWrMnPf8bW1TYtmcitOzXT3maibSq0ssiNao1T/Q==","signatures":[{"sig":"MEQCIFpJ2AG6WPHOc34i8nm5e3aE8CO686J88nHmjaGjfvGjAiAvwUhjHn5leiikhKXLe4JxhC3eWwOrvWeKF5OOqjBCpg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@bymax-one%2fnest-logger@1.2.5","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":483455},"main":"./dist/server/index.cjs","type":"module","types":"./dist/server/index.d.cts","module":"./dist/server/index.mjs","engines":{"node":">=24.0.0"},"exports":{".":{"import":{"types":"./dist/server/index.d.ts","default":"./dist/server/index.mjs"},"require":{"types":"./dist/server/index.d.cts","default":"./dist/server/index.cjs"}},"./shared":{"import":{"types":"./dist/shared/index.d.ts","default":"./dist/shared/index.mjs"},"require":{"types":"./dist/shared/index.d.cts","default":"./dist/shared/index.cjs"}},"./package.json":"./package.json"},"gitHead":"3c62df36da371a1593eb53e4cf2bae6e6afb9965","scripts":{"lint":"eslint src","size":"node scripts/check-size.mjs","test":"jest","bench":"node --expose-gc --import tsx bench/throughput.bench.ts","build":"pnpm clean && tsup","clean":"rm -rf dist coverage","prepare":"husky","release":"npm publish --provenance --access public","lint:fix":"eslint src --fix","mutation":"stryker run","test:all":"pnpm test && pnpm test:e2e","test:cov":"jest --coverage","test:e2e":"jest --config jest.e2e.config.ts","typecheck":"tsc --noEmit && tsc --noEmit -p tsconfig.server.json && tsc --noEmit -p tsconfig.bench.json","test:watch":"jest --watch","test:cov:all":"jest --config jest.coverage.config.ts --coverage","check:exports":"attw --pack .","check:mutants":"node scripts/check-mutation-directives.mjs","mutation:full":"node -e \"require('node:fs').rmSync('reports/stryker-incremental.json',{force:true,recursive:true})\" && stryker run","prepublishOnly":"pnpm clean && pnpm typecheck && pnpm lint && pnpm check:mutants && pnpm test:cov:all && pnpm build && pnpm check:published","check:published":"node scripts/check-published-surface.mjs","mutation:dry-run":"stryker run --dryRunOnly"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:ba0cbcf9-3a81-42eb-b5b3-aadccdb90f58"}},"repository":{"url":"git+https://github.com/bymaxone/nest-logger.git","type":"git"},"_npmVersion":"11.17.0","description":"Structured JSON logging for NestJS based on Pino 10, with optional OpenTelemetry correlation.","directories":{},"lint-staged":{"*.{json,md,yml,yaml}":["prettier --write"],"*.{ts,tsx,js,mjs,cjs}":["eslint --fix","prettier --write"]},"sideEffects":false,"_nodeVersion":"24.19.0","publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"typesVersions":{"*":{"shared":["./dist/shared/index.d.cts"]}},"_hasShrinkwrap":false,"packageManager":"pnpm@11.20.0","devDependencies":{"tsx":"^4.19.2","jest":"^30.4.2","pino":"^10.0.0","rxjs":"^7.8.0","tsup":"^8.5.1","husky":"^9.1.7","eslint":"^9.39.4","globals":"^17.6.0","ts-jest":"^29.4.9","ts-node":"^10.9.2","prettier":"^3.8.3","supertest":"^7.2.2","tinybench":"^6.0.2","@eslint/js":"^9.39.4","typescript":"^5.9.3","@types/jest":"^30.0.0","@types/node":"^26","lint-staged":"^17.0.7","pino-pretty":"^13.0.0","@nestjs/core":"^11.1.20","@nestjs/common":"^11.1.20","@types/express":"^5.0.6","@commitlint/cli":"^21.0.2","@nestjs/testing":"^11.1.20","@types/supertest":"^7.2.0","reflect-metadata":"^0.2.2","@opentelemetry/api":"^1.9.0","eslint-plugin-import":"^2.32.0","@arethetypeswrong/cli":"^0.18.5","@stryker-mutator/core":"^9","eslint-config-prettier":"^10.1.8","eslint-plugin-prettier":"^5.5.5","eslint-plugin-security":"^4.0.0","@nestjs/platform-express":"^11.1.20","@typescript-eslint/parser":"^8.59.3","@stryker-mutator/jest-runner":"^9","@commitlint/config-conventional":"^21.0.2","@typescript-eslint/eslint-plugin":"^8.59.3","eslint-import-resolver-typescript":"^4.4.4","@stryker-mutator/typescript-checker":"^9"},"peerDependencies":{"pino":"^10.0.0","rxjs":"^7.8.0","pino-pretty":"^13.0.0","@nestjs/core":"^11.1.18","@nestjs/common":"^11.0.16","reflect-metadata":"^0.2.0","@opentelemetry/api":"^1.9.0"},"peerDependenciesMeta":{"pino-pretty":{"optional":true},"@opentelemetry/api":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/nest-logger_1.2.5_1786753499289_0.21285198384250958","host":"s3://npm-registry-packages-npm-production"}},"1.2.6":{"name":"@bymax-one/nest-logger","version":"1.2.6","keywords":["nestjs","logger","pino","json-logging","structured-logging","opentelemetry","observability","tracing","request-id","pii-redaction"],"author":{"name":"Bymax One","email":"support@bymax.one"},"license":"MIT","_id":"@bymax-one/nest-logger@1.2.6","maintainers":[{"name":"bymax.one","email":"bymaxone.core@gmail.com"},{"name":"msalvatti","email":"msalvatti@gmail.com"}],"homepage":"https://github.com/bymaxone/nest-logger#readme","bugs":{"url":"https://github.com/bymaxone/nest-logger/issues"},"dist":{"shasum":"bc38739af4813acc820fc4c60f0fc6b9ef62d04b","tarball":"https://registry.npmjs.org/@bymax-one/nest-logger/-/nest-logger-1.2.6.tgz","fileCount":12,"integrity":"sha512-erz1it1LgxuZtahKMu3ELlyjr3JOT6i17V/FFGoazSqKs81ZQ3vUyn51fIgW/V/Ljuy7A/q8GWRmMK40bUDy5w==","signatures":[{"sig":"MEQCICXGax6oCIuroROWKFQe0SBlvE0GBuMEnhrWmYWEDoyaAiASo2mCU8gEfZI4c+XdBq64t3JTqoNZ1r66T2yg9x7agQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@bymax-one%2fnest-logger@1.2.6","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":515063},"main":"./dist/server/index.cjs","type":"module","types":"./dist/server/index.d.cts","module":"./dist/server/index.mjs","engines":{"node":">=24.0.0"},"exports":{".":{"import":{"types":"./dist/server/index.d.ts","default":"./dist/server/index.mjs"},"require":{"types":"./dist/server/index.d.cts","default":"./dist/server/index.cjs"}},"./shared":{"import":{"types":"./dist/shared/index.d.ts","default":"./dist/shared/index.mjs"},"require":{"types":"./dist/shared/index.d.cts","default":"./dist/shared/index.cjs"}},"./package.json":"./package.json"},"gitHead":"98d2ddff20cd970c665ea49032606d10e14adacc","scripts":{"lint":"eslint src","size":"node scripts/check-size.mjs","test":"jest","bench":"node --expose-gc --import tsx bench/throughput.bench.ts","build":"pnpm clean && tsup","clean":"rm -rf dist coverage","prepare":"husky","release":"npm publish --provenance --access public","lint:fix":"eslint src --fix","mutation":"stryker run","test:all":"pnpm test && pnpm test:e2e","test:cov":"jest --coverage","test:e2e":"jest --config jest.e2e.config.ts","typecheck":"tsc --noEmit && tsc --noEmit -p tsconfig.server.json && tsc --noEmit -p tsconfig.bench.json","test:watch":"jest --watch","test:cov:all":"jest --config jest.coverage.config.ts --coverage","check:exports":"attw --pack .","check:mutants":"node scripts/check-mutation-directives.mjs","mutation:full":"node -e \"require('node:fs').rmSync('reports/stryker-incremental.json',{force:true,recursive:true})\" && stryker run","prepublishOnly":"pnpm clean && pnpm typecheck && pnpm lint && pnpm check:mutants && pnpm test:cov:all && pnpm build && pnpm check:published","check:published":"node scripts/check-published-surface.mjs","mutation:dry-run":"stryker run --dryRunOnly"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:ba0cbcf9-3a81-42eb-b5b3-aadccdb90f58"}},"repository":{"url":"git+https://github.com/bymaxone/nest-logger.git","type":"git"},"_npmVersion":"11.17.0","description":"Structured JSON logging for NestJS based on Pino 10, with optional OpenTelemetry correlation.","directories":{},"lint-staged":{"*.{json,md,yml,yaml}":["prettier --write"],"*.{ts,tsx,js,mjs,cjs}":["eslint --fix","prettier --write"]},"sideEffects":false,"_nodeVersion":"24.19.0","publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"typesVersions":{"*":{"shared":["./dist/shared/index.d.cts"]}},"_hasShrinkwrap":false,"packageManager":"pnpm@11.20.0","devDependencies":{"tsx":"^4.19.2","jest":"^30.4.2","pino":"^10.0.0","rxjs":"^7.8.0","tsup":"^8.5.1","husky":"^9.1.7","eslint":"^9.39.4","globals":"^17.6.0","ts-jest":"^29.4.9","ts-node":"^10.9.2","prettier":"^3.8.3","supertest":"^7.2.2","tinybench":"^6.0.2","@eslint/js":"^9.39.4","typescript":"^5.9.3","@types/jest":"^30.0.0","@types/node":"^26","lint-staged":"^17.0.7","pino-pretty":"^13.0.0","@nestjs/core":"^11.1.20","@nestjs/common":"^11.1.20","@types/express":"^5.0.6","@commitlint/cli":"^21.0.2","@nestjs/testing":"^11.1.20","@types/supertest":"^7.2.0","reflect-metadata":"^0.2.2","@opentelemetry/api":"^1.9.0","eslint-plugin-import":"^2.32.0","@arethetypeswrong/cli":"^0.18.5","@stryker-mutator/core":"^9","eslint-config-prettier":"^10.1.8","eslint-plugin-prettier":"^5.5.5","eslint-plugin-security":"^4.0.0","@nestjs/platform-express":"^11.1.20","@typescript-eslint/parser":"^8.59.3","@stryker-mutator/jest-runner":"^9","@commitlint/config-conventional":"^21.0.2","@typescript-eslint/eslint-plugin":"^8.59.3","eslint-import-resolver-typescript":"^4.4.4","@stryker-mutator/typescript-checker":"^9"},"peerDependencies":{"pino":"^10.0.0","rxjs":"^7.8.0","pino-pretty":"^13.0.0","@nestjs/core":"^11.1.18","@nestjs/common":"^11.0.16","reflect-metadata":"^0.2.0","@opentelemetry/api":"^1.9.0"},"peerDependenciesMeta":{"pino-pretty":{"optional":true},"@opentelemetry/api":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/nest-logger_1.2.6_1786796364124_0.10110169820060766","host":"s3://npm-registry-packages-npm-production"}},"1.2.7":{"name":"@bymax-one/nest-logger","version":"1.2.7","keywords":["nestjs","logger","pino","json-logging","structured-logging","opentelemetry","observability","tracing","request-id","pii-redaction"],"author":{"name":"Bymax One","email":"support@bymax.one"},"license":"MIT","_id":"@bymax-one/nest-logger@1.2.7","maintainers":[{"name":"bymax.one","email":"bymaxone.core@gmail.com"},{"name":"msalvatti","email":"msalvatti@gmail.com"}],"homepage":"https://github.com/bymaxone/nest-logger#readme","bugs":{"url":"https://github.com/bymaxone/nest-logger/issues"},"dist":{"shasum":"2e81b25dda3d14a16f4508cd88e9f27d273a7456","tarball":"https://registry.npmjs.org/@bymax-one/nest-logger/-/nest-logger-1.2.7.tgz","fileCount":12,"integrity":"sha512-fGrXmrftF9c0osxzDpwtb4g7Hni75fXzqZIOtWtQeDXJ/u4+5py42PHHljG9eqPcQRfihXa2kOWkVHAgCkJNKg==","signatures":[{"sig":"MEUCIB7HIxJu2QQGbGZoqhmuFOzBKn/+lycPBQYSX+ZIDYvYAiEAi8C78tSOMLiqZEu3G8T4GWRv/tQvLPiRe9FlEudx7HM=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@bymax-one%2fnest-logger@1.2.7","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":523899},"main":"./dist/server/index.cjs","type":"module","types":"./dist/server/index.d.cts","module":"./dist/server/index.mjs","engines":{"node":">=24.0.0"},"exports":{".":{"import":{"types":"./dist/server/index.d.ts","default":"./dist/server/index.mjs"},"require":{"types":"./dist/server/index.d.cts","default":"./dist/server/index.cjs"}},"./shared":{"import":{"types":"./dist/shared/index.d.ts","default":"./dist/shared/index.mjs"},"require":{"types":"./dist/shared/index.d.cts","default":"./dist/shared/index.cjs"}},"./package.json":"./package.json"},"gitHead":"938bd12959300327e0ea51afb752646b3e8b3c33","scripts":{"lint":"eslint src","size":"node scripts/check-size.mjs","test":"jest","bench":"node --expose-gc --import tsx bench/throughput.bench.ts","build":"pnpm clean && tsup","clean":"rm -rf dist coverage","prepare":"husky","release":"npm publish --provenance --access public","lint:fix":"eslint src --fix","mutation":"stryker run","test:all":"pnpm test && pnpm test:e2e","test:cov":"jest --coverage","test:e2e":"jest --config jest.e2e.config.ts","typecheck":"tsc --noEmit && tsc --noEmit -p tsconfig.server.json && tsc --noEmit -p tsconfig.bench.json","test:watch":"jest --watch","test:cov:all":"jest --config jest.coverage.config.ts --coverage","check:exports":"attw --pack .","check:mutants":"node scripts/check-mutation-directives.mjs","mutation:full":"node -e \"require('node:fs').rmSync('reports/stryker-incremental.json',{force:true,recursive:true})\" && stryker run","prepublishOnly":"pnpm clean && pnpm typecheck && pnpm lint && pnpm check:mutants && pnpm test:cov:all && pnpm build && pnpm check:published","check:published":"node scripts/check-published-surface.mjs","mutation:dry-run":"stryker run --dryRunOnly"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:ba0cbcf9-3a81-42eb-b5b3-aadccdb90f58"}},"repository":{"url":"git+https://github.com/bymaxone/nest-logger.git","type":"git"},"_npmVersion":"11.17.0","description":"Structured JSON logging for NestJS based on Pino 10, with optional OpenTelemetry correlation.","directories":{},"lint-staged":{"*.{json,md,yml,yaml}":["prettier --write"],"*.{ts,tsx,js,mjs,cjs}":["eslint --fix","prettier --write"]},"sideEffects":false,"_nodeVersion":"24.19.0","publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"typesVersions":{"*":{"shared":["./dist/shared/index.d.cts"]}},"_hasShrinkwrap":false,"packageManager":"pnpm@11.20.0","devDependencies":{"tsx":"^4.19.2","jest":"^30.4.2","pino":"^10.0.0","rxjs":"^7.8.0","tsup":"^8.5.1","husky":"^9.1.7","eslint":"^9.39.4","globals":"^17.6.0","ts-jest":"^29.4.9","ts-node":"^10.9.2","prettier":"^3.8.3","supertest":"^7.2.2","tinybench":"^6.0.2","@eslint/js":"^9.39.4","typescript":"^5.9.3","@types/jest":"^30.0.0","@types/node":"^26","lint-staged":"^17.0.7","pino-pretty":"^13.0.0","@nestjs/core":"^11.1.20","@nestjs/common":"^11.1.20","@types/express":"^5.0.6","@commitlint/cli":"^21.0.2","@nestjs/testing":"^11.1.20","@types/supertest":"^7.2.0","reflect-metadata":"^0.2.2","@opentelemetry/api":"^1.9.0","eslint-plugin-import":"^2.32.0","@arethetypeswrong/cli":"^0.18.5","@stryker-mutator/core":"^9","eslint-config-prettier":"^10.1.8","eslint-plugin-prettier":"^5.5.5","eslint-plugin-security":"^4.0.0","@nestjs/platform-express":"^11.1.20","@typescript-eslint/parser":"^8.59.3","@stryker-mutator/jest-runner":"^9","@commitlint/config-conventional":"^21.0.2","@typescript-eslint/eslint-plugin":"^8.59.3","eslint-import-resolver-typescript":"^4.4.4","@stryker-mutator/typescript-checker":"^9"},"peerDependencies":{"pino":"^10.0.0","rxjs":"^7.8.0","pino-pretty":"^13.0.0","@nestjs/core":"^11.1.18","@nestjs/common":"^11.0.16","reflect-metadata":"^0.2.0","@opentelemetry/api":"^1.9.0"},"peerDependenciesMeta":{"pino-pretty":{"optional":true},"@opentelemetry/api":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/nest-logger_1.2.7_1786803000068_0.4454137604218138","host":"s3://npm-registry-packages-npm-production"}},"1.2.9":{"name":"@bymax-one/nest-logger","version":"1.2.9","keywords":["nestjs","logger","pino","json-logging","structured-logging","opentelemetry","observability","tracing","request-id","pii-redaction"],"author":{"name":"Bymax One","email":"support@bymax.one"},"license":"MIT","_id":"@bymax-one/nest-logger@1.2.9","maintainers":[{"name":"bymax.one","email":"bymaxone.core@gmail.com"},{"name":"msalvatti","email":"msalvatti@gmail.com"}],"homepage":"https://github.com/bymaxone/nest-logger#readme","bugs":{"url":"https://github.com/bymaxone/nest-logger/issues"},"dist":{"shasum":"6621853a233f32fb3e8eba68981080fa64f9ef6c","tarball":"https://registry.npmjs.org/@bymax-one/nest-logger/-/nest-logger-1.2.9.tgz","fileCount":12,"integrity":"sha512-vltOIkDMDGfdnVlmue1aHIkS/9dHLw2KPe4CyP6ikemcbhsW6BpYrkZImZKpyrKQAJULpDUCZMn66zUgAx/vdQ==","signatures":[{"sig":"MEUCIQDYTlMpDhQU0oLkFmCEv13yzNK/tdh+2LkMP/lOoUCyBgIgXCf6/aez3W0xnvp0fHXn56+WAaYrpOvXg9UsFkIkf5g=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@bymax-one%2fnest-logger@1.2.9","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":608409},"main":"./dist/server/index.cjs","type":"module","types":"./dist/server/index.d.cts","module":"./dist/server/index.mjs","engines":{"node":">=24.0.0"},"exports":{".":{"import":{"types":"./dist/server/index.d.ts","default":"./dist/server/index.mjs"},"require":{"types":"./dist/server/index.d.cts","default":"./dist/server/index.cjs"}},"./shared":{"import":{"types":"./dist/shared/index.d.ts","default":"./dist/shared/index.mjs"},"require":{"types":"./dist/shared/index.d.cts","default":"./dist/shared/index.cjs"}},"./package.json":"./package.json"},"gitHead":"d2c9e5a102ee11a6daab030c72109589d1e4c47f","scripts":{"lint":"eslint src","size":"node scripts/check-size.mjs","test":"jest","bench":"node --expose-gc --import tsx bench/throughput.bench.ts","build":"pnpm clean && tsup","clean":"rm -rf dist coverage","prepare":"husky","release":"npm publish --provenance --access public","lint:fix":"eslint src --fix","mutation":"stryker run","test:all":"pnpm test && pnpm test:e2e","test:cov":"jest --coverage","test:e2e":"jest --config jest.e2e.config.ts","typecheck":"tsc --noEmit && tsc --noEmit -p tsconfig.server.json && tsc --noEmit -p tsconfig.bench.json","check:docs":"node scripts/check-doc-snippets.mjs","test:watch":"jest --watch","test:cov:all":"jest --config jest.coverage.config.ts --coverage","check:exports":"attw --pack .","check:mutants":"node scripts/check-mutation-directives.mjs","mutation:full":"node -e \"require('node:fs').rmSync('reports/stryker-incremental.json',{force:true,recursive:true})\" && stryker run","prepublishOnly":"pnpm clean && pnpm typecheck && pnpm lint && pnpm check:mutants && pnpm check:docs && pnpm test:cov:all && pnpm build && pnpm check:published","check:published":"node scripts/check-published-surface.mjs","mutation:dry-run":"stryker run --dryRunOnly"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:ba0cbcf9-3a81-42eb-b5b3-aadccdb90f58"}},"repository":{"url":"git+https://github.com/bymaxone/nest-logger.git","type":"git"},"_npmVersion":"11.17.0","description":"Structured JSON logging for NestJS based on Pino 10, with optional OpenTelemetry correlation.","directories":{},"lint-staged":{"*.{json,md,yml,yaml}":["prettier --write"],"*.{ts,tsx,js,mjs,cjs}":["eslint --fix","prettier --write"]},"sideEffects":false,"_nodeVersion":"24.19.0","publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"typesVersions":{"*":{"shared":["./dist/shared/index.d.cts"]}},"_hasShrinkwrap":false,"packageManager":"pnpm@11.20.0","devDependencies":{"tsx":"^4.19.2","jest":"^30.4.2","pino":"^10.0.0","rxjs":"^7.8.0","tsup":"^8.5.1","husky":"^9.1.7","eslint":"^9.39.4","globals":"^17.6.0","ts-jest":"^29.4.9","ts-node":"^10.9.2","prettier":"^3.8.3","supertest":"^7.2.2","tinybench":"^6.0.2","@eslint/js":"^9.39.4","typescript":"^5.9.3","@types/jest":"^30.0.0","@types/node":"^26","lint-staged":"^17.0.7","pino-pretty":"^13.0.0","@nestjs/core":"^11.1.20","@nestjs/common":"^11.1.20","@types/express":"^5.0.6","@commitlint/cli":"^21.0.2","@nestjs/testing":"^11.1.20","@types/supertest":"^7.2.0","reflect-metadata":"^0.2.2","@opentelemetry/api":"^1.9.0","eslint-plugin-import":"^2.32.0","@arethetypeswrong/cli":"^0.18.5","@stryker-mutator/core":"^9","eslint-config-prettier":"^10.1.8","eslint-plugin-prettier":"^5.5.5","eslint-plugin-security":"^4.0.0","@nestjs/platform-express":"^11.1.20","@typescript-eslint/parser":"^8.59.3","@stryker-mutator/jest-runner":"^9","@commitlint/config-conventional":"^21.0.2","@typescript-eslint/eslint-plugin":"^8.59.3","eslint-import-resolver-typescript":"^4.4.4","@stryker-mutator/typescript-checker":"^9"},"peerDependencies":{"pino":"^10.0.0","rxjs":"^7.8.0","pino-pretty":"^13.0.0","@nestjs/core":"^11.1.18","@nestjs/common":"^11.0.16","reflect-metadata":"^0.2.0","@opentelemetry/api":"^1.9.0"},"peerDependenciesMeta":{"pino-pretty":{"optional":true},"@opentelemetry/api":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/nest-logger_1.2.9_1786917052388_0.12372488047153585","host":"s3://npm-registry-packages-npm-production"}},"1.3.0":{"name":"@bymax-one/nest-logger","version":"1.3.0","keywords":["nestjs","logger","pino","json-logging","structured-logging","opentelemetry","observability","tracing","request-id","pii-redaction"],"author":{"name":"Bymax One","email":"support@bymax.one"},"license":"MIT","_id":"@bymax-one/nest-logger@1.3.0","maintainers":[{"name":"bymax.one","email":"bymaxone.core@gmail.com"},{"name":"msalvatti","email":"msalvatti@gmail.com"}],"homepage":"https://github.com/bymaxone/nest-logger#readme","bugs":{"url":"https://github.com/bymaxone/nest-logger/issues"},"dist":{"shasum":"4ac731f280e69bcf5093ffa721b1e0d0b7ce92e1","tarball":"https://registry.npmjs.org/@bymax-one/nest-logger/-/nest-logger-1.3.0.tgz","fileCount":12,"integrity":"sha512-TFafqDmStfzvLlK76nnRHXRmg3ACTiIo+DPwo5EPRrp+1mk3hj6jKaKW1lL1DW+2Crqy9R9DXx9cCUtg//no/A==","signatures":[{"sig":"MEUCIGsCjGD6o2ijN/4XsrqZB71+kRw8BJsH1CpBDZXvpn5ZAiEAzeO5XRrt185SPtKb8LGsT0mDlrWhwBG+P9+cNJ/zdU8=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@bymax-one%2fnest-logger@1.3.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":614575},"main":"./dist/server/index.cjs","type":"module","types":"./dist/server/index.d.cts","module":"./dist/server/index.mjs","engines":{"node":">=24.0.0"},"exports":{".":{"import":{"types":"./dist/server/index.d.ts","default":"./dist/server/index.mjs"},"require":{"types":"./dist/server/index.d.cts","default":"./dist/server/index.cjs"}},"./shared":{"import":{"types":"./dist/shared/index.d.ts","default":"./dist/shared/index.mjs"},"require":{"types":"./dist/shared/index.d.cts","default":"./dist/shared/index.cjs"}},"./package.json":"./package.json"},"gitHead":"ca161dab217172b58fc6c224c352c6c27f13c6ef","scripts":{"lint":"eslint src","size":"node scripts/check-size.mjs","test":"jest","bench":"node --expose-gc --import tsx bench/throughput.bench.ts","build":"pnpm clean && tsup","clean":"rm -rf dist coverage","prepare":"husky","release":"npm publish --provenance --access public","lint:fix":"eslint src --fix","mutation":"stryker run","test:all":"pnpm test && pnpm test:e2e","test:cov":"jest --coverage","test:e2e":"jest --config jest.e2e.config.ts","typecheck":"tsc --noEmit && tsc --noEmit -p tsconfig.server.json && tsc --noEmit -p tsconfig.bench.json","check:docs":"node scripts/check-doc-snippets.mjs","test:watch":"jest --watch","test:cov:all":"jest --config jest.coverage.config.ts --coverage","check:exports":"attw --pack .","check:mutants":"node scripts/check-mutation-directives.mjs","mutation:full":"node -e \"require('node:fs').rmSync('reports/stryker-incremental.json',{force:true,recursive:true})\" && stryker run","prepublishOnly":"pnpm clean && pnpm typecheck && pnpm lint && pnpm check:mutants && pnpm check:docs && pnpm test:cov:all && pnpm build && pnpm check:published","check:published":"node scripts/check-published-surface.mjs","mutation:dry-run":"stryker run --dryRunOnly"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:ba0cbcf9-3a81-42eb-b5b3-aadccdb90f58"}},"repository":{"url":"git+https://github.com/bymaxone/nest-logger.git","type":"git"},"_npmVersion":"11.17.0","description":"Structured JSON logging for NestJS based on Pino 10, with optional OpenTelemetry correlation.","directories":{},"lint-staged":{"*.{json,md,yml,yaml}":["prettier --write"],"*.{ts,tsx,js,mjs,cjs}":["eslint --fix","prettier --write"]},"sideEffects":false,"_nodeVersion":"24.19.0","publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"typesVersions":{"*":{"shared":["./dist/shared/index.d.cts"]}},"_hasShrinkwrap":false,"packageManager":"pnpm@11.20.0","devDependencies":{"tsx":"^4.19.2","jest":"^30.4.2","pino":"^10.0.0","rxjs":"^7.8.0","tsup":"^8.5.1","husky":"^9.1.7","eslint":"^9.39.4","globals":"^17.6.0","ts-jest":"^29.4.9","ts-node":"^10.9.2","prettier":"^3.8.3","supertest":"^7.2.2","tinybench":"^6.0.2","@eslint/js":"^9.39.4","typescript":"^5.9.3","@types/jest":"^30.0.0","@types/node":"^26","lint-staged":"^17.0.7","pino-pretty":"^13.0.0","@nestjs/core":"^11.1.20","@nestjs/common":"^11.1.20","@types/express":"^5.0.6","@commitlint/cli":"^21.0.2","@nestjs/testing":"^11.1.20","@types/supertest":"^7.2.0","reflect-metadata":"^0.2.2","@opentelemetry/api":"^1.9.0","eslint-plugin-import":"^2.32.0","@arethetypeswrong/cli":"^0.18.5","@stryker-mutator/core":"^9","eslint-config-prettier":"^10.1.8","eslint-plugin-prettier":"^5.5.5","eslint-plugin-security":"^4.0.0","@nestjs/platform-express":"^11.1.20","@typescript-eslint/parser":"^8.59.3","@stryker-mutator/jest-runner":"^9","@commitlint/config-conventional":"^21.0.2","@typescript-eslint/eslint-plugin":"^8.59.3","eslint-import-resolver-typescript":"^4.4.4","@stryker-mutator/typescript-checker":"^9"},"peerDependencies":{"pino":"^10.0.0","rxjs":"^7.8.0","pino-pretty":"^13.0.0","@nestjs/core":"^11.1.18","@nestjs/common":"^11.0.16","reflect-metadata":"^0.2.0","@opentelemetry/api":"^1.9.0"},"peerDependenciesMeta":{"pino-pretty":{"optional":true},"@opentelemetry/api":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/nest-logger_1.3.0_1787051649076_0.6059415212442512","host":"s3://npm-registry-packages-npm-production"}},"1.3.1":{"name":"@bymax-one/nest-logger","version":"1.3.1","keywords":["nestjs","logger","pino","json-logging","structured-logging","opentelemetry","observability","tracing","request-id","pii-redaction"],"author":{"name":"Bymax One","email":"support@bymax.one"},"license":"MIT","_id":"@bymax-one/nest-logger@1.3.1","maintainers":[{"name":"bymax.one","email":"bymaxone.core@gmail.com"},{"name":"msalvatti","email":"msalvatti@gmail.com"}],"homepage":"https://github.com/bymaxone/nest-logger#readme","bugs":{"url":"https://github.com/bymaxone/nest-logger/issues"},"dist":{"shasum":"352dce337b46457b3ae46773d9a2f499bc752141","tarball":"https://registry.npmjs.org/@bymax-one/nest-logger/-/nest-logger-1.3.1.tgz","fileCount":12,"integrity":"sha512-SipB1s6I8VNqDjXjQ9PZ36gtRj05h/K7eVko0qYCURulMUOm3yvxYvytR2HMwTYaBqYtSpFus7ELwds3ekMSVg==","signatures":[{"sig":"MEYCIQDLLvcUeg9wljE7H4DkIqomKJYj+850QrRCIu2RdKGmqwIhAPij+z+OhURuro97HfYx0u6evgXKwn2tBFhi0tE78S/z","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@bymax-one%2fnest-logger@1.3.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":618451},"main":"./dist/server/index.cjs","type":"module","types":"./dist/server/index.d.cts","module":"./dist/server/index.mjs","engines":{"node":">=24.0.0"},"exports":{".":{"import":{"types":"./dist/server/index.d.ts","default":"./dist/server/index.mjs"},"require":{"types":"./dist/server/index.d.cts","default":"./dist/server/index.cjs"}},"./shared":{"import":{"types":"./dist/shared/index.d.ts","default":"./dist/shared/index.mjs"},"require":{"types":"./dist/shared/index.d.cts","default":"./dist/shared/index.cjs"}},"./package.json":"./package.json"},"gitHead":"281004b3b18a643fd5ed02c073852ac3c79b8929","scripts":{"lint":"eslint src","size":"node scripts/check-size.mjs","test":"jest","bench":"node --expose-gc --import tsx bench/throughput.bench.ts","build":"pnpm clean && tsup","clean":"rm -rf dist coverage","prepare":"husky","release":"npm publish --provenance --access public","lint:fix":"eslint src --fix","mutation":"stryker run","test:all":"pnpm test && pnpm test:e2e","test:cov":"jest --coverage","test:e2e":"jest --config jest.e2e.config.ts","typecheck":"tsc --noEmit && tsc --noEmit -p tsconfig.server.json && tsc --noEmit -p tsconfig.bench.json","check:docs":"node scripts/check-doc-snippets.mjs","test:watch":"jest --watch","test:cov:all":"jest --config jest.coverage.config.ts --coverage","check:exports":"attw --pack .","check:mutants":"node scripts/check-mutation-directives.mjs","mutation:full":"node -e \"require('node:fs').rmSync('reports/stryker-incremental.json',{force:true,recursive:true})\" && stryker run","prepublishOnly":"pnpm clean && pnpm typecheck && pnpm lint && pnpm check:mutants && pnpm check:docs && pnpm test:cov:all && pnpm build && pnpm check:published","check:published":"node scripts/check-published-surface.mjs","mutation:dry-run":"stryker run --dryRunOnly"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:ba0cbcf9-3a81-42eb-b5b3-aadccdb90f58"}},"repository":{"url":"git+https://github.com/bymaxone/nest-logger.git","type":"git"},"_npmVersion":"11.17.0","description":"Structured JSON logging for NestJS based on Pino 10, with optional OpenTelemetry correlation.","directories":{},"lint-staged":{"*.{json,md,yml,yaml}":["prettier --write"],"*.{ts,tsx,js,mjs,cjs}":["eslint --fix","prettier --write"]},"sideEffects":false,"_nodeVersion":"24.19.0","publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"typesVersions":{"*":{"shared":["./dist/shared/index.d.cts"]}},"_hasShrinkwrap":false,"packageManager":"pnpm@11.20.0","devDependencies":{"tsx":"^4.19.2","jest":"^30.4.2","pino":"^10.0.0","rxjs":"^7.8.0","tsup":"^8.5.1","husky":"^9.1.7","eslint":"^9.39.4","globals":"^17.6.0","ts-jest":"^29.4.9","ts-node":"^10.9.2","prettier":"^3.8.3","supertest":"^7.2.2","tinybench":"^6.0.2","@eslint/js":"^9.39.4","typescript":"^5.9.3","@types/jest":"^30.0.0","@types/node":"^26","lint-staged":"^17.0.7","pino-pretty":"^13.0.0","@nestjs/core":"^11.1.20","@nestjs/common":"^11.1.20","@types/express":"^5.0.6","@commitlint/cli":"^21.0.2","@nestjs/testing":"^11.1.20","@types/supertest":"^7.2.0","reflect-metadata":"^0.2.2","@opentelemetry/api":"^1.9.0","eslint-plugin-import":"^2.32.0","@arethetypeswrong/cli":"^0.18.5","@stryker-mutator/core":"^9","eslint-config-prettier":"^10.1.8","eslint-plugin-prettier":"^5.5.5","eslint-plugin-security":"^4.0.0","@nestjs/platform-express":"^11.1.20","@typescript-eslint/parser":"^8.59.3","@stryker-mutator/jest-runner":"^9","@commitlint/config-conventional":"^21.0.2","@typescript-eslint/eslint-plugin":"^8.59.3","eslint-import-resolver-typescript":"^4.4.4","@stryker-mutator/typescript-checker":"^9"},"peerDependencies":{"pino":"^10.0.0","rxjs":"^7.8.0","pino-pretty":"^13.0.0","@nestjs/core":"^11.1.18","@nestjs/common":"^11.0.16","reflect-metadata":"^0.2.0","@opentelemetry/api":"^1.9.0"},"peerDependenciesMeta":{"pino-pretty":{"optional":true},"@opentelemetry/api":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/nest-logger_1.3.1_1787093821253_0.46621347071687835","host":"s3://npm-registry-packages-npm-production"}},"1.4.0":{"name":"@bymax-one/nest-logger","version":"1.4.0","description":"Structured JSON logging for NestJS based on Pino 10, with optional OpenTelemetry correlation.","author":{"name":"Bymax One","email":"support@bymax.one"},"license":"MIT","homepage":"https://github.com/bymaxone/nest-logger#readme","repository":{"type":"git","url":"git+https://github.com/bymaxone/nest-logger.git"},"bugs":{"url":"https://github.com/bymaxone/nest-logger/issues"},"type":"module","sideEffects":false,"exports":{".":{"import":{"types":"./dist/server/index.d.ts","default":"./dist/server/index.mjs"},"require":{"types":"./dist/server/index.d.cts","default":"./dist/server/index.cjs"}},"./shared":{"import":{"types":"./dist/shared/index.d.ts","default":"./dist/shared/index.mjs"},"require":{"types":"./dist/shared/index.d.cts","default":"./dist/shared/index.cjs"}},"./package.json":"./package.json"},"main":"./dist/server/index.cjs","module":"./dist/server/index.mjs","types":"./dist/server/index.d.cts","typesVersions":{"*":{"shared":["./dist/shared/index.d.cts"]}},"scripts":{"bench":"node --expose-gc --import tsx bench/throughput.bench.ts","build":"pnpm clean && tsup","check:exports":"attw --pack .","check:docs":"node scripts/check-doc-snippets.mjs","check:mutants":"node scripts/check-mutation-directives.mjs","check:published":"node scripts/check-published-surface.mjs","clean":"rm -rf dist coverage","lint":"eslint src","lint:fix":"eslint src --fix","mutation":"stryker run","mutation:full":"node -e \"require('node:fs').rmSync('reports/stryker-incremental.json',{force:true,recursive:true})\" && stryker run","mutation:dry-run":"stryker run --dryRunOnly","prepare":"husky","prepublishOnly":"pnpm clean && pnpm typecheck && pnpm lint && pnpm check:mutants && pnpm check:docs && pnpm test:cov:all && pnpm build && pnpm check:published","release":"npm publish --provenance --access public","size":"node scripts/check-size.mjs","test":"jest","test:all":"pnpm test && pnpm test:e2e","test:cov":"jest --coverage","test:cov:all":"jest --config jest.coverage.config.ts --coverage","test:e2e":"jest --config jest.e2e.config.ts","test:watch":"jest --watch","typecheck":"tsc --noEmit && tsc --noEmit -p tsconfig.server.json && tsc --noEmit -p tsconfig.bench.json"},"lint-staged":{"*.{ts,tsx,js,mjs,cjs}":["eslint --fix","prettier --write"],"*.{json,md,yml,yaml}":["prettier --write"]},"peerDependencies":{"@nestjs/common":"^11.0.16","@nestjs/core":"^11.1.18","@opentelemetry/api":"^1.9.0","pino":"^10.0.0","pino-pretty":"^13.0.0","reflect-metadata":"^0.2.0","rxjs":"^7.8.0"},"peerDependenciesMeta":{"@opentelemetry/api":{"optional":true},"pino-pretty":{"optional":true}},"devDependencies":{"@arethetypeswrong/cli":"^0.18.5","@commitlint/cli":"^21.0.2","@commitlint/config-conventional":"^21.0.2","@eslint/js":"^9.39.4","@nestjs/common":"^11.1.20","@nestjs/core":"^11.1.20","@nestjs/platform-express":"^11.1.20","@nestjs/testing":"^11.1.20","@opentelemetry/api":"^1.9.0","@stryker-mutator/core":"^9","@stryker-mutator/jest-runner":"^9","@stryker-mutator/typescript-checker":"^9","@types/express":"^5.0.6","@types/jest":"^30.0.0","@types/node":"^26","@types/supertest":"^7.2.0","@typescript-eslint/eslint-plugin":"^8.59.3","@typescript-eslint/parser":"^8.59.3","eslint":"^9.39.4","eslint-config-prettier":"^10.1.8","eslint-import-resolver-typescript":"^4.4.4","eslint-plugin-import":"^2.32.0","eslint-plugin-prettier":"^5.5.5","eslint-plugin-security":"^4.0.0","globals":"^17.6.0","husky":"^9.1.7","jest":"^30.4.2","lint-staged":"^17.0.7","pino":"^10.0.0","pino-pretty":"^13.0.0","prettier":"^3.8.3","reflect-metadata":"^0.2.2","rxjs":"^7.8.0","supertest":"^7.2.2","tinybench":"^6.0.2","ts-jest":"^29.4.9","ts-node":"^10.9.2","tsup":"^8.5.1","tsx":"^4.19.2","typescript":"^5.9.3"},"keywords":["nestjs","logger","pino","json-logging","structured-logging","opentelemetry","observability","tracing","request-id","pii-redaction"],"packageManager":"pnpm@11.20.0","engines":{"node":">=24.0.0"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"gitHead":"a42a300100f69feddc62455aae3948e1ce7a0b99","_id":"@bymax-one/nest-logger@1.4.0","_nodeVersion":"24.19.0","_npmVersion":"11.17.0","dist":{"integrity":"sha512-JeRwlxonlg1WJlxQcSb3DRqX8+X/hFVWPjOp3ht+DEiHk0kjuddtjsZ0POTnGhbXAmMi6mlB5mDwZ+oAMy8UaA==","shasum":"42b6cbee2a5b894ebda27b82aaf011836ada46e8","tarball":"https://registry.npmjs.org/@bymax-one/nest-logger/-/nest-logger-1.4.0.tgz","fileCount":12,"unpackedSize":673374,"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@bymax-one%2fnest-logger@1.4.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIFXpHzDmYr0RvepeFvs1RZgLKKGa+DUr/4pqwP2DQYgrAiEA/E5zdVmOz2v2ast4u8XHKvXqr6khWAMkm9oMFuhetgA="}]},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:ba0cbcf9-3a81-42eb-b5b3-aadccdb90f58"}},"directories":{},"maintainers":[{"name":"bymax.one","email":"bymaxone.core@gmail.com"},{"name":"msalvatti","email":"msalvatti@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/nest-logger_1.4.0_1788092325343_0.5171734701619084"},"_hasShrinkwrap":false}},"time":{"created":"2026-06-18T13:10:22.283Z","modified":"2026-08-30T12:18:45.880Z","1.0.0":"2026-06-18T13:10:22.540Z","1.0.1":"2026-07-29T16:59:45.231Z","1.0.2":"2026-07-30T00:21:32.883Z","1.0.3":"2026-07-30T00:40:14.203Z","1.0.4":"2026-07-30T10:01:19.934Z","1.0.5":"2026-08-01T17:58:00.865Z","1.0.6":"2026-08-06T11:33:31.633Z","1.0.7":"2026-08-08T13:00:35.942Z","1.0.8":"2026-08-10T17:02:14.168Z","1.1.0":"2026-08-11T11:03:11.703Z","1.2.0":"2026-08-13T10:58:13.031Z","1.2.1":"2026-08-13T19:06:37.191Z","1.2.2":"2026-08-13T19:46:21.730Z","1.2.3":"2026-08-14T22:45:15.806Z","1.2.4":"2026-08-14T23:46:54.561Z","1.2.5":"2026-08-15T00:24:59.440Z","1.2.6":"2026-08-15T12:19:24.276Z","1.2.7":"2026-08-15T14:10:00.228Z","1.2.9":"2026-08-16T21:50:52.545Z","1.3.0":"2026-08-18T11:14:09.217Z","1.3.1":"2026-08-18T22:57:01.403Z","1.4.0":"2026-08-30T12:18:45.523Z"},"bugs":{"url":"https://github.com/bymaxone/nest-logger/issues"},"author":{"name":"Bymax One","email":"support@bymax.one"},"license":"MIT","homepage":"https://github.com/bymaxone/nest-logger#readme","keywords":["nestjs","logger","pino","json-logging","structured-logging","opentelemetry","observability","tracing","request-id","pii-redaction"],"repository":{"type":"git","url":"git+https://github.com/bymaxone/nest-logger.git"},"description":"Structured JSON logging for NestJS based on Pino 10, with optional OpenTelemetry correlation.","maintainers":[{"name":"bymax.one","email":"bymaxone.core@gmail.com"},{"name":"msalvatti","email":"msalvatti@gmail.com"}],"readme":"<p align=\"center\">\n  <img src=\"https://img.shields.io/badge/%40bymax--one-nest--logger-000000?style=for-the-badge&logo=nestjs&logoColor=E0234E\" alt=\"@bymax-one/nest-logger\" />\n</p>\n\n<h1 align=\"center\">@bymax-one/nest-logger</h1>\n\n<p align=\"center\">\n  <strong>Structured JSON logging for NestJS</strong><br />\n  <sub>Pino 10 · OpenTelemetry · PII Redaction · Multi-Destination · Multi-Tenant · Zero Runtime Dependencies</sub>\n</p>\n\n<p align=\"center\">\n  <a href=\"https://www.npmjs.com/package/@bymax-one/nest-logger\"><img src=\"https://img.shields.io/npm/v/@bymax-one/nest-logger?style=flat-square&colorA=000000&colorB=000000\" alt=\"npm version\" /></a>\n  <a href=\"https://www.npmjs.com/package/@bymax-one/nest-logger\"><img src=\"https://img.shields.io/npm/dm/@bymax-one/nest-logger?style=flat-square&colorA=000000&colorB=000000\" alt=\"npm downloads\" /></a>\n  <a href=\"https://github.com/bymaxone/nest-logger/actions/workflows/ci.yml\"><img src=\"https://img.shields.io/github/actions/workflow/status/bymaxone/nest-logger/ci.yml?branch=main&style=flat-square&colorA=000000&label=CI\" alt=\"CI status\" /></a>\n  <a href=\"https://github.com/bymaxone/nest-logger/actions/workflows/ci.yml\"><img src=\"https://img.shields.io/badge/coverage-100%25-brightgreen?style=flat-square&colorA=000000\" alt=\"coverage\" /></a>\n  <a href=\"https://github.com/bymaxone/nest-logger/blob/main/docs/mutation_testing_results.md\"><img src=\"https://img.shields.io/badge/mutation-100%25-brightgreen?style=flat-square&colorA=000000\" alt=\"mutation score\" /></a>\n  <a href=\"https://scorecard.dev/viewer/?uri=github.com/bymaxone/nest-logger\"><img src=\"https://api.scorecard.dev/projects/github.com/bymaxone/nest-logger/badge?style=flat-square\" alt=\"OpenSSF Scorecard\" /></a>\n  <a href=\"https://github.com/bymaxone/nest-logger/blob/main/LICENSE\"><img src=\"https://img.shields.io/github/license/bymaxone/nest-logger?style=flat-square&colorA=000000&colorB=000000\" alt=\"license\" /></a>\n  <a href=\"https://www.typescriptlang.org/\"><img src=\"https://img.shields.io/badge/TypeScript-strict-3178C6?style=flat-square&logo=typescript&logoColor=white\" alt=\"TypeScript\" /></a>\n  <a href=\"https://nodejs.org/\"><img src=\"https://img.shields.io/badge/Node.js-24%2B-339933?style=flat-square&logo=node.js&logoColor=white\" alt=\"Node.js\" /></a>\n</p>\n\n<p align=\"center\">\n  <a href=\"https://github.com/bymaxone/nest-logger\">GitHub</a> ·\n  <a href=\"https://github.com/bymaxone/nest-logger/issues\">Issues</a> ·\n  <a href=\"#-quick-start\">Quick Start</a> ·\n  <a href=\"#-api-reference\">API Reference</a> ·\n  <a href=\"https://github.com/bymaxone/nest-logger-example\">Example App</a>\n</p>\n\n---\n\n## ✨ Overview\n\n`@bymax-one/nest-logger` replaces ad-hoc `console.log` and legacy Winston setups with a production-grade structured logging pipeline. Every log entry is a JSON object carrying a `logKey` (`MODULE_ACTION_RESULT` convention), `requestId`, `tenantId`, and — when OpenTelemetry is active — the correlated `traceId`/`spanId`.\n\n**Why Pino?** At ~750,000 logs/sec (vs Winston's ~110,000), Pino consumes 3× less CPU and half the RSS under load. The difference is measurable in production billing/payments backends where the logger is on the hot path for every request.\n\nThe library has **zero direct dependencies** — all packages arrive as peer dependencies, so you control exact versions and the supply chain surface stays minimal.\n\n### Why nest-logger?\n\n- **🎯 One module, the whole pipeline** — Logger service, HTTP interceptor, exception filter, context propagation, redaction, and destinations arrive in a single `forRoot()`. No gluing together `pino-http`, a redaction layer, and a transport by hand.\n- **🔌 Your sinks, your rules** — The library defines `ILogDestination`. You implement it for Loki, Postgres, a rolling file, or anything else. No vendor lock-in, no hidden transport dependencies.\n- **🔒 Redacted by default** — 32 sensitive field names are censored **down to 100 levels of nesting**, covering passwords, tokens, PCI DSS card data, MFA secrets, LGPD documents and credential-bearing HTTP headers. One recursive walk per entry, not a path list. Domain-specific names are yours to add via `redactPaths`.\n- **⚡ On the hot path, so it stays cheap** — Singleton providers, one composed Pino mixin, and a single-pass redactor. No `Scope.REQUEST`, no path matching.\n- **🔭 Correlated when you need it** — When an OpenTelemetry span is active, `traceId`/`spanId`/`traceFlags` land in every entry. When the peer is absent, the mixin steps aside at zero cost.\n\n```\npnpm add @bymax-one/nest-logger\n```\n\n---\n\n## 🔥 Features\n\n### 📝 Core Logging\n\n- ✅ **Structured JSON** — every entry has `level`, `time`, `service`, `logKey`, `msg`, and arbitrary metadata fields\n- ✅ **`MODULE_ACTION_RESULT` Log Keys** — a naming convention enforced by an exported regex for CI validation\n- ✅ **NestJS `LoggerService` Bridge** — drop-in replacement; all NestJS internal logs flow through Pino\n- ✅ **Pretty-Print in Dev** — opt-in `PrettyDevDestination` with a configurable `view` (single-line, hidden fields, message-only) for readable local output (requires optional `pino-pretty`)\n- ✅ **Field Size Guard** — a serialized field over the ceiling (default 64 KB) is replaced by a compact truncation envelope instead of flooding the sink\n\n### 🛡️ Security & Privacy\n\n- ✅ **PII Redaction by Default** — 32 field names censored wherever they appear, to a 100-level nesting ceiling past which nested objects are dropped, in a single snapshotting walk\n- ✅ **PCI DSS & MFA Coverage** — card data and MFA secrets redacted out of the box, with common HTTP auth headers\n- ✅ **LGPD-Aware Paths** — CPF, CNPJ, and RG redacted by default for Brazilian workloads\n- ✅ **Append-Only Redact List** — `DEFAULT_REDACT_PATHS` never shrinks without a major version; extend it via `redactPaths`\n- ✅ **Validated Trace IDs** — OTel identifiers pass `isValidTraceId` before injection, never raw user input\n\n### 🔍 Observability & Context\n\n- ✅ **OpenTelemetry Correlation** — optional `@opentelemetry/api` peer; injects `traceId`/`spanId`/`traceFlags` into every log via a Pino mixin when an active span is detected. Resolution is anchored at the library's own module path, so a Docker `WORKDIR`, a pnpm workspace or a monorepo launched from the repo root cannot silently switch correlation off\n- ✅ **Stable Resource Identity** — `service.name`/`.namespace`/`.version`/`.instance.id` and `deployment.environment.name`, all **Stable** in Semantic Conventions v1.44.0, resolved from one deterministic precedence shared with the OTel SDK\n- ✅ **Semconv Error Fields** — opt-in `exception.type`/`.message`/`.stacktrace` and low-cardinality `error.type`, additive beside the legacy `err.*`, with full `Error.cause` chains\n- ✅ **Machine-Readable Event Names** — `event.name` derived from `logKey` following OTel naming rules\n- ✅ **AsyncLocalStorage Context** — `requestId`, `tenantId`, `userId` flow automatically through the request lifecycle without prop drilling\n- ✅ **HTTP Access Log, before guards** — logs every request including the ones an interceptor cannot see (401/403/429 guard rejections, 404 unmatched routes), with URL normalization (UUIDs and numeric IDs replaced by `:id`) and the query string stripped\n- ✅ **Exception Filter** — captures NestJS `HttpException` and unexpected errors with structured output\n\n### 🔌 Destinations\n\n- ✅ **Pluggable Destinations** — implement `ILogDestination` to ship logs to Loki, Postgres, rolling files, or any sink\n- ✅ **Managed Lifecycle** — `onInit()` / `onShutdown()` hooks; a destination that fails `onInit()` is reported and excluded from shutdown, and boot is never aborted\n- ✅ **Crash-Proof Writes** — every `write()` is wrapped in a try/catch; a failure is reported on `stderr` and swallowed, never propagated to the app\n\n### 🧩 Developer Experience\n\n- ✅ **Zero Runtime Dependencies** — everything arrives as a peer dependency, so you control versions and supply-chain surface\n- ✅ **2 Subpath Exports** — `.` for the NestJS server API, `./shared` for zero-dependency types and constants\n- ✅ **Dynamic Module** — configure via `forRoot()` or `forRootAsync()`, sensible defaults included\n- ✅ **Strict TypeScript** — `strict: true`, no `any` in production code, JSDoc on every public export\n- ✅ **100% Coverage + Mutation Tested** — statements, branches, functions, and lines gated at 100%, with Stryker as the deeper gate\n\n---\n\n## 📦 Subpath Exports\n\nOne package, two entry points — import only what your app needs:\n\n| Subpath    | Import                          | Purpose                                                                                                                                                           |              Dependencies               |\n| ---------- | ------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------- | :-------------------------------------: |\n| **Server** | `@bymax-one/nest-logger`        | NestJS module, logger service, interceptor, filter, decorators, destinations                                                                                      | NestJS 11, pino, rxjs, reflect-metadata |\n| **Shared** | `@bymax-one/nest-logger/shared` | Types, constants, the log-key regex — `LogLevel`, `LogEntry`, `ServiceMetadata`, `ResolvedServiceMetadata`, `EmittedServiceResource`, `EmittedDeploymentResource` |                  None                   |\n\n```\nshared (zero deps)\n     ↑\n  server\n```\n\nThe `/shared` subpath is safe to import in isomorphic code, test helpers, CLI scripts, or shared packages that must not pull in NestJS.\n\n---\n\n> [!TIP]\n> Prefer to learn from a working app? See the [nest-logger-example](https://github.com/bymaxone/nest-logger-example) — a full NestJS project wired with this library.\n\n## 🚀 Quick Start\n\n### 1. Install\n\n```bash\n# Using pnpm (recommended)\npnpm add @bymax-one/nest-logger\n\n# Using npm\nnpm install @bymax-one/nest-logger\n\n# Using yarn\nyarn add @bymax-one/nest-logger\n```\n\n> [!IMPORTANT]\n> You must also install the required **peer dependencies**. The library ships `\"dependencies\": {}`, so nothing arrives implicitly:\n\n```bash\n# Server subpath (required)\npnpm add @nestjs/common @nestjs/core pino reflect-metadata rxjs\n\n# Optional — pretty local output via PrettyDevDestination\npnpm add -D pino-pretty\n\n# Optional — OpenTelemetry trace correlation\npnpm add @opentelemetry/api @opentelemetry/sdk-node\n\n```\n\n> ⚠️ **Under pnpm, `-D` may not make it absent in production — measure, do not assume.** Two\n> consumers who had assumed otherwise measured the peer **present** in their real production images,\n> by two different build routes: `pnpm prune --prod` keeps the store entry, and a clean\n> `pnpm install --prod --frozen-lockfile` in a fresh stage installs it too. In both, the peer was\n> recorded in the lockfile. `PrettyDevDestination` imports it lazily, relative to the library's own\n> directory under `.pnpm/`, where it is a sibling — so it resolves.\n>\n> That is two measurements, not a law of pnpm: whether a production install always carries an optional\n> peer, however the lockfile was produced, has not been tested here. The advice below does not depend\n> on it.\n>\n> The clean-install case is worth stating separately, because \"we do a fresh prod install, not a\n> prune\" reads like an exemption and is not one. It is what one of those consumers concluded before\n> measuring their own image.\n>\n> **On other package managers this is different**, and the difference cuts the other way: under npm's\n> or yarn's flat `node_modules`, a pruned devDependency really is gone. If you install with those,\n> do not read this warning as universal.\n>\n> Either way, the rule that survives both layouts: **\"it is a devDependency, therefore this path\n> cannot run in production\" is not a safe premise, because the premise is about someone else's\n> install command.** A `PrettyDevDestination` left registered in production will not crash and will\n> not warn — it renders ANSI colour into a log pipeline that has silently failed to parse every line\n> since the deploy, which is indistinguishable from a service that went quiet. Gate it on an explicit\n> configuration value you can see, not on the packaging.\n\n> [!NOTE]\n> `@opentelemetry/api` is resolved lazily when the Pino instance is built. When it is absent the trace mixin silently steps aside — the logger never fails to start, and never warns, over an optional peer.\n\n> [!NOTE]\n> The published declarations depend on no HTTP framework's types. The HTTP interceptor, the exception filter and the request-id middleware are typed by structural contracts (`LoggableRequest`, `LoggableResponse`, `NextHandler`) that an Express request and response satisfy as-is, so nothing extra is needed even when you compile with `skipLibCheck: false`. The emitted `.d.ts` imports only `@nestjs/common`, `pino` and `rxjs`.\n\n### 2. Register the module\n\n```typescript\n// app.module.ts\nimport { Module } from '@nestjs/common'\nimport { BymaxLoggerModule } from '@bymax-one/nest-logger'\n\n@Module({\n  imports: [\n    BymaxLoggerModule.forRoot({\n      service: { name: 'my-app', version: '1.0.0' },\n      level: 'info',\n      http: { isEnabled: true }\n    })\n  ]\n})\nexport class AppModule {}\n```\n\nStdout is wired automatically — `DefaultStdoutDestination` is always active, so this is all you need to be logging structured JSON.\n\n### 3. Async configuration with `ConfigService`\n\n```typescript\n// app.module.ts\nimport { Module } from '@nestjs/common'\nimport { ConfigModule, ConfigService } from '@nestjs/config'\nimport { BymaxLoggerModule } from '@bymax-one/nest-logger'\n\n@Module({\n  imports: [\n    ConfigModule.forRoot({ isGlobal: true }),\n    BymaxLoggerModule.forRootAsync({\n      imports: [ConfigModule],\n      inject: [ConfigService],\n      useFactory: (cfg: ConfigService) => ({\n        service: {\n          name: cfg.getOrThrow<string>('OTEL_SERVICE_NAME'),\n          version: cfg.getOrThrow<string>('RELEASE_SHA')\n        },\n        level: cfg.get('LOG_LEVEL') ?? 'info',\n        http: { isEnabled: true }\n      })\n    })\n  ]\n})\nexport class AppModule {}\n```\n\n### 4. Inject the logger in a service\n\n```typescript\n// payments.service.ts\nimport { Injectable } from '@nestjs/common'\nimport { InjectLogger, PinoLoggerService } from '@bymax-one/nest-logger'\n\n@Injectable()\nexport class PaymentsService {\n  constructor(\n    @InjectLogger(PaymentsService.name)\n    private readonly logger: PinoLoggerService\n  ) {}\n\n  async refund(paymentId: string, amount: number, requestedBy: string) {\n    this.logger.info('PAYMENT_REFUND_REQUESTED', 'Refund requested', requestedBy, {\n      paymentId,\n      amount\n    })\n\n    try {\n      const result = await this.stripe.refunds.create({ payment_intent: paymentId, amount })\n      this.logger.info('PAYMENT_REFUND_SUCCESS', 'Refund processed', requestedBy, {\n        paymentId,\n        stripeRefundId: result.id\n      })\n      return result\n    } catch (err) {\n      this.logger.errorStructured(\n        'PAYMENT_REFUND_FAILED',\n        err instanceof Error ? err : new Error(String(err)),\n        requestedBy,\n        { paymentId, amount }\n      )\n      throw err\n    }\n  }\n}\n```\n\nOutput (JSON, production):\n\n```json\n{\n  \"level\": \"info\",\n  \"time\": \"2026-05-28T10:12:44.512Z\",\n  \"service\": { \"name\": \"my-app\", \"version\": \"abc123\" },\n  \"logKey\": \"PAYMENT_REFUND_SUCCESS\",\n  \"msg\": \"Refund processed\",\n  \"context\": \"PaymentsService\",\n  \"requestId\": \"r_7f3a9b\",\n  \"tenantId\": \"t_acme\",\n  \"traceId\": \"4bf92f3577b34da6a3ce929d0e0e4736\",\n  \"spanId\": \"00f067aa0ba902b7\",\n  \"paymentId\": \"pi_xyz\",\n  \"stripeRefundId\": \"re_abc\"\n}\n```\n\nOutput (pretty-print, development):\n\n```\n[10:12:44.512] INFO (my-app): PAYMENT_REFUND_SUCCESS\n    requestId: \"r_7f3a9b\"\n    tenantId: \"t_acme\"\n    paymentId: \"pi_xyz\"\n    stripeRefundId: \"re_abc\"\n```\n\n### 5. HTTP logging (automatic)\n\nEnable `http.isEnabled: true` in the module options and wire the access log — `applyAccessLog(app)` in `main.ts` (recommended, see [Requests rejected before routing](#requests-rejected-before-routing)) or `applyRequestIdMiddleware(consumer)` (see [Context propagation](#7-context-propagation-with-logcontextservice)). The access log is recorded from **middleware**, which emits:\n\n| Log key                     | When                                                |\n| --------------------------- | --------------------------------------------------- |\n| `HTTP_REQUEST_START`        | Request received                                    |\n| `HTTP_REQUEST_SUCCESS`      | 2xx response                                        |\n| `HTTP_REQUEST_REDIRECT`     | 3xx response                                        |\n| `HTTP_REQUEST_CLIENT_ERROR` | 4xx response                                        |\n| `HTTP_REQUEST_SERVER_ERROR` | 5xx response                                        |\n| `HTTP_REQUEST_ABORTED`      | Connection closed before the response was delivered |\n\n`HTTP_REQUEST_START` is emitted **before guards**, so it carries no `userId` — authentication runs\nin a guard, and at that point there is no principal yet. The acting user is on the **terminal**\nentry, where the guard has populated it. Both entries carry the same `requestId`, so joining on\nthat gives the whole request.\n| `HTTP_EXCEPTION_HANDLED` | `HttpException` caught by the filter |\n| `HTTP_EXCEPTION_UNHANDLED` | Unexpected error caught by the filter |\n\nURLs are automatically normalized — `/users/550e8400-e29b-41d4-a716-446655440000` becomes `/users/:id` so Loki/Grafana cardinality stays bounded. The query string is stripped from every logged URL, because a magic-link token or reset code in a query parameter is a secret no key-name redaction can scrub out of a string value.\n\n> [!IMPORTANT]\n> **Why middleware and not an interceptor.** NestJS runs middleware → guards → interceptors →\n> handler, so an interceptor never observes a request a guard rejected, and never observes one that\n> matched no route. Measured against a real backend: **401, 403, 429 from a throttler and 404 for an\n> unknown path produced no log line at all** — not even `HTTP_REQUEST_START` — so brute force,\n> credential stuffing and route enumeration were invisible, and invisible without a `requestId` to\n> correlate them by. The access log therefore runs before guards.\n>\n> A consumer who does not wire the middleware keeps the previous interceptor-based behaviour rather\n> than losing HTTP logs — including its blind spot.\n\n#### Requests rejected before routing\n\nMiddleware wired through `configure(consumer)` is not early enough for every request. NestJS\nregisters the body parser **one line before** it registers module middleware:\n\n```js\n// @nestjs/core/nest-application.js\nuseBodyParser && this.registerParserMiddleware()\nawait this.registerModules() // everything from configure(consumer)\n```\n\nExpress dispatches in registration order, so when the parser rejects a body it calls `next(err)`\nand every remaining non-error handler is skipped — module middleware, guards, interceptors and the\nroute handler all never run. **A `POST` carrying truncated JSON therefore produces no access log\nat all**, and the same hole covers a payload over the body limit and an unsupported content type:\nexactly the requests a client got wrong or an attacker shaped.\n\nWhat you get today depends on your wiring, and neither answer is good:\n\n| Wiring                                                 | A body the parser rejects produces                        |\n| ------------------------------------------------------ | --------------------------------------------------------- |\n| `forRoot` with `shouldCaptureExceptions` (the default) | **one** `HTTP_EXCEPTION_HANDLED` line, **no `requestId`** |\n| `forRootAsync`, or `shouldCaptureExceptions: false`    | **nothing at all**                                        |\n\nThe first row is the one worth reading twice. The line exists, so a dashboard counting entries\nlooks healthy — but the correlation scope is mounted behind the parser too, so it never opened:\nthe client can send `x-request-id: measure-me` and the entry carries no `requestId` to join it to.\nA 400 you cannot trace to the caller is the same defect as a missing 400 wearing a healthier face.\n\n`applyAccessLog(app)` closes both rows. `INestApplication.use()` delegates straight to the HTTP\nadapter and `init()` (where the parser is registered) does not run until `listen()`, so mounting\nfrom `main.ts` lands **ahead** of the parser — the same reason `helmet` and `cookie-parser` are\nmounted this way:\n\n```typescript\n// main.ts\nimport { NestFactory } from '@nestjs/core'\nimport { BymaxLoggerModule, applyAccessLog } from '@bymax-one/nest-logger'\nimport { AppModule } from './app.module'\n\nasync function bootstrap() {\n  const app = await NestFactory.create(AppModule, { bufferLogs: true })\n  BymaxLoggerModule.useNestLogger(app)\n\n  // BEFORE the app initializes. init() is where the parser is mounted, and\n  // listen() only triggers init() when you have not called it yourself — so a\n  // serverless entry point or a test that does `await app.init()` first must\n  // mount before THAT, not merely before listen().\n  applyAccessLog(app)\n\n  await app.listen(3000)\n}\n\nvoid bootstrap()\n```\n\nThe access log needs nothing else to work there — it emits from the response's `'close'` event,\nreading `statusCode` and `writableFinished`, so it never depends on a route matching, a handler\nrunning or a filter catching anything. One line in, one line out, for the parser rejection, the\nunmatched-route 404, the guard rejection and the aborted connection alike.\n\n`applyRequestIdMiddleware(consumer)` remains supported and unchanged; it is the right choice when\ncorrelation should be scoped to a route subtree rather than the whole application. **Wiring both is\nsafe** — the correlation middleware adopts an id already in scope instead of minting a second one,\nand the access log stands down when it finds the request's lifecycle already claimed, so nothing is\nminted twice and nothing is logged twice.\n\n**Delivery is reported separately from status.** `HTTP_REQUEST_ABORTED` is emitted when the\nconnection closed before the response was flushed, and it **keeps the real status the server\nproduced** rather than inventing one: nginx's `499` is not an HTTP status (IANA leaves 452–499\nunassigned), so recording it would assert a code the protocol has no name for and break any\nconsumer grouping by class.\n\nIts limit is worth stating: `writableFinished` distinguishes a response still in flight from one\nhanded to the operating system. A **fast handler whose client hangs up after the bytes were\nflushed** is reported as the success it was — the server completed and flushed it, and whether the\npeer read it is not knowable from the server side. What this catches is the case that matters\noperationally: the slow upstream, the load-balancer timeout, the cancelled request.\n\n### 6. OpenTelemetry correlation\n\nInitialize the OTel SDK **before** importing NestJS — this is critical:\n\n```typescript\n// main.ts (top of file — before any NestJS import)\nimport { NodeSDK } from '@opentelemetry/sdk-node'\nimport { OTLPTraceExporter } from '@opentelemetry/exporter-trace-otlp-http'\nimport { getNodeAutoInstrumentations } from '@opentelemetry/auto-instrumentations-node'\nimport { resourceFromAttributes } from '@opentelemetry/resources'\nimport { ATTR_SERVICE_NAME, ATTR_SERVICE_VERSION } from '@opentelemetry/semantic-conventions'\n\nconst sdk = new NodeSDK({\n  resource: resourceFromAttributes({\n    [ATTR_SERVICE_NAME]: process.env.OTEL_SERVICE_NAME ?? 'my-app',\n    [ATTR_SERVICE_VERSION]: process.env.RELEASE_SHA ?? 'dev',\n    'deployment.environment': process.env.NODE_ENV ?? 'development'\n  }),\n  traceExporter: new OTLPTraceExporter({ url: process.env.OTLP_TRACE_ENDPOINT }),\n  instrumentations: [\n    getNodeAutoInstrumentations({\n      '@opentelemetry/instrumentation-fs': { isEnabled: false } // noisy\n    })\n  ]\n})\n\nsdk.start()\n\nprocess.on('SIGTERM', () => {\n  void sdk.shutdown().finally(() => process.exit(0))\n})\n\n// NestJS imports come AFTER sdk.start()\nimport { NestFactory } from '@nestjs/core'\nimport { AppModule } from './app.module'\n\nasync function bootstrap() {\n  const app = await NestFactory.create(AppModule, { bufferLogs: true })\n  await app.listen(3000)\n}\n\nvoid bootstrap()\n```\n\nOnce active, every log entry automatically carries `traceId`, `spanId`, and `traceFlags`. Click the `traceId` in Grafana to jump directly to the correlated span in Tempo or Honeycomb.\n\n**Without OpenTelemetry installed, everything above simply does not happen** — no error, no warning\non every log, no crash. The peer is optional and the logger is fully usable on its own. The one\ncase that _is_ reported is a misconfiguration: if trace injection is enabled and\n`@opentelemetry/api` cannot be resolved, a single `LOGGER_BOOTSTRAP_WARNING` naming\n`OTEL_API_UNAVAILABLE` is emitted at startup. Absence of `traceId` would otherwise be\nindistinguishable from \"no active span\".\n\nThe logger **observes** the trace context; it never creates spans, installs a context manager, or\nparses `traceparent` by hand. When the API is present but no span is active, no identifiers are\nemitted — none are invented.\n\n> [!NOTE]\n> Resolution of the optional peer is anchored at the **library's own module path**, falling back to\n> `process.cwd()`. Anchoring only at the working directory — as versions before this did — silently\n> disabled correlation whenever the process was launched from somewhere other than the application\n> root: a Docker `WORKDIR`, a pnpm/Yarn workspace with hoisted `node_modules`, a monorepo started at\n> the repository root, a serverless bundle.\n\n### 6b. Resource identity\n\nEvery entry carries the service identity, using attributes that are **Stable** in Semantic\nConventions v1.44.0:\n\n```typescript\nBymaxLoggerModule.forRoot({\n  service: {\n    name: 'checkout-api', // service.name\n    version: '2.14.3', // service.version\n    namespace: 'payments', // service.namespace\n    instanceId: process.env.POD_UID, // service.instance.id\n    environment: 'production' // deployment.environment.name\n  }\n})\n```\n\n```json\n{\n  \"level\": \"info\",\n  \"time\": \"2026-08-13T10:00:00.000Z\",\n  \"service\": {\n    \"name\": \"checkout-api\",\n    \"version\": \"2.14.3\",\n    \"namespace\": \"payments\",\n    \"instance\": { \"id\": \"pod-7f3a\" }\n  },\n  \"deployment\": { \"environment\": { \"name\": \"production\" } },\n  \"logKey\": \"PAYMENT_FAILED\",\n  \"event.name\": \"payment.failed\",\n  \"msg\": \"Payment failed\"\n}\n```\n\nSet `resourceFormat: 'flat'` to emit the dotted attribute names verbatim\n(`\"service.instance.id\": \"pod-7f3a\"`), which is what a collector mapping log fields onto resource\nattributes reads directly.\n\n#### Precedence\n\nResolved once at startup, in this order:\n\n1. **explicit `service` options**\n2. **`OTEL_SERVICE_NAME`** (name only)\n3. **`OTEL_RESOURCE_ATTRIBUTES`** (`service.namespace=payments,service.version=2.14.3,…`)\n4. **`NODE_ENV`** (environment only)\n\nExplicit configuration wins because it is the most specific statement you can make. The order of\nthe two OpenTelemetry variables is required by the specification, not chosen: _\"If `service.name` is\nalso provided in `OTEL_RESOURCE_ATTRIBUTES`, then `OTEL_SERVICE_NAME` takes precedence.\"_\n\nReading the same variables the SDK reads is what makes **logs and traces agree** without the logger\ndepending on the SDK. Configure the environment once and both signals describe the same service.\n\n> [!IMPORTANT]\n> **`service.instance.id` is never generated.** The specification requires the triplet\n> (`service.namespace`, `service.name`, `service.instance.id`) to be globally unique and recommends\n> a random UUID — but a UUID minted by the logger would be the _logger's_, not the OpenTelemetry\n> Resource's, so logs and traces would claim different instances of the same process. It would also\n> change on every restart while looking authoritative. Supply it from the platform (Kubernetes pod\n> UID, ECS task ARN, VM instance id) or through `OTEL_RESOURCE_ATTRIBUTES`. Omitted is honest;\n> plausible-but-wrong is not.\n>\n> There is **no `OTEL_SERVICE_VERSION`** variable in the specification. Version comes from\n> configuration or from `OTEL_RESOURCE_ATTRIBUTES`.\n\nThe deprecated `deployment.environment` spelling is **never** emitted, in any mode.\n\n### 6c. Event names\n\nStructured entries carry a machine-readable event name derived from `logKey`, following OTel naming\nrules — lowercase, dot-namespaced:\n\n| `logKey`                     | `event.name`                 |\n| ---------------------------- | ---------------------------- |\n| `PAYMENT_FAILED`             | `payment.failed`             |\n| `USER_AUTHENTICATION_FAILED` | `user.authentication.failed` |\n\n`logKey` is **never renamed or removed** — this is additive. Calls through the NestJS variadic\nbridge (`logger.log`, `logger.warn`, …) carry no log key and correctly get no event name: an\nordinary diagnostic line is not an Event.\n\nKeep event names **low cardinality**. `payment.failed` is an event; `payment.failed.918231781` is an\nidentifier wearing an event's clothes and will multiply your series count. Identifiers belong in\ntheir own fields.\n\n> [!NOTE]\n> The value is meant to be mapped onto the **`EventName`** field of the OpenTelemetry LogRecord,\n> which is Stable in the Logs Data Model. The same-named `event.name` **attribute** is _Deprecated_\n> precisely because the value belongs in that top-level field instead. A JSON log line has no way to\n> express that distinction — every key is just a key — so the carrier key is configurable via\n> `eventNameField`, and your collector decides where it lands. What it must not do is carry it into\n> an OTLP _attributes_ map under the deprecated name.\n\nSet `eventNameField: false` to emit nothing.\n\n### 6d. Error fields\n\n`errorFormat` controls the shape:\n\n```json\n// errorFormat: 'pino'  (default — unchanged from 1.2.0)\n{ \"err\": { \"type\": \"PaymentDeclined\", \"message\": \"card declined\", \"stack\": \"…\",\n           \"cause\": { \"name\": \"Error\", \"message\": \"gateway timeout\" } } }\n\n// errorFormat: 'both'  (recommended while migrating)\n{ \"err\": { \"type\": \"PaymentDeclined\", … },\n  \"exception.type\": \"PaymentDeclined\",\n  \"exception.message\": \"card declined\",\n  \"exception.stacktrace\": \"…\",\n  \"error.type\": \"PaymentDeclined\" }\n\n// errorFormat: 'semconv'  (explicit migration — err is removed)\n{ \"exception.type\": \"PaymentDeclined\", \"exception.message\": \"card declined\",\n  \"exception.stacktrace\": \"…\", \"error.type\": \"PaymentDeclined\" }\n```\n\nAll four attributes are **Stable**. `error.type` carries the **class name** and is low cardinality\nby construction — never a message, never an identifier — because the spec requires it to be\naggregatable.\n\n**`Error.cause` chains are preserved**, depth- and width-bounded, circular-safe, and redacted like\nany other field. `AggregateError` members reach the entry as `err.errors`. There is no\nOpenTelemetry attribute for a cause chain, so these stay namespaced under `err` rather than\ninventing an `exception.cause` the spec does not define.\n\n**An error's own enumerable properties travel with it at every depth** — `code` on a Node system\nerror, `statusCode` from an HTTP layer, whatever domain fields you attached — including on a nested\n`cause` and on each `AggregateError` member:\n\n```json\n{\n  \"err\": {\n    \"type\": \"Error\",\n    \"message\": \"bootstrap failed\",\n    \"code\": \"EBOOT\",\n    \"cause\": {\n      \"name\": \"Error\",\n      \"message\": \"config invalid\",\n      \"code\": \"BYMAX_CONFIG_VALIDATION\",\n      \"issues\": [{ \"variable\": \"DATABASE_URL\", \"code\": \"invalid_url\" }]\n    }\n  }\n}\n```\n\nThis matters because `code` is usually the field you alert on. Until 1.2.7 those properties survived\nonly on the error handed to the log call and were dropped the moment the same error was wrapped as\nsomeone else's `cause` — which is what any handler that wraps what it caught does before\nlogging it. They never shadow a\nfield the serializer derives, and they pass through the same name-based redaction and size bound as\nany other serializer output.\n\nAn error's own enumerable properties (`code`, `statusCode`, domain fields) are carried through, as\nPino's standard serializer did.\n\n### 7. Context propagation with `LogContextService`\n\n```typescript\n// request-id.middleware.ts\nimport { Injectable, NestMiddleware } from '@nestjs/common'\nimport {\n  LogContextService,\n  type LoggableRequest,\n  type LoggableResponse\n} from '@bymax-one/nest-logger'\nimport { randomUUID } from 'node:crypto'\n\n@Injectable()\nexport class RequestIdMiddleware implements NestMiddleware {\n  constructor(private readonly logContext: LogContextService) {}\n\n  use(req: LoggableRequest, res: LoggableResponse, next: () => void) {\n    // A header can arrive repeated, so its type is `string | string[]`.\n    const raw = req.headers['x-request-id']\n    const requestId = (Array.isArray(raw) ? raw[0] : raw) ?? `r_${randomUUID()}`\n    this.logContext.run({ requestId }, next)\n  }\n}\n```\n\nAny log emitted inside the `run()` scope — regardless of nesting depth — automatically includes `requestId` with no prop drilling.\n\n---\n\n## ⚙️ Configuration\n\nFull options reference for `BymaxLoggerModule.forRoot(options)`:\n\n### Top-level options\n\n| Option                       | Type                            | Default                            | Description                                                                                                                                |\n| ---------------------------- | ------------------------------- | ---------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------ |\n| `service.name`               | `string`                        | **Required**                       | Service name emitted in every log entry                                                                                                    |\n| `service.version`            | `string`                        | **Required**                       | Release version/SHA emitted in every log entry                                                                                             |\n| `service.namespace`          | `string`                        | —                                  | OTel `service.namespace` (**Stable**) — the group the service belongs to                                                                   |\n| `service.instanceId`         | `string`                        | —                                  | OTel `service.instance.id` (**Stable**). **Never generated** — supply it from the platform. See [Resource identity](#6b-resource-identity) |\n| `service.environment`        | `string`                        | `NODE_ENV`                         | OTel `deployment.environment.name` (**Stable**). The deprecated `deployment.environment` is never emitted                                  |\n| `resourceFormat`             | `'nested' \\| 'flat'`            | `'nested'`                         | Shape of the identity fields. `'flat'` emits the dotted attribute names verbatim                                                           |\n| `eventNameField`             | `string \\| false`               | `'event.name'`                     | Field carrying the derived event name (`PAYMENT_FAILED` → `payment.failed`). `false` disables it                                           |\n| `errorFormat`                | `'pino' \\| 'semconv' \\| 'both'` | `'pino'`                           | `'both'` adds `exception.*` and `error.type` beside `err.*`; `'semconv'` replaces them                                                     |\n| `level`                      | `LogLevel`                      | `'info'`                           | Minimum log level. One of `fatal \\| error \\| warn \\| info \\| debug \\| trace`                                                               |\n| `redactPaths`                | `string[]`                      | `[]`                               | Additional `fast-redact` paths, applied on top of the default coverage                                                                     |\n| `redactStrategy`             | `'names' \\| 'paths'`            | `'names'`                          | Engine behind the DEFAULT set. `'paths'` restores the pre-1.2 `fast-redact` expansion (four-level ceiling, ~100× slower)                   |\n| `shouldDisableDefaultRedact` | `boolean`                       | `false`                            | Skip the default PII coverage entirely. ⚠️ Emits `LOGGER_BOOTSTRAP_WARNING` at startup — document why                                      |\n| `redactCensor`               | `string`                        | `'[REDACTED]'`                     | Replacement value written in place of every redacted field                                                                                 |\n| `maxEntrySizeBytes`          | `number`                        | `65536`                            | UTF-8 byte ceiling per serialized field (`err` + any custom serializer); over it the value becomes a truncation envelope                   |\n| `destinations`               | `ILogDestination[]`             | `[new DefaultStdoutDestination()]` | The sinks entries are written to. ⚠️ A non-empty list **replaces** that default — see [Destinations](#destinations-replace-stdout)         |\n\n### `http` options\n\n| Option                         | Type       | Default                         | Description                                                                           |\n| ------------------------------ | ---------- | ------------------------------- | ------------------------------------------------------------------------------------- |\n| `http.isEnabled`               | `boolean`  | `false`                         | Register `HttpLoggingInterceptor` (and, on `forRoot`, `HttpExceptionFilter`) globally |\n| `http.shouldCaptureExceptions` | `boolean`  | `true`                          | Capture unhandled HTTP exceptions and emit `HTTP_EXCEPTION_UNHANDLED`                 |\n| `http.shouldGenerateRequestId` | `boolean`  | `true`                          | Generate a `requestId` when the inbound request header is absent                      |\n| `http.excludePaths`            | `RegExp[]` | `[/^\\/health$/, /^\\/metrics$/]` | Paths that bypass HTTP logging. Use anchored, linear-time regexes (ReDoS-safe)        |\n| `http.tenantIdHeader`          | `string`   | `'x-tenant-id'`                 | Request header carrying the tenant identifier                                         |\n\n### `otel` options\n\n| Option                              | Type                          | Default       | Description                                                              |\n| ----------------------------------- | ----------------------------- | ------------- | ------------------------------------------------------------------------ |\n| `otel.shouldAutoInjectTraceContext` | `boolean`                     | `true`        | Detect `@opentelemetry/api` and inject `traceId`/`spanId` via Pino mixin |\n| `otel.fieldFormat`                  | `'camelCase' \\| 'snake_case'` | `'camelCase'` | Field names in log entries: `traceId`/`spanId` vs `trace_id`/`span_id`   |\n\n---\n\n## 🔑 Log Key Convention\n\nAll structured log calls must use the `MODULE_ACTION_RESULT` format:\n\n```\nUSER_LOGIN_SUCCESS         AUTH_REGISTER_FAILED\nPAYMENT_REFUND_PROCESSED   WEBHOOK_STRIPE_RECEIVED\nHTTP_REQUEST_CLIENT_ERROR  METHOD_SLOW_EXECUTION\n```\n\nThe regex is exported from the `/shared` entry for CI validation:\n\n```typescript\nimport { LOG_KEYS_CONVENTION_REGEX } from '@bymax-one/nest-logger/shared'\n\nfunction assertValidLogKey(key: string) {\n  if (!LOG_KEYS_CONVENTION_REGEX.test(key)) {\n    throw new Error(`Invalid log key: \"${key}\". Expected MODULE_ACTION_RESULT format.`)\n  }\n}\n```\n\n### Reserved keys\n\nThe following keys are used internally by the library — do not reuse them in application code:\n\n`LOGGER_BOOTSTRAP_OK` · `LOGGER_BOOTSTRAP_WARNING` · `LOGGER_SHUTDOWN_OK` · `HTTP_REQUEST_START` · `HTTP_REQUEST_SUCCESS` · `HTTP_REQUEST_REDIRECT` · `HTTP_REQUEST_CLIENT_ERROR` · `HTTP_REQUEST_SERVER_ERROR` · `HTTP_REQUEST_ABORTED` · `HTTP_REQUEST_COMPLETED` · `HTTP_EXCEPTION_HANDLED` · `HTTP_EXCEPTION_UNHANDLED` · `METHOD_EXECUTION` · `METHOD_SLOW_EXECUTION` · `LOGGER_DESTINATION_INIT_FAILED` · `LOGGER_DESTINATION_WRITE_FAILED` · `LOGGER_ENTRY_TRUNCATED` · `LOGGER_REDACTION_FAILED`\n\nAll reserved keys are exported as the `RESERVED_LOG_KEYS` constant from `@bymax-one/nest-logger/shared`.\n\n`HTTP_REQUEST_COMPLETED` is reserved but deliberately never emitted — the four status-specific\nterminal keys already carry the same `duration`, so a generic \"completed\" entry would double the\naccess-log volume to say nothing new. The reserved-but-unwritten set is exported as\n`RESERVED_LOG_KEYS_NOT_EMITTED`, and a test asserts that every OTHER declared key has a writer in\nthe source, so a key can no longer be documented as a signal and then silently never emitted.\n\n---\n\n## 🧩 Custom Destinations\n\nImplement `ILogDestination` to ship logs to any sink:\n\n```typescript\nimport type { ILogDestination } from '@bymax-one/nest-logger'\nimport type { LogEntry } from '@bymax-one/nest-logger/shared'\n\nexport class LokiDestination implements ILogDestination {\n  readonly name = 'loki'\n  readonly minLevel = 'info' as const\n\n  private readonly url: string\n  private readonly headers: Record<string, string>\n  private readonly labels: Record<string, string>\n  // Serialized lines, not objects — `write` receives the payload already encoded.\n  private buffer: string[] = []\n  private flushTimer?: NodeJS.Timeout\n\n  constructor(opts: {\n    url: string\n    username: string\n    password: string\n    labels: Record<string, string>\n  }) {\n    this.url = `${opts.url}/loki/api/v1/push`\n    this.labels = opts.labels\n    const credentials = Buffer.from(`${opts.username}:${opts.password}`).toString('base64')\n    this.headers = {\n      'Content-Type': 'application/json',\n      Authorization: `Basic ${credentials}`\n    }\n  }\n\n  async onInit(): Promise<void> {\n    this.flushTimer = setInterval(() => void this.flush(), 5_000)\n  }\n\n  async onShutdown(): Promise<void> {\n    clearInterval(this.flushTimer)\n    await this.flush()\n  }\n\n  // `payload` already IS the serialized entry, newline-terminated. Buffer it as\n  // it arrives; parse only where a field is genuinely needed, as `flush` does.\n  write(payload: string): void {\n    this.buffer.push(payload)\n    if (this.buffer.length >= 100) void this.flush()\n  }\n\n  private async flush(): Promise<void> {\n    if (this.buffer.length === 0) return\n    const batch = this.buffer.splice(0)\n    const body = JSON.stringify({\n      streams: [\n        {\n          stream: this.labels,\n          values: batch.map((line) => [\n            // `time` is an ISO 8601 string — parse it to epoch ms, then scale to\n            // the nanoseconds Loki expects. `BigInt(entry.time)` throws on an ISO string.\n            String(BigInt(Date.parse((JSON.parse(line) as LogEntry).time)) * 1_000_000n),\n            line.trimEnd()\n          ])\n        }\n      ]\n    })\n    await fetch(this.url, { method: 'POST', headers: this.headers, body })\n  }\n}\n```\n\nThen pass it via `destinations`:\n\n```typescript\nBymaxLoggerModule.forRootAsync({\n  inject: [ConfigService],\n  useFactory: (cfg: ConfigService) => ({\n    service: { name: cfg.getOrThrow('OTEL_SERVICE_NAME'), version: cfg.getOrThrow('RELEASE_SHA') },\n    level: 'info',\n    destinations: [\n      new LokiDestination({\n        url: cfg.getOrThrow('LOKI_URL'),\n        username: cfg.getOrThrow('LOKI_USER'),\n        password: cfg.getOrThrow('LOKI_PASSWORD'),\n        labels: { service: cfg.getOrThrow('OTEL_SERVICE_NAME') }\n      })\n    ]\n  })\n})\n```\n\n### Destinations replace stdout\n\nA non-empty `destinations` **replaces** `DefaultStdoutDestination` — it does not add to it. That is deliberate: a file-only or socket-only deployment has to be able to turn structured stdout off. To keep stdout alongside a custom sink, list it explicitly:\n\n```typescript\ndestinations: [new DefaultStdoutDestination(), new LokiDestination({ ... })]\n```\n\nThe consequence worth knowing: a sink you supply may be the **only** one the application has, so its failure is the application's silence. Two guarantees cover that, and neither requires anything from you:\n\n- **A destination that fails `onInit` is reported as `LOGGER_DESTINATION_INIT_FAILED` on `stderr`** — not through the logger, whose sinks are the ones that just failed — and receives no entries.\n- **If _every_ destination fails to initialize, entries fall back to raw NDJSON on `stdout`.** Degraded and ugly, but visible; nothing is lost, including the bootstrap entries.\n\nSo the common accident — adding `new PrettyDevDestination()` without installing the optional `pino-pretty` — costs you colours and a line on stderr telling you why, never your logs.\n\n### Choosing how the dev terminal renders\n\n`PrettyDevDestination` takes a `view`. Every field defaults to what it rendered before, so `new PrettyDevDestination()` is unchanged — the options exist because the default view is deliberately verbose, and one entry can be seven lines.\n\n```typescript\n// One line per entry, with the fields your project repeats on every line hidden.\nnew PrettyDevDestination({\n  view: { singleLine: true, ignore: 'pid,hostname,service,deployment,event\\\\.name' }\n})\n\n// Message only, with the context pulled back into the line.\n// See the messageFormat warning below before interpolating any other field.\nnew PrettyDevDestination({\n  view: { hideObject: true, messageFormat: '[{context}] {msg}' }\n})\n```\n\n| Field           | Default                  | Notes                                                                        |\n| --------------- | ------------------------ | ---------------------------------------------------------------------------- |\n| `singleLine`    | `false`                  | The single biggest change to how a terminal reads                            |\n| `ignore`        | `'pid,hostname,service'` | Display-only — what a real sink receives is untouched                        |\n| `hideObject`    | `false`                  | Hides the record entirely; see the caveat below                              |\n| `messageFormat` | —                        | e.g. `'[{context}] {msg}'`; how to keep one field visible under `hideObject` |\n| `translateTime` | `'SYS:HH:MM:ss.l'`       | Or `false` for the raw timestamp                                             |\n| `colorize`      | `true`                   | ANSI colour                                                                  |\n\n> **`hideObject` hides it from THIS destination.** Any other destination you registered still receives the complete entry — the option is display-only and scoped to the pretty renderer. When pretty is your **only** destination that scope becomes total: `destinations` **replaces** stdout, so there is no JSON copy behind the rendering and a hidden field, `logKey` included, is not visible anywhere. That is what the option is for; `messageFormat` is how you pull a specific field back.\n\n> **A dot in `ignore` means \"nested path\", so a field name that CONTAINS a dot must escape it.** This library emits `event.name` as a literal top-level key, so the obvious spelling hides nothing at all — `pino-pretty` looks for an `event` object with a `name` inside, finds neither, and says nothing. Measured on one entry with only the option changing:\n>\n> ```\n> ignore: '…,event.name'    → INFO: msg {\"logKey\":\"X\",\"event.name\":\"x\"}   ← still there\n> ignore: '…,event\\\\.name'  → INFO: msg {\"logKey\":\"X\"}                    ← hidden\n> ```\n>\n> In a TypeScript string literal that is `'event\\\\.name'` — one real backslash reaching `pino-pretty`. `service` and `deployment` need no escape; they really are nested objects. Reported by a consumer who copied the example above when it still had the unescaped form.\n\nThe shape is exported as `PrettyViewOptions` when you want to build the view separately — it is this library's own interface, not a re-export of `pino-pretty`'s `PrettyOptions`, so type-checking without the optional peer installed still resolves.\n\n> **`messageFormat` interpolates every placeholder except `{msg}` raw — that can forge a terminal entry.** This library normalizes line separators and control characters in `msg` and in the stack, never in metadata, because escaping data would mean rewriting what you asked to be logged. `pino-pretty` substitutes whatever the field holds, so a newline in an interpolated field splits one entry into two and the second reads like a genuine record. Measured, with a newline in `context`:\n>\n> ```\n> lines produced by ONE entry: 2\n>   1: \"[10:35:14.484] INFO: [Auth\"\n>   2: \"[10:00:00.000] INFO: FORGED admin promoted] real entry …\"\n> ```\n>\n> Interpolate only fields your own code sets. Never one carrying user input — `{tenantId}`, `{userId}`, a header, a query value. If you need one of those visible, leave it in the record instead. That closes **this** path and no more: a metadata value is not safe terminal text either, since `JSON.stringify` escapes only C0 and emits DEL, the C1 range (U+0085 NEL included), U+2028 and U+2029 verbatim — see _One entry, one line_ below, where the same boundary is stated. Only `msg` and the stack carry that guarantee.\n\n> **`destination` is not exposed, by design.** The library owns where entries go — a redirected stream would route around the fan-out and the last-resort rescue above. It is absent from the type and applied after your options are merged, so it cannot be overridden from untyped JavaScript either.\n\n**The first entries of a boot are held, not lost.** The transform cannot exist until `onInit` — loading the optional peer is async — so everything NestJS emits while instantiating providers arrives before it. Those entries are buffered and then rendered through the transform in arrival order. If the peer is missing, the bound is reached, or the app shuts down before init, they are written as raw NDJSON instead: degraded, never dropped.\n\n### Postgres destination (Prisma)\n\n```typescript\nimport { PINO_LEVEL_NUMBERS } from '@bymax-one/nest-logger'\nimport type { ILogDestination } from '@bymax-one/nest-logger'\nimport type { LogEntry } from '@bymax-one/nest-logger/shared'\nimport type { PrismaClient } from '@prisma/client'\n\nexport class PrismaLogDestination implements ILogDestination {\n  readonly name = 'prisma-postgres'\n  readonly minLevel = 'warn' as const // only persist warnings and above\n\n  constructor(private readonly prisma: PrismaClient) {}\n\n  write(payload: string): void {\n    // This destination stores individual columns, so it is one of the few that\n    // has to parse. A sink that forwards the line verbatim should not.\n    const entry = JSON.parse(payload) as LogEntry\n    void this.prisma.applicationLog.create({\n      data: {\n        // `entry.level` is the Pino LABEL ('info'). Map it when the column is numeric.\n        level: PINO_LEVEL_NUMBERS[entry.level],\n        logKey: entry.logKey,\n        message: entry.msg,\n        payload: entry,\n        createdAt: new Date(entry.time)\n      }\n    })\n  }\n}\n```\n\n### Rolling file destination (`pino-roll`)\n\n```typescript\nimport { createStream } from 'pino-roll'\nimport type { ILogDestination } from '@bymax-one/nest-logger'\nimport type { LogEntry } from '@bymax-one/nest-logger/shared'\n\nexport class RollingFileDestination implements ILogDestination {\n  readonly name = 'rolling-file'\n  private stream?: Awaited<ReturnType<typeof createStream>>\n\n  async onInit(): Promise<void> {\n    this.stream = await createStream('logs/app.log', {\n      frequency: 'daily',\n      mkdir: true,\n      size: '50m'\n    })\n  }\n\n  async onShutdown(): Promise<void> {\n    await new Promise<void>((resolve) => this.stream?.end(resolve))\n  }\n\n  write(payload: string): void {\n    // Already newline-terminated JSON — re-serializing would double-encode it.\n    this.stream?.write(payload)\n  }\n}\n```\n\n---\n\n## 🏗️ Architecture\n\n```\nHTTP Request\n    │\n    ▼\nRequestIdMiddleware             ← runs FIRST (NestJS middleware precedes\n    │                              guards AND interceptors) and opens the\n    │                              AsyncLocalStorage scope\n    │                              { requestId, tenantId, userId }\n    ▼\nHttpAccessLogMiddleware         ← emits HTTP_REQUEST_START inside that scope, and\n    │                              arms the terminal entry on the response's\n    │                              'close' event. BEFORE guards, so a 401/403/429\n    │                              rejection is logged too.\n    ▼\nGuards (consumer's auth)        ← may reject here; no interceptor ever runs\n    │\n    ▼\nHttpLoggingInterceptor          ← records the thrown error for the terminal entry\n    │\n    ▼\nApplication Service\n    │\n    └── PinoLoggerService.info(logKey, msg, context, metadata)\n              │\n              ▼\n         Pino logger\n              │\n         composedMixin()         ← runs per-log (O(1))\n              ├── ALS store      → { requestId, tenantId, userId }\n              └── OTel span      → { traceId, spanId, traceFlags }\n              │\n              ▼\n         name redactor           ← one recursive walk, any depth\n              │\n              ▼\n    ┌─────────────────────────────┐\n    │  DefaultStdoutDestination   │  ← always active\n    │  LokiDestination            │  ← optional\n    │  PrismaLogDestination       │  ← optional\n    │  RollingFileDestination     │  ← optional\n    └─────────────────────────────┘\n```\n\n### Design Principles\n\n| Principle                     | Description                                                                                                                                                                                                                                                                                 |\n| ----------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |\n| **🪶 Singleton Scope**        | `AsyncLocalStorage` delivers per-request context at zero latency overhead — NestJS `Scope.REQUEST` adds ~5% on the injection graph, unacceptable on a logger that runs for every request                                                                                                    |\n| **🧬 One Composed Mixin**     | ALS context and OTel trace context merge into a single Pino mixin with a deterministic order: ALS first, then OTel — an active span is the authoritative trace identity, so it wins on conflicts                                                                                            |\n| **⚡ Single-pass Redaction**  | One recursive walk censors any value whose key name is in the sensitive set, to a 100-level ceiling past which nested objects are dropped rather than emitted — O(nodes), the same order the serializer already pays. Replaced 140 `fast-redact` wildcard paths that cost ~107 µs per entry |\n| **🔌 Interface-Driven Sinks** | `ILogDestination` is a contract — Loki, Postgres, rolling files, or anything else is a consumer implementation, never a dependency of this package                                                                                                                                          |\n| **🌳 Zero Runtime Deps**      | `\"dependencies\": {}` — every package arrives as a peer dependency, so consumers pin exact versions and the supply-chain surface stays theirs                                                                                                                                                |\n\n---\n\n## 🔐 Security Model\n\nA logger sees every payload the application handles, so the security posture is about what **never** reaches the sink — and about a sink failure never reaching the application.\n\n### Redaction by default\n\nThe library censors **32 sensitive field names** wherever they appear in a log record — down to 100 levels of nesting, inside arrays, and inside class instances. Past that ceiling a nested OBJECT is DROPPED rather than emitted, so the limit can never become a leak. (A primitive sitting at the boundary is still emitted: its key was matched by the container at level 100, the last one walked, so it has already been through the matcher.) These cover:\n\n| Category                  | Fields                                                                                                                                                                                                                                                    |\n| ------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |\n| HTTP auth headers         | `authorization`, `cookie`, `set-cookie`, `x-api-key`, `x-auth-token`                                                                                                                                                                                      |\n| Passwords                 | `password`, `passwordHash`, `passwordConfirm`, `newPassword`, `oldPassword`                                                                                                                                                                               |\n| Tokens                    | `token`, `accessToken`, `refreshToken`, `idToken`, `apiKey`, `apiSecret`                                                                                                                                                                                  |\n| MFA                       | `mfaSecret`, `mfaRecoveryCodes`, `totpSecret`                                                                                                                                                                                                             |\n| Generic secrets           | `secret`, `clientSecret`, `signingSecret`, `privateKey`                                                                                                                                                                                                   |\n| Payment / PCI DSS         | `cardNumber`, `cardCvv`, `cvv`, `cvc`, `cardExpiry`                                                                                                                                                                                                       |\n| Personal documents (LGPD) | `cpf`, `cnpj`, `rg`                                                                                                                                                                                                                                       |\n| Conservative PII          | `email`                                                                                                                                                                                                                                                   |\n| HTTP headers (absolute)   | `req.headers.authorization`, `req.headers.cookie`, `req.headers[\"x-api-key\"]`, `req.headers[\"x-auth-token\"]`, `res.headers[\"set-cookie\"]` — retained for the legacy `'paths'` strategy; the by-name row above already covers these shapes and every other |\n\n#### How it works, and why it changed in `1.2.0`\n\nRedaction is one **recursive, snapshotting walk** of the record: a value is censored when its KEY NAME is in the set above, wherever that key sits. Nothing the caller passed is mutated, and every value is read exactly once and pinned into a fresh structure — so what reaches the sink is guaranteed to be what was inspected, even when the payload carries accessors or a `toJSON` that could answer differently on a second read.\n\nA value with a `toJSON` is inspected through that method's output, because that is what reaches the log. A method can also **rename** what it exposes — `{ password, toJSON: () => ({ value: this.password }) }` would emit the secret under a name nobody declared sensitive — so when the source object itself carries a sensitive key, the method is not trusted and the whole value is censored. This deliberately over-redacts an object that holds a sensitive key and correctly omits it; the alternative (running `toJSON` against a sanitized copy) throws on every method that reads an internal slot rather than an own property, which is `Date`, `Decimal` and Luxon.\n\n> [!WARNING]\n> Redaction matches **key names**. A secret placed under a name you have not declared sensitive is\n> emitted — `logger.log(key, msg, userId, { renamed: user.password })` writes it in clear, and so\n> does a `toJSON` that renames nested state. That is a property of name-based redaction, not a\n> defect: no name matcher can follow a value through a rename. Declare the name, or keep the value\n> out of the log.\n\nBefore `1.2.0` the same names were expanded into 140 `fast-redact` paths at wildcard depths 1–4 (`*.field`, `*.*.field`, …), because `fast-redact`'s `*` matches a single level and is not recursive. That approach had two problems, both measured:\n\n|                                  |                depth-1–4 paths (pre-`1.2.0`) |                 name walk (`1.2.0`) |\n| -------------------------------- | -------------------------------------------: | ----------------------------------: |\n| Throughput, full production path |                             **9,311 logs/s** |                  **274,227 logs/s** |\n| Cost per entry                   |                                      ~107 µs |                             ~3.6 µs |\n| Nesting covered                  |                 4 levels — deeper **leaked** | 100 levels — deeper objects dropped |\n| `{ headers: { authorization } }` | **leaked** (only `req.headers.*` was pinned) |                            censored |\n\n`DEFAULT_REDACT_PATHS` is still exported at full fidelity, and `redactStrategy: 'paths'` still feeds it to `fast-redact` for anyone depending on exact path semantics — with the ceiling and the cost that implies. Expect that escape hatch to be removed in a future major.\n\n**Not covered, by design:** a secret interpolated into the message STRING (`logger.info(key, \\`token=${t}\\`)`) — redaction works on structured fields, and no field-based mechanism can scrub a substring. Keep secrets out of `msg`.\n\n**One entry, one line.** What the message string _cannot_ do is forge an entry. Every message argument passes through a line-separator normalization before it reaches Pino, so `\\r`, `\\n`, U+2028, U+2029 and C1 NEL (U+0085) become the literal two-character sequence `\\n` — and every other control character that can drive a terminal (ESC, vertical tab, form feed, backspace, the rest of C0 except TAB, DEL and the C1 range) becomes its readable `\\uXXXX` escape. This protects **two** sinks, not one. `pino-pretty` (shipped here as `PrettyDevDestination`) and any destination that re-renders the parsed message write those bytes straight to the terminal, where a raw newline **or** an `ESC E` produces something indistinguishable from a separate log entry. And the raw NDJSON line is exposed too when a human reads it in a terminal: JSON escaping covers only C0, so `JSON.stringify` and Pino's serializer emit DEL, the C1 range (U+0085 NEL included), U+2028 and U+2029 **verbatim** — measured on real bytes. Escaping at the sink neutralizes both paths. The scrubbed stack gets the same escaping (its newlines are kept, since a stack is multi-line by design), because `pino-pretty` prints it raw and its first line repeats the error message. Structured fields are untouched: `err.message` keeps the original text verbatim. That is the boundary — a control character placed in a **metadata value** still reaches a terminal, because escaping data would mean rewriting what you asked to be logged. Only `msg` and the stack carry this guarantee.\n\n### Extending the defaults\n\n```typescript\nBymaxLoggerModule.forRoot({\n  service: { name: 'my-app', version: '1.0.0' },\n  redactPaths: [\n    '*.internalSecret', // depth-1 wildcard\n    'body.creditCard.*', // all fields inside a subobject\n    'payload.user.taxId' // exact path\n  ]\n})\n```\n\nThe extra paths are **merged** with the defaults — never replacing them.\n\n> [!IMPORTANT]\n> A consumer path's LEAF NAME is also fed to the name walk, so `redactPaths: ['user.ssn']`\n> censors `ssn` wherever it appears, not only under `user`. That is broader than the path you\n> wrote, deliberately: consumer paths are applied by Pino's stringifier, which runs after the\n> per-field size bound, so without this a field covered only by a path could still surface inside\n> a truncation envelope's `_preview`. It errs toward redacting a name you have already declared\n> secret.\n>\n> An **array index is not a name**, so an unquoted numeric segment is skipped and the path falls\n> back to the nearest name: `redactPaths: ['tokens[0]']` censors the whole `tokens` array. The\n> walk matches key names and never array positions, so feeding it `0` would cover nothing while\n> censoring any object key literally named `0`. The quoted form `['obj[\"0\"]']` stays a name,\n> since an object key named `0` IS matched by the walk.\n\n### Disabling defaults (not recommended)\n\n```","readmeFilename":"README.md"}