UNPKG

youzanyun-devtool-worker

Version:

339 lines (338 loc) 15.4 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 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; ;