@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,824 @@
1
+ const { test } = require('node:test')
2
+ const { strict: assert } = require('node:assert')
3
+ const slowRedact = require('../index.js')
4
+
5
+ test('basic path redaction', () => {
6
+ const obj = {
7
+ headers: {
8
+ cookie: 'secret-cookie',
9
+ authorization: 'Bearer token'
10
+ },
11
+ body: { message: 'hello' }
12
+ }
13
+
14
+ const redact = slowRedact({ paths: ['headers.cookie'] })
15
+ const result = redact(obj)
16
+
17
+ // Original object should remain unchanged
18
+ assert.strictEqual(obj.headers.cookie, 'secret-cookie')
19
+
20
+ // Result should have redacted path
21
+ const parsed = JSON.parse(result)
22
+ assert.strictEqual(parsed.headers.cookie, '[REDACTED]')
23
+ assert.strictEqual(parsed.headers.authorization, 'Bearer token')
24
+ assert.strictEqual(parsed.body.message, 'hello')
25
+ })
26
+
27
+ test('multiple paths redaction', () => {
28
+ const obj = {
29
+ user: { name: 'john', password: 'secret' },
30
+ session: { token: 'abc123' }
31
+ }
32
+
33
+ const redact = slowRedact({
34
+ paths: ['user.password', 'session.token']
35
+ })
36
+ const result = redact(obj)
37
+
38
+ // Original unchanged
39
+ assert.strictEqual(obj.user.password, 'secret')
40
+ assert.strictEqual(obj.session.token, 'abc123')
41
+
42
+ // Result redacted
43
+ const parsed = JSON.parse(result)
44
+ assert.strictEqual(parsed.user.password, '[REDACTED]')
45
+ assert.strictEqual(parsed.session.token, '[REDACTED]')
46
+ assert.strictEqual(parsed.user.name, 'john')
47
+ })
48
+
49
+ test('custom censor value', () => {
50
+ const obj = { secret: 'hidden' }
51
+ const redact = slowRedact({
52
+ paths: ['secret'],
53
+ censor: '***'
54
+ })
55
+ const result = redact(obj)
56
+
57
+ const parsed = JSON.parse(result)
58
+ assert.strictEqual(parsed.secret, '***')
59
+ })
60
+
61
+ test('serialize: false returns object with restore method', () => {
62
+ const obj = { secret: 'hidden' }
63
+ const redact = slowRedact({
64
+ paths: ['secret'],
65
+ serialize: false
66
+ })
67
+ const result = redact(obj)
68
+
69
+ // Should be object, not string
70
+ assert.strictEqual(typeof result, 'object')
71
+ assert.strictEqual(result.secret, '[REDACTED]')
72
+
73
+ // Should have restore method
74
+ assert.strictEqual(typeof result.restore, 'function')
75
+
76
+ const restored = result.restore()
77
+ assert.strictEqual(restored.secret, 'hidden')
78
+ })
79
+
80
+ test('bracket notation paths', () => {
81
+ const obj = {
82
+ 'weird-key': { 'another-weird': 'secret' },
83
+ normal: 'public'
84
+ }
85
+
86
+ const redact = slowRedact({
87
+ paths: ['["weird-key"]["another-weird"]']
88
+ })
89
+ const result = redact(obj)
90
+
91
+ const parsed = JSON.parse(result)
92
+ assert.strictEqual(parsed['weird-key']['another-weird'], '[REDACTED]')
93
+ assert.strictEqual(parsed.normal, 'public')
94
+ })
95
+
96
+ test('array paths', () => {
97
+ const obj = {
98
+ users: [
99
+ { name: 'john', password: 'secret1' },
100
+ { name: 'jane', password: 'secret2' }
101
+ ]
102
+ }
103
+
104
+ const redact = slowRedact({
105
+ paths: ['users[0].password', 'users[1].password']
106
+ })
107
+ const result = redact(obj)
108
+
109
+ const parsed = JSON.parse(result)
110
+ assert.strictEqual(parsed.users[0].password, '[REDACTED]')
111
+ assert.strictEqual(parsed.users[1].password, '[REDACTED]')
112
+ assert.strictEqual(parsed.users[0].name, 'john')
113
+ assert.strictEqual(parsed.users[1].name, 'jane')
114
+ })
115
+
116
+ test('wildcard at end of path', () => {
117
+ const obj = {
118
+ secrets: {
119
+ key1: 'secret1',
120
+ key2: 'secret2'
121
+ },
122
+ public: 'data'
123
+ }
124
+
125
+ const redact = slowRedact({
126
+ paths: ['secrets.*']
127
+ })
128
+ const result = redact(obj)
129
+
130
+ const parsed = JSON.parse(result)
131
+ assert.strictEqual(parsed.secrets.key1, '[REDACTED]')
132
+ assert.strictEqual(parsed.secrets.key2, '[REDACTED]')
133
+ assert.strictEqual(parsed.public, 'data')
134
+ })
135
+
136
+ test('wildcard with arrays', () => {
137
+ const obj = {
138
+ items: ['secret1', 'secret2', 'secret3']
139
+ }
140
+
141
+ const redact = slowRedact({
142
+ paths: ['items.*']
143
+ })
144
+ const result = redact(obj)
145
+
146
+ const parsed = JSON.parse(result)
147
+ assert.strictEqual(parsed.items[0], '[REDACTED]')
148
+ assert.strictEqual(parsed.items[1], '[REDACTED]')
149
+ assert.strictEqual(parsed.items[2], '[REDACTED]')
150
+ })
151
+
152
+ test('intermediate wildcard', () => {
153
+ const obj = {
154
+ users: {
155
+ user1: { password: 'secret1' },
156
+ user2: { password: 'secret2' }
157
+ }
158
+ }
159
+
160
+ const redact = slowRedact({
161
+ paths: ['users.*.password']
162
+ })
163
+ const result = redact(obj)
164
+
165
+ const parsed = JSON.parse(result)
166
+ assert.strictEqual(parsed.users.user1.password, '[REDACTED]')
167
+ assert.strictEqual(parsed.users.user2.password, '[REDACTED]')
168
+ })
169
+
170
+ test('censor function', () => {
171
+ const obj = { secret: 'hidden' }
172
+ const redact = slowRedact({
173
+ paths: ['secret'],
174
+ censor: (value, path) => `REDACTED:${path.join('.')}`
175
+ })
176
+ const result = redact(obj)
177
+
178
+ const parsed = JSON.parse(result)
179
+ assert.strictEqual(parsed.secret, 'REDACTED:secret')
180
+ })
181
+
182
+ test('custom serialize function', () => {
183
+ const obj = { secret: 'hidden', public: 'data' }
184
+ const redact = slowRedact({
185
+ paths: ['secret'],
186
+ serialize: (obj) => `custom:${JSON.stringify(obj)}`
187
+ })
188
+ const result = redact(obj)
189
+
190
+ assert(result.startsWith('custom:'))
191
+ const parsed = JSON.parse(result.slice(7))
192
+ assert.strictEqual(parsed.secret, '[REDACTED]')
193
+ assert.strictEqual(parsed.public, 'data')
194
+ })
195
+
196
+ test('nested paths', () => {
197
+ const obj = {
198
+ level1: {
199
+ level2: {
200
+ level3: {
201
+ secret: 'hidden'
202
+ }
203
+ }
204
+ }
205
+ }
206
+
207
+ const redact = slowRedact({
208
+ paths: ['level1.level2.level3.secret']
209
+ })
210
+ const result = redact(obj)
211
+
212
+ const parsed = JSON.parse(result)
213
+ assert.strictEqual(parsed.level1.level2.level3.secret, '[REDACTED]')
214
+ })
215
+
216
+ test('non-existent paths are ignored', () => {
217
+ const obj = { existing: 'value' }
218
+ const redact = slowRedact({
219
+ paths: ['nonexistent.path']
220
+ })
221
+ const result = redact(obj)
222
+
223
+ const parsed = JSON.parse(result)
224
+ assert.strictEqual(parsed.existing, 'value')
225
+ assert.strictEqual(parsed.nonexistent, undefined)
226
+ })
227
+
228
+ test('null and undefined handling', () => {
229
+ const obj = {
230
+ nullValue: null,
231
+ undefinedValue: undefined,
232
+ nested: {
233
+ nullValue: null
234
+ }
235
+ }
236
+
237
+ const redact = slowRedact({
238
+ paths: ['nullValue', 'nested.nullValue']
239
+ })
240
+ const result = redact(obj)
241
+
242
+ const parsed = JSON.parse(result)
243
+ assert.strictEqual(parsed.nullValue, '[REDACTED]')
244
+ assert.strictEqual(parsed.nested.nullValue, '[REDACTED]')
245
+ })
246
+
247
+ test('original object remains unchanged', () => {
248
+ const original = {
249
+ secret: 'hidden',
250
+ nested: { secret: 'hidden2' }
251
+ }
252
+ const copy = JSON.parse(JSON.stringify(original))
253
+
254
+ const redact = slowRedact({
255
+ paths: ['secret', 'nested.secret']
256
+ })
257
+ redact(original)
258
+
259
+ // Original should be completely unchanged
260
+ assert.deepStrictEqual(original, copy)
261
+ })
262
+
263
+ test('strict mode with primitives', () => {
264
+ const redact = slowRedact({
265
+ paths: ['test'],
266
+ strict: true
267
+ })
268
+
269
+ const stringResult = redact('primitive')
270
+ assert.strictEqual(stringResult, '"primitive"')
271
+
272
+ const numberResult = redact(42)
273
+ assert.strictEqual(numberResult, '42')
274
+ })
275
+
276
+ // Path validation tests to match fast-redact behavior
277
+ test('path validation - non-string paths should throw', () => {
278
+ assert.throws(() => {
279
+ slowRedact({ paths: [123] })
280
+ }, {
281
+ message: 'Paths must be (non-empty) strings'
282
+ })
283
+
284
+ assert.throws(() => {
285
+ slowRedact({ paths: [null] })
286
+ }, {
287
+ message: 'Paths must be (non-empty) strings'
288
+ })
289
+
290
+ assert.throws(() => {
291
+ slowRedact({ paths: [undefined] })
292
+ }, {
293
+ message: 'Paths must be (non-empty) strings'
294
+ })
295
+ })
296
+
297
+ test('path validation - empty string should throw', () => {
298
+ assert.throws(() => {
299
+ slowRedact({ paths: [''] })
300
+ }, {
301
+ message: 'Invalid redaction path ()'
302
+ })
303
+ })
304
+
305
+ test('path validation - double dots should throw', () => {
306
+ assert.throws(() => {
307
+ slowRedact({ paths: ['invalid..path'] })
308
+ }, {
309
+ message: 'Invalid redaction path (invalid..path)'
310
+ })
311
+
312
+ assert.throws(() => {
313
+ slowRedact({ paths: ['a..b..c'] })
314
+ }, {
315
+ message: 'Invalid redaction path (a..b..c)'
316
+ })
317
+ })
318
+
319
+ test('path validation - unmatched brackets should throw', () => {
320
+ assert.throws(() => {
321
+ slowRedact({ paths: ['invalid[unclosed'] })
322
+ }, {
323
+ message: 'Invalid redaction path (invalid[unclosed)'
324
+ })
325
+
326
+ assert.throws(() => {
327
+ slowRedact({ paths: ['invalid]unopened'] })
328
+ }, {
329
+ message: 'Invalid redaction path (invalid]unopened)'
330
+ })
331
+
332
+ assert.throws(() => {
333
+ slowRedact({ paths: ['nested[a[b]'] })
334
+ }, {
335
+ message: 'Invalid redaction path (nested[a[b])'
336
+ })
337
+ })
338
+
339
+ test('path validation - comma-separated paths should throw', () => {
340
+ assert.throws(() => {
341
+ slowRedact({ paths: ['req,headers.cookie'] })
342
+ }, {
343
+ message: 'Invalid redaction path (req,headers.cookie)'
344
+ })
345
+
346
+ assert.throws(() => {
347
+ slowRedact({ paths: ['user,profile,name'] })
348
+ }, {
349
+ message: 'Invalid redaction path (user,profile,name)'
350
+ })
351
+
352
+ assert.throws(() => {
353
+ slowRedact({ paths: ['a,b'] })
354
+ }, {
355
+ message: 'Invalid redaction path (a,b)'
356
+ })
357
+ })
358
+
359
+ test('path validation - mixed valid and invalid should throw', () => {
360
+ assert.throws(() => {
361
+ slowRedact({ paths: ['valid.path', 123, 'another.valid'] })
362
+ }, {
363
+ message: 'Paths must be (non-empty) strings'
364
+ })
365
+
366
+ assert.throws(() => {
367
+ slowRedact({ paths: ['valid.path', 'invalid..path'] })
368
+ }, {
369
+ message: 'Invalid redaction path (invalid..path)'
370
+ })
371
+
372
+ assert.throws(() => {
373
+ slowRedact({ paths: ['valid.path', 'req,headers.cookie'] })
374
+ }, {
375
+ message: 'Invalid redaction path (req,headers.cookie)'
376
+ })
377
+ })
378
+
379
+ test('path validation - valid paths should work', () => {
380
+ // These should not throw
381
+ assert.doesNotThrow(() => {
382
+ slowRedact({ paths: [] })
383
+ })
384
+
385
+ assert.doesNotThrow(() => {
386
+ slowRedact({ paths: ['valid.path'] })
387
+ })
388
+
389
+ assert.doesNotThrow(() => {
390
+ slowRedact({ paths: ['user.password', 'data[0].secret'] })
391
+ })
392
+
393
+ assert.doesNotThrow(() => {
394
+ slowRedact({ paths: ['["quoted-key"].value'] })
395
+ })
396
+
397
+ assert.doesNotThrow(() => {
398
+ slowRedact({ paths: ["['single-quoted'].value"] })
399
+ })
400
+
401
+ assert.doesNotThrow(() => {
402
+ slowRedact({ paths: ['array[0]', 'object.property', 'wildcard.*'] })
403
+ })
404
+ })
405
+
406
+ // fast-redact compatibility tests
407
+ test('censor function receives path as array (fast-redact compatibility)', () => {
408
+ const obj = {
409
+ headers: {
410
+ authorization: 'Bearer token',
411
+ 'x-api-key': 'secret-key'
412
+ }
413
+ }
414
+
415
+ const pathsReceived = []
416
+ const redact = slowRedact({
417
+ paths: ['headers.authorization', 'headers["x-api-key"]'],
418
+ censor: (value, path) => {
419
+ pathsReceived.push(path)
420
+ assert(Array.isArray(path), 'Path should be an array')
421
+ return '[REDACTED]'
422
+ }
423
+ })
424
+
425
+ redact(obj)
426
+
427
+ // Verify paths are arrays
428
+ assert.strictEqual(pathsReceived.length, 2)
429
+ assert.deepStrictEqual(pathsReceived[0], ['headers', 'authorization'])
430
+ assert.deepStrictEqual(pathsReceived[1], ['headers', 'x-api-key'])
431
+ })
432
+
433
+ test('censor function with nested paths receives correct array', () => {
434
+ const obj = {
435
+ user: {
436
+ profile: {
437
+ credentials: {
438
+ password: 'secret123'
439
+ }
440
+ }
441
+ }
442
+ }
443
+
444
+ let receivedPath
445
+ const redact = slowRedact({
446
+ paths: ['user.profile.credentials.password'],
447
+ censor: (value, path) => {
448
+ receivedPath = path
449
+ assert.strictEqual(value, 'secret123')
450
+ assert(Array.isArray(path))
451
+ return '[REDACTED]'
452
+ }
453
+ })
454
+
455
+ redact(obj)
456
+
457
+ assert.deepStrictEqual(receivedPath, ['user', 'profile', 'credentials', 'password'])
458
+ })
459
+
460
+ test('censor function with wildcards receives correct array paths', () => {
461
+ const obj = {
462
+ users: {
463
+ user1: { password: 'secret1' },
464
+ user2: { password: 'secret2' }
465
+ }
466
+ }
467
+
468
+ const pathsReceived = []
469
+ const redact = slowRedact({
470
+ paths: ['users.*.password'],
471
+ censor: (value, path) => {
472
+ pathsReceived.push([...path]) // copy the array
473
+ assert(Array.isArray(path))
474
+ return '[REDACTED]'
475
+ }
476
+ })
477
+
478
+ redact(obj)
479
+
480
+ assert.strictEqual(pathsReceived.length, 2)
481
+ assert.deepStrictEqual(pathsReceived[0], ['users', 'user1', 'password'])
482
+ assert.deepStrictEqual(pathsReceived[1], ['users', 'user2', 'password'])
483
+ })
484
+
485
+ test('censor function with array wildcard receives correct array paths', () => {
486
+ const obj = {
487
+ items: [
488
+ { secret: 'value1' },
489
+ { secret: 'value2' }
490
+ ]
491
+ }
492
+
493
+ const pathsReceived = []
494
+ const redact = slowRedact({
495
+ paths: ['items.*.secret'],
496
+ censor: (value, path) => {
497
+ pathsReceived.push([...path])
498
+ assert(Array.isArray(path))
499
+ return '[REDACTED]'
500
+ }
501
+ })
502
+
503
+ redact(obj)
504
+
505
+ assert.strictEqual(pathsReceived.length, 2)
506
+ assert.deepStrictEqual(pathsReceived[0], ['items', '0', 'secret'])
507
+ assert.deepStrictEqual(pathsReceived[1], ['items', '1', 'secret'])
508
+ })
509
+
510
+ test('censor function with end wildcard receives correct array paths', () => {
511
+ const obj = {
512
+ secrets: {
513
+ key1: 'secret1',
514
+ key2: 'secret2'
515
+ }
516
+ }
517
+
518
+ const pathsReceived = []
519
+ const redact = slowRedact({
520
+ paths: ['secrets.*'],
521
+ censor: (value, path) => {
522
+ pathsReceived.push([...path])
523
+ assert(Array.isArray(path))
524
+ return '[REDACTED]'
525
+ }
526
+ })
527
+
528
+ redact(obj)
529
+
530
+ assert.strictEqual(pathsReceived.length, 2)
531
+ // Sort paths for consistent testing since object iteration order isn't guaranteed
532
+ pathsReceived.sort((a, b) => a[1].localeCompare(b[1]))
533
+ assert.deepStrictEqual(pathsReceived[0], ['secrets', 'key1'])
534
+ assert.deepStrictEqual(pathsReceived[1], ['secrets', 'key2'])
535
+ })
536
+
537
+ test('type safety: accessing properties on primitive values should not throw', () => {
538
+ // Test case from GitHub issue #5
539
+ const redactor = slowRedact({ paths: ['headers.authorization'] })
540
+ const data = {
541
+ headers: 123 // primitive value
542
+ }
543
+
544
+ assert.doesNotThrow(() => {
545
+ const result = redactor(data)
546
+ const parsed = JSON.parse(result)
547
+ assert.strictEqual(parsed.headers, 123) // Should remain unchanged
548
+ })
549
+
550
+ // Test wildcards with primitives
551
+ const redactor2 = slowRedact({ paths: ['data.*.nested'] })
552
+ const data2 = {
553
+ data: {
554
+ item1: 123, // primitive, trying to access .nested on it
555
+ item2: { nested: 'secret' }
556
+ }
557
+ }
558
+
559
+ assert.doesNotThrow(() => {
560
+ const result2 = redactor2(data2)
561
+ const parsed2 = JSON.parse(result2)
562
+ assert.strictEqual(parsed2.data.item1, 123) // Primitive unchanged
563
+ assert.strictEqual(parsed2.data.item2.nested, '[REDACTED]') // Object property redacted
564
+ })
565
+
566
+ // Test deep nested access on primitives
567
+ const redactor3 = slowRedact({ paths: ['user.name.first.charAt'] })
568
+ const data3 = {
569
+ user: {
570
+ name: 'John' // string primitive
571
+ }
572
+ }
573
+
574
+ assert.doesNotThrow(() => {
575
+ const result3 = redactor3(data3)
576
+ const parsed3 = JSON.parse(result3)
577
+ assert.strictEqual(parsed3.user.name, 'John') // Should remain unchanged
578
+ })
579
+ })
580
+
581
+ // Remove option tests
582
+ test('remove option: basic key removal', () => {
583
+ const obj = { username: 'john', password: 'secret123' }
584
+ const redact = slowRedact({ paths: ['password'], remove: true })
585
+ const result = redact(obj)
586
+
587
+ // Original object should remain unchanged
588
+ assert.strictEqual(obj.password, 'secret123')
589
+
590
+ // Result should have password completely removed
591
+ const parsed = JSON.parse(result)
592
+ assert.strictEqual(parsed.username, 'john')
593
+ assert.strictEqual('password' in parsed, false)
594
+ assert.strictEqual(parsed.password, undefined)
595
+ })
596
+
597
+ test('remove option: multiple paths removal', () => {
598
+ const obj = {
599
+ user: { name: 'john', password: 'secret' },
600
+ session: { token: 'abc123', id: 'session1' }
601
+ }
602
+
603
+ const redact = slowRedact({
604
+ paths: ['user.password', 'session.token'],
605
+ remove: true
606
+ })
607
+ const result = redact(obj)
608
+
609
+ // Original unchanged
610
+ assert.strictEqual(obj.user.password, 'secret')
611
+ assert.strictEqual(obj.session.token, 'abc123')
612
+
613
+ // Result has keys completely removed
614
+ const parsed = JSON.parse(result)
615
+ assert.strictEqual(parsed.user.name, 'john')
616
+ assert.strictEqual(parsed.session.id, 'session1')
617
+ assert.strictEqual('password' in parsed.user, false)
618
+ assert.strictEqual('token' in parsed.session, false)
619
+ })
620
+
621
+ test('remove option: wildcard removal', () => {
622
+ const obj = {
623
+ secrets: {
624
+ key1: 'secret1',
625
+ key2: 'secret2'
626
+ },
627
+ public: 'data'
628
+ }
629
+
630
+ const redact = slowRedact({
631
+ paths: ['secrets.*'],
632
+ remove: true
633
+ })
634
+ const result = redact(obj)
635
+
636
+ const parsed = JSON.parse(result)
637
+ assert.strictEqual(parsed.public, 'data')
638
+ assert.deepStrictEqual(parsed.secrets, {}) // All keys removed
639
+ })
640
+
641
+ test('remove option: array wildcard removal', () => {
642
+ const obj = {
643
+ items: ['secret1', 'secret2', 'secret3'],
644
+ meta: 'data'
645
+ }
646
+
647
+ const redact = slowRedact({
648
+ paths: ['items.*'],
649
+ remove: true
650
+ })
651
+ const result = redact(obj)
652
+
653
+ const parsed = JSON.parse(result)
654
+ assert.strictEqual(parsed.meta, 'data')
655
+ // Array items set to undefined are omitted by JSON.stringify
656
+ assert.deepStrictEqual(parsed.items, [null, null, null])
657
+ })
658
+
659
+ test('remove option: intermediate wildcard removal', () => {
660
+ const obj = {
661
+ users: {
662
+ user1: { password: 'secret1', name: 'john' },
663
+ user2: { password: 'secret2', name: 'jane' }
664
+ }
665
+ }
666
+
667
+ const redact = slowRedact({
668
+ paths: ['users.*.password'],
669
+ remove: true
670
+ })
671
+ const result = redact(obj)
672
+
673
+ const parsed = JSON.parse(result)
674
+ assert.strictEqual(parsed.users.user1.name, 'john')
675
+ assert.strictEqual(parsed.users.user2.name, 'jane')
676
+ assert.strictEqual('password' in parsed.users.user1, false)
677
+ assert.strictEqual('password' in parsed.users.user2, false)
678
+ })
679
+
680
+ test('remove option: serialize false returns object with removed keys', () => {
681
+ const obj = { secret: 'hidden', public: 'data' }
682
+ const redact = slowRedact({
683
+ paths: ['secret'],
684
+ remove: true,
685
+ serialize: false
686
+ })
687
+ const result = redact(obj)
688
+
689
+ // Should be object, not string
690
+ assert.strictEqual(typeof result, 'object')
691
+ assert.strictEqual(result.public, 'data')
692
+ assert.strictEqual('secret' in result, false)
693
+
694
+ // Should have restore method
695
+ assert.strictEqual(typeof result.restore, 'function')
696
+
697
+ const restored = result.restore()
698
+ assert.strictEqual(restored.secret, 'hidden')
699
+ })
700
+
701
+ test('remove option: non-existent paths are ignored', () => {
702
+ const obj = { existing: 'value' }
703
+ const redact = slowRedact({
704
+ paths: ['nonexistent.path'],
705
+ remove: true
706
+ })
707
+ const result = redact(obj)
708
+
709
+ const parsed = JSON.parse(result)
710
+ assert.strictEqual(parsed.existing, 'value')
711
+ assert.strictEqual(parsed.nonexistent, undefined)
712
+ })
713
+
714
+ // Test for Issue #13: Empty string bracket notation paths not being redacted correctly
715
+ test('empty string bracket notation path', () => {
716
+ const obj = { '': { c: 'sensitive-data' } }
717
+ const redact = slowRedact({ paths: ["[''].c"] })
718
+ const result = redact(obj)
719
+
720
+ // Original object should remain unchanged
721
+ assert.strictEqual(obj[''].c, 'sensitive-data')
722
+
723
+ // Result should have redacted path
724
+ const parsed = JSON.parse(result)
725
+ assert.strictEqual(parsed[''].c, '[REDACTED]')
726
+ })
727
+
728
+ test('empty string bracket notation with double quotes', () => {
729
+ const obj = { '': { c: 'sensitive-data' } }
730
+ const redact = slowRedact({ paths: ['[""].c'] })
731
+ const result = redact(obj)
732
+
733
+ // Original object should remain unchanged
734
+ assert.strictEqual(obj[''].c, 'sensitive-data')
735
+
736
+ // Result should have redacted path
737
+ const parsed = JSON.parse(result)
738
+ assert.strictEqual(parsed[''].c, '[REDACTED]')
739
+ })
740
+
741
+ test('empty string key with nested bracket notation', () => {
742
+ const obj = { '': { '': { secret: 'value' } } }
743
+ const redact = slowRedact({ paths: ["[''][''].secret"] })
744
+ const result = redact(obj)
745
+
746
+ // Original object should remain unchanged
747
+ assert.strictEqual(obj[''][''].secret, 'value')
748
+
749
+ // Result should have redacted path
750
+ const parsed = JSON.parse(result)
751
+ assert.strictEqual(parsed[''][''].secret, '[REDACTED]')
752
+ })
753
+
754
+ // Test for Pino issue #2313: censor should only be called when path exists
755
+ test('censor function not called for non-existent paths', () => {
756
+ let censorCallCount = 0
757
+ const censorCalls = []
758
+
759
+ const redact = slowRedact({
760
+ paths: ['a.b.c', 'req.authorization', 'url'],
761
+ serialize: false,
762
+ censor (value, path) {
763
+ censorCallCount++
764
+ censorCalls.push({ value, path: path.slice() })
765
+ return '***'
766
+ }
767
+ })
768
+
769
+ // Test case 1: { req: { id: 'test' } }
770
+ // req.authorization doesn't exist, censor should not be called for it
771
+ censorCallCount = 0
772
+ censorCalls.length = 0
773
+ redact({ req: { id: 'test' } })
774
+
775
+ // Should not have been called for any path since none exist
776
+ assert.strictEqual(censorCallCount, 0, 'censor should not be called when paths do not exist')
777
+
778
+ // Test case 2: { a: { d: 'test' } }
779
+ // a.b.c doesn't exist (a.d exists, but not a.b.c)
780
+ censorCallCount = 0
781
+ redact({ a: { d: 'test' } })
782
+ assert.strictEqual(censorCallCount, 0)
783
+
784
+ // Test case 3: paths that do exist should still call censor
785
+ censorCallCount = 0
786
+ censorCalls.length = 0
787
+ const result = redact({ req: { authorization: 'bearer token' } })
788
+ assert.strictEqual(censorCallCount, 1, 'censor should be called when path exists')
789
+ assert.deepStrictEqual(censorCalls[0].path, ['req', 'authorization'])
790
+ assert.strictEqual(censorCalls[0].value, 'bearer token')
791
+ assert.strictEqual(result.req.authorization, '***')
792
+ })
793
+
794
+ test('censor function not called for non-existent nested paths', () => {
795
+ let censorCallCount = 0
796
+
797
+ const redact = slowRedact({
798
+ paths: ['headers.authorization'],
799
+ serialize: false,
800
+ censor (value, path) {
801
+ censorCallCount++
802
+ return '[REDACTED]'
803
+ }
804
+ })
805
+
806
+ // headers exists but authorization doesn't
807
+ censorCallCount = 0
808
+ const result1 = redact({ headers: { 'content-type': 'application/json' } })
809
+ assert.strictEqual(censorCallCount, 0)
810
+ assert.deepStrictEqual(result1.headers, { 'content-type': 'application/json' })
811
+
812
+ // headers doesn't exist at all
813
+ censorCallCount = 0
814
+ const result2 = redact({ body: 'data' })
815
+ assert.strictEqual(censorCallCount, 0)
816
+ assert.strictEqual(result2.body, 'data')
817
+ assert.strictEqual(typeof result2.restore, 'function')
818
+
819
+ // headers.authorization exists - should call censor
820
+ censorCallCount = 0
821
+ const result3 = redact({ headers: { authorization: 'Bearer token' } })
822
+ assert.strictEqual(censorCallCount, 1)
823
+ assert.strictEqual(result3.headers.authorization, '[REDACTED]')
824
+ })