

export function isObject(value: any): boolean {
    return (
        // not null
        value &&
        typeof value === "object" &&
        // not array
        !Array.isArray( value )
    );
}

export function isPlainObject(value: any): boolean {
    return (
        isObject(value) &&
        value.constructor === Object
    );
}

export function isNaN(value: any): boolean {
    return (
        typeof value === "number" &&
        value !== value
    );
}

const MAX_VALUE_LENGTH = 50;
export function invalidValuesAsString(value: any): string {

    // "big string..."
    if ( typeof value === "string" ) {
        if ( value.length > MAX_VALUE_LENGTH ) {
            value = value.slice(0, MAX_VALUE_LENGTH) + "...";
        }

        return `"${value}"`;
    }

    

    let valueAsString = value + "";
    
    //  /some/ig
    if ( value instanceof RegExp ) {
        valueAsString = value.toString();
    }

    // [1,2,3] or {"x": 1}
    else if ( Array.isArray(value) || isObject(value) ) {
        try {
            valueAsString = JSON.stringify(value);
        } catch (err) {
            valueAsString = value + "";
        }
    }

    if ( valueAsString.length > MAX_VALUE_LENGTH ) {
        valueAsString = valueAsString.slice(0, MAX_VALUE_LENGTH) + "...";
    }

    return valueAsString;
}


export const eol = {
    eol: null,
    
    toString() {
        return this.eol;
    },

    define(os?: string) {
        // https://github.com/ryanve/eol/blob/gh-pages/eol.js
        let isWindows = (
            typeof process !== "undefined" && 
            "win32" === process.platform
        );

        // for tests
        if ( os === "linux" ) {
            isWindows = false;
        }
        if ( os === "windows" ) {
            isWindows = true;
        }
        

        if ( isWindows ) {
            (this as any).eol = "\r\n";
        }
        else {
            (this as any).eol = "\n";
        }
    }
};

eol.define();
