function clitable(obj) { var headers = {}; if(!obj instanceof Array) return; // Gather headers for(var row of obj) { for(var col of Object.keys(row)) { if(headers[col] == undefined) headers[col] = {maxLen: col.length}; headers[col].maxLen = Math.max(headers[col].maxLen,String(row[col]).length); } } var tableLen = 0; for(var k in headers) tableLen += headers[k].maxLen + 3; tableLen -=1; var v = '│'; var h = '─'; var cul = '┌'; var cur = '┐'; var cdl = '└'; var cdr = '┘'; var cross = "┼"; var crossD = "┬"; var crossU = "┴"; var crossR = "├"; var crossL = "┤"; var out="",c = 0; // Top line out += cul + h; c = 0; for(var col in headers) { out += ((c!=0)?h+ crossD + h:"") +h.repeat(headers[col].maxLen); c++; } out += h + cur +"\n"; // Headers out += v+" "; for(var col in headers) { // Pad Rest var clen = headers[col].maxLen - (col.length); out += col + " ".repeat(clen) + " "+v+" "; } out+='\n'; // Middle line out+=crossR+h; var c = 0; for(var col in headers) { out += ((c!=0)?h+ cross + h:"") +h.repeat(headers[col].maxLen); c++; } out += h + crossL +"\n"; //out += (v + h.times(tableLen) + v + "\n" ); for(var row of obj) { // check row len out += v +" "; for(var col in headers) { var clen = headers[col].maxLen - String(row[col]).length; if(typeof(row[col]) == "number") { out += " ".repeat(clen) +String(row[col]) + " " + v +" "; } else { out += String(row[col]) + " ".repeat(clen) + " " + v +" "; } } out +="\n"; } // Top line out += cdl + h; c = 0; for(var col in headers) { out += ((c!=0)?h+ crossU + h:"") +h.repeat(headers[col].maxLen); c++; } out += h + cdr +"\n"; return out; } module.exports = clitable;