(a: unknown, b: unknown)
| 136 | * re-writing (and emitting a confusing "Updated" log line). |
| 137 | */ |
| 138 | export function jsonDeepEqual(a: unknown, b: unknown): boolean { |
| 139 | if (a === b) return true; |
| 140 | if (typeof a !== typeof b) return false; |
| 141 | if (a === null || b === null) return a === b; |
| 142 | if (typeof a !== 'object') return false; |
| 143 | if (Array.isArray(a) !== Array.isArray(b)) return false; |
| 144 | if (Array.isArray(a) && Array.isArray(b)) { |
| 145 | if (a.length !== b.length) return false; |
| 146 | return a.every((v, i) => jsonDeepEqual(v, b[i])); |
| 147 | } |
| 148 | const ao = a as Record<string, unknown>; |
| 149 | const bo = b as Record<string, unknown>; |
| 150 | const ak = Object.keys(ao).sort(); |
| 151 | const bk = Object.keys(bo).sort(); |
| 152 | if (ak.length !== bk.length) return false; |
| 153 | if (!ak.every((k, i) => k === bk[i])) return false; |
| 154 | return ak.every((k) => jsonDeepEqual(ao[k], bo[k])); |
| 155 | } |
| 156 | |
| 157 | /** |
| 158 | * Replace or append a marker-delimited section in a markdown-ish file. |
no outgoing calls
no test coverage detected