Eric Bower
·
2025-06-06
test.ts
1export {
2 afterAll,
3 beforeAll,
4 beforeEach,
5 describe,
6 expect,
7 test,
8} from "vitest";
9
10export function isLikeSelector(selector: unknown) {
11 return (
12 selector !== null &&
13 typeof selector === "object" &&
14 Reflect.getPrototypeOf(selector) === Object.prototype &&
15 Reflect.ownKeys(selector).length > 0
16 );
17}
18
19export const CIRCULAR_SELECTOR = new Error("Encountered a circular selector");
20
21export function assertLike(
22 lhs: Record<any, any>,
23 selector: Record<any, any>,
24 circular = new Set(),
25) {
26 if (circular.has(selector)) {
27 throw CIRCULAR_SELECTOR;
28 }
29
30 circular.add(selector);
31
32 if (lhs === null || typeof lhs !== "object") {
33 return lhs;
34 }
35
36 const comparable: Record<any, any> = {};
37 for (const [key, rhs] of Object.entries(selector)) {
38 if (isLikeSelector(rhs)) {
39 comparable[key] = assertLike(Reflect.get(lhs, key), rhs, circular);
40 } else {
41 comparable[key] = Reflect.get(lhs, key);
42 }
43 }
44
45 return comparable;
46}