kui-shell
Version:
This is the monorepo for Kui, the hybrid command-line/GUI electron-based Kubernetes tool
343 lines • 16.5 kB
JavaScript
;
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
step((generator = generator.apply(thisArg, _arguments || [])).next());
});
};
Object.defineProperty(exports, "__esModule", { value: true });
const debug_1 = require("debug");
const debug = debug_1.default('webapp/cli/print');
debug('loading');
const status_1 = require("./status");
const listen_1 = require("./listen");
const popup_core_1 = require("./popup-core");
const scroll_1 = require("./scroll");
const popup_1 = require("./popup");
const table_1 = require("./views/table");
const presentation_1 = require("./views/presentation");
const sidecar_present_1 = require("./views/sidecar-present");
const sidecar_1 = require("./views/sidecar");
const types_1 = require("../util/types");
const async_1 = require("../util/async");
const basicModels_1 = require("./models/basicModels");
const command_1 = require("../models/command");
const table_2 = require("./models/table");
const is_1 = require("../models/mmr/is");
const show_1 = require("../models/mmr/show");
const entity_1 = require("../models/entity");
const usage_error_1 = require("../core/usage-error");
const registeredListViews = {};
exports.registerListView = (kind, handler) => {
registeredListViews[kind] = handler;
};
const registeredEntityViews = {};
exports.registerEntityView = (kind, handler) => {
registeredEntityViews[kind] = handler;
};
const printTable = (tab, response, resultDom, execOptions, parsedOptions) => __awaiter(void 0, void 0, void 0, function* () {
const registeredListView = registeredListViews[response.type];
if (registeredListView) {
yield registeredListView(tab, response, resultDom, parsedOptions, execOptions);
return resultDom.children.length === 0;
}
;
resultDom.parentNode.classList.add('result-as-table', 'result-as-vertical');
if (response.noEntityColors) {
resultDom.classList.add('result-table-with-custom-entity-colors');
}
table_1.formatTable(tab, response, resultDom);
});
exports.streamTo = (tab, block) => {
const container = block.querySelector('.repl-output');
const resultDom = container ? document.createElement('div') : block.querySelector('.repl-result');
if (container) {
container.classList.add('repl-result-has-content');
container.insertBefore(resultDom, container.childNodes[0]);
}
let previousLine;
return (response, killLine = false) => {
resultDom.setAttribute('data-stream', 'data-stream');
resultDom.parentNode.classList.add('result-vertical');
if (killLine && previousLine) {
previousLine.parentNode.removeChild(previousLine);
previousLine = undefined;
}
const formatPart = (response, resultDom) => __awaiter(void 0, void 0, void 0, function* () {
if (usage_error_1.default.isUsageError(response)) {
previousLine = yield usage_error_1.default.getFormattedMessage(response);
resultDom.appendChild(previousLine);
resultDom.classList.add('oops');
resultDom.setAttribute('data-status-code', response.code.toString());
}
else if (entity_1.isMixedResponse(response)) {
async_1.promiseEach(response, _ => {
const para = document.createElement('p');
para.classList.add('kui--mixed-response--text');
resultDom.appendChild(para);
return formatPart(_, para);
});
}
else if (types_1.isHTML(response)) {
response.classList.add('repl-result-like');
previousLine = response;
resultDom.appendChild(previousLine);
}
else if (table_2.isMultiTable(response)) {
response.tables.forEach((_) => __awaiter(void 0, void 0, void 0, function* () { return printTable(tab, _, resultDom); }));
const br = document.createElement('br');
resultDom.appendChild(br);
}
else if (table_2.isTable(response)) {
const wrapper = document.createElement('div');
wrapper.classList.add('repl-result');
resultDom.appendChild(wrapper);
yield printTable(tab, response, wrapper);
}
else if (sidecar_1.isCustomSpec(response)) {
sidecar_1.showCustom(tab, response, {});
}
else {
previousLine = document.createElement('pre');
previousLine.classList.add('streaming-output', 'repl-result-like');
previousLine.innerText = entity_1.isMessageBearingEntity(response) ? response.message : response.toString();
resultDom.appendChild(previousLine);
}
});
return formatPart(response, resultDom).then(() => {
scroll_1.scrollIntoView({ element: resultDom, when: 0 });
});
};
};
exports.ok = (parentNode, suffix, css) => {
const okLine = document.createElement('div');
okLine.classList.add('ok-line');
const replResultBlock = parentNode.parentNode.querySelector('.repl-result');
const resultHasContent = replResultBlock.children.length > 0;
if (resultHasContent) {
;
replResultBlock.parentNode.classList.add('repl-result-has-content');
}
const ok = document.createElement('span');
okLine.appendChild(ok);
ok.classList.add('ok');
ok.appendChild(document.createTextNode(suffix ? 'ok:' : 'ok'));
if (suffix) {
ok.classList.add('inline-ok');
okLine.appendChild(typeof suffix === 'string' ? document.createTextNode(` ${suffix}`) : suffix);
}
if (css) {
okLine.classList.add(css);
}
parentNode.appendChild(okLine);
return okLine;
};
function renderResult(response, tab, execOptions, parsedOptions, resultDom, echo = true, attach = echo) {
return __awaiter(this, void 0, void 0, function* () {
if (table_2.isTable(response)) {
yield printTable(tab, response, resultDom, execOptions, parsedOptions);
return true;
}
else if (types_1.isHTML(response)) {
if (attach) {
resultDom.appendChild(response);
}
if (echo) {
;
resultDom.parentNode.classList.add('result-vertical');
exports.ok(resultDom.parentElement).classList.add('ok-for-list');
}
return true;
}
else {
return false;
}
});
}
exports.renderResult = renderResult;
function replResult() {
const resultContainer = document.createElement('div');
const resultDom = document.createElement('div');
resultDom.classList.add('repl-result');
resultContainer.appendChild(resultDom);
return resultDom;
}
exports.replResult = replResult;
exports.printResults = (block, nextBlock, tab, resultDom, echo = true, execOptions, parsedOptions, command, evaluator) => (response) => __awaiter(void 0, void 0, void 0, function* () {
debug('printResults', response);
const incognitoHint = evaluator && evaluator.options && evaluator.options.incognito && evaluator.options.incognito;
const incognito = incognitoHint && popup_core_1.isPopup() && incognitoHint.indexOf('popup') >= 0;
const presentation = sidecar_1.isCustomSpec(response) && response.presentation;
let customContainer;
if (popup_core_1.isPopup() && !incognito) {
resultDom = customContainer = popup_1.createPopupContentContainer(['valid-response'], presentation || (!Array.isArray(response) && presentation_1.default.SidecarFullscreenForPopups));
}
if (process.env.KUI_TEE_TO_FILE) {
debug('teeing output to file', process.env.KUI_TEE_TO_FILE);
Promise.resolve().then(() => require('../util/tee')).then(_ => _.default(response));
}
if (echo) {
status_1.setStatus(block, response === false ? "error" : "valid-response");
}
const render = (response, { echo, resultDom }) => __awaiter(void 0, void 0, void 0, function* () {
if (response && response !== true) {
if (yield renderResult(response, tab, execOptions, parsedOptions, resultDom, echo)) {
}
else if (typeof response === 'number' ||
typeof response === 'string' ||
(entity_1.isMessageBearingEntity(response) && !is_1.isMultiModalResponse(response))) {
if (echo) {
const span = document.createElement('pre');
span.innerText = entity_1.isMessageBearingEntity(response) ? response.message : response.toString();
resultDom.appendChild(span);
resultDom.parentNode.classList.add('result-vertical');
exports.ok(resultDom.parentElement).classList.add('ok-for-list');
}
}
else if (sidecar_1.isCustomSpec(response)) {
const echoOk = echo || (execOptions && execOptions.replSilence);
if (echoOk || (execOptions && execOptions.type === command_1.ExecType.ClickHandler)) {
yield sidecar_1.showCustom(tab, response, popup_core_1.isPopup() ? Object.assign({}, execOptions, { leaveBottomStripeAlone: true }) : execOptions, customContainer);
if (echoOk && !popup_core_1.isPopup()) {
exports.ok(resultDom.parentElement);
}
return !customContainer || customContainer.children.length === 0;
}
}
else if (entity_1.isEntitySpec(response) && registeredEntityViews[response.type]) {
if (yield registeredEntityViews[response.type](tab, response, resultDom, parsedOptions, execOptions)) {
if (echo)
exports.ok(resultDom.parentElement);
}
return resultDom.children.length === 0;
}
else if (entity_1.isEntitySpec(response) && response.verb === 'delete') {
if (echo) {
if (response.type) {
exports.ok(resultDom, `deleted ${response.type.replace(/s$/, '')} ${response.name}`, 'show-in-popup');
}
else {
exports.ok(resultDom);
}
}
}
else if (entity_1.isEntitySpec(response) &&
(response.verb === 'get' || response.verb === 'create' || response.verb === 'update')) {
const forRepl = yield sidecar_1.showEntity(tab, response, Object.assign({}, execOptions || {}, {
echo,
show: response.show || 'default'
}));
if (echo) {
if (forRepl && forRepl !== true) {
render(forRepl, { echo, resultDom });
}
else if (forRepl) {
exports.ok(resultDom.parentElement);
}
}
return true;
}
else if (is_1.isMultiModalResponse(response)) {
const echoOk = echo || (execOptions && execOptions.replSilence);
yield show_1.show(tab, response);
if (echoOk && !popup_core_1.isPopup()) {
exports.ok(resultDom.parentElement);
}
}
else if (entity_1.isMixedResponse(response)) {
debug('mixed response');
const paragraph = (part) => {
if (typeof part === 'string') {
const para = document.createElement('p');
para.classList.add('kui--mixed-response--text');
para.innerText = part;
return para;
}
else {
return part;
}
};
response.forEach(part => {
exports.printResults(block, nextBlock, tab, resultDom, echo, execOptions, parsedOptions, command, evaluator)(paragraph(part));
});
}
else if (typeof response === 'object') {
const code = document.createElement('code');
code.appendChild(document.createTextNode(JSON.stringify(response, undefined, 4)));
resultDom.appendChild(code);
code.classList.add('hljs', 'json');
resultDom.parentNode.classList.add('result-vertical');
exports.ok(resultDom.parentElement).classList.add('ok-for-list');
}
}
else if (response) {
if (echo)
exports.ok(resultDom.parentElement);
}
});
let promise;
if (!basicModels_1.isWatchable(response) && table_2.isTable(response) && response.body.length === 0) {
response = true;
}
if (table_2.isMultiTable(response)) {
;
resultDom.parentNode.classList.add('result-as-table', 'result-as-multi-table', 'result-vertical');
const tables = response.tables;
if (tables[0].flexWrap) {
;
resultDom.parentNode.classList.add('result-as-multi-table-flex-wrap');
}
promise = Promise.resolve(table_1.formatTable(tab, response, resultDom)).then(() => false);
}
else {
promise = render(response, { echo, resultDom });
}
if (table_2.isTable(response) || table_2.isMultiTable(response)) {
if (popup_core_1.isPopup()) {
sidecar_present_1.default(tab, presentation_1.default.FixedSize);
}
if (echo) {
promise.then(() => {
exports.ok(resultDom.parentNode).classList.add('ok-for-list');
});
}
}
yield promise.then((alreadyRendered) => __awaiter(void 0, void 0, void 0, function* () {
if (popup_core_1.isPopup() &&
(Array.isArray(response) ||
(customContainer && customContainer.children.length > 0) ||
(sidecar_1.isCustomSpec(response) && response.presentation === presentation_1.default.FixedSize))) {
if (!incognito) {
const modes = entity_1.isEntitySpec(response) && response.modes;
const prettyType = (table_2.isTable(response) && response.title) ||
(table_2.isTable(response) &&
response.body[0] &&
(response.body[0].prettyType ||
response.body[0].prettyKind ||
response.body[0].type ||
response.body[0].kind)) ||
(entity_1.isEntitySpec(response) &&
(response.kind || response.prettyType || response.prettyKind || response.type || response.kind)) ||
false;
const presentation = (sidecar_1.isCustomSpec(response) && response.presentation) ||
(prettyType && Array.isArray(response) && presentation_1.default.FixedSize) ||
presentation_1.default.SidecarFullscreenForPopups;
yield popup_1.renderPopupContent(command, alreadyRendered !== true && resultDom, execOptions, Object.assign({}, response, {
modes: modes || undefined,
prettyType,
badges: sidecar_1.isCustomSpec(response) && response.badges,
controlHeaders: entity_1.isEntitySpec(response) && response.controlHeaders,
presentation
}));
}
if (!incognito) {
listen_1.popupListen(undefined, command);
}
}
}));
return !sidecar_1.isCustomSpec(response);
});
//# sourceMappingURL=print.js.map