log-ocd
Version:
the best node.js logger
107 lines (93 loc) • 2.53 kB
JavaScript
/**
* -----------------------------------------------------------------------------
* LOG-OCD: BUILD-ITEMS HELPER
* -----------------------------------------------------------------------------
* @version 1.0.0-beta.11
* @see [log-ocd]{@link https://github.com/imaginate/log-ocd}
*
* @author Adam Smith <imagineadamsmith@gmail.com> (https://github.com/imaginate)
* @copyright 2022 Adam A Smith <imagineadamsmith@gmail.com> (https://github.com/imaginate)
*
* Supporting Libraries:
* @see [chalk]{@link https://github.com/chalk/chalk}
* @see [vitals]{@link https://github.com/imaginate/vitals}
*
* Annotations:
* @see [JSDoc3]{@link http://usejsdoc.org/}
* @see [Closure Compiler specific JSDoc]{@link https://developers.google.com/closure/compiler/docs/js-for-compiler}
*/
;
var help = require('../../../helpers');
var fill = help.fill;
var fuse = help.fuse;
var remap = help.remap;
var same = help.same;
var slice = help.slice;
var until = help.until;
/**
* @typedef {!Array<string>} Item
* @typedef {!Array<Item>} Items
*/
/**
* @param {Columns} columns
* @param {!Array<string>} vals
* @return {Items}
*/
module.exports = function buildItems(columns, vals) {
/** @type {number} */
var remain;
/** @type {Items} */
var items;
/** @type {Item} */
var item;
/** @type {!Array<boolean>} */
var done;
remain = columns.length;
items = [];
done = new Array(remain);
done = fill(done, false);
vals = remap(vals, function(val, i) {
if (val.length) return val;
--remain;
done[i] = true;
return fill(column[i].len, ' ');
});
done.remain = remain;
until(0, 100, function() {
item = newItem(columns, vals, done);
items = fuse.val(items, item);
return done.remain;
});
return items;
};
/**
* @private
* @param {Columns} columns
* @param {!Array<string>} vals
* @param {!Array<boolean>} done
* @return {Item}
*/
function newItem(columns, vals, done) {
/** @type {Column} */
var column;
/** @type {string} */
var space;
/** @type {number} */
var index;
return remap(vals, function(val, i) {
if ( done[i] ) return val;
column = columns[i];
if (val.length > column.len) {
index = column.len + 1;
vals[i] = slice(val, index);
return slice(val, 0, index);
}
--done.remain;
done[i] = true;
vals[i] = fill(column.len, ' ');
space = fill(column.len - val.length, ' ');
return same(column.align, 'left')
? fuse(val, space)
: fuse(space, val);
});
}