@viewdo/dxp-story-cli
Version:
DXP Story Management CLI
363 lines • 14.7 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());
});
};
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