UNPKG

youzanyun-devtool-worker

Version:

312 lines (311 loc) 14.3 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); const tslib_1 = require("tslib"); const fs_extra_1 = tslib_1.__importDefault(require("fs-extra")); const uniq_1 = tslib_1.__importDefault(require("lodash/uniq")); const path_1 = tslib_1.__importDefault(require("path")); const spring4js_nodejs_1 = require("spring4js-nodejs"); const BaseController_1 = tslib_1.__importDefault(require("../BaseController")); let TemplateManageController = class TemplateManageController extends BaseController_1.default { async getTemplates(ctx) { const params = ctx.query; const result = await this.templateManageService.getTemplates(params); return result; } async saveTemplate(ctx) { const params = ctx.request.body; const result = await this.templateManageService.saveTemplate(params); return result; } async deleteTemplate(ctx) { const params = ctx.query; const result = await this.templateManageService.deleteTemplate(params); return result; } async getLocalTemplate(ctx) { const params = ctx.query; const templateDetail = await this.templateManageService.getTemplateDetail({ appId: params.templateId, appName: params.appName, }); const appList = await this.projectService.getProjectsByProName({ proName: params.appName, }); const projectRoot = appList[0].proPath; const result = await this.customCompsService.getCompsByAppName({ appName: params.appName, pageNo: 1, pageSize: 1000, }, true); const localTemplate = { appId: params.templateId, }; if (templateDetail.appItemExtension && templateDetail.appItemExtension.componentData) { localTemplate.components = JSON.parse(templateDetail.appItemExtension.componentData); } if (!localTemplate.components) { localTemplate.components = [{ type: 'config', title: '微页面标题' }]; } if (!localTemplate.jsUrl) { localTemplate.jsUrl = { compUrl: '', comp: { jsMap: {}, }, editor: { jsList: [], cssList: [], }, }; } const correctCompList = result.compList ? result.compList.filter((item) => item.visible) : null; if (correctCompList && correctCompList.length > 0) { const components = correctCompList.map((item) => item.code); const { h5CompsFile, h5CompMap } = await this.handleH5ComponentJs(components, projectRoot, '/_yzydev_/local/file?filePath='); const jsList = correctCompList.map((item) => { const filePath = path_1.default.resolve(projectRoot, `showcase-editor/dist/${item.code}.js`); return `/_yzydev_/local/file?filePath=${filePath}`; }); localTemplate.jsUrl.compUrl = h5CompsFile; localTemplate.jsUrl.comp.jsMap = h5CompMap; localTemplate.jsUrl.editor.jsList = localTemplate.jsUrl.editor.jsList.concat(jsList); } const groupInfo = await this.dpRequestService.getAllGroupComponent({ appName: params.appName }); let groupFilter = []; if (Array.isArray(groupInfo) && groupInfo.length) { groupFilter = groupInfo.filter((item) => item.visible); groupFilter.forEach((item) => { if (Array.isArray(item.children)) { item.children = item.children.filter((v) => v.visible); item.children.forEach((v) => (v.type = v.code)); } }); } localTemplate.extensionGroupInfo = groupFilter; return localTemplate; } async updateTemplate(ctx) { const { templateId, templateInfo, appName, isBrandTemplate } = ctx.request.body; const extensionKdtId = ctx.cookies.get('kdt_id'); const appList = await this.projectService.getProjectsByProName({ proName: appName, }); const projectRoot = appList[0].proPath; const templateDetail = await this.templateManageService.getTemplateDetail({ appId: templateId, appName, }); templateDetail.appName = appName; const templateScript = { compUrl: '', comp: { jsMap: {}, }, editor: { jsList: [], cssList: [], }, }; try { const oldData = JSON.parse(templateDetail.appItemExtension.templateScript); Object.assign(templateScript, { nativeTemplate: oldData.nativeTemplate, pageType: oldData.pageType, matchTypes: oldData.matchTypes, requireMatchTypes: oldData.requireMatchTypes, }); } catch (error) { console.log(error); } const templateCompTypes = templateInfo .map((item) => item.type) .filter((item) => item.startsWith(`extension-${appName}`)) || []; if (templateCompTypes.length > 0) { const compTypes = (0, uniq_1.default)(templateCompTypes); if (isBrandTemplate) { try { const mpZipUrl = await this.templateManageService.getTemplateMpResources(projectRoot, compTypes, templateId, appName); templateScript.mpZipUrl = mpZipUrl; templateScript.nativeTemplate = 1; } catch (error) { templateScript.mpZipUrl = ''; } } const { h5CompsFile, h5CompMap } = await this.handleH5ComponentJs(compTypes, projectRoot); const localJsList = compTypes.map((item) => { return path_1.default.resolve(projectRoot, `showcase-editor/dist/${item}.js`); }); let compUploadRes = []; let compsUploadRes = []; let editorUploadRes = []; try { compUploadRes = await this.cdnService.uploadFileToCdn({ projectName: appName, pageName: 'template-component', fileList: [h5CompsFile], addHash: true, }); compsUploadRes = await this.cdnService.uploadFileToCdn({ projectName: appName, pageName: 'template-component-list', fileList: Array.from(new Set(Object.values(h5CompMap))), addHash: true, }); editorUploadRes = await this.cdnService.uploadFileToCdn({ projectName: appName, pageName: 'template-editor', fileList: [...localJsList], addHash: true, }); } catch (err) { ctx.body = { code: -1, message: '保存上传失败', }; return; } templateScript.compUrl = compUploadRes[0].url; templateScript.comp.jsMap = this.replaceH5ComponentUrl(h5CompMap, compsUploadRes); const jsList = editorUploadRes.map((item) => item.url); templateScript.editor.jsList = jsList; } if (!templateDetail.appItemExtension) { templateDetail.appItemExtension = {}; } templateDetail.appItemExtension.componentData = templateInfo; templateDetail.appItemExtension.templateScript = JSON.stringify(templateScript); templateDetail.appItemExtension.bAuditViewUrl = `https://www.youzan.com/v4/deco/developer-decorate#/create/${templateId}?status=testing&extensionKdtId=${extensionKdtId}`; templateDetail.appItemExtension.cAuditViewUrl = `https://h5.youzan.com/wscshop/decorate/extension-preview?templateId=${templateId}&status=testing&cloudType=1&extensionKdtId=${extensionKdtId}`; templateDetail.appItemExtension.bPreviewUrl = `https://www.youzan.com/v4/deco/developer-decorate#/create/${templateId}?status=official&extensionKdtId=${extensionKdtId}`; templateDetail.appItemExtension.cPreviewUrl = `https://h5.youzan.com/wscshop/decorate/extension-preview?templateId=${templateId}&status=official&cloudType=1&extensionKdtId=${extensionKdtId}`; const result = await this.templateManageService.updateTemplate(templateDetail); console.log('success--->', result); return result; } replaceH5ComponentUrl(uploadFrontMap, uploadBackList) { const map = uploadBackList.reduce((result, item) => { result[item.filePath] = item.url; return result; }, {}); return Object.keys(uploadFrontMap).reduce((result, key) => { result[key] = map[uploadFrontMap[key]]; return result; }, {}); } async handleH5ComponentJs(compTypes, projectRoot, prefix = '') { const h5CompMap = {}; const h5CompContent = []; const maxSize = 200 * 1024; const compSizeArrs = []; let temp = []; let size = 0; for (let i = 0; i < compTypes.length; i++) { const compType = compTypes[i]; const compPath = path_1.default.resolve(projectRoot, `showcase-components/dist/${compType}.js`); const stat = await fs_extra_1.default.stat(compPath); if (stat.size > maxSize) { compSizeArrs.push([compType]); } else if (size + stat.size > maxSize) { compSizeArrs.push(temp); temp = [compType]; size = stat.size; } else { temp.push(compType); size += stat.size; } if (i === compTypes.length - 1 && temp.length) { compSizeArrs.push(temp); } } const unionCompDir = this.configService.getUnionCompJsDir(); await fs_extra_1.default.ensureDir(unionCompDir); for (let i = 0; i < compSizeArrs.length; i++) { let filePath = path_1.default.resolve(unionCompDir, `union-comp-${i}.js`); let content = []; await fs_extra_1.default.ensureFile(filePath); for (let j = 0; j < compSizeArrs[i].length; j++) { const compType = compSizeArrs[i][j]; const compPath = path_1.default.resolve(projectRoot, `showcase-components/dist/${compType}.js`); const compContent = await (await fs_extra_1.default.readFile(compPath)).toString('utf8'); content.push(compContent); h5CompContent.push(compContent); h5CompMap[compType] = prefix + filePath; } await fs_extra_1.default.writeFile(filePath, content.join('\n')); } const vendorsDllJs = path_1.default.resolve(projectRoot, `showcase-components/dist/vendors.dll.js`); const isDllExist = await fs_extra_1.default.pathExists(vendorsDllJs); if (isDllExist) { const jsContentBuffer = await fs_extra_1.default.readFile(vendorsDllJs); const jsContent = jsContentBuffer.toString('utf8'); h5CompContent.unshift(jsContent); h5CompMap.vendors = prefix + vendorsDllJs; } const h5CompsFile = this.configService.getDpCompJsFile(); await fs_extra_1.default.ensureFile(h5CompsFile); await fs_extra_1.default.writeFile(h5CompsFile, h5CompContent.join('\n')); return { h5CompsFile: prefix + h5CompsFile, h5CompMap }; } async getTestShopList(ctx) { const { appId, projectId } = ctx.query; const data = await this.shopService.getTestShopList({ appId, env: 0, projectId, }); return data; } }; tslib_1.__decorate([ (0, spring4js_nodejs_1.Resource)() ], TemplateManageController.prototype, "configService", void 0); tslib_1.__decorate([ (0, spring4js_nodejs_1.Resource)() ], TemplateManageController.prototype, "userService", void 0); tslib_1.__decorate([ (0, spring4js_nodejs_1.Resource)() ], TemplateManageController.prototype, "projectService", void 0); tslib_1.__decorate([ (0, spring4js_nodejs_1.Resource)() ], TemplateManageController.prototype, "cdnService", void 0); tslib_1.__decorate([ (0, spring4js_nodejs_1.Resource)() ], TemplateManageController.prototype, "customCompsService", void 0); tslib_1.__decorate([ (0, spring4js_nodejs_1.Resource)() ], TemplateManageController.prototype, "templateManageService", void 0); tslib_1.__decorate([ (0, spring4js_nodejs_1.Resource)() ], TemplateManageController.prototype, "shopService", void 0); tslib_1.__decorate([ (0, spring4js_nodejs_1.Resource)() ], TemplateManageController.prototype, "dpRequestService", void 0); tslib_1.__decorate([ (0, spring4js_nodejs_1.Path)('template/list', spring4js_nodejs_1.HttpMethod.GET) ], TemplateManageController.prototype, "getTemplates", null); tslib_1.__decorate([ (0, spring4js_nodejs_1.Path)('template/save', spring4js_nodejs_1.HttpMethod.POST) ], TemplateManageController.prototype, "saveTemplate", null); tslib_1.__decorate([ (0, spring4js_nodejs_1.Path)('template/delete', spring4js_nodejs_1.HttpMethod.DELETE) ], TemplateManageController.prototype, "deleteTemplate", null); tslib_1.__decorate([ (0, spring4js_nodejs_1.Path)('local/template/detail', spring4js_nodejs_1.HttpMethod.GET) ], TemplateManageController.prototype, "getLocalTemplate", null); tslib_1.__decorate([ (0, spring4js_nodejs_1.Path)('template/update', spring4js_nodejs_1.HttpMethod.POST) ], TemplateManageController.prototype, "updateTemplate", null); tslib_1.__decorate([ (0, spring4js_nodejs_1.Path)('template/test-shop', spring4js_nodejs_1.HttpMethod.GET) ], TemplateManageController.prototype, "getTestShopList", null); TemplateManageController = tslib_1.__decorate([ (0, spring4js_nodejs_1.Controller)('/api/design-platform') ], TemplateManageController); exports.default = TemplateManageController;