UNPKG

youzanyun-devtool-worker

Version:

323 lines (322 loc) 14.8 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 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; ;