import { ArrayPush , ArrayConcat , isArray , ObjectCreate , getPrototypeOf , getOwnPropertyNames , getOwnPropertySymbols , unwrap , ProxyPropertyKey , } from './shared' ; declare var globalThis ; interface DevToolFormatter { header : ( object : any , config : any ) => any ; hasBody : ( object : any , config : any ) => boolean | null ; body : ( object : any , config : any ) => any ; } function extract ( objectOrArray ) { if ( isArray ( objectOrArray ) ) { return objectOrArray . map ( ( item ) => { const original = unwrap ( item ) ; if ( original !== item ) { return extract ( original ) ; } return item ; } ) ; } const obj = ObjectCreate ( getPrototypeOf ( objectOrArray ) ) ; const names = getOwnPropertyNames ( objectOrArray ) ; return ArrayConcat . call ( names , getOwnPropertySymbols ( objectOrArray ) ) . reduce ( ( seed , key ) => { const item = objectOrArray [ key ] ; const original = unwrap ( item ) ; if ( original !== item ) { seed [ key ] = extract ( original ) ; } else { seed [ key ] = item ; } return seed ; } , obj ) ; } const formatter = { header : ( plainOrProxy ) => { const originalTarget = unwrap ( plainOrProxy ) ; if ( ! originalTarget || originalTarget === plainOrProxy ) { return null ; } const obj = extract ( plainOrProxy ) ; return [ 'object' , { object : obj } ] ; } , hasBody : ( ) => { return false ; } , body : ( ) => { return null ; } , } ; function getGlobal ( ) { if ( typeof globalThis !== 'undefined' ) { return globalThis ; } if ( typeof self !== 'undefined' ) { return self ; } if ( typeof window !== 'undefined' ) { return window ; } if ( typeof global !== 'undefined' ) { return global ; } return { } ; } export function init ( ) { if ( process . env . NODE_ENV === 'production' ) { throw new ReferenceError ( ) ; } const global = getGlobal ( ) ; const devtoolsFormatters = global . devtoolsFormatters || [ ] ; ArrayPush . call ( devtoolsFormatters , formatter ) ; global . devtoolsFormatters = devtoolsFormatters ; }