youzanyun-devtool-worker
Version:
371 lines (370 loc) • 16.2 kB
JavaScript
;
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;
;