youzanyun-devtool-worker
Version:
312 lines (311 loc) • 14.3 kB
JavaScript
;
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;