UNPKG

youzanyun-devtool-worker

Version:

371 lines (370 loc) 16.2 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); const tslib_1 = require("tslib"); const path_1 = tslib_1.__importDefault(require("path")); const fs_extra_1 = tslib_1.__importDefault(require("fs-extra")); const download_1 = tslib_1.__importDefault(require("download")); const merge_1 = tslib_1.__importDefault(require("lodash/merge")); const spring4js_nodejs_1 = require("spring4js-nodejs"); const PageHandler_1 = tslib_1.__importDefault(require("./PageHandler")); let H5ExtensionService = class H5ExtensionService { constructor() { this.remoteTemplateVersion = {}; this.pageHandlerCache = {}; this.versionFileName = 'ecloud-tpl-version.json'; } async start() { this.workDir = this.configService.getWorkerDir(); const h5DemoDir = this.configService.getH5DemoDir(); await fs_extra_1.default.ensureDir(h5DemoDir); this.h5CompDemoDir = path_1.default.resolve(h5DemoDir, 'h5-extension'); const remoteToolConfig = await this.customApiService.getRemoteToolConfig(); if (remoteToolConfig.templateVersion) { this.remoteTemplateVersion = JSON.parse(remoteToolConfig.templateVersion); } } async getTemplateListByNodeId(params) { const res = await this.h5RequestService.getH5TemplatesByNodeId(params); let result = res.items || []; result.push({ description: "[特殊] 节点组件定制", id: 0, implType: "components", name: "_common", pageId: 0, pageType: 0, status: 1, }); return result; } async isUsedOldTemplate(projectId) { const appDetail = await this.projectService.getCompletedProjectById(projectId); const result = await this.h5RequestService.isUsedOldTemplate(appDetail.appId, { projectId }); return result; } async getMenu(workbenchId, projectId) { let menuData = [{ key: 'home', title: '定制指南', param: { contentType: 'webview', url: `/html/h5-extension/?projectId=${projectId}&workbenchId=${workbenchId}#/home`, docKey: 'h5-home', } }]; const nodeData = await this.h5RequestService.getH5NodeList(); if (nodeData && nodeData.length > 0) { const nodeList = nodeData.filter((item) => { const { bizNodeCode, bizNodeElement } = item; return (bizNodeElement.indexOf(1) > -1) && bizNodeCode && bizNodeCode !== 'node_beauty' && bizNodeCode !== 'node_showcase'; }); for (let i = 0; i < nodeList.length; i++) { const nodeItem = nodeList[i]; const { bizNodeId, bizNodeName, bizNodeCode } = nodeItem; let templateList = await this.getTemplateListByNodeId({ pageIndex: 0, pageSize: 1000, relType: 2, status: 1, bizNodeElementId: 1, bizNodeId, }); if (bizNodeCode === 'node_goods-detail') { const isUsedOld = await this.isUsedOldTemplate(projectId); if (!isUsedOld) { templateList = templateList.filter((item) => item.name === 'goods-detail__v2'); } } const children = templateList.filter((item) => { return item.pageType === 0 && item.implType !== 'scriptReplace'; }).map((item) => { const url = `/html/h5-extension?projectId=${projectId}&workbenchId=${workbenchId}&nodeCode=${bizNodeCode}&bizNodeId=${bizNodeId}` + `&pUrl=${item.previewUrl}&pageName=${item.name}&pageTitle=${item.description}&pageId=${item.pageId}#/detail`; return { key: `${bizNodeCode}/${item.name}`, title: item.description, param: { contentType: 'webview', url, docKey: 'h5-custom', } }; }); menuData.push({ key: bizNodeCode, title: bizNodeName, children, }); } menuData.push({ key: 0, title: '全局页面定制', param: { contentType: 'webview', url: `/html/h5-extension?projectId=${projectId}&workbenchId=${workbenchId}&nodeCode=_global` + `&pageName=_global&pageTitle=全局页面定制#/detail`, docKey: 'h5-custom', } }); } return menuData; } async initPageDemo(projectId) { const project = await this.projectService.getProjectById(projectId); let versionInfo = {}; let remoteConfig = { version: this.remoteTemplateVersion.h5CompFrameworkVersion, demoUrl: this.remoteTemplateVersion.h5CompUrl, }; if (remoteConfig.demoUrl) { await this.checkAndDownloadTpl(remoteConfig, this.h5CompDemoDir); const extensionDir = path_1.default.resolve(project.proPath, `${project.proName}-ui/h5-extension`); const versionPath = path_1.default.resolve(extensionDir, this.versionFileName); let isVersionExist = await fs_extra_1.default.pathExists(versionPath); if (!isVersionExist) { versionInfo = { latestVersion: remoteConfig.version, currentVersion: null, }; } else { const currentVersionInfo = await fs_extra_1.default.readJSON(versionPath); versionInfo = { latestVersion: remoteConfig.version, currentVersion: currentVersionInfo.frameworkVersion }; } } return versionInfo; } async updateH5Project(projectId) { const project = await this.projectService.getProjectById(projectId); const h5CompDir = path_1.default.resolve(project.proPath, `${project.proName}-ui/h5-extension`); await fs_extra_1.default.ensureDir(path_1.default.resolve(h5CompDir, 'src')); await fs_extra_1.default.remove(path_1.default.resolve(h5CompDir, 'ecloud-tpl-version.json')); await fs_extra_1.default.copy(path_1.default.resolve(this.h5CompDemoDir, 'ecloud-tpl-version.json'), path_1.default.resolve(h5CompDir, 'ecloud-tpl-version.json')); await fs_extra_1.default.remove(path_1.default.resolve(h5CompDir, 'webpack')); await fs_extra_1.default.copy(path_1.default.resolve(this.h5CompDemoDir, 'webpack'), path_1.default.resolve(h5CompDir, 'webpack')); await fs_extra_1.default.remove(path_1.default.resolve(h5CompDir, 'package-lock.json')); await fs_extra_1.default.remove(path_1.default.resolve(h5CompDir, 'yarn.lock')); const compPckExist = await fs_extra_1.default.pathExists(path_1.default.resolve(h5CompDir, 'package.json')); if (compPckExist) { const currentCompPackage = await fs_extra_1.default.readJSON(path_1.default.resolve(h5CompDir, 'package.json')); const demoCompPackage = await fs_extra_1.default.readJSON(path_1.default.resolve(this.h5CompDemoDir, 'package.json')); await fs_extra_1.default.writeJSON(path_1.default.resolve(h5CompDir, 'package.json'), (0, merge_1.default)({}, currentCompPackage, demoCompPackage), { spaces: 2 }); } else { await fs_extra_1.default.copy(path_1.default.resolve(this.h5CompDemoDir, 'package.json'), path_1.default.resolve(h5CompDir, 'package.json')); } await fs_extra_1.default.remove(path_1.default.resolve(h5CompDir, 'README.md')); await fs_extra_1.default.copy(path_1.default.resolve(this.h5CompDemoDir, 'README.md'), path_1.default.resolve(h5CompDir, 'README.md')); const currentVersionInfo = await fs_extra_1.default.readJSON(path_1.default.resolve(h5CompDir, 'ecloud-tpl-version.json')); return { latestVersion: currentVersionInfo.frameworkVersion, currentVersion: currentVersionInfo.frameworkVersion }; } async getAllPageCustomList(params) { const { projectId } = params; const result = []; const nodeData = await this.h5RequestService.getH5NodeList(); if (!nodeData && nodeData.length === 0) { return result; } const feNodeData = nodeData.filter((item) => { const { bizNodeCode, bizNodeElement } = item; return (bizNodeElement.indexOf(1) > -1) && bizNodeCode; }); feNodeData.push({ bizNodeCode: "_global", bizNodeId: 0, bizNodeName: "全局页面定制", id: 0, }); for (let i = 0; i < feNodeData.length; i++) { const { bizNodeCode, bizNodeId } = feNodeData[i]; const pageInfo = await this.getPageCustomListByNodeId({ projectId, nodeCode: bizNodeCode, pageIndex: 0, pageSize: 1000, relType: 2, status: 1, bizNodeElementId: 1, bizNodeId, }); const customInfo = pageInfo.filter((item) => item.isCustomed); if (customInfo.length > 0) { result.push(Object.assign(Object.assign({}, feNodeData[i]), { children: customInfo })); } } return result; } async getPageCustomListByNodeId(params) { const { projectId, nodeCode } = params, yzyParams = tslib_1.__rest(params, ["projectId", "nodeCode"]); let result = []; if (nodeCode === '_global') { result = [{ description: "[特殊] 全局组件定制", id: 0, implType: "components", name: "_global", pageId: 0, pageType: 0, status: 1, }]; } else { const res = await this.h5RequestService.getH5TemplatesByNodeId(yzyParams); result = res.items || []; result.push({ description: "[特殊] 节点组件定制", id: 0, implType: "components", name: "_common", pageId: 0, pageType: 0, status: 1, }); } if (result && result.length > 0) { const project = await this.projectService.getProjectById(projectId); for (let i = 0; i < result.length; i++) { const pageName = result[i].name; const { isCustomed, expandedList } = await this.getCustomInfo(project, nodeCode, pageName); result[i].isCustomed = isCustomed; result[i].expandedList = expandedList; } } return result; } async getPageComponentList(params) { const { projectId, nodeCode, pageName, incloudCommon } = params; const project = await this.projectService.getProjectById(projectId); const { isCustomed, expandedList } = await this.getCustomInfo(project, nodeCode, pageName, incloudCommon); return isCustomed ? expandedList : []; } async getCustomInfo(project, nodeCode, pageName, incloudCommon = false) { if (!project.proPath) { return { isCustomed: false, expandedList: [] }; } const pageHandler = await this.getPageHandler({ projectId: project.id, nodeCode, pageName }); const isExist = await pageHandler.isPageCompCustom(); let isCustomed = false; let expandedList = []; if (incloudCommon) { expandedList = await pageHandler.getDistPageComponents(); isCustomed = expandedList && expandedList.localComps && expandedList.localComps.length; } else if (isExist) { isCustomed = isExist; expandedList = await pageHandler.getComponents(); } return { isCustomed, expandedList, }; } async getLocalPageFile(params) { const { projectId, nodeCode, pageName } = params; const pageHandler = await this.getPageHandler({ projectId, nodeCode, pageName }); const { localPageFile } = await pageHandler.getDistPageComponents(); return localPageFile; } async getPageHandler({ projectId, nodeCode, pageName }) { let cacheKey = `${projectId}-${nodeCode}-${pageName}`; let pageHandler = this.pageHandlerCache[cacheKey]; if (pageHandler) { return pageHandler; } const project = await this.projectService.getProjectById(projectId); pageHandler = new PageHandler_1.default({ h5CompDemoDir: this.h5CompDemoDir, workDir: this.workDir, projectRootDir: project.proPath, projectName: project.proName, nodeCode, pageName, }); await pageHandler.start(); this.pageHandlerCache[cacheKey] = pageHandler; return pageHandler; } async checkAndDownloadTpl(remoteConfig, demoDir) { let needDownload = false; let cacheVersionInfo = {}; try { cacheVersionInfo = await fs_extra_1.default.readJson(path_1.default.resolve(demoDir, this.versionFileName)); if (remoteConfig.version != cacheVersionInfo.frameworkVersion) { needDownload = true; } } catch (e) { needDownload = true; } if (needDownload) { await fs_extra_1.default.remove(demoDir); await (0, download_1.default)(remoteConfig.demoUrl, demoDir, { extract: true, strip: 1, }); } } async checkDistDir(distDir) { let result = false; const dirs = await fs_extra_1.default.readdir(distDir); const infoPath = path_1.default.resolve(distDir, 'info.json'); const isInfoExist = await fs_extra_1.default.pathExists(infoPath); if (isInfoExist) { const infoJson = await fs_extra_1.default.readJSON(infoPath); const pageNames = Object.keys(infoJson); const matches = []; for (let i = 0; i < pageNames.length; i++) { const regStr = `^${pageNames[i]}\.(.)+\.js$`; const reg = new RegExp(regStr); const hasMatch = dirs.find(item => { const isExist = reg.test(item); return isExist; }); if (hasMatch) { matches.push(!!hasMatch); } } result = matches.length === pageNames.length; } return result; } }; tslib_1.__decorate([ (0, spring4js_nodejs_1.Resource)() ], H5ExtensionService.prototype, "projectService", void 0); tslib_1.__decorate([ (0, spring4js_nodejs_1.Resource)() ], H5ExtensionService.prototype, "configService", void 0); tslib_1.__decorate([ (0, spring4js_nodejs_1.Resource)() ], H5ExtensionService.prototype, "customApiService", void 0); tslib_1.__decorate([ (0, spring4js_nodejs_1.Resource)() ], H5ExtensionService.prototype, "h5RequestService", void 0); tslib_1.__decorate([ (0, spring4js_nodejs_1.Resource)() ], H5ExtensionService.prototype, "cdnService", void 0); tslib_1.__decorate([ (0, spring4js_nodejs_1.Resource)() ], H5ExtensionService.prototype, "userService", void 0); H5ExtensionService = tslib_1.__decorate([ (0, spring4js_nodejs_1.Service)() ], H5ExtensionService); exports.default = H5ExtensionService; ;