summaryrefslogtreecommitdiff
path: root/packages/astro-parser/src/utils/nodes_match.ts
blob: 7e40939945fe6bb1295a6cb605644611746a8b89 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
// @ts-nocheck

/** Compare two TemplateNodes to determine if they are equivalent */
export function nodes_match(a, b) {
  if (!!a !== !!b) return false;
  if (Array.isArray(a) !== Array.isArray(b)) return false;

  if (a && typeof a === 'object') {
    if (Array.isArray(a)) {
      if (a.length !== b.length) return false;
      return a.every((child, i) => nodes_match(child, b[i]));
    }

    const a_keys = Object.keys(a).sort();
    const b_keys = Object.keys(b).sort();

    if (a_keys.length !== b_keys.length) return false;

    let i = a_keys.length;
    while (i--) {
      const key = a_keys[i];
      if (b_keys[i] !== key) return false;

      if (key === 'start' || key === 'end') continue;

      if (!nodes_match(a[key], b[key])) {
        return false;
      }
    }

    return true;
  }

  return a === b;
}