// schema -> property name -> display name type Mapping = Record>; const proxySymbol = Symbol("proxy"); export function ProxyFactory(map: Mapping) { const make = (record: T) => { if (typeof record !== "object" || record === null) { return record; } if (record[proxySymbol]) { return record; } const kind = record["__typename"]; if (!kind) return record; const fields = map[kind]; if (!fields) return record; return new Proxy(record, { get(target, prop, receiver) { if (prop === proxySymbol) { return true; } if (prop in fields) { const key = fields[prop as string]; return target[key]; } const v = Reflect.get(target, prop, receiver); return make(v); }, }) as T; }; return make; }