@sanity-codegen/cli
Version:
CLI for sanity-codegen
66 lines (56 loc) • 2.17 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.createAnimatedLogger = createAnimatedLogger;
var _ora = _interopRequireDefault(require("ora"));
var _rxjs = require("rxjs");
var _operators = require("rxjs/operators");
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
const minMessageTime = 1000;
const logLevels = ['success', 'error', 'warn', 'info', 'verbose', 'debug'];
function createAnimatedLogger(options) {
let spinner = (0, _ora.default)(options).start();
const message$ = new _rxjs.Subject();
const stream$ = message$.pipe((0, _operators.concatMap)(message => (0, _rxjs.concat)((0, _rxjs.of)(message), (0, _rxjs.timer)(0))), (0, _operators.filter)(Boolean), (0, _operators.startWith)(null), (0, _operators.pairwise)(), (0, _operators.concatMap)(([prev, curr]) => {
if ((prev === null || prev === void 0 ? void 0 : prev.level) === 'verbose' && (curr === null || curr === void 0 ? void 0 : curr.level) !== 'verbose') {
// ensures the last bit is on the screen for a lil bit
return (0, _rxjs.concat)((0, _rxjs.timer)(minMessageTime), (0, _rxjs.of)(curr));
}
return (0, _rxjs.of)(curr);
}), (0, _operators.filter)(Boolean), (0, _operators.publish)());
stream$.subscribe(message => {
if ('flush' in message) return;
spinner.start();
spinner.text = message.text;
if (message.level !== 'verbose') {
const mappings = {
success: 'succeed',
error: 'fail',
warn: 'warn',
info: 'info',
debug: 'stopAndPersist'
};
spinner[mappings[message.level] || 'info']();
}
});
stream$.connect();
const logger = logLevels.reduce((acc, level) => {
acc[level] = message => message$.next({
text: message,
level
});
return acc;
}, {});
return Object.assign({}, logger, {
log: logger.debug,
closeAndFlush: async () => {
message$.next({
flush: true,
level: 'verbose'
});
await stream$.pipe((0, _operators.filter)(e => 'flush' in e), (0, _operators.first)()).toPromise();
spinner.stop();
}
});
}