@contrast/agent-bundle 5.47.0 → 5.48.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (526) hide show
  1. package/node_modules/@contrast/agent/package.json +10 -10
  2. package/node_modules/@contrast/agentify/package.json +14 -14
  3. package/node_modules/@contrast/architecture-components/package.json +4 -4
  4. package/node_modules/@contrast/assess/lib/configuration-analysis/install/apollo-server.js +1 -1
  5. package/node_modules/@contrast/assess/lib/configuration-analysis/install/graphql-yoga.js +1 -1
  6. package/node_modules/@contrast/assess/lib/dataflow/sinks/install/fs.js +8 -15
  7. package/node_modules/@contrast/assess/package.json +11 -11
  8. package/node_modules/@contrast/config/package.json +2 -2
  9. package/node_modules/@contrast/core/package.json +4 -4
  10. package/node_modules/@contrast/deadzones/package.json +4 -4
  11. package/node_modules/@contrast/dep-hooks/lib/export-handler-registry.js +1 -10
  12. package/node_modules/@contrast/dep-hooks/lib/export-hook-descriptor.js +1 -1
  13. package/node_modules/@contrast/dep-hooks/lib/index.d.ts +1 -1
  14. package/node_modules/@contrast/dep-hooks/lib/index.js +1 -1
  15. package/node_modules/@contrast/dep-hooks/lib/package-finder.d.ts +2 -1
  16. package/node_modules/@contrast/dep-hooks/lib/package-finder.js +11 -2
  17. package/node_modules/@contrast/dep-hooks/package.json +3 -3
  18. package/node_modules/@contrast/esm-hooks/package.json +5 -5
  19. package/node_modules/@contrast/instrumentation/package.json +4 -4
  20. package/node_modules/@contrast/library-analysis/lib/install/library-reporting/dep.json +144 -202
  21. package/node_modules/@contrast/library-analysis/package.json +3 -3
  22. package/node_modules/@contrast/logger/package.json +3 -3
  23. package/node_modules/@contrast/metrics/package.json +5 -5
  24. package/node_modules/@contrast/patcher/package.json +2 -2
  25. package/node_modules/@contrast/protect/lib/input-tracing/install/fs.js +0 -8
  26. package/node_modules/@contrast/protect/package.json +10 -10
  27. package/node_modules/@contrast/reporter/package.json +5 -5
  28. package/node_modules/@contrast/rewriter/package.json +4 -4
  29. package/node_modules/@contrast/route-coverage/lib/index.d.ts +2 -0
  30. package/node_modules/@contrast/route-coverage/lib/index.js +2 -1
  31. package/node_modules/@contrast/route-coverage/lib/install/express.js +535 -0
  32. package/node_modules/@contrast/route-coverage/lib/install/fastify/fastify-express.js +71 -0
  33. package/node_modules/@contrast/route-coverage/lib/install/fastify/fastify-middie.js +67 -0
  34. package/node_modules/@contrast/route-coverage/lib/install/{fastify.js → fastify/fastify.js} +12 -12
  35. package/node_modules/@contrast/route-coverage/lib/install/{express → fastify}/index.js +6 -5
  36. package/node_modules/@contrast/route-coverage/lib/install/koa.js +39 -45
  37. package/node_modules/@contrast/route-coverage/lib/utils/route-info.js +26 -1
  38. package/node_modules/@contrast/route-coverage/package.json +7 -7
  39. package/node_modules/@contrast/scopes/package.json +5 -5
  40. package/node_modules/@contrast/sec-obs/package.json +8 -8
  41. package/node_modules/@contrast/sources/package.json +2 -2
  42. package/node_modules/@contrast/telemetry/package.json +4 -4
  43. package/node_modules/@opentelemetry/semantic-conventions/build/esm/experimental_attributes.d.ts +697 -30
  44. package/node_modules/@opentelemetry/semantic-conventions/build/esm/experimental_attributes.js +697 -30
  45. package/node_modules/@opentelemetry/semantic-conventions/build/esm/experimental_attributes.js.map +1 -1
  46. package/node_modules/@opentelemetry/semantic-conventions/build/esm/experimental_events.d.ts +6 -0
  47. package/node_modules/@opentelemetry/semantic-conventions/build/esm/experimental_events.js +6 -0
  48. package/node_modules/@opentelemetry/semantic-conventions/build/esm/experimental_events.js.map +1 -1
  49. package/node_modules/@opentelemetry/semantic-conventions/build/esm/experimental_metrics.d.ts +877 -49
  50. package/node_modules/@opentelemetry/semantic-conventions/build/esm/experimental_metrics.js +877 -49
  51. package/node_modules/@opentelemetry/semantic-conventions/build/esm/experimental_metrics.js.map +1 -1
  52. package/node_modules/@opentelemetry/semantic-conventions/build/esm/stable_attributes.d.ts +13 -4
  53. package/node_modules/@opentelemetry/semantic-conventions/build/esm/stable_attributes.js +13 -4
  54. package/node_modules/@opentelemetry/semantic-conventions/build/esm/stable_attributes.js.map +1 -1
  55. package/node_modules/@opentelemetry/semantic-conventions/build/esm/version.d.ts +1 -1
  56. package/node_modules/@opentelemetry/semantic-conventions/build/esm/version.js +1 -1
  57. package/node_modules/@opentelemetry/semantic-conventions/build/esm/version.js.map +1 -1
  58. package/node_modules/@opentelemetry/semantic-conventions/build/esnext/experimental_attributes.d.ts +697 -30
  59. package/node_modules/@opentelemetry/semantic-conventions/build/esnext/experimental_attributes.js +697 -30
  60. package/node_modules/@opentelemetry/semantic-conventions/build/esnext/experimental_attributes.js.map +1 -1
  61. package/node_modules/@opentelemetry/semantic-conventions/build/esnext/experimental_events.d.ts +6 -0
  62. package/node_modules/@opentelemetry/semantic-conventions/build/esnext/experimental_events.js +6 -0
  63. package/node_modules/@opentelemetry/semantic-conventions/build/esnext/experimental_events.js.map +1 -1
  64. package/node_modules/@opentelemetry/semantic-conventions/build/esnext/experimental_metrics.d.ts +877 -49
  65. package/node_modules/@opentelemetry/semantic-conventions/build/esnext/experimental_metrics.js +877 -49
  66. package/node_modules/@opentelemetry/semantic-conventions/build/esnext/experimental_metrics.js.map +1 -1
  67. package/node_modules/@opentelemetry/semantic-conventions/build/esnext/stable_attributes.d.ts +13 -4
  68. package/node_modules/@opentelemetry/semantic-conventions/build/esnext/stable_attributes.js +13 -4
  69. package/node_modules/@opentelemetry/semantic-conventions/build/esnext/stable_attributes.js.map +1 -1
  70. package/node_modules/@opentelemetry/semantic-conventions/build/esnext/version.d.ts +1 -1
  71. package/node_modules/@opentelemetry/semantic-conventions/build/esnext/version.js +1 -1
  72. package/node_modules/@opentelemetry/semantic-conventions/build/esnext/version.js.map +1 -1
  73. package/node_modules/@opentelemetry/semantic-conventions/build/src/experimental_attributes.d.ts +697 -30
  74. package/node_modules/@opentelemetry/semantic-conventions/build/src/experimental_attributes.js +729 -61
  75. package/node_modules/@opentelemetry/semantic-conventions/build/src/experimental_attributes.js.map +1 -1
  76. package/node_modules/@opentelemetry/semantic-conventions/build/src/experimental_events.d.ts +6 -0
  77. package/node_modules/@opentelemetry/semantic-conventions/build/src/experimental_events.js +7 -1
  78. package/node_modules/@opentelemetry/semantic-conventions/build/src/experimental_events.js.map +1 -1
  79. package/node_modules/@opentelemetry/semantic-conventions/build/src/experimental_metrics.d.ts +877 -49
  80. package/node_modules/@opentelemetry/semantic-conventions/build/src/experimental_metrics.js +886 -56
  81. package/node_modules/@opentelemetry/semantic-conventions/build/src/experimental_metrics.js.map +1 -1
  82. package/node_modules/@opentelemetry/semantic-conventions/build/src/stable_attributes.d.ts +13 -4
  83. package/node_modules/@opentelemetry/semantic-conventions/build/src/stable_attributes.js +13 -4
  84. package/node_modules/@opentelemetry/semantic-conventions/build/src/stable_attributes.js.map +1 -1
  85. package/node_modules/@opentelemetry/semantic-conventions/build/src/version.d.ts +1 -1
  86. package/node_modules/@opentelemetry/semantic-conventions/build/src/version.js +1 -1
  87. package/node_modules/@opentelemetry/semantic-conventions/build/src/version.js.map +1 -1
  88. package/node_modules/@opentelemetry/semantic-conventions/package.json +3 -5
  89. package/node_modules/{pino → @pinojs/redact}/.github/dependabot.yml +1 -1
  90. package/node_modules/@pinojs/redact/.github/workflows/ci.yml +48 -0
  91. package/node_modules/@pinojs/redact/.github/workflows/publish-release.yml +43 -0
  92. package/node_modules/{abort-controller → @pinojs/redact}/LICENSE +1 -1
  93. package/node_modules/@pinojs/redact/README.md +350 -0
  94. package/node_modules/@pinojs/redact/benchmarks/basic.js +184 -0
  95. package/node_modules/@pinojs/redact/eslint.config.js +1 -0
  96. package/node_modules/@pinojs/redact/index.d.ts +52 -0
  97. package/node_modules/@pinojs/redact/index.js +529 -0
  98. package/node_modules/@pinojs/redact/index.test-d.ts +22 -0
  99. package/node_modules/@pinojs/redact/package.json +37 -0
  100. package/node_modules/@pinojs/redact/scripts/sync-version.mjs +20 -0
  101. package/node_modules/@pinojs/redact/test/actual-redact-comparison.test.js +211 -0
  102. package/node_modules/@pinojs/redact/test/index.test.js +824 -0
  103. package/node_modules/@pinojs/redact/test/integration.test.js +390 -0
  104. package/node_modules/@pinojs/redact/test/multiple-wildcards.test.js +227 -0
  105. package/node_modules/@pinojs/redact/test/prototype-pollution.test.js +223 -0
  106. package/node_modules/@pinojs/redact/test/selective-clone.test.js +115 -0
  107. package/node_modules/@pinojs/redact/tsconfig.json +19 -0
  108. package/node_modules/@types/node/README.md +1 -1
  109. package/node_modules/@types/node/console.d.ts +3 -2
  110. package/node_modules/@types/node/package.json +2 -2
  111. package/node_modules/@types/node/process.d.ts +7 -0
  112. package/node_modules/@types/node/sqlite.d.ts +107 -0
  113. package/node_modules/@types/node/url.d.ts +32 -8
  114. package/node_modules/axios/CHANGELOG.md +18 -0
  115. package/node_modules/axios/README.md +1 -4
  116. package/node_modules/axios/dist/axios.js +2 -2
  117. package/node_modules/axios/dist/axios.js.map +1 -1
  118. package/node_modules/axios/dist/axios.min.js +2 -2
  119. package/node_modules/axios/dist/axios.min.js.map +1 -1
  120. package/node_modules/axios/dist/browser/axios.cjs +2 -2
  121. package/node_modules/axios/dist/browser/axios.cjs.map +1 -1
  122. package/node_modules/axios/dist/esm/axios.js +2 -2
  123. package/node_modules/axios/dist/esm/axios.js.map +1 -1
  124. package/node_modules/axios/dist/esm/axios.min.js +2 -2
  125. package/node_modules/axios/dist/esm/axios.min.js.map +1 -1
  126. package/node_modules/axios/dist/node/axios.cjs +25 -20
  127. package/node_modules/axios/dist/node/axios.cjs.map +1 -1
  128. package/node_modules/axios/lib/adapters/http.js +22 -18
  129. package/node_modules/axios/lib/env/data.js +1 -1
  130. package/node_modules/axios/package.json +1 -1
  131. package/node_modules/form-data/CHANGELOG.md +60 -2
  132. package/node_modules/form-data/README.md +4 -4
  133. package/node_modules/form-data/lib/form_data.js +2 -2
  134. package/node_modules/form-data/package.json +4 -4
  135. package/node_modules/ipaddr.js/README.md +1 -0
  136. package/node_modules/ipaddr.js/ipaddr.min.js +1 -1
  137. package/node_modules/ipaddr.js/lib/ipaddr.js +11 -0
  138. package/node_modules/ipaddr.js/lib/ipaddr.js.d.ts +1 -0
  139. package/node_modules/ipaddr.js/package.json +2 -3
  140. package/node_modules/nan/.github/workflows/ci.yml +3 -1
  141. package/node_modules/nan/CHANGELOG.md +4 -1
  142. package/node_modules/nan/README.md +2 -2
  143. package/node_modules/nan/nan.h +25 -15
  144. package/node_modules/nan/nan_maybe_43_inl.h +5 -1
  145. package/node_modules/nan/package.json +2 -2
  146. package/node_modules/node-abi/abi_registry.json +8 -1
  147. package/node_modules/node-abi/package.json +1 -1
  148. package/node_modules/pino/CONTRIBUTING.md +4 -0
  149. package/node_modules/pino/LICENSE +1 -1
  150. package/node_modules/pino/README.md +20 -3
  151. package/node_modules/pino/benchmarks/basic.bench.js +1 -1
  152. package/node_modules/pino/benchmarks/child-child.bench.js +1 -1
  153. package/node_modules/pino/benchmarks/child-creation.bench.js +1 -1
  154. package/node_modules/pino/benchmarks/child.bench.js +1 -1
  155. package/node_modules/pino/benchmarks/deep-object.bench.js +1 -1
  156. package/node_modules/pino/benchmarks/internal/just-pino-heavy.bench.js +1 -1
  157. package/node_modules/pino/benchmarks/internal/just-pino.bench.js +1 -1
  158. package/node_modules/pino/benchmarks/internal/redact.bench.js +1 -1
  159. package/node_modules/pino/benchmarks/long-string.bench.js +1 -1
  160. package/node_modules/pino/benchmarks/multi-arg.bench.js +1 -1
  161. package/node_modules/pino/benchmarks/multistream.js +1 -1
  162. package/node_modules/pino/benchmarks/object.bench.js +1 -1
  163. package/node_modules/pino/benchmarks/utils/generate-benchmark-doc.js +2 -2
  164. package/node_modules/pino/benchmarks/utils/runbench.js +3 -3
  165. package/node_modules/pino/benchmarks/utils/wrap-log-level.js +2 -2
  166. package/node_modules/pino/browser.js +76 -36
  167. package/node_modules/pino/build/sync-version.js +18 -3
  168. package/node_modules/pino/docs/api.md +155 -13
  169. package/node_modules/pino/docs/browser.md +16 -1
  170. package/node_modules/pino/docs/bundling.md +5 -3
  171. package/node_modules/pino/docs/diagnostics.md +16 -0
  172. package/node_modules/pino/docs/ecosystem.md +15 -12
  173. package/node_modules/pino/docs/help.md +29 -3
  174. package/node_modules/pino/docs/lts.md +5 -4
  175. package/node_modules/pino/docs/transports.md +442 -271
  176. package/node_modules/pino/docs/web.md +59 -9
  177. package/node_modules/pino/eslint.config.js +19 -0
  178. package/node_modules/pino/examples/transport.js +2 -2
  179. package/node_modules/pino/file.js +1 -1
  180. package/node_modules/pino/lib/meta.js +1 -1
  181. package/node_modules/pino/lib/multistream.js +17 -2
  182. package/node_modules/pino/lib/proto.js +35 -11
  183. package/node_modules/pino/lib/redaction.js +9 -13
  184. package/node_modules/pino/lib/time.js +29 -1
  185. package/node_modules/pino/lib/tools.js +37 -8
  186. package/node_modules/pino/lib/transport-stream.js +10 -4
  187. package/node_modules/pino/lib/transport.js +23 -9
  188. package/node_modules/pino/lib/worker.js +164 -24
  189. package/node_modules/pino/package.json +28 -27
  190. package/node_modules/pino/pino.d.ts +244 -203
  191. package/node_modules/pino/pino.js +7 -3
  192. package/node_modules/pino/test/basic.test.js +181 -169
  193. package/node_modules/pino/test/broken-pipe.test.js +18 -16
  194. package/node_modules/pino/test/browser-child.test.js +26 -0
  195. package/node_modules/pino/test/browser-is-level-enabled.test.js +101 -0
  196. package/node_modules/pino/test/browser-serializers.test.js +0 -2
  197. package/node_modules/pino/test/browser-transmit.test.js +68 -0
  198. package/node_modules/pino/test/browser.test.js +98 -13
  199. package/node_modules/pino/test/complex-objects.test.js +8 -6
  200. package/node_modules/pino/test/crlf.test.js +7 -5
  201. package/node_modules/pino/test/custom-levels.test.js +80 -66
  202. package/node_modules/pino/test/diagnostics.test.js +107 -0
  203. package/node_modules/pino/test/error-key.test.js +37 -0
  204. package/node_modules/pino/test/error.test.js +48 -43
  205. package/node_modules/pino/test/escaping.test.js +8 -6
  206. package/node_modules/pino/test/esm/esm.mjs +5 -3
  207. package/node_modules/pino/test/esm/index.test.js +14 -27
  208. package/node_modules/pino/test/esm/named-exports.mjs +9 -8
  209. package/node_modules/pino/test/exit.test.js +18 -16
  210. package/node_modules/pino/test/fixtures/broken-pipe/basic.js +1 -1
  211. package/node_modules/pino/test/fixtures/broken-pipe/destination.js +1 -1
  212. package/node_modules/pino/test/fixtures/broken-pipe/syncfalse.js +1 -1
  213. package/node_modules/pino/test/fixtures/console-transport.js +1 -1
  214. package/node_modules/pino/test/fixtures/crashing-transport.js +13 -0
  215. package/node_modules/pino/test/fixtures/default-exit.js +1 -1
  216. package/node_modules/pino/test/fixtures/destination-exit.js +1 -1
  217. package/node_modules/pino/test/fixtures/noop-transport.js +1 -1
  218. package/node_modules/pino/test/fixtures/pretty/null-prototype.js +1 -1
  219. package/node_modules/pino/test/fixtures/stdout-hack-protection.js +1 -1
  220. package/node_modules/pino/test/fixtures/syncfalse-child.js +1 -1
  221. package/node_modules/pino/test/fixtures/syncfalse-exit.js +1 -1
  222. package/node_modules/pino/test/fixtures/syncfalse-flush-exit.js +1 -1
  223. package/node_modules/pino/test/fixtures/syncfalse.js +1 -1
  224. package/node_modules/pino/test/fixtures/syntax-error-esm.mjs +2 -0
  225. package/node_modules/pino/test/fixtures/to-file-transport-with-transform.js +3 -3
  226. package/node_modules/pino/test/fixtures/to-file-transport.js +2 -2
  227. package/node_modules/pino/test/fixtures/to-file-transport.mjs +2 -2
  228. package/node_modules/pino/test/fixtures/transport/index.js +2 -2
  229. package/node_modules/pino/test/fixtures/transport-main.js +1 -1
  230. package/node_modules/pino/test/fixtures/transport-transform.js +1 -1
  231. package/node_modules/pino/test/fixtures/transport-uses-pino-config.js +1 -1
  232. package/node_modules/pino/test/fixtures/transport-worker-data.js +1 -1
  233. package/node_modules/pino/test/fixtures/transport-worker.js +2 -2
  234. package/node_modules/pino/test/fixtures/ts/to-file-transport-with-transform.ts +3 -3
  235. package/node_modules/pino/test/fixtures/ts/to-file-transport.ts +2 -2
  236. package/node_modules/pino/test/fixtures/ts/transpile.cjs +1 -1
  237. package/node_modules/pino/test/fixtures/ts/transport-exit-immediately-with-async-dest.ts +1 -1
  238. package/node_modules/pino/test/fixtures/ts/transport-main.ts +1 -1
  239. package/node_modules/pino/test/fixtures/ts/transport-worker.ts +1 -1
  240. package/node_modules/pino/test/formatters.test.js +46 -37
  241. package/node_modules/pino/test/helper.d.ts +1 -1
  242. package/node_modules/pino/test/helper.js +37 -10
  243. package/node_modules/pino/test/hooks.test.js +45 -28
  244. package/node_modules/pino/test/http.test.js +39 -67
  245. package/node_modules/pino/test/internals/version.test.js +11 -9
  246. package/node_modules/pino/test/is-level-enabled.test.js +66 -72
  247. package/node_modules/pino/test/levels.test.js +245 -141
  248. package/node_modules/pino/test/metadata.test.js +45 -31
  249. package/node_modules/pino/test/mixin-merge-strategy.test.js +9 -7
  250. package/node_modules/pino/test/mixin.test.js +63 -40
  251. package/node_modules/pino/test/multistream.test.js +174 -118
  252. package/node_modules/pino/test/redact.test.js +172 -126
  253. package/node_modules/pino/test/serializers.test.js +61 -57
  254. package/node_modules/pino/test/stdout-protection.test.js +14 -12
  255. package/node_modules/pino/test/syncfalse.test.js +29 -34
  256. package/node_modules/pino/test/timestamp-nano.test.js +37 -0
  257. package/node_modules/pino/test/timestamp.test.js +37 -34
  258. package/node_modules/pino/test/transport/big.test.js +11 -12
  259. package/node_modules/pino/test/transport/bundlers-support.test.js +15 -43
  260. package/node_modules/pino/test/transport/caller.test.js +9 -8
  261. package/node_modules/pino/test/transport/core.test.js +175 -145
  262. package/node_modules/pino/test/transport/core.transpiled.test.ts +17 -19
  263. package/node_modules/pino/test/transport/crash.test.js +36 -0
  264. package/node_modules/pino/test/transport/module-link.test.js +21 -19
  265. package/node_modules/pino/test/transport/pipeline.test.js +109 -8
  266. package/node_modules/pino/test/transport/repl.test.js +4 -3
  267. package/node_modules/pino/test/transport/{syncfalse.test.js → sync-false.test.js} +14 -12
  268. package/node_modules/pino/test/transport/sync-true.test.js +57 -0
  269. package/node_modules/pino/test/transport/targets.test.js +25 -5
  270. package/node_modules/pino/test/transport/uses-pino-config.test.js +16 -17
  271. package/node_modules/pino/test/transport-stream.test.js +40 -0
  272. package/node_modules/pino/test/types/{pino-import.test-d.ts → pino-import.test-d.cts} +4 -3
  273. package/node_modules/pino/test/types/pino-multistream.test-d.ts +1 -1
  274. package/node_modules/pino/test/types/pino-top-export.test-d.ts +1 -0
  275. package/node_modules/pino/test/types/pino-transport.test-d.ts +1 -1
  276. package/node_modules/pino/test/types/pino-type-only.test-d.ts +24 -6
  277. package/node_modules/pino/test/types/pino.test-d.ts +161 -6
  278. package/node_modules/pino/test/types/pino.ts +31 -19
  279. package/node_modules/pino/tsconfig.json +1 -1
  280. package/node_modules/pino-abstract-transport/.github/workflows/ci.yml +2 -4
  281. package/node_modules/pino-abstract-transport/index.js +1 -1
  282. package/node_modules/pino-abstract-transport/package.json +2 -3
  283. package/node_modules/pino-abstract-transport/test/base.test.js +1 -1
  284. package/node_modules/pino-abstract-transport/test/worker.test.js +7 -14
  285. package/node_modules/pino-std-serializers/.github/workflows/ci.yml +5 -5
  286. package/node_modules/pino-std-serializers/Readme.md +1 -0
  287. package/node_modules/pino-std-serializers/package.json +9 -8
  288. package/node_modules/pino-std-serializers/test/err-with-cause.test.js +72 -88
  289. package/node_modules/pino-std-serializers/test/err.test.js +76 -91
  290. package/node_modules/pino-std-serializers/test/req.test.js +142 -98
  291. package/node_modules/pino-std-serializers/test/res.test.js +42 -31
  292. package/node_modules/process-warning/.github/dependabot.yml +1 -1
  293. package/node_modules/process-warning/.github/workflows/ci.yml +1 -2
  294. package/node_modules/process-warning/README.md +4 -4
  295. package/node_modules/process-warning/eslint.config.js +6 -0
  296. package/node_modules/process-warning/package.json +39 -8
  297. package/node_modules/process-warning/test/emit-interpolated-string.test.js +11 -6
  298. package/node_modules/process-warning/test/emit-once-only.test.js +11 -6
  299. package/node_modules/process-warning/test/emit-reset.test.js +10 -6
  300. package/node_modules/process-warning/test/emit-set.test.js +10 -5
  301. package/node_modules/process-warning/test/emit-unlimited.test.js +12 -7
  302. package/node_modules/process-warning/test/index.test.js +20 -20
  303. package/node_modules/process-warning/test/issue-88.test.js +8 -3
  304. package/node_modules/process-warning/test/jest.test.js +17 -15
  305. package/node_modules/process-warning/test/no-warnings.test.js +9 -9
  306. package/node_modules/process-warning/test/promise.js +10 -0
  307. package/node_modules/process-warning/types/index.d.ts +5 -5
  308. package/node_modules/thread-stream/.github/workflows/ci.yml +4 -8
  309. package/node_modules/thread-stream/index.d.ts +4 -5
  310. package/node_modules/thread-stream/lib/worker.js +5 -2
  311. package/node_modules/thread-stream/package.json +6 -4
  312. package/node_modules/thread-stream/test/base.test.js +12 -0
  313. package/node_modules/thread-stream/test/never-drain.test.js +3 -1
  314. package/node_modules/thread-stream/test/pkg/pkg.test.js +2 -0
  315. package/node_modules/thread-stream/test/syntax-error.mjs +2 -0
  316. package/node_modules/thread-stream/tsconfig.json +8 -0
  317. package/node_modules/yaml/browser/dist/compose/compose-collection.js +1 -1
  318. package/node_modules/yaml/browser/dist/compose/resolve-block-seq.js +1 -1
  319. package/node_modules/yaml/browser/dist/compose/resolve-flow-collection.js +2 -2
  320. package/node_modules/yaml/browser/dist/errors.js +1 -1
  321. package/node_modules/yaml/browser/dist/nodes/Alias.js +1 -1
  322. package/node_modules/yaml/browser/dist/parse/parser.js +2 -2
  323. package/node_modules/yaml/browser/dist/stringify/stringifyNumber.js +1 -1
  324. package/node_modules/yaml/browser/dist/stringify/stringifyPair.js +1 -1
  325. package/node_modules/yaml/dist/compose/compose-collection.js +1 -1
  326. package/node_modules/yaml/dist/compose/resolve-block-seq.js +1 -1
  327. package/node_modules/yaml/dist/compose/resolve-flow-collection.js +2 -2
  328. package/node_modules/yaml/dist/errors.js +1 -1
  329. package/node_modules/yaml/dist/nodes/Alias.js +1 -1
  330. package/node_modules/yaml/dist/parse/parser.js +2 -2
  331. package/node_modules/yaml/dist/stringify/stringifyNumber.js +1 -1
  332. package/node_modules/yaml/dist/stringify/stringifyPair.js +1 -1
  333. package/node_modules/yaml/package.json +4 -4
  334. package/package.json +2 -2
  335. package/node_modules/@contrast/route-coverage/lib/install/express/express4.js +0 -157
  336. package/node_modules/@contrast/route-coverage/lib/install/express/express5.js +0 -553
  337. package/node_modules/abort-controller/README.md +0 -98
  338. package/node_modules/abort-controller/browser.js +0 -13
  339. package/node_modules/abort-controller/browser.mjs +0 -11
  340. package/node_modules/abort-controller/dist/abort-controller.d.ts +0 -43
  341. package/node_modules/abort-controller/dist/abort-controller.js +0 -127
  342. package/node_modules/abort-controller/dist/abort-controller.js.map +0 -1
  343. package/node_modules/abort-controller/dist/abort-controller.mjs +0 -118
  344. package/node_modules/abort-controller/dist/abort-controller.mjs.map +0 -1
  345. package/node_modules/abort-controller/dist/abort-controller.umd.js +0 -5
  346. package/node_modules/abort-controller/dist/abort-controller.umd.js.map +0 -1
  347. package/node_modules/abort-controller/package.json +0 -97
  348. package/node_modules/abort-controller/polyfill.js +0 -21
  349. package/node_modules/abort-controller/polyfill.mjs +0 -19
  350. package/node_modules/base64-js/LICENSE +0 -21
  351. package/node_modules/base64-js/README.md +0 -34
  352. package/node_modules/base64-js/base64js.min.js +0 -1
  353. package/node_modules/base64-js/index.d.ts +0 -3
  354. package/node_modules/base64-js/index.js +0 -150
  355. package/node_modules/base64-js/package.json +0 -47
  356. package/node_modules/buffer/AUTHORS.md +0 -73
  357. package/node_modules/buffer/LICENSE +0 -21
  358. package/node_modules/buffer/README.md +0 -410
  359. package/node_modules/buffer/index.d.ts +0 -194
  360. package/node_modules/buffer/index.js +0 -2106
  361. package/node_modules/buffer/package.json +0 -93
  362. package/node_modules/event-target-shim/LICENSE +0 -22
  363. package/node_modules/event-target-shim/README.md +0 -293
  364. package/node_modules/event-target-shim/dist/event-target-shim.js +0 -871
  365. package/node_modules/event-target-shim/dist/event-target-shim.js.map +0 -1
  366. package/node_modules/event-target-shim/dist/event-target-shim.mjs +0 -862
  367. package/node_modules/event-target-shim/dist/event-target-shim.mjs.map +0 -1
  368. package/node_modules/event-target-shim/dist/event-target-shim.umd.js +0 -6
  369. package/node_modules/event-target-shim/dist/event-target-shim.umd.js.map +0 -1
  370. package/node_modules/event-target-shim/index.d.ts +0 -399
  371. package/node_modules/event-target-shim/package.json +0 -82
  372. package/node_modules/events/.airtap.yml +0 -15
  373. package/node_modules/events/.github/FUNDING.yml +0 -12
  374. package/node_modules/events/.travis.yml +0 -18
  375. package/node_modules/events/History.md +0 -118
  376. package/node_modules/events/LICENSE +0 -22
  377. package/node_modules/events/Readme.md +0 -50
  378. package/node_modules/events/events.js +0 -497
  379. package/node_modules/events/package.json +0 -37
  380. package/node_modules/events/security.md +0 -10
  381. package/node_modules/events/tests/add-listeners.js +0 -111
  382. package/node_modules/events/tests/check-listener-leaks.js +0 -101
  383. package/node_modules/events/tests/common.js +0 -104
  384. package/node_modules/events/tests/errors.js +0 -13
  385. package/node_modules/events/tests/events-list.js +0 -28
  386. package/node_modules/events/tests/events-once.js +0 -234
  387. package/node_modules/events/tests/index.js +0 -64
  388. package/node_modules/events/tests/legacy-compat.js +0 -16
  389. package/node_modules/events/tests/listener-count.js +0 -37
  390. package/node_modules/events/tests/listeners-side-effects.js +0 -56
  391. package/node_modules/events/tests/listeners.js +0 -168
  392. package/node_modules/events/tests/max-listeners.js +0 -47
  393. package/node_modules/events/tests/method-names.js +0 -35
  394. package/node_modules/events/tests/modify-in-emit.js +0 -90
  395. package/node_modules/events/tests/num-args.js +0 -60
  396. package/node_modules/events/tests/once.js +0 -83
  397. package/node_modules/events/tests/prepend.js +0 -31
  398. package/node_modules/events/tests/remove-all-listeners.js +0 -133
  399. package/node_modules/events/tests/remove-listeners.js +0 -212
  400. package/node_modules/events/tests/set-max-listeners-side-effects.js +0 -31
  401. package/node_modules/events/tests/special-event-names.js +0 -45
  402. package/node_modules/events/tests/subclass.js +0 -66
  403. package/node_modules/events/tests/symbols.js +0 -25
  404. package/node_modules/fast-redact/.github/workflows/ci.yml +0 -37
  405. package/node_modules/fast-redact/LICENSE +0 -21
  406. package/node_modules/fast-redact/benchmark/index.js +0 -223
  407. package/node_modules/fast-redact/example/default-usage.js +0 -14
  408. package/node_modules/fast-redact/example/intermediate-wildcard-array.js +0 -11
  409. package/node_modules/fast-redact/example/multi-wildcard-array-depth.js +0 -11
  410. package/node_modules/fast-redact/example/multi-wildcard-array-end.js +0 -11
  411. package/node_modules/fast-redact/example/multi-wildcard-array.js +0 -11
  412. package/node_modules/fast-redact/example/serialize-false.js +0 -11
  413. package/node_modules/fast-redact/example/serialize-function.js +0 -4
  414. package/node_modules/fast-redact/example/top-wildcard-object.js +0 -9
  415. package/node_modules/fast-redact/index.js +0 -56
  416. package/node_modules/fast-redact/lib/modifiers.js +0 -291
  417. package/node_modules/fast-redact/lib/parse.js +0 -44
  418. package/node_modules/fast-redact/lib/redactor.js +0 -108
  419. package/node_modules/fast-redact/lib/restorer.js +0 -92
  420. package/node_modules/fast-redact/lib/rx.js +0 -16
  421. package/node_modules/fast-redact/lib/state.js +0 -20
  422. package/node_modules/fast-redact/lib/validator.js +0 -33
  423. package/node_modules/fast-redact/package.json +0 -50
  424. package/node_modules/fast-redact/readme.md +0 -282
  425. package/node_modules/fast-redact/test/index.js +0 -1502
  426. package/node_modules/ieee754/LICENSE +0 -11
  427. package/node_modules/ieee754/README.md +0 -51
  428. package/node_modules/ieee754/index.d.ts +0 -10
  429. package/node_modules/ieee754/index.js +0 -85
  430. package/node_modules/ieee754/package.json +0 -52
  431. package/node_modules/pino/.eslintignore +0 -2
  432. package/node_modules/pino/.eslintrc +0 -8
  433. package/node_modules/pino/.github/workflows/bench.yml +0 -61
  434. package/node_modules/pino/.github/workflows/ci.yml +0 -86
  435. package/node_modules/pino/.github/workflows/lock-threads.yml +0 -30
  436. package/node_modules/pino/.github/workflows/package-manager-ci.yml +0 -99
  437. package/node_modules/pino/.github/workflows/target-main.yml +0 -23
  438. package/node_modules/pino/.taprc.yaml +0 -8
  439. package/node_modules/pino/docsify/sidebar.md +0 -26
  440. package/node_modules/pino/favicon-16x16.png +0 -0
  441. package/node_modules/pino/favicon-32x32.png +0 -0
  442. package/node_modules/pino/lib/worker-pipeline.js +0 -38
  443. package/node_modules/pino/node_modules/sonic-boom/.eslintignore +0 -2
  444. package/node_modules/pino/node_modules/sonic-boom/.husky/pre-commit +0 -4
  445. package/node_modules/pino/node_modules/sonic-boom/.taprc.yaml +0 -11
  446. package/node_modules/pino/node_modules/sonic-boom/LICENSE +0 -21
  447. package/node_modules/pino/node_modules/sonic-boom/README.md +0 -151
  448. package/node_modules/pino/node_modules/sonic-boom/bench.js +0 -98
  449. package/node_modules/pino/node_modules/sonic-boom/check.js +0 -18
  450. package/node_modules/pino/node_modules/sonic-boom/example.js +0 -8
  451. package/node_modules/pino/node_modules/sonic-boom/fixtures/firehose.js +0 -22
  452. package/node_modules/pino/node_modules/sonic-boom/index.js +0 -690
  453. package/node_modules/pino/node_modules/sonic-boom/package.json +0 -50
  454. package/node_modules/pino/node_modules/sonic-boom/test/destroy.test.js +0 -49
  455. package/node_modules/pino/node_modules/sonic-boom/test/end.test.js +0 -98
  456. package/node_modules/pino/node_modules/sonic-boom/test/flush-sync.test.js +0 -140
  457. package/node_modules/pino/node_modules/sonic-boom/test/flush.test.js +0 -419
  458. package/node_modules/pino/node_modules/sonic-boom/test/fsync.test.js +0 -63
  459. package/node_modules/pino/node_modules/sonic-boom/test/helper.js +0 -42
  460. package/node_modules/pino/node_modules/sonic-boom/test/minlength.test.js +0 -35
  461. package/node_modules/pino/node_modules/sonic-boom/test/mode.test.js +0 -116
  462. package/node_modules/pino/node_modules/sonic-boom/test/reopen.test.js +0 -239
  463. package/node_modules/pino/node_modules/sonic-boom/test/retry.test.js +0 -414
  464. package/node_modules/pino/node_modules/sonic-boom/test/sync.test.js +0 -261
  465. package/node_modules/pino/node_modules/sonic-boom/test/write.test.js +0 -465
  466. package/node_modules/pino/node_modules/sonic-boom/types/index.d.ts +0 -62
  467. package/node_modules/pino/node_modules/sonic-boom/types/tests/test.ts +0 -4
  468. package/node_modules/pino/pino-banner.png +0 -0
  469. package/node_modules/pino/pino-logo-hire.png +0 -0
  470. package/node_modules/pino/pino-tree.png +0 -0
  471. package/node_modules/pino/pretty-demo.png +0 -0
  472. package/node_modules/pino/test/errorKey.test.js +0 -34
  473. package/node_modules/pino/test/transport/core.test.ts +0 -236
  474. package/node_modules/pino-std-serializers/.taprc +0 -2
  475. package/node_modules/process/.eslintrc +0 -21
  476. package/node_modules/process/LICENSE +0 -22
  477. package/node_modules/process/README.md +0 -26
  478. package/node_modules/process/browser.js +0 -184
  479. package/node_modules/process/index.js +0 -2
  480. package/node_modules/process/package.json +0 -27
  481. package/node_modules/process/test.js +0 -199
  482. package/node_modules/process-warning/.taprc +0 -2
  483. package/node_modules/readable-stream/LICENSE +0 -47
  484. package/node_modules/readable-stream/README.md +0 -116
  485. package/node_modules/readable-stream/lib/_stream_duplex.js +0 -4
  486. package/node_modules/readable-stream/lib/_stream_passthrough.js +0 -4
  487. package/node_modules/readable-stream/lib/_stream_readable.js +0 -4
  488. package/node_modules/readable-stream/lib/_stream_transform.js +0 -4
  489. package/node_modules/readable-stream/lib/_stream_writable.js +0 -4
  490. package/node_modules/readable-stream/lib/internal/streams/add-abort-signal.js +0 -52
  491. package/node_modules/readable-stream/lib/internal/streams/buffer_list.js +0 -157
  492. package/node_modules/readable-stream/lib/internal/streams/compose.js +0 -194
  493. package/node_modules/readable-stream/lib/internal/streams/destroy.js +0 -290
  494. package/node_modules/readable-stream/lib/internal/streams/duplex.js +0 -143
  495. package/node_modules/readable-stream/lib/internal/streams/duplexify.js +0 -378
  496. package/node_modules/readable-stream/lib/internal/streams/end-of-stream.js +0 -286
  497. package/node_modules/readable-stream/lib/internal/streams/from.js +0 -98
  498. package/node_modules/readable-stream/lib/internal/streams/lazy_transform.js +0 -51
  499. package/node_modules/readable-stream/lib/internal/streams/legacy.js +0 -89
  500. package/node_modules/readable-stream/lib/internal/streams/operators.js +0 -457
  501. package/node_modules/readable-stream/lib/internal/streams/passthrough.js +0 -39
  502. package/node_modules/readable-stream/lib/internal/streams/pipeline.js +0 -471
  503. package/node_modules/readable-stream/lib/internal/streams/readable.js +0 -1290
  504. package/node_modules/readable-stream/lib/internal/streams/state.js +0 -39
  505. package/node_modules/readable-stream/lib/internal/streams/transform.js +0 -180
  506. package/node_modules/readable-stream/lib/internal/streams/utils.js +0 -327
  507. package/node_modules/readable-stream/lib/internal/streams/writable.js +0 -819
  508. package/node_modules/readable-stream/lib/internal/validators.js +0 -530
  509. package/node_modules/readable-stream/lib/ours/browser.js +0 -35
  510. package/node_modules/readable-stream/lib/ours/errors.js +0 -343
  511. package/node_modules/readable-stream/lib/ours/index.js +0 -65
  512. package/node_modules/readable-stream/lib/ours/primordials.js +0 -124
  513. package/node_modules/readable-stream/lib/ours/util/inspect.js +0 -55
  514. package/node_modules/readable-stream/lib/ours/util.js +0 -148
  515. package/node_modules/readable-stream/lib/stream/promises.js +0 -43
  516. package/node_modules/readable-stream/lib/stream.js +0 -143
  517. package/node_modules/readable-stream/package.json +0 -88
  518. package/node_modules/safe-buffer/LICENSE +0 -21
  519. package/node_modules/safe-buffer/README.md +0 -584
  520. package/node_modules/safe-buffer/index.d.ts +0 -187
  521. package/node_modules/safe-buffer/index.js +0 -65
  522. package/node_modules/safe-buffer/package.json +0 -51
  523. package/node_modules/string_decoder/LICENSE +0 -48
  524. package/node_modules/string_decoder/README.md +0 -47
  525. package/node_modules/string_decoder/lib/string_decoder.js +0 -296
  526. package/node_modules/string_decoder/package.json +0 -34
