All files ApiChain.js

100% Statements 75/75
100% Branches 10/10
100% Functions 6/6
100% Lines 75/75

Press n or j to go to the next uncovered block, b, p or k for the previous block.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 768x 8x 8x 8x 8x 8x 8x 8x 6x 6x 2x 2x 2x 2x 2x 6x 6x 6x 8x 8x 8x 8x 5x 5x 5x 8x 8x 8x 8x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 8x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 8x  
const Prototype2ApiChain = new Map();
const OBJ_prototype = Object.getPrototypeOf( {} );
 
    export const
setProp = ( refObj, k, ApiChainLocal )=>
{
    if( typeof refObj[ k ] == 'function' )
    {   ApiChainLocal.prototype[ k ] = function( ...args )
        {   if( k.startsWith('get') )
            {
                if( this.length )
                    return this[ 0 ][ k ]( ...args )
                else
                    return;
            }
            this.forEach( el => el[ k ]( ...args ) );
            return this;
        }
    }else
    {   Object.defineProperty( ApiChainLocal.prototype, k,
        {   get  : function(){ if( this.length ) return this[ 0 ][ k ] }
        ,   set: function( v )
            {  this.forEach( el => el[ k ] = v );
               return v
            }
        } );
    }
}
    function
applyPrototype( elementProto, refObj )
{   let ChainClass = Prototype2ApiChain.get(elementProto);
    if( ChainClass )
        return ChainClass;
 
    class ApiChainLocal extends Array{}
 
    const applied = {"constructor":1};
    for ( let obj=refObj; obj !== OBJ_prototype && obj != null ; obj = Object.getPrototypeOf(obj))
    {
        for( let k of Object.getOwnPropertyNames(obj) )
            if( !applied[k])
            {   setProp( refObj, k, ApiChainLocal );
                applied[k]=1;
            }
    }
    Prototype2ApiChain.set(elementProto, ApiChainLocal);
    return ApiChainLocal;
}
    export function
ApiChain( elOrArr, elementProto = undefined )
{
    const isArr = Array.isArray( elOrArr );
    const arr =  isArr ? elOrArr : [ elOrArr ];
    if( ! elementProto )
        elementProto = Object.getPrototypeOf( isArr ? elOrArr[0] : elOrArr );
    const refObj = arr[0];
    if( elementProto === OBJ_prototype )
    {
        class ApiChainLocal extends Array{}
 
        for( let k in refObj )
            setProp( refObj, k, ApiChainLocal );
        const ret = new ApiChainLocal();
        ret.push(...arr);
        return ret;
    }
 
    // class object
    const ApiChain = applyPrototype( elementProto, refObj );
 
    const ret = new ApiChain();
    ret.push(...arr);
    return ret;
}
export default ApiChain;