youzanyun-devtool-worker
Version:
339 lines (338 loc) • 15.4 kB
JavaScript
"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 camelCase_1 = tslib_1.__importDefault(require("lodash/camelCase"));
const upperFirst_1 = tslib_1.__importDefault(require("lodash/upperFirst"));
const merge_1 = tslib_1.__importDefault(require("lodash/merge"));
const spring4js_nodejs_1 = require("spring4js-nodejs");
const AppHandler_1 = tslib_1.__importDefault(require("./AppHandler"));
const PageHandler_1 = tslib_1.__importDefault(require("./PageHandler"));
const constants_1 = require("./constants");
let BeautyPcService = class BeautyPcService {
constructor() {
this.previewCompsMap = {};
this._broadcastPreviewComps = new spring4js_nodejs_1.Emitter();
this.onBroadcastPreviewComps = this._broadcastPreviewComps.registerEvent;
this.remoteTemplateVersion = {};
this.pageHandlerCache = {};
this.appHandlerCache = {};
this.versionFileName = 'ecloud-tpl-version.json';
}
async start() {
this.workDir = this.configService.getWorkerDir();
const pcDemoDir = this.configService.getPcDemoDir();
await fs_extra_1.default.ensureDir(pcDemoDir);
const beautyPcGuideDir = this.beautyPcGuideDir = path_1.default.resolve(pcDemoDir, `${constants_1.WORK_DIR_NAME}`);
this.beautyPcDemoDir = path_1.default.resolve(beautyPcGuideDir, 'demo');
const remoteToolConfig = await this.customApiService.getRemoteToolConfig();
let remoteTemplateVersion = {};
if (remoteToolConfig.templateVersion) {
remoteTemplateVersion = this.remoteTemplateVersion = JSON.parse(remoteToolConfig.templateVersion);
}
await this.checkAndDownloadTpl({
version: remoteTemplateVersion.beautyPcFrameworkVersion,
demoUrl: remoteTemplateVersion.beautyPcUrl
}, this.beautyPcGuideDir);
const beautyPcConfigFile = path_1.default.resolve(beautyPcGuideDir, 'config.json');
const beautyPcConfig = await fs_extra_1.default.readJSON(beautyPcConfigFile);
this.customTypeConfig = beautyPcConfig.customTypeConfig;
this.beautyPcPages = beautyPcConfig.pages;
}
async getMenu(workbenchId, projectId) {
let menuData = [{
key: 'home',
title: '首页',
param: {
contentType: 'webview',
url: `/html/pc/mei-pc-extension/?projectId=${projectId}&workbenchId=${workbenchId}#/home`,
}
}];
this.customTypeConfig.map(item => {
const { type, title } = item;
menuData.push({
key: type,
title,
param: {
contentType: 'webview',
url: `/html/pc/mei-pc-extension?projectId=${projectId}&workbenchId=${workbenchId}&customType=${type}#/list`,
}
});
});
menuData.push({
key: 'upload',
title: '上传',
param: {
contentType: 'webview',
url: `/html/pc/mei-pc-extension/?projectId=${projectId}&workbenchId=${workbenchId}#/upload`,
}
});
return menuData;
}
async initPageDemo(projectId) {
const project = await this.projectService.getProjectById(projectId);
let versionInfo = {};
let remoteConfig = {
version: this.remoteTemplateVersion.beautyPcFrameworkVersion,
demoUrl: this.remoteTemplateVersion.beautyPcUrl
};
if (remoteConfig.demoUrl) {
await this.checkAndDownloadTpl(remoteConfig, this.beautyPcGuideDir);
const extensionDir = path_1.default.resolve(project.proPath, `${project.proName}-ui/${constants_1.WORK_DIR_NAME}`);
const versionPath = path_1.default.resolve(extensionDir, this.versionFileName);
let isVersionExist = await fs_extra_1.default.pathExists(versionPath);
if (!isVersionExist) {
await fs_extra_1.default.copy(this.beautyPcDemoDir, extensionDir);
await fs_extra_1.default.copy(path_1.default.resolve(this.beautyPcGuideDir, this.versionFileName), versionPath);
versionInfo = {
latestVersion: remoteConfig.version,
currentVersion: remoteConfig.version,
};
}
else {
const currentVersionInfo = await fs_extra_1.default.readJSON(versionPath);
versionInfo = {
latestVersion: remoteConfig.version,
currentVersion: currentVersionInfo.frameworkVersion
};
}
}
return versionInfo;
}
async updateProject(projectId) {
const project = await this.projectService.getProjectById(projectId);
const extensionDir = path_1.default.resolve(project.proPath, `${project.proName}-ui/${constants_1.WORK_DIR_NAME}`);
await fs_extra_1.default.ensureDir(path_1.default.resolve(extensionDir, 'src'));
await fs_extra_1.default.remove(path_1.default.resolve(extensionDir, this.versionFileName));
await fs_extra_1.default.copy(path_1.default.resolve(this.beautyPcGuideDir, this.versionFileName), path_1.default.resolve(extensionDir, this.versionFileName));
await fs_extra_1.default.remove(path_1.default.resolve(extensionDir, 'webpack'));
await fs_extra_1.default.copy(path_1.default.resolve(this.beautyPcDemoDir, 'webpack'), path_1.default.resolve(extensionDir, 'webpack'));
await fs_extra_1.default.remove(path_1.default.resolve(extensionDir, 'package-lock.json'));
await fs_extra_1.default.remove(path_1.default.resolve(extensionDir, 'yarn.lock'));
const compPckExist = await fs_extra_1.default.pathExists(path_1.default.resolve(extensionDir, 'package.json'));
if (compPckExist) {
const currentCompPackage = await fs_extra_1.default.readJSON(path_1.default.resolve(extensionDir, 'package.json'));
const demoCompPackage = await fs_extra_1.default.readJSON(path_1.default.resolve(this.beautyPcDemoDir, 'package.json'));
await fs_extra_1.default.writeJSON(path_1.default.resolve(extensionDir, 'package.json'), (0, merge_1.default)({}, currentCompPackage, demoCompPackage), { spaces: 2 });
}
else {
await fs_extra_1.default.copy(path_1.default.resolve(this.beautyPcDemoDir, 'package.json'), path_1.default.resolve(extensionDir, 'package.json'));
}
await fs_extra_1.default.remove(path_1.default.resolve(extensionDir, 'README.md'));
await fs_extra_1.default.copy(path_1.default.resolve(this.beautyPcDemoDir, 'README.md'), path_1.default.resolve(extensionDir, 'README.md'));
}
async getPageCustomList(params) {
const { projectId, customType, customed } = params;
let result = [];
const customTypes = this.customTypeConfig.filter(item => !customType ? true : item.type === customType);
for (let i = 0; i < customTypes.length; i++) {
const item = customTypes[i];
const type = (0, upperFirst_1.default)((0, camelCase_1.default)(item.type));
const funName = `get${type}List`;
const pageInfo = await this[funName]({
projectId,
});
const customInfo = pageInfo.filter((item) => customed ? item.isCustomed : true);
if (customInfo.length > 0) {
if (customType) {
result = customInfo || [];
}
else {
result.push(Object.assign(Object.assign({}, item), { children: customInfo }));
}
}
}
return result;
}
async getComponentReplaceList(params) {
const { projectId } = params;
const customType = 'component-replace';
let pageInfo = this.customTypeConfig.find(item => item.type === customType) || {};
const appHandler = await this.getAppHandler({
projectId,
groupPath: pageInfo.path,
});
const customInfo = await appHandler.getComponents();
return customInfo;
}
async getPageAddList(params) {
const { projectId } = params;
const customType = 'page-add';
let pageInfo = this.customTypeConfig.find(item => item.type === customType) || {};
const appHandler = await this.getAppHandler({
projectId,
groupPath: pageInfo.path,
});
const customInfo = await appHandler.getAddPages();
return customInfo;
}
async getPageReplaceList(params) {
const customType = 'page-replace';
let pageInfo = this.customTypeConfig.find(item => item.type === customType) || {};
const { projectId } = params;
const pageHandler = await this.getPageHandler({
projectId,
pagePath: pageInfo.path,
});
const customInfo = await pageHandler.getPages();
return customInfo;
}
async getAppHandler({ projectId, groupPath }) {
const cacheKey = `${projectId}-${groupPath}`;
let appHandler = this.pageHandlerCache[cacheKey];
if (appHandler) {
return appHandler;
}
const project = await this.projectService.getProjectById(projectId);
appHandler = new AppHandler_1.default({
beautyPcGuideDir: this.beautyPcGuideDir,
workDir: this.workDir,
projectRootDir: project.proPath,
projectName: project.proName,
groupPath,
});
await appHandler.start();
this.appHandlerCache[cacheKey] = appHandler;
return appHandler;
}
async getPageHandler({ projectId, pagePath }) {
let cacheKey = `${projectId}-${pagePath}`;
let pageHandler = this.pageHandlerCache[cacheKey];
if (pageHandler) {
return pageHandler;
}
const project = await this.projectService.getProjectById(projectId);
pageHandler = new PageHandler_1.default({
beautyPcGuideDir: this.beautyPcGuideDir,
workDir: this.workDir,
projectRootDir: project.proPath,
projectName: project.proName,
pagePath,
});
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 getTouchJsPath() {
const touchJsPath = path_1.default.resolve(this.configService.getWorkerDir(), 'assets/utils/touch-emulator.js');
return touchJsPath;
}
async broadcastPreviewComps(projectId, workbenchId, previewComps) {
this._broadcastPreviewComps.fire(previewComps);
}
async updatePreviewComps(projectId, url, previewComps) {
const key = projectId + '_' + url;
this.previewCompsMap[key] = previewComps;
return true;
}
async getPreviewComps(projectId, url) {
const key = projectId + '_' + url;
return this.previewCompsMap[key] || [];
}
async uploadInfo(params) {
const { projectId } = params;
const project = await this.projectService.getProjectById(projectId);
const isClean = await this.projectService.checkProjectStatus(project.proPath);
if (!isClean) {
throw new Error('请先提交本地代码');
}
const userInfo = await this.userService.getUserInfo();
const prodBuildDir = path_1.default.resolve(project.proPath, `${project.proName}-ui/${constants_1.WORK_DIR_NAME}/dist`);
const infoPath = path_1.default.resolve(prodBuildDir, 'info.json');
const pagesInfo = await fs_extra_1.default.readJSON(infoPath);
const pageValues = Object.values(pagesInfo);
for (let t = 0; t < pageValues.length; t++) {
const pages = pageValues[t];
if (pages && pages instanceof Array && pages.length > 0) {
for (let i = 0; i < pages.length; i++) {
const page = pages[i];
const uploadParams = {
projectName: project.proName,
pageName: page.moduleName,
fileList: [],
addHash: false,
};
const allowUrlName = ['js', 'css', 'url'];
for (let key of allowUrlName) {
if (page[key]) {
uploadParams.fileList = page[key];
const url = await this.uploadToCdn(uploadParams);
page[key] = url;
}
}
}
}
}
const pages = [{
pageName: 'mei_diy_web',
content: pagesInfo,
}];
const customInfo = {
type: 'original',
appName: project.proName,
commitUser: userInfo.userName || userInfo.mobile || 'youzanyun-developer-tool',
commitHash: 'unknown',
pages,
};
const saveRes = await this.customApiService.saveCustomContent(customInfo);
return saveRes;
}
async uploadToCdn(data) {
const params = Object.assign({}, data);
const fileListType = typeof data.fileList;
if (!data.fileList) {
return null;
}
else if (fileListType === 'string') {
params.fileList = [data.fileList];
}
const uploadCompFileList = await this.cdnService.uploadFileToCdn(params);
const uploadUrls = uploadCompFileList.map(item => item.url);
if (fileListType === 'string') {
return uploadUrls[0];
}
return uploadUrls;
}
};
tslib_1.__decorate([
(0, spring4js_nodejs_1.Resource)()
], BeautyPcService.prototype, "projectService", void 0);
tslib_1.__decorate([
(0, spring4js_nodejs_1.Resource)()
], BeautyPcService.prototype, "configService", void 0);
tslib_1.__decorate([
(0, spring4js_nodejs_1.Resource)()
], BeautyPcService.prototype, "customApiService", void 0);
tslib_1.__decorate([
(0, spring4js_nodejs_1.Resource)()
], BeautyPcService.prototype, "cdnService", void 0);
tslib_1.__decorate([
(0, spring4js_nodejs_1.Resource)()
], BeautyPcService.prototype, "userService", void 0);
BeautyPcService = tslib_1.__decorate([
(0, spring4js_nodejs_1.Service)()
], BeautyPcService);
exports.default = BeautyPcService;
;