UNPKG

youzanyun-devtool-worker

Version:

- web - ws - proxy

192 lines (191 loc) 8.04 kB
"use strict"; 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; ;