@kui-shell/plugin-tutorials
Version:
IBM Cloud shell plugin for tutorials
150 lines • 6.49 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 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