@@ -0,0 +1,350 @@
1
+ # @pinojs/redact
2
+
3
+ > Smart object redaction for JavaScript applications - safe AND fast!
4
+
5
+ Redact JS objects with the same API as [fast-redact](https://github.com/davidmarkclements/fast-redact), but uses innovative **selective cloning** instead of mutating the original. This provides immutability guarantees with **performance competitive** to fast-redact for real-world usage patterns.
6
+
7
+ ## Install
8
+
9
+ ```bash
10
+ npm install @pinojs/redact
11
+ ```
12
+
13
+ ## Usage
14
+
15
+ ```js
16
+ const slowRedact = require('@pinojs/redact')
17
+
18
+ const redact = slowRedact({
19
+ paths: ['headers.cookie', 'headers.authorization', 'user.password']
20
+ })
21
+
22
+ const obj = {
23
+ headers: {
24
+ cookie: 'secret-session-token',
25
+ authorization: 'Bearer abc123',
26
+ 'x-forwarded-for': '192.168.1.1'
27
+ },
28
+ user: {
29
+ name: 'john',
30
+ password: 'secret123'
31
+ }
32
+ }
33
+
34
+ console.log(redact(obj))
35
+ // Output: {"headers":{"cookie":"[REDACTED]","authorization":"[REDACTED]","x-forwarded-for":"192.168.1.1"},"user":{"name":"john","password":"[REDACTED]"}}
36
+
37
+ // Original object is completely unchanged:
38
+ console.log(obj.headers.cookie) // 'secret-session-token'
39
+ ```
40
+
41
+ ## API
42
+
43
+ ### slowRedact(options) → Function
44
+
45
+ Creates a redaction function with the specified options.
46
+
47
+ #### Options
48
+
49
+ - **paths** `string[]` (required): An array of strings describing the nested location of a key in an object
50
+ - **censor** `any` (optional, default: `'[REDACTED]'`): The value to replace sensitive data with. Can be a static value or function.
51
+ - **serialize** `Function|boolean` (optional, default: `JSON.stringify`): Serialization function. Set to `false` to return the redacted object.
52
+ - **remove** `boolean` (optional, default: `false`): Remove redacted keys from serialized output
53
+ - **strict** `boolean` (optional, default: `true`): Throw on non-object values or pass through primitives
54
+
55
+ #### Path Syntax
56
+
57
+ Supports the same path syntax as fast-redact:
58
+
59
+ - **Dot notation**: `'user.name'`, `'headers.cookie'`
60
+ - **Bracket notation**: `'user["password"]'`, `'headers["X-Forwarded-For"]'`
61
+ - **Array indices**: `'users[0].password'`, `'items[1].secret'`
62
+ - **Wildcards**:
63
+ - Terminal: `'users.*.password'` (redacts password for all users)
64
+ - Intermediate: `'*.password'` (redacts password at any level)
65
+ - Array wildcard: `'items.*'` (redacts all array elements)
66
+
67
+ #### Examples
68
+
69
+ **Custom censor value:**
70
+ ```js
71
+ const redact = slowRedact({
72
+ paths: ['password'],
73
+ censor: '***HIDDEN***'
74
+ })
75
+ ```
76
+
77
+ **Dynamic censor function:**
78
+ ```js
79
+ const redact = slowRedact({
80
+ paths: ['password'],
81
+ censor: (value, path) => `REDACTED:${path}`
82
+ })
83
+ ```
84
+
85
+ **Return object instead of JSON string:**
86
+ ```js
87
+ const redact = slowRedact({
88
+ paths: ['secret'],
89
+ serialize: false
90
+ })
91
+
92
+ const result = redact({ secret: 'hidden', public: 'data' })
93
+ console.log(result.secret) // '[REDACTED]'
94
+ console.log(result.public) // 'data'
95
+
96
+ // Restore original values
97
+ const restored = result.restore()
98
+ console.log(restored.secret) // 'hidden'
99
+ ```
100
+
101
+ **Custom serialization:**
102
+ ```js
103
+ const redact = slowRedact({
104
+ paths: ['password'],
105
+ serialize: obj => JSON.stringify(obj, null, 2)
106
+ })
107
+ ```
108
+
109
+ **Remove keys instead of redacting:**
110
+ ```js
111
+ const redact = slowRedact({
112
+ paths: ['password', 'user.secret'],
113
+ remove: true
114
+ })
115
+
116
+ const obj = { username: 'john', password: 'secret123', user: { name: 'Jane', secret: 'hidden' } }
117
+ console.log(redact(obj))
118
+ // Output: {"username":"john","user":{"name":"Jane"}}
119
+ // Note: 'password' and 'user.secret' are completely absent, not redacted
120
+ ```
121
+
122
+ **Wildcard patterns:**
123
+ ```js
124
+ // Redact all properties in secrets object
125
+ const redact1 = slowRedact({ paths: ['secrets.*'] })
126
+
127
+ // Redact password for any user
128
+ const redact2 = slowRedact({ paths: ['users.*.password'] })
129
+
130
+ // Redact all items in an array
131
+ const redact3 = slowRedact({ paths: ['items.*'] })
132
+
133
+ // Remove all secrets instead of redacting them
134
+ const redact4 = slowRedact({ paths: ['secrets.*'], remove: true })
135
+ ```
136
+
137
+ ## Key Differences from fast-redact
138
+
139
+ ### Safety First
140
+ - **No mutation**: Original objects are never modified
141
+ - **Selective cloning**: Only clones paths that need redaction, shares references for everything else
142
+ - **Restore capability**: Can restore original values when `serialize: false`
143
+
144
+ ### Feature Compatibility
145
+ - **Remove option**: Full compatibility with fast-redact's `remove: true` option to completely omit keys from output
146
+ - **All path patterns**: Supports same syntax including wildcards, bracket notation, and array indices
147
+ - **Censor functions**: Dynamic censoring with path information passed as arrays
148
+ - **Serialization**: Custom serializers and `serialize: false` mode
149
+
150
+ ### Smart Performance Approach
151
+ - **Selective cloning**: Analyzes redaction paths and only clones necessary object branches
152
+ - **Reference sharing**: Non-redacted properties maintain original object references
153
+ - **Memory efficiency**: Dramatically reduced memory usage for large objects with minimal redaction
154
+ - **Setup-time optimization**: Path analysis happens once during setup, not per redaction
155
+
156
+ ### When to Use @pinojs/redact
157
+ - When immutability is critical
158
+ - When you need to preserve original objects
159
+ - When objects are shared across multiple contexts
160
+ - In functional programming environments
161
+ - When debugging and you need to compare before/after
162
+ - **Large objects with selective redaction** (now performance-competitive!)
163
+ - When memory efficiency with reference sharing is important
164
+
165
+ ### When to Use fast-redact
166
+ - When absolute maximum performance is critical
167
+ - In extremely high-throughput scenarios (>100,000 ops/sec)
168
+ - When you control the object lifecycle and mutation is acceptable
169
+ - Very small objects where setup overhead matters
170
+
171
+ ## Performance Benchmarks
172
+
173
+ @pinojs/redact uses **selective cloning** that provides good performance while maintaining immutability guarantees:
174
+
175
+ ### Performance Results
176
+
177
+ | Operation Type | @pinojs/redact | fast-redact | Performance Ratio |
178
+ |---------------|-------------|-------------|-------------------|
179
+ | **Small objects** | ~690ns | ~200ns | ~3.5x slower |
180
+ | **Large objects (minimal redaction)** | **~18μs** | ~17μs | **~same performance** |
181
+ | **Large objects (wildcards)** | **~48μs** | ~37μs | **~1.3x slower** |
182
+ | **No redaction (large objects)** | **~18μs** | ~17μs | **~same performance** |
183
+
184
+ ### Performance Improvements
185
+
186
+ @pinojs/redact is performance-competitive with fast-redact for large objects.
187
+
188
+ 1. **Selective cloning approach**: Only clones object paths that need redaction
189
+ 2. **Reference sharing**: Non-redacted properties share original object references
190
+ 3. **Setup-time optimization**: Path analysis happens once, not per redaction
191
+ 4. **Memory efficiency**: Dramatically reduced memory usage for typical use cases
192
+
193
+ ### Benchmark Details
194
+
195
+ **Small Objects (~180 bytes)**:
196
+ - @pinojs/redact: **690ns** per operation
197
+ - fast-redact: **200ns** per operation
198
+ - **Slight setup overhead for small objects**
199
+
200
+ **Large Objects (~18KB, minimal redaction)**:
201
+ - @pinojs/redact: **18μs** per operation
202
+ - fast-redact: **17μs** per operation
203
+ - Near-identical performance
204
+
205
+ **Large Objects (~18KB, wildcard patterns)**:
206
+ - @pinojs/redact: **48μs** per operation
207
+ - fast-redact: **37μs** per operation
208
+ - Competitive performance for complex patterns
209
+
210
+ **Memory Considerations**:
211
+ - @pinojs/redact: **Selective reference sharing** (much lower memory usage than before)
212
+ - fast-redact: Mutates in-place (lowest memory usage)
213
+ - Large objects with few redacted paths now share most references
214
+
215
+ ### When Performance Matters
216
+
217
+ Choose **fast-redact** when:
218
+ - Absolute maximum performance is critical (>100,000 ops/sec)
219
+ - Working with very small objects frequently
220
+ - Mutation is acceptable and controlled
221
+ - Every microsecond counts
222
+
223
+ Choose **@pinojs/redact** when:
224
+ - Immutability is required (with competitive performance)
225
+ - Objects are shared across contexts
226
+ - Large objects with selective redaction
227
+ - Memory efficiency through reference sharing is important
228
+ - Safety and functionality are priorities
229
+ - Most production applications (performance gap is minimal)
230
+
231
+ Run benchmarks yourself:
232
+ ```bash
233
+ npm run bench
234
+ ```
235
+
236
+ ## How Selective Cloning Works
237
+
238
+ @pinojs/redact uses an innovative **selective cloning** approach that provides immutability guarantees while dramatically improving performance:
239
+
240
+ ### Traditional Approach (before optimization)
241
+ ```js
242
+ // Old approach: Deep clone entire object, then redact
243
+ const fullClone = deepClone(originalObject) // Clone everything
244
+ redact(fullClone, paths) // Then redact specific paths
245
+ ```
246
+
247
+ ### Selective Cloning Approach (current)
248
+ ```js
249
+ // New approach: Analyze paths, clone only what's needed
250
+ const pathStructure = buildPathStructure(paths) // One-time setup
251
+ const selectiveClone = cloneOnlyNeededPaths(obj, pathStructure) // Smart cloning
252
+ redact(selectiveClone, paths) // Redact pre-identified paths
253
+ ```
254
+
255
+ ### Key Innovations
256
+
257
+ 1. **Path Analysis**: Pre-processes redaction paths into an efficient tree structure
258
+ 2. **Selective Cloning**: Only creates new objects for branches that contain redaction targets
259
+ 3. **Reference Sharing**: Non-redacted properties maintain exact same object references
260
+ 4. **Setup Optimization**: Path parsing happens once during redactor creation, not per redaction
261
+
262
+ ### Example: Reference Sharing in Action
263
+
264
+ ```js
265
+ const largeConfig = {
266
+ database: { /* large config object */ },
267
+ api: { /* another large config */ },
268
+ secrets: { password: 'hidden', apiKey: 'secret' }
269
+ }
270
+
271
+ const redact = slowRedact({ paths: ['secrets.password'] })
272
+ const result = redact(largeConfig)
273
+
274
+ // Only secrets object is cloned, database and api share original references
275
+ console.log(result.database === largeConfig.database) // true - shared reference!
276
+ console.log(result.api === largeConfig.api) // true - shared reference!
277
+ console.log(result.secrets === largeConfig.secrets) // false - cloned for redaction
278
+ ```
279
+
280
+ This approach provides **immutability where it matters** while **sharing references where it's safe**.
281
+
282
+ ## Remove Option
283
+
284
+ The `remove: true` option provides full compatibility with fast-redact's key removal functionality:
285
+
286
+ ```js
287
+ const redact = slowRedact({
288
+ paths: ['password', 'secrets.*', 'users.*.credentials'],
289
+ remove: true
290
+ })
291
+
292
+ const data = {
293
+ username: 'john',
294
+ password: 'secret123',
295
+ secrets: { apiKey: 'abc', token: 'xyz' },
296
+ users: [
297
+ { name: 'Alice', credentials: { password: 'pass1' } },
298
+ { name: 'Bob', credentials: { password: 'pass2' } }
299
+ ]
300
+ }
301
+
302
+ console.log(redact(data))
303
+ // Output: {"username":"john","secrets":{},"users":[{"name":"Alice"},{"name":"Bob"}]}
304
+ ```
305
+
306
+ ### Remove vs Redact Behavior
307
+
308
+ | Option | Behavior | Output Example |
309
+ |--------|----------|----------------|
310
+ | Default (redact) | Replaces values with censor | `{"password":"[REDACTED]"}` |
311
+ | `remove: true` | Completely omits keys | `{}` |
312
+
313
+ ### Compatibility Notes
314
+
315
+ - **Same output as fast-redact**: Identical JSON output when using `remove: true`
316
+ - **Wildcard support**: Works with all wildcard patterns (`*`, `users.*`, `items.*.secret`)
317
+ - **Array handling**: Array items are set to `undefined` (omitted in JSON output)
318
+ - **Nested paths**: Supports deep removal (`users.*.credentials.password`)
319
+ - **Serialize compatibility**: Only works with `JSON.stringify` serializer (like fast-redact)
320
+
321
+ ## Testing
322
+
323
+ ```bash
324
+ # Run unit tests
325
+ npm test
326
+
327
+ # Run integration tests comparing with fast-redact
328
+ npm run test:integration
329
+
330
+ # Run all tests (unit + integration)
331
+ npm run test:all
332
+
333
+ # Run benchmarks
334
+ npm run bench
335
+ ```
336
+
337
+ ### Test Coverage
338
+
339
+ - **16 unit tests**: Core functionality and edge cases
340
+ - **16 integration tests**: Output compatibility with fast-redact
341
+ - **All major features**: Paths, wildcards, serialization, custom censors
342
+ - **Performance benchmarks**: Direct comparison with fast-redact
343
+
344
+ ## License
345
+
346
+ MIT
347
+
348
+ ## Contributing
349
+
350
+ Pull requests welcome! Please ensure all tests pass and add tests for new features.
@@ -0,0 +1,184 @@
1
+ const { bench, group, run } = require('mitata')
2
+ const slowRedact = require('../index.js')
3
+ const fastRedact = require('fast-redact')
4
+
5
+ // Test objects
6
+ const smallObj = {
7
+ user: { name: 'john', password: 'secret123' },
8
+ headers: { cookie: 'session-token', authorization: 'Bearer abc123' }
9
+ }
10
+
11
+ const largeObj = {
12
+ users: [],
13
+ metadata: {
14
+ version: '1.0.0',
15
+ secret: 'app-secret-key',
16
+ database: {
17
+ host: 'localhost',
18
+ password: 'db-password'
19
+ }
20
+ }
21
+ }
22
+
23
+ // Populate users array with for loop instead of Array.from
24
+ for (let i = 0; i < 100; i++) {
25
+ largeObj.users.push({
26
+ id: i,
27
+ name: `user${i}`,
28
+ email: `user${i}@example.com`,
29
+ password: `secret${i}`,
30
+ profile: {
31
+ age: 20 + (i % 50),
32
+ preferences: {
33
+ theme: 'dark',
34
+ notifications: true,
35
+ apiKey: `key-${i}-secret`
36
+ }
37
+ }
38
+ })
39
+ }
40
+
41
+ // Redaction configurations
42
+ const basicSlowRedact = slowRedact({
43
+ paths: ['user.password', 'headers.cookie']
44
+ })
45
+
46
+ const basicFastRedact = fastRedact({
47
+ paths: ['user.password', 'headers.cookie']
48
+ })
49
+
50
+ const wildcardSlowRedact = slowRedact({
51
+ paths: ['users.*.password', 'users.*.profile.preferences.apiKey']
52
+ })
53
+
54
+ const wildcardFastRedact = fastRedact({
55
+ paths: ['users.*.password', 'users.*.profile.preferences.apiKey']
56
+ })
57
+
58
+ const deepSlowRedact = slowRedact({
59
+ paths: ['metadata.secret', 'metadata.database.password']
60
+ })
61
+
62
+ const deepFastRedact = fastRedact({
63
+ paths: ['metadata.secret', 'metadata.database.password']
64
+ })
65
+
66
+ group('Small Object Redaction - @pinojs/redact', () => {
67
+ bench('basic paths', () => {
68
+ basicSlowRedact(smallObj)
69
+ })
70
+
71
+ bench('serialize: false', () => {
72
+ const redact = slowRedact({
73
+ paths: ['user.password'],
74
+ serialize: false
75
+ })
76
+ redact(smallObj)
77
+ })
78
+
79
+ bench('custom censor function', () => {
80
+ const redact = slowRedact({
81
+ paths: ['user.password'],
82
+ censor: (value, path) => `HIDDEN:${path}`
83
+ })
84
+ redact(smallObj)
85
+ })
86
+ })
87
+
88
+ group('Small Object Redaction - fast-redact', () => {
89
+ bench('basic paths', () => {
90
+ basicFastRedact(smallObj)
91
+ })
92
+
93
+ bench('serialize: false', () => {
94
+ const redact = fastRedact({
95
+ paths: ['user.password'],
96
+ serialize: false
97
+ })
98
+ redact(smallObj)
99
+ })
100
+
101
+ bench('custom censor function', () => {
102
+ const redact = fastRedact({
103
+ paths: ['user.password'],
104
+ censor: (value, path) => `HIDDEN:${path}`
105
+ })
106
+ redact(smallObj)
107
+ })
108
+ })
109
+
110
+ group('Large Object Redaction - @pinojs/redact', () => {
111
+ bench('wildcard patterns', () => {
112
+ wildcardSlowRedact(largeObj)
113
+ })
114
+
115
+ bench('deep nested paths', () => {
116
+ deepSlowRedact(largeObj)
117
+ })
118
+
119
+ bench('multiple wildcards', () => {
120
+ const redact = slowRedact({
121
+ paths: ['users.*.password', 'users.*.profile.preferences.*']
122
+ })
123
+ redact(largeObj)
124
+ })
125
+ })
126
+
127
+ group('Large Object Redaction - fast-redact', () => {
128
+ bench('wildcard patterns', () => {
129
+ wildcardFastRedact(largeObj)
130
+ })
131
+
132
+ bench('deep nested paths', () => {
133
+ deepFastRedact(largeObj)
134
+ })
135
+
136
+ bench('multiple wildcards', () => {
137
+ const redact = fastRedact({
138
+ paths: ['users.*.password', 'users.*.profile.preferences.*']
139
+ })
140
+ redact(largeObj)
141
+ })
142
+ })
143
+
144
+ group('Direct Performance Comparison', () => {
145
+ bench('@pinojs/redact - basic paths', () => {
146
+ basicSlowRedact(smallObj)
147
+ })
148
+
149
+ bench('fast-redact - basic paths', () => {
150
+ basicFastRedact(smallObj)
151
+ })
152
+
153
+ bench('@pinojs/redact - wildcards', () => {
154
+ wildcardSlowRedact(largeObj)
155
+ })
156
+
157
+ bench('fast-redact - wildcards', () => {
158
+ wildcardFastRedact(largeObj)
159
+ })
160
+ })
161
+
162
+ group('Object Cloning Overhead', () => {
163
+ bench('@pinojs/redact - no redaction (clone only)', () => {
164
+ const redact = slowRedact({ paths: [] })
165
+ redact(smallObj)
166
+ })
167
+
168
+ bench('fast-redact - no redaction', () => {
169
+ const redact = fastRedact({ paths: [] })
170
+ redact(smallObj)
171
+ })
172
+
173
+ bench('@pinojs/redact - large object clone', () => {
174
+ const redact = slowRedact({ paths: [] })
175
+ redact(largeObj)
176
+ })
177
+
178
+ bench('fast-redact - large object', () => {
179
+ const redact = fastRedact({ paths: [] })
180
+ redact(largeObj)
181
+ })
182
+ })
183
+
184
+ run()
@@ -0,0 +1 @@
1
+ module.exports = require('neostandard')()
@@ -0,0 +1,52 @@
1
+ export = F;
2
+
3
+ /**
4
+ * When called without any options, or with a zero length paths array, @pinojs/redact will return JSON.stringify or the serialize option, if set.
5
+ * @param redactOptions
6
+ * @param redactOptions.paths An array of strings describing the nested location of a key in an object.
7
+ * @param redactOptions.censor This is the value which overwrites redacted properties.
8
+ * @param redactOptions.remove The remove option, when set to true will cause keys to be removed from the serialized output.
9
+ * @param redactOptions.serialize The serialize option may either be a function or a boolean. If a function is supplied, this will be used to serialize the redacted object.
10
+ * @param redactOptions.strict The strict option, when set to true, will cause the redactor function to throw if instead of an object it finds a primitive.
11
+ * @returns Redacted value from input
12
+ */
13
+ declare function F(
14
+ redactOptions: F.RedactOptionsNoSerialize
15
+ ): F.redactFnNoSerialize;
16
+ declare function F(redactOptions?: F.RedactOptions): F.redactFn;
17
+
18
+ declare namespace F {
19
+ /** Redacts input */
20
+ type redactFn = <T>(input: T) => string | T;
21
+
22
+ /** Redacts input without serialization */
23
+ type redactFnNoSerialize = redactFn & {
24
+ /** Method that allowing the redacted keys to be restored with the original data. Supplied only when serialize option set to false. */
25
+ restore<T>(input: T): T;
26
+ };
27
+
28
+ interface RedactOptions {
29
+ /** An array of strings describing the nested location of a key in an object. */
30
+ paths?: string[] | undefined;
31
+
32
+ /** This is the value which overwrites redacted properties. */
33
+ censor?: string | ((v: any) => any) | undefined;
34
+
35
+ /** The remove option, when set to true will cause keys to be removed from the serialized output. */
36
+ remove?: boolean | undefined;
37
+
38
+ /**
39
+ * The serialize option may either be a function or a boolean. If a function is supplied, this will be used to serialize the redacted object.
40
+ * The default serialize is the function JSON.stringify
41
+ */
42
+ serialize?: boolean | ((v: any) => any) | undefined;
43
+
44
+ /** The strict option, when set to true, will cause the redactor function to throw if instead of an object it finds a primitive. */
45
+ strict?: boolean | undefined;
46
+ }
47
+
48
+ /** RedactOptions without serialization. Instead of the serialized object, the output of the redactor function will be the mutated object itself. */
49
+ interface RedactOptionsNoSerialize extends RedactOptions {
50
+ serialize: false;
51
+ }
52
+ }