Order-insensitive deep-equality key, so re-ordered tables are not conflicts.
(value: unknown)
| 143 | |
| 144 | /** Order-insensitive deep-equality key, so re-ordered tables are not conflicts. */ |
| 145 | function stableKey(value: unknown): string { |
| 146 | if (Array.isArray(value)) return `[${value.map(stableKey).join(',')}]`; |
| 147 | if (isRecord(value)) { |
| 148 | return `{${Object.keys(value) |
| 149 | .toSorted() |
| 150 | .map((k) => `${JSON.stringify(k)}:${stableKey(value[k])}`) |
| 151 | .join(',')}}`; |
| 152 | } |
| 153 | return JSON.stringify(value) ?? 'null'; |
| 154 | } |
| 155 | |
| 156 | function deepEqual(a: unknown, b: unknown): boolean { |
| 157 | return stableKey(a) === stableKey(b); |