youzanyun-devtool-worker
Version:
323 lines (322 loc) • 14.8 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 nunjucks_1 = tslib_1.__importDefault(require("nunjucks"));
const fast_glob_1 = tslib_1.__importDefault(require("fast-glob"));
const lodash_1 = require("lodash");
const CategoryHandler_1 = tslib_1.__importDefault(require("./CategoryHandler"));
class AppHandler {
constructor({ isDesignPlatform = false, projectId, projectName, projectRootDir, youzanMpName, guideConfigDir, devtoolVersion }) {
this.projectId = projectId;
this.projectName = projectName;
this.youzanMpName = youzanMpName;
this.projectRootDir = projectRootDir;
this.guideConfigDir = guideConfigDir;
this.devtoolVersion = devtoolVersion;
this.isDesignPlatform = isDesignPlatform;
}
async start() {
let guideJson = this.guideJson = await fs_extra_1.default.readJson(path_1.default.resolve(this.guideConfigDir, 'guide.json'));
try {
this.guideMetaJson = await fs_extra_1.default.readJson(path_1.default.resolve(this.guideConfigDir, 'guide.meta.json'));
}
catch (e) {
console.warn(`${this.projectName} ${this.youzanMpName} guide.meta.json 读取失败, 使用默认数据`, e);
this.guideMetaJson = {
"version": "",
"downloadTimestamp": 0,
"downloadUrl": ""
};
}
this.showcaseMpRoot = path_1.default.resolve(this.projectRootDir, `showcase-components-mp`);
if (this.isDesignPlatform) {
this.mpRoot = this.showcaseMpRoot;
this.extensionPath = path_1.default.resolve(this.showcaseMpRoot, 'extension.json');
}
else {
this.mpRoot = path_1.default.resolve(this.projectRootDir, `${this.projectName}-ui`, guideJson.developDir);
this.extensionPath = path_1.default.resolve(this.mpRoot, 'extension.json');
}
this.categoryJsonList = [];
let context = { mpRoot: this.mpRoot };
let env = new nunjucks_1.default.Environment(null, {
tags: {
blockStart: '{%',
blockEnd: '%}',
variableStart: '{$',
variableEnd: '$}',
commentStart: '{#',
commentEnd: '#}'
}
});
if (this.guideJson.customDocument) {
let customTpl = await fs_extra_1.default.readFile(path_1.default.resolve(this.guideConfigDir, guideJson.customDocument), 'utf8');
let customTemplate = nunjucks_1.default.compile(customTpl, env);
let customMd = customTemplate.render(context);
this.customDocument = customMd;
}
if (this.guideJson.addNewPageDocument) {
let customTpl = await fs_extra_1.default.readFile(path_1.default.resolve(this.guideConfigDir, guideJson.addNewPageDocument), 'utf8');
let customTemplate = nunjucks_1.default.compile(customTpl, env);
let customMd = customTemplate.render(context);
this.addNewPageDocument = customMd;
}
let categoryJsonFiles = await (0, fast_glob_1.default)(['*/category.json'], {
cwd: this.guideConfigDir
});
for (let categoryJsonFile of categoryJsonFiles) {
let categoryJsonAbsolutePath = path_1.default.resolve(this.guideConfigDir, categoryJsonFile);
let categoryJson = await fs_extra_1.default.readJson(categoryJsonAbsolutePath);
categoryJson.name = path_1.default.dirname(categoryJsonFile);
this.categoryJsonList.push(categoryJson);
}
}
async getMenu() {
let menuList = [
{
title: '定制指南',
key: '定制指南',
param: {
contentType: 'webview',
url: `/html/mp/app?hideMenu=1&projectId=${this.projectId}&appName=${this.youzanMpName}#/document`,
docKey: 'mp-home',
}
},
{
title: '页面定制',
key: '页面定制',
children: []
},
{
title: '自定义页面',
key: '自定义页面',
param: {
contentType: 'webview',
url: `/html/mp/app?hideMenu=1&projectId=${this.projectId}&appName=${this.youzanMpName}#/custom-page`,
docKey: 'mp-add-page',
}
},
{
title: '打包配置',
key: '打包配置',
param: {
contentType: 'webview',
url: `/html/mp/app?hideMenu=1&projectId=${this.projectId}&appName=${this.youzanMpName}#/build-info`,
docKey: 'mp-build-config',
}
},
];
let pageCustomMenu = menuList[1];
for (let category of this.categoryJsonList) {
pageCustomMenu.children.push({
title: category.label,
key: category.label,
param: {
contentType: 'webview',
url: `/html/mp/app?hideMenu=1&projectId=${this.projectId}&appName=${this.youzanMpName}#/category-page/${category.name}`,
docKey: `mp-page-custom`,
}
});
}
return menuList;
}
async getCustomInfo() {
let appJsonPath = path_1.default.resolve(this.mpRoot, 'src/app.json');
let existAppJson = await fs_extra_1.default.pathExists(appJsonPath);
let version = '';
if (existAppJson) {
version = await this._getCreateProjectGuideVersion();
}
return {
projectCreated: existAppJson,
version,
appJson: '',
categoryJsonList: this.categoryJsonList,
customDocument: this.customDocument,
addNewPageDocument: this.addNewPageDocument,
projectName: this.projectName,
};
}
async getVersionInfo() {
let latestVersion = await this._getCurrentGuideVersion();
let currentVersion = await this._getCreateProjectGuideVersion();
return {
currentVersion,
latestVersion,
needUpdate: latestVersion !== currentVersion,
};
}
async createDevelopProject() {
let appJsonPath = path_1.default.resolve(this.mpRoot, 'src/app.json');
let demoPath = this.getDemoDir();
let existAppJson = await fs_extra_1.default.pathExists(appJsonPath);
if (!existAppJson) {
await fs_extra_1.default.copy(demoPath, this.mpRoot);
await fs_extra_1.default.writeJson(path_1.default.resolve(this.mpRoot, 'guide.meta.json'), this.guideMetaJson, { spaces: 2 });
let appJson = await fs_extra_1.default.readJson(appJsonPath);
appJson.pages = ["pages/hello-world/index"];
appJson.subPackages = [];
await fs_extra_1.default.writeJson(appJsonPath, appJson, { spaces: 2 });
await fs_extra_1.default.remove(path_1.default.resolve(this.mpRoot, 'src/packages'));
await fs_extra_1.default.remove(path_1.default.resolve(this.mpRoot, 'src/pages'));
await fs_extra_1.default.copy(path_1.default.resolve(demoPath, 'src/pages/hello-world'), path_1.default.resolve(this.mpRoot, 'src/pages/hello-world'));
}
}
async updateProject() {
let demoPath = this.getDemoDir();
let toCopyFile = this.guideJson.updateFiles || [];
for (let updateFile of toCopyFile) {
await fs_extra_1.default.remove(path_1.default.resolve(this.mpRoot, updateFile));
await fs_extra_1.default.copy(path_1.default.resolve(demoPath, updateFile), path_1.default.resolve(this.mpRoot, updateFile));
}
await fs_extra_1.default.writeJson(path_1.default.resolve(this.mpRoot, 'guide.meta.json'), this.guideMetaJson, { spaces: 2 });
}
async _getCreateProjectGuideVersion() {
let guideInfo;
try {
guideInfo = await fs_extra_1.default.readJson(path_1.default.resolve(this.mpRoot, 'guide.meta.json'));
}
catch (e) {
guideInfo = {};
}
return guideInfo.version || '--';
}
async _getCurrentGuideVersion() {
return this.guideMetaJson.version;
}
getDemoDir() {
return path_1.default.resolve(this.guideConfigDir, this.guideJson.demo);
}
getProjectMpRootDir() {
return this.mpRoot;
}
async createNewAddPage(page) {
let targetDir;
if (page.package == 'main') {
targetDir = `src/pages/${page.name}`;
}
else {
targetDir = `src/packages/${page.package}/${page.name}`;
}
let exist = await fs_extra_1.default.pathExists(targetDir);
if (exist) {
throw new Error(`页面目录已存在: ${targetDir}。请先删除`);
}
let demoPath = this.getDemoDir();
await fs_extra_1.default.copy(path_1.default.resolve(demoPath, 'src/pages/hello-world'), path_1.default.resolve(this.mpRoot, targetDir));
let appJson = await fs_extra_1.default.readJson(path_1.default.resolve(this.mpRoot, 'src/app.json'));
if (page.package == 'main') {
if ((0, lodash_1.findIndex)(appJson.pages, el => el == `${page.name}/index`) == -1) {
appJson.pages.push(`pages/${page.name}/index`);
}
}
else {
if (!appJson.subPackages) {
appJson.subPackages = [];
}
let subPackage = (0, lodash_1.find)(appJson.subPackages, el => el.root == `packages/${page.package}`);
if (!subPackage) {
subPackage = {
"root": `packages/${page.package}`,
"name": `${page.package}`,
"pages": []
};
appJson.subPackages.push(subPackage);
}
if ((0, lodash_1.findIndex)(subPackage.pages, el => el == `${page.name}/index`) == -1) {
subPackage.pages.push(`${page.name}/index`);
}
}
await fs_extra_1.default.writeJson(path_1.default.resolve(this.mpRoot, 'src/app.json'), appJson, { spaces: 2 });
let extension = await fs_extra_1.default.readJson(path_1.default.resolve(this.mpRoot, 'extension.json'));
if (page.package == 'main') {
let index = (0, lodash_1.findIndex)(extension.app.addPages, (el) => {
return el.package == `main` && el.path == `${page.name}/index`;
});
if (index == -1) {
extension.app.addPages.push({
package: 'main',
label: page.label,
path: `pages/${page.name}/index`
});
}
}
else {
let index = (0, lodash_1.findIndex)(extension.app.addPages, (el) => {
return el.package == `packages/${page.package}` && el.path == `${page.name}/index`;
});
if (index == -1) {
extension.app.addPages.push({
package: `packages/${page.package}`,
label: page.label,
path: `${page.name}/index`
});
}
}
await fs_extra_1.default.writeJson(path_1.default.resolve(this.mpRoot, 'extension.json'), extension, { spaces: 2 });
}
async removeAddedPage(page) {
let appJsonPath = path_1.default.resolve(this.mpRoot, 'src/app.json');
let appJson = await fs_extra_1.default.readJson(appJsonPath);
if (page.package == 'main') {
let dir = path_1.default.resolve(this.mpRoot, 'src', path_1.default.dirname(page.path));
await fs_extra_1.default.remove(dir);
appJson.pages = (0, lodash_1.filter)(appJson.pages, el => el != page.path);
}
else {
let dir = path_1.default.resolve(this.mpRoot, 'src', page.package, path_1.default.dirname(page.path));
await fs_extra_1.default.remove(dir);
let subPackageIndex = (0, lodash_1.findIndex)(appJson.subPackages, (el) => el.root == page.package);
let subPackage = appJson.subPackages[subPackageIndex];
appJson.subPackages.splice(subPackageIndex, 1);
subPackage.pages = (0, lodash_1.filter)(subPackage.pages, el => el != page.path);
if (subPackage.pages.length > 0) {
appJson.subPackages.push(subPackage);
}
}
await fs_extra_1.default.writeJson(appJsonPath, appJson, { spaces: 2 });
let extensionPath = path_1.default.resolve(this.mpRoot, 'extension.json');
let extension = await fs_extra_1.default.readJson(extensionPath);
let addedPages = extension.app.addPages;
extension.app.addPages = (0, lodash_1.filter)(addedPages, el => {
return !(el.package == page.package && el.path == page.path);
});
await fs_extra_1.default.writeJson(extensionPath, extension, { spaces: 2 });
}
async getDevelopingAppJson() {
let appJsonPath = path_1.default.resolve(this.mpRoot, 'src/app.json');
let content = await fs_extra_1.default.readJson(appJsonPath);
return content;
}
async getCategoryHandler({ categoryName }) {
let categoryDir = path_1.default.resolve(this.guideConfigDir, categoryName);
let categoryHandler = new CategoryHandler_1.default({
appHandler: this,
categoryDir,
});
await categoryHandler.start();
return categoryHandler;
}
async getExtensionConfig(isShowcase = false) {
const mpDir = isShowcase ? this.showcaseMpRoot : this.mpRoot;
let extension;
try {
extension = await fs_extra_1.default.readJson(path_1.default.resolve(mpDir, 'extension.json'));
}
catch (e) {
extension = {};
}
extension.pageCustom = extension.pageCustom || {};
return extension;
}
async saveExtensionConfig(extension, isShowcase = false) {
const mpDir = isShowcase ? this.showcaseMpRoot : this.mpRoot;
extension.guideVersion = await this._getCurrentGuideVersion();
extension.devtoolVersion = this.devtoolVersion;
await fs_extra_1.default.writeJson(path_1.default.resolve(mpDir, 'extension.json'), extension, { spaces: 2 });
}
}
exports.default = AppHandler;
;