UNPKG

@kui-shell/plugin-tutorials

Version:

IBM Cloud shell plugin for tutorials

150 lines 6.49 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 path_1 = require("path"); const core_1 = require("@kui-shell/core"); const usage_1 = require("../usage"); const modes_1 = require("./modes"); const util_1 = require("./util"); const debug = debug_1.default('tutorial get'); debug('loading'); const marked = require("marked"); const startButton = (args, command) => { const start = document.createElement('button'); start.setAttribute('id', 'start'); start.setAttribute('type', 'button'); start.className = 'bx--btn bx--btn--primary'; start.innerText = 'Try a guided tutorial'; const projectName = args[args.indexOf('get') + 1]; const projectHome = util_1.projectHome(projectName); start.onclick = () => command.REPL.pexec(`tutorial use '${projectHome}/package.json'`); return start; }; const enclosingContainer = () => { const container = document.createElement('div'); container.className = 'project-config-container'; return container; }; const setup = (args) => { const projectName = args[args.indexOf('get') + 1]; const projectHome = util_1.projectHome(projectName); core_1.injectCSS(path_1.join(__dirname, '../../../web/css/main.css')); return util_1.readProject(projectHome); }; const paragraphWithIcon = ({ title, text, content }) => { const paragraph = document.createElement('div'); paragraph.className = 'project-config-paragraph project-config-items'; const titleDom = document.createElement('div'); titleDom.className = 'config-item-title'; titleDom.innerText = title; paragraph.appendChild(titleDom); const introParagraph = document.createElement('div'); if (text) { introParagraph.innerHTML = marked(text); } else if (content) { introParagraph.appendChild(content); } introParagraph.className = 'project-config-paragraph-text smaller-text'; paragraph.appendChild(introParagraph); return paragraph; }; const createServiceRow = dep => { const dom = document.createElement('p'); const row = document.createElement('div'); const icon = document.createElement('i'); const text = document.createElement('span'); row.className = 'flex-layout'; row.appendChild(icon); row.appendChild(text); dom.appendChild(row); icon.className = 'fas fa-cloud'; text.className = 'left-pad nowrap'; text.innerText = dep.metadata.prettyName || dep.name; return dom; }; const renderDeps = deps => { return deps.map(createServiceRow).reduce((container, row) => { container.appendChild(row); return container; }, document.createElement('div')); }; const fetchProjectData = () => info => { return { info, deps: [], imports: [] }; }; const doGet = (command) => __awaiter(void 0, void 0, void 0, function* () { debug(`tutorial get impl`); const args = command.argvNoOptions; return setup(args) .then(fetchProjectData()) .then(({ info: { config: { projectName, name = projectName, api, choices, tutorial }, projectHome }, deps, imports }) => { const content = enclosingContainer(); const intro = document.createElement('div'); intro.className = 'project-description'; content.appendChild(intro); const introLeft = document.createElement('div'); const introRight = document.createElement('div'); introLeft.className = 'project-description-left'; introRight.className = 'project-description-right'; intro.appendChild(introLeft); intro.appendChild(introRight); const descriptionDom = document.createElement('div'); descriptionDom.className = 'project-config-paragraph project-config-items'; const titleDom = document.createElement('div'); titleDom.className = 'config-item-title'; titleDom.innerText = 'Description'; descriptionDom.appendChild(titleDom); const text = document.createElement('div'); text.innerText = `${tutorial.profile} \n\n Level: ${tutorial.level} \n Time: ${tutorial.time} \n Skills: ${tutorial.skills}`; descriptionDom.appendChild(text); introLeft.appendChild(descriptionDom); if (deps.length > 0) { introRight.appendChild(paragraphWithIcon({ title: 'Cloud Services', content: renderDeps(deps) })); } if (imports.length > 0) { introRight.appendChild(paragraphWithIcon({ title: 'Module Imports', content: renderDeps(imports) })); } if (tutorial) { const buttons = document.createElement('div'); buttons.className = 'project-config-buttons'; content.appendChild(buttons); buttons.appendChild(startButton(args, command)); } const wskflowContainer = document.createElement('div'); wskflowContainer.className = 'project-config-wskflow-container'; content.appendChild(wskflowContainer); command.REPL.qexec(`preview "${projectHome}/composition.js"`, undefined, undefined, { container: wskflowContainer }); return { type: 'custom', prettyType: usage_1.entities, isEntity: true, prettyName: name, name: projectName, api, subtext: 'Learn more about what this module offers, and how it is constructed', content, modes: modes_1.modes('get', api, choices) }; }); }); exports.default = (commandTree) => __awaiter(void 0, void 0, void 0, function* () { commandTree.listen(`/tutorial/get`, doGet, { usage: usage_1.usage.get }); }); //# sourceMappingURL=get.js.map