* Recursively redact a value (object, array, or primitive). * Returns a deep clone with secrets replaced. Cycles guarded via WeakSet.
(value, seen = new WeakSet())
| 80 | * Returns a deep clone with secrets replaced. Cycles guarded via WeakSet. |
| 81 | */ |
| 82 | function redactValue(value, seen = new WeakSet()) { |
| 83 | if (value === null || value === undefined) return value; |
| 84 | if (typeof value === 'string') return redactString(value); |
| 85 | if (typeof value !== 'object') return value; |
| 86 | if (seen.has(value)) return '[Circular]'; |
| 87 | seen.add(value); |
| 88 | if (Array.isArray(value)) return value.map(v => redactValue(v, seen)); |
| 89 | const out = {}; |
| 90 | for (const [k, v] of Object.entries(value)) { |
| 91 | if (ALWAYS_REDACT_KEYS.has(k.toLowerCase())) { |
| 92 | out[k] = '[REDACTED]'; |
| 93 | } else { |
| 94 | out[k] = redactValue(v, seen); |
| 95 | } |
| 96 | } |
| 97 | return out; |
| 98 | } |
| 99 | |
| 100 | // ─── Path safety ──────────────────────────────────────────────────────────── |
| 101 |
no test coverage detected