json-processing
Version:
JSON Processing Tool
138 lines (137 loc) • 4.57 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.tableAscii = exports.json = exports.raw = void 0;
// @ts-ignore
const ascii_table_1 = __importDefault(require("ascii-table"));
const lodash_1 = __importDefault(require("lodash"));
const rxjs_1 = require("rxjs");
const operators_1 = require("rxjs/operators");
function raw(observable, stream) {
observable.subscribe({
next: value => {
try {
if (value instanceof rxjs_1.GroupedObservable) {
const key = value.key;
value = value.pipe(operators_1.toArray(), operators_1.map(array => ({ key: key, values: array })));
}
if (value instanceof rxjs_1.Observable)
value.
subscribe({
next: o => stream.write(o),
error: err => stream.emit('error', err)
});
else {
stream.write(value);
}
}
catch (e) {
stream.emit('error', e);
}
},
error: err => stream.emit('error', err),
complete: () => stream !== process.stdout &&
stream.end()
});
return stream;
}
exports.raw = raw;
function json(observable, stream) {
observable.subscribe({
next: value => {
try {
if (value instanceof rxjs_1.GroupedObservable) {
const key = value.key;
value = value.pipe(operators_1.toArray(), operators_1.map(array => ({ key: key, values: array })));
}
if (value instanceof rxjs_1.Observable)
value.pipe(operators_1.map(o => `${JSON.stringify(o)}\n`))
.subscribe({
next: o => stream.write(o),
error: err => stream.emit('error', err)
});
else
stream.write(`${JSON.stringify(value)}\n`);
}
catch (e) {
stream.emit('error', e);
}
},
error: (err) => stream.emit('error', err),
complete: () => stream !== process.stdout &&
stream.end()
});
return stream;
}
exports.json = json;
function tableAscii(observable, stream) {
let builder;
observable.subscribe({
next: value => {
try {
if (value instanceof rxjs_1.Observable) {
const builder = new TableBuilder(value.key);
value = value.subscribe({
next: value => builder.addRow(value),
error: err => stream.emit('error', err),
complete: () => builder.render(stream)
});
}
else {
builder = builder || new TableBuilder('');
builder.addRow(value);
}
}
catch (e) {
stream.emit('error', e);
}
},
error: err => stream.emit('error', err),
complete: () => {
if (builder)
builder.render(stream);
if (process.stdout !== stream)
stream.end();
}
});
return stream;
}
exports.tableAscii = tableAscii;
class TableBuilder {
constructor(title) {
this._table = new ascii_table_1.default(title);
this._heading = [];
}
addRow(value) {
this._setHeading(value);
this._table.addRowMatrix([
this._toRow(value)
]);
}
render(stream) {
stream.write(this._table.render());
stream.write('\n');
}
_setHeading(value) {
if (!lodash_1.default.isObject(value))
return;
return this._table.
setHeading((this._heading = lodash_1.default(this._heading).
concat(Object.keys(value)).
uniq().value()));
}
_toRow(value) {
if (lodash_1.default.isEmpty(this._heading))
return value;
return this._heading.map(h => {
const val = value[h];
if (lodash_1.default.isArray(val))
return '[array]';
if (lodash_1.default.isObject(val))
return '[object]';
return val;
});
}
}