param prop param obj export function inner ( prop , obj ) { if ( prop === void 0 || obj === void 0 ) return void 0 ; for ( const item of prop . split ( "." ) ) { if ( ! obj . hasOwnProperty ( item ) ) { return undefined ; } obj = obj [ item ] ; } return obj ; } param prop param obj export function exists ( prop , obj ) { return inner ( prop , obj ) !== undefined ; } function _mixin ( dest , source ) { const empty = { } ; for ( const key in source ) { if ( ! source . hasOwnProperty ( key ) ) continue ; if ( key === "__proto__" || key === "constructor" ) continue ; let s = source [ key ] ; if ( s instanceof Array ) { } else if ( typeof s === "object" ) { s = deepMixin ( dest [ key ] , s ) ; } if ( ! ( key in dest ) || ( dest [ key ] !== s && ( ! ( key in empty ) || empty [ key ] !== s ) ) ) { dest [ key ] = s ; } } return dest ; } param dest param sources export function deepMixin ( dest = { } , ... sources ) { if ( typeof dest !== "object" ) throw new Error ( `Destination "${ dest }" must be an object.` ) ; for ( const source of sources ) { _mixin ( dest , source ) ; } return dest ; } param dest param sources export function deepMixinT < T > ( dest = { } , ... sources ) { return deepMixin ( dest , ... sources ) ; } param obj export function safeStringify ( obj ) { const cache = [ ] ; return JSON . stringify ( obj , function ( key , value ) { if ( typeof value === "object" && value !== null ) { if ( cache . indexOf ( value ) !== - 1 ) { return ; } cache . push ( value ) ; } return value ; } ) ; } export function isArray ( arg ) { if ( Array . isArray !== undefined ) { return Array . isArray ( arg ) ; } return Object . prototype . toString . call ( arg ) === "[object Array]" ; } export interface ClassMeta { module : string ; file : string ; class : string ; } export function classID2Meta ( classID ) { const info = classID . split ( "_" ) ; const classInfo = info [ 1 ] . split ( "." ) ; return { module : `@hpcc-js/${ info [ 0 ] }` , file : classInfo [ 0 ] , class : classInfo [ 1 ] || classInfo [ 0 ] } ; }