I have an arbitrarily deep object like this:
const objToAccess = {
  id: 1,
  name: {
    first: 'Foo',
    last: 'Bar'
  },
  address: {
    street: {
      name: '987 Walker',
      roadType: 'Ave'
    },
    zip: '12345'
  }
};
I call a function that takes the above objToAccess as a param. EDIT: This function is a black box. I don't know what it looks like and can't edit it. For example:
const accessFn = objToAccess => {
  const a = objToAccess.id;
  const b = objToAccess.name.first;
  const c = objToAccess.address;
};
After that function is called, I want to know which properties were accessed. Here's the kicker: If a nested object was accessed, I want to flag all children as being accessed, too. For example, after running the above code, I would like a result that looks like this:
const propsAccessed = {
  id: true,
  name: {
    first: true,
    last: false
  },
  address: {
    street: {
      name: true,
      roadType: true
    },
    zip: true
  }
};
My naive attempt is to created the propsAccessed object & set everything to false, and then use getters (below). But, I can't figure out how to use them in such a way that flags all children if just the parent object is accessed. Any ideas would be great!
const gettedReturnedMutation = {
  get id() {
    propsAccessed.id = true;
  },
  get name() {
    // TODO if just address is accessed, recursively flag all children as true
    return {
      get first() {
        propsAccessed.name.first = true;
      },
      get last() {
        propsAccessed.name.last = true;
      }
    }
  },
  get address() {
    // TODO if just address is accessed, recursively flag all children as true
    return {
      get street() {
        return {
          get name() {
            propsAccessed.address.street.name = true;
          },
          get roadType() {
            propsAccessed.address.street.roadType = true;
          }
        }
      },
      get zip() {
        propsAccessed.address.zip = true;
      }
    }
  }
}
 
     
    