diff options
author | 2021-03-16 16:08:11 -0400 | |
---|---|---|
committer | 2021-03-16 16:08:11 -0400 | |
commit | 588b086a4dc45e717341e18728fff65a90ddf46c (patch) | |
tree | fbabfff761add5217963a3d341d68392bea2cccf /src/compiler/utils/nodes_match.ts | |
parent | 174fc1d669fea1cf8be0d873fdb232fd0169abe6 (diff) | |
download | astro-588b086a4dc45e717341e18728fff65a90ddf46c.tar.gz astro-588b086a4dc45e717341e18728fff65a90ddf46c.tar.zst astro-588b086a4dc45e717341e18728fff65a90ddf46c.zip |
Bring compiler into Astro (#4)
* include source compiler
* Import from JS
* Conditionally use the instance contents
Co-authored-by: Fred K. Schott <fkschott@gmail.com>
Diffstat (limited to 'src/compiler/utils/nodes_match.ts')
-rw-r--r-- | src/compiler/utils/nodes_match.ts | 34 |
1 files changed, 34 insertions, 0 deletions
diff --git a/src/compiler/utils/nodes_match.ts b/src/compiler/utils/nodes_match.ts new file mode 100644 index 000000000..9c8e1fb48 --- /dev/null +++ b/src/compiler/utils/nodes_match.ts @@ -0,0 +1,34 @@ +// @ts-nocheck + +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; +} |