Found while validating #5039 / PR #5045.
Repro
const o: any = {};
Object.defineProperty(o, 'hidden', { value: 1 }); // enumerable defaults to false
o.shown = 2;
console.log(JSON.stringify(Object.entries(o)), JSON.stringify(Object.keys(o)));
Actual (Perry)
[["hidden",1],["shown",2]] ["shown"]
Expected (Node)
Object.keys filters non-enumerable properties correctly; Object.entries (and presumably Object.values) does not. Real-world sighting: chalk's vendored ansi-styles assembles its style object with several non-enumerable defineProperty slots (codes, rgbToAnsi256, hexToRgb, …) — Object.entries(ansiStyles) returns 55 entries under Perry vs Node's 45, so chalk defines 10 extra (unused) style getters. Harmless there, but any code branching on entries/values length or content over such objects diverges.
Found while validating #5039 / PR #5045.
Repro
Actual (Perry)
Expected (Node)
Object.keysfilters non-enumerable properties correctly;Object.entries(and presumablyObject.values) does not. Real-world sighting: chalk's vendored ansi-styles assembles its style object with several non-enumerabledefinePropertyslots (codes,rgbToAnsi256,hexToRgb, …) —Object.entries(ansiStyles)returns 55 entries under Perry vs Node's 45, so chalk defines 10 extra (unused) style getters. Harmless there, but any code branching onentries/valueslength or content over such objects diverges.