import { setHidden } from './common' import { globals, observe } from './globals' import { $$, $O } from './symbols' export const shims: Array<[Function, string[]]> = [ [Object, ['keys', 'values', 'entries']], [Array, ['from']], ] shims.forEach(([namespace, keys]) => keys.forEach(key => { const fn = namespace[key] const shim = (...args: any[]) => { const target = args[0] && args[0][$$] if (target) { observe(target, $O) args[0] = target } return fn(...args) } setHidden(shim, 'name', fn.name) Object.defineProperty(namespace, key, { get: () => (globals.observe ? shim : fn), }) }) )