UNPKG

kui-shell

Version:

This is the monorepo for Kui, the hybrid command-line/GUI electron-based Kubernetes tool

343 lines 16.5 kB
"use strict"; 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