UNPKG

@viewdo/dxp-story-cli

Version:

DXP Story Management CLI

363 lines 14.7 kB
#!/usr/bin/env node "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()); }); }; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.conventions = exports.previewReplacements = exports.deploymentReplacements = exports.setupMockXAPI = exports.writePreviewData = exports.getStoryDataFileName = exports.getPreviewData = exports.getActionData = exports.watchConfigs = exports.load = void 0; require("es6-shim"); const express_1 = __importDefault(require("express")); const fs_1 = __importDefault(require("fs")); const path_1 = __importDefault(require("path")); require("reflect-metadata"); require("source-map-support/register"); const typedi_1 = require("typedi"); const app_1 = require("./app"); const FileService_1 = require("./app/services/FileService"); const TokenizationService_1 = require("./app/services/TokenizationService"); const watch = require("node-watch"); const app = new app_1.App({}); let { KEY: key = path_1.default.basename(path_1.default.resolve(process.cwd())), EPISODE: episode = "default", } = process.env; const load = (directory, basename) => { return app.format_service.load(directory, basename); }; exports.load = load; const watchConfigs = (directory, story_key, episode_key) => { writePreviewData(story_key, episode_key); watch(directory, { recursive: true, filter: (f) => !/preview\.js$/.test(f), }, (event, filename) => { if (filename) { console.log(`${filename} file changed`); writePreviewData(story_key, episode_key); } }); }; exports.watchConfigs = watchConfigs; const getPreviewData = (story_key, episode_key) => { return app.configuration_manager.getExperiencePreviewFromConfigurations(story_key, episode_key); }; exports.getPreviewData = getPreviewData; const getActionData = (story_key, action_key) => { var actionConfig = app.configuration_manager.getActionDataFromConfigurations(story_key, action_key); var experience = app.configuration_manager.getExperiencePreviewFromConfigurations(story_key); return { experience, actionConfig, }; }; exports.getActionData = getActionData; const writePreviewData = (story_key, episode_key) => { const file_service = typedi_1.Container.get(FileService_1.FileService); const experience = getPreviewData(story_key, episode_key); let content = `window.experience = ${JSON.stringify(experience)}`; let path = `${app.configuration_manager.getStoryDirectory(story_key)}/.preview.js`; file_service.write(path, content); }; exports.writePreviewData = writePreviewData; const getStoryDataFileName = (episode) => { // use conventions from the story configuration file let entryName = episode; if (episode != "default") entryName = "episode-" + episode; return entryName; }; exports.getStoryDataFileName = getStoryDataFileName; const conventions = app.conventions; exports.conventions = conventions; const previewConfig = getPreviewData(key, episode); const previewOverrides = load(path_1.default.join(process.cwd(), 'stories', key), "preview-config"); previewConfig.organization.data = Object.assign(previewConfig.organization.data || {}, previewOverrides.organization || {}); const setupMockXAPI = (basePath, key, episode) => (devServer) => { devServer.app.use(express_1.default.json()); const fileService = typedi_1.Container.get(FileService_1.FileService); const tokenizationService = typedi_1.Container.get(TokenizationService_1.TokenizationService); const handleExperienceResponse = (_req, res) => { var story = getPreviewData(key, episode).story; story.links.forEach(link => { link.url = replacePreviewTokens(basePath, link.url); }); var organization = getPreviewData(key, episode).organization; res.json(Object.assign(Object.assign({}, previewConfig), { story, organization })); }; const handleStoryResponse = (_req, res) => { var story = getPreviewData(key, episode).story; story.links.forEach(link => { link.url = replacePreviewTokens(basePath, link.url); }); res.json(story); }; devServer.app.get(`/api/story/:key`, handleStoryResponse); devServer.app.get(`/api/experience/a/:key`, handleExperienceResponse); devServer.app.get(`/api/experience/:key/session`, (_req, res) => { res.set('dxp-session-id', 'fake-session'); res.json({ success: true }); }); devServer.app.get(`/api/experience/:key/details`, handleExperienceResponse); devServer.app.get(`/api/experience/:key/set-milestone`, (req, res) => { previewConfig.milestone = req.query.value; previewConfig.progress = "Started"; res.json({ success: true }); }); devServer.app.get(`/api/experience/:key/record-event`, (req, res) => { previewConfig.events = previewConfig.events || []; if (!previewConfig.events.includes(req.query.value)) { previewConfig.events.push(req.query.value); } res.json({ success: true }); }); devServer.app.get(`/api/experience/:key/set-converted`, (_req, res) => { previewConfig.progress = "Converted"; res.json({ success: true }); }); devServer.app.get(`/api/experience/:key/set-completed`, (_req, res) => { previewConfig.progress = "Completed"; res.json({ success: true }); }); devServer.app.post(`/api/experience/:key/set-data`, (req, res) => { let data = req.body || req.query; previewConfig.data = Object.assign(previewConfig.data, data); res.json({ success: true }); }); devServer.app.put(`/api/experience/:key/:command`, (_req, res) => { res.json({ success: true }); }); devServer.app.get([ '/html-templates/*.liquid' ], (req, res) => __awaiter(void 0, void 0, void 0, function* () { const filePath = path_1.default.join(basePath, req.path); let data = fileService.read(filePath); if (!data) res.send('File not found: ' + req.path); try { data = yield tokenizationService.parseLiquidTemplate(filePath, previewConfig); } catch (err) { console.error(err); res.send('Error parsing liquid ' + req.path + ' ' + err.message || err); } try { data = replacePreviewTokens(basePath, data); } catch (err) { console.error(err); res.send('Error replacing tokens ' + req.path + ' ' + err.message || err); } if (data != null) { res.send(data); } else { res.send('No template found ' + req.path); } })); devServer.app.get([ `/email-templates/*`, `/text-templates/*`, `/unpacked/*` ], (req, res) => __awaiter(void 0, void 0, void 0, function* () { const data = yield servedReplacements(req, basePath); if (data != null) { res.send(data); } else { res.send('Error parsing data for preview!'); } })); }; exports.setupMockXAPI = setupMockXAPI; const servedReplacements = (req, basePath) => __awaiter(void 0, void 0, void 0, function* () { var originalUrl = req.originalUrl; var filePath = req.path; // make sure redirect occurs at mount if (filePath === '/' && originalUrl.pathname.substr(-1) !== '/') { filePath = ''; } filePath = path_1.default.join(basePath, filePath); try { let result = yield fs_1.default.promises.readFile(filePath, 'utf-8'); return replacePreviewTokens(basePath, result); } catch (err) { // Can't find the file skip this middleware if (err) { console.log('err reading' + err); } return null; } }); const deploymentReplacements = (entryName) => [ { pattern: /\/html\-templates\/([a-z\-0-9_-]*)\.\w*/gi, replacement: function (match, key) { return `[story.html-templates.${key}.url]`; }, }, { pattern: /\/text\-templates\/([a-z\-0-9_-]*)\.\w*/gi, replacement: function (match, key) { return `[story.text-templates.${key}.url]`; }, }, { pattern: `/${entryName}.output`, replacement: "[xapi.url]/story/[story.key]", }, ]; exports.deploymentReplacements = deploymentReplacements; const replacePreviewTokens = (basePath, data, recursive = true) => { const replacements = previewReplacements(basePath, recursive); let content = data; for (let item of replacements) { content = content.replace(item.pattern, item.replacement); } return content; }; const previewReplacements = (basePath, recursive = true) => { var _a, _b, _c, _d, _e, _f, _g; let replacements = [ { pattern: "[story.key]", replacement: previewConfig.story.key, }, { pattern: "[story.publickey]", replacement: previewConfig.story.publicKey || previewConfig.story.key, }, { pattern: "[story.name]", replacement: previewConfig.story.name ? previewConfig.story.name : "", }, { pattern: "[story.description]", replacement: previewConfig.story.description ? previewConfig.story.description : "", }, ...((_a = previewConfig.story.links) === null || _a === void 0 ? void 0 : _a.map((link) => { const targetUrl = recursive ? replacePreviewTokens(basePath, link.url, false) : link.urt; return { pattern: `[story.custom-links.${link.key}.url]`, replacement: targetUrl || "" }; })) || [], ...Object.keys(previewConfig.story.htmlTemplates || {}).map((template) => { return { pattern: `[story.html-templates.${template}.url]`, replacement: previewConfig.story.htmlTemplates[template] || "" }; }), ...Object.keys(previewConfig.story.textTemplates || {}).map((template) => { return { pattern: `[story.text-templates.${template}.url]`, replacement: previewConfig.story.htmlTemplates[template] || "" }; }), // Experience { pattern: "[experience.key]", replacement: previewConfig.key || "", }, { pattern: "[experience.url]", replacement: "localhost:8050/@" + previewConfig.story.publicKey || previewConfig.story.key || "", }, { pattern: "[experience.milestone]", replacement: previewConfig.milestone || "", }, { pattern: "[experience.progress]", replacement: previewConfig.progress || "", }, ...previewConfig.story.inputArray.map((input) => { return { pattern: `[experience.data.${input.key}\|?(\w+)?]`, replacement: previewConfig.data[input.key] || "" }; }), ...previewConfig.story.inputArray .filter((i) => i.display == 'Options') .map((input) => { var _a; return { pattern: `[experience.data.${input.key}|display]`, replacement: previewConfig.data[input.key] ? ((_a = input.options .find(o => o.value == previewConfig.data[input.key])) === null || _a === void 0 ? void 0 : _a.display) || input.value || "" : input.value || "" }; }), // Organization { pattern: "[organization.key]", replacement: previewConfig.organization.key || "", }, { pattern: "[organization.name]", replacement: previewConfig.organization.name || "", }, { pattern: "[organization.url]", replacement: previewConfig.organization.url || "", }, { pattern: "[organization.entity.key]", replacement: previewConfig.childEntityKey || "", }, { pattern: "[organization.entity.name]", replacement: ((_c = (_b = previewConfig.organization) === null || _b === void 0 ? void 0 : _b.entity) === null || _c === void 0 ? void 0 : _c.name) || "", }, ...Object.keys(previewConfig.organization.data).map((key) => { var _a; return { pattern: `[organization.data.${key}]`, replacement: ((_a = previewConfig.organization) === null || _a === void 0 ? void 0 : _a.data[key]) || "", }; }), // user { pattern: "[user.key]", replacement: ((_d = previewConfig.user) === null || _d === void 0 ? void 0 : _d.key) || "fake-user-key", }, { pattern: "[user.firstname]", replacement: ((_e = previewConfig.user) === null || _e === void 0 ? void 0 : _e.firstname) || "", }, { pattern: "[user.lastname]", replacement: ((_f = previewConfig.user) === null || _f === void 0 ? void 0 : _f.lastname) || "", }, { pattern: "[user.email]", replacement: ((_g = previewConfig.user) === null || _g === void 0 ? void 0 : _g.email) || "", }, // System { pattern: `[xapi.url]`, replacement: `http://localhost:8050/api`, }, { pattern: `[system.live]`, replacement: `false`, }, { pattern: `[system.staged]`, replacement: `true`, }, { pattern: `[system.now]`, replacement: new Date().toISOString(), }, ]; return replacements; }; exports.previewReplacements = previewReplacements; //# sourceMappingURL=tools.js.map