repos / starfx

a micro-mvc framework for react apps
git clone https://github.com/neurosnap/starfx.git

starfx / src
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}