diff options
Diffstat (limited to 'packages/astro-parser/src/utils/nodes_match.ts')
-rw-r--r-- | packages/astro-parser/src/utils/nodes_match.ts | 35 |
1 files changed, 35 insertions, 0 deletions
diff --git a/packages/astro-parser/src/utils/nodes_match.ts b/packages/astro-parser/src/utils/nodes_match.ts new file mode 100644 index 000000000..7e4093994 --- /dev/null +++ b/packages/astro-parser/src/utils/nodes_match.ts @@ -0,0 +1,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; +} |