Depth-first sync walk collecting ref/manifest nodes (not recursing into them).
(value: unknown, out: object[], seen: WeakSet<object>)
| 92 | |
| 93 | /** Depth-first sync walk collecting ref/manifest nodes (not recursing into them). */ |
| 94 | function collectRefs(value: unknown, out: object[], seen: WeakSet<object>): void { |
| 95 | if (isLargeValueRef(value) || isLargeArrayManifest(value)) { |
| 96 | out.push(value as object) |
| 97 | return |
| 98 | } |
| 99 | if (value === null || typeof value !== 'object') return |
| 100 | if (seen.has(value)) return |
| 101 | seen.add(value) |
| 102 | if (Array.isArray(value)) { |
| 103 | for (const item of value) collectRefs(item, out, seen) |
| 104 | return |
| 105 | } |
| 106 | for (const v of Object.values(value)) collectRefs(v, out, seen) |
| 107 | } |
| 108 | |
| 109 | /** Sync rebuild of `value` with each collected ref swapped for its replacement (by identity). */ |
| 110 | function substituteRefs(value: unknown, replacements: Map<object, unknown>): unknown { |
no test coverage detected