(a: unknown, b: unknown)
| 109 | * re-writing (and emitting a confusing "Updated" log line). |
| 110 | */ |
| 111 | export function jsonDeepEqual(a: unknown, b: unknown): boolean { |
| 112 | if (a === b) return true; |
| 113 | if (typeof a !== typeof b) return false; |
| 114 | if (a === null || b === null) return a === b; |
| 115 | if (typeof a !== 'object') return false; |
| 116 | if (Array.isArray(a) !== Array.isArray(b)) return false; |
| 117 | if (Array.isArray(a) && Array.isArray(b)) { |
| 118 | if (a.length !== b.length) return false; |
| 119 | return a.every((v, i) => jsonDeepEqual(v, b[i])); |
| 120 | } |
| 121 | const ao = a as Record<string, unknown>; |
| 122 | const bo = b as Record<string, unknown>; |
| 123 | const ak = Object.keys(ao).sort(); |
| 124 | const bk = Object.keys(bo).sort(); |
| 125 | if (ak.length !== bk.length) return false; |
| 126 | if (!ak.every((k, i) => k === bk[i])) return false; |
| 127 | return ak.every((k) => jsonDeepEqual(ao[k], bo[k])); |
| 128 | } |
| 129 | |
| 130 | /** |
| 131 | * Replace or append a marker-delimited section in a markdown-ish file. |
no outgoing calls
no test coverage detected