youzanyun-devtool-worker
Version:
- web - ws - proxy
192 lines (191 loc) • 8.04 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
const tslib_1 = require("tslib");
const path_1 = tslib_1.__importDefault(require("path"));
const nunjucks_1 = tslib_1.__importDefault(require("nunjucks"));
const fs_extra_1 = tslib_1.__importDefault(require("fs-extra"));
const lodash_1 = require("lodash");
const download_1 = tslib_1.__importDefault(require("download"));
const spring4js_nodejs_1 = require("spring4js-nodejs");
const PageHandler_1 = tslib_1.__importDefault(require("./PageHandler"));
let PcCustomService = class PcCustomService {
constructor() {
this.pageHandlerCache = {};
}
async start() {
this.pcDemoDir = this.configService.getPcDemoDir();
this.pcConfig = {
"wsc-pc": {
name: 'wsc-pc',
label: '微商城pc端定制',
developDir: 'pc-extension',
customDocument: '## PC定制文档\n工程路径: {$ appDevelopDir $}',
categoryList: [
{
name: "showcase",
label: "微页面定制",
description: "微页面定制",
pageList: [
{
name: "pc-showcase-editor",
label: "微页面编辑页",
developDir: 'showcase-editor',
devBuildDir: 'dist',
prodBuildDir: 'dist',
demoVersion: '0.0.2',
demoUrl: 'https://b.yzcdn.cn/yzy/devtool/pc/pc-showcase-editor-master-bf7d0678f6336f4d7049430861e92eab78ac7a96.tar.gz',
previewUrl: 'https://www.youzan.com/v4/shop/decorate?pageName=pc-showcase-editor&appId={$ projectId $}&appType=wsc-pc#/create/1',
updateFiles: [
'webpack',
'package.json',
'postcss.config.js',
'README.md'
]
}
]
}
]
}
};
}
async getAppCustomInfo({ projectId, appName }) {
let appConfig = JSON.parse(JSON.stringify(this.pcConfig[appName]));
let project = await this.projectService.getProjectById(projectId);
let projectDir = project.proPath;
let developDir = path_1.default.resolve(projectDir, `${project.proName}-ui`, appConfig.developDir);
let env = new nunjucks_1.default.Environment(null, {
tags: {
blockStart: '{%',
blockEnd: '%}',
variableStart: '{$',
variableEnd: '$}',
commentStart: '{#',
commentEnd: '#}'
}
});
let documentTemplate = nunjucks_1.default.compile(appConfig.customDocument, env);
let context = {
projectId,
appDevelopDir: developDir
};
let document = documentTemplate.render(context);
appConfig.customDocument = document;
appConfig.projectName = project.proName;
return appConfig;
}
async getMenu({ projectId, appName, workbenchId }) {
let menuList = [
{
title: '定制指南',
key: '定制指南',
param: {
contentType: 'webview',
url: `/html/pc/app?hideMenu=1&projectId=${projectId}&appName=${appName}#/document`,
docKey: 'pc-home',
}
},
{
title: '页面定制',
key: '页面定制',
children: []
}
];
let pageCustomMenu = menuList[1];
let appConfig = this.pcConfig[appName];
for (let category of appConfig.categoryList) {
pageCustomMenu.children.push({
title: category.label,
key: category.label,
param: {
contentType: 'webview',
url: `/html/pc/app?hideMenu=1&projectId=${projectId}&workbenchId=${workbenchId}&appName=${appName}#/plugin-page/${category.name}`,
docKey: `pc-${category.name}`,
}
});
}
return menuList;
}
async getCategoryCustomDetail({ projectId, appName, categoryName }) {
let infoList = [];
let appConfig = this.pcConfig[appName];
let category = lodash_1.find(appConfig.categoryList, (item) => {
return item.name = categoryName;
});
for (let pageConfig of category.pageList) {
let handler = await this.getPageHandler({ projectId, appName, categoryName, pageName: pageConfig.name });
let customInfo = await handler.getCustomInfo();
infoList.push(customInfo);
}
return infoList;
}
async getPageHandler({ projectId, appName, categoryName, pageName }) {
let cacheKey = `${projectId}-${appName}-${categoryName}-${pageName}`;
let pageHandler = this.pageHandlerCache[cacheKey];
if (pageHandler) {
return pageHandler;
}
let appConfig = this.pcConfig[appName];
let category = lodash_1.find(appConfig.categoryList, (item) => {
return item.name == categoryName;
});
let pageConfig = lodash_1.find(category.pageList, (item) => {
return item.name == pageName;
});
if (!pageConfig) {
throw new Error(`页面不存在 ${appName}-${categoryName}-${pageName}`);
}
let project = await this.projectService.getProjectById(projectId);
let demoDir = path_1.default.resolve(this.pcDemoDir, appName, pageConfig.name);
let projectDir = project.proPath;
await this.checkDemoUpdated(appName, demoDir, pageConfig);
let developDir = path_1.default.resolve(projectDir, `${project.proName}-ui`, appConfig.developDir, pageConfig.developDir);
pageHandler = new PageHandler_1.default({ demoDir, developDir, pageConfig, projectId, projectDir });
await pageHandler.start();
this.pageHandlerCache[cacheKey] = pageHandler;
return pageHandler;
}
async checkDemoUpdated(appName, demoDir, pageConfig) {
let exist = await fs_extra_1.default.pathExists(demoDir);
if (exist) {
try {
let metaInfo = await fs_extra_1.default.readJson(path_1.default.resolve(demoDir, 'page.meta.json'));
if (metaInfo.demoVersion == pageConfig.demoVersion) {
return;
}
}
catch (e) {
console.log(`${appName} ${pageConfig.pageName} 向导升级异常`, e);
}
}
await this.downloadDemo({
url: pageConfig.demoUrl,
demoDir,
demoVersion: pageConfig.demoVersion
});
}
async downloadDemo({ url, demoDir, demoVersion }) {
await fs_extra_1.default.ensureDir(demoDir);
await fs_extra_1.default.remove(demoDir);
await download_1.default(url, demoDir, {
extract: true,
strip: 1,
});
let meta = {
demoVersion,
downloadTimestamp: Date.now(),
downloadUrl: url
};
await fs_extra_1.default.writeJson(path_1.default.resolve(demoDir, 'page.meta.json'), meta, { spaces: 2 });
}
};
tslib_1.__decorate([
spring4js_nodejs_1.Resource()
], PcCustomService.prototype, "projectService", void 0);
tslib_1.__decorate([
spring4js_nodejs_1.Resource()
], PcCustomService.prototype, "configService", void 0);
PcCustomService = tslib_1.__decorate([
spring4js_nodejs_1.Service()
], PcCustomService);
exports.default = PcCustomService;
;