const path = require("path"); const rootPath = path.resolve(process.cwd(), "node_modules"); /** 解析绝对路径 * @param {Object} dir */ function resolvePath(dir: string) { return path.resolve(rootPath, dir); } class TransformPages { public CONFIG: Config = { includes: ["path", "aliasPath", "name"], }; public pagesPath: string; public uniPagesJSON: UniPagesJSON; public routes: string[]; public platform: string; /** * Creates an instance of TransformPages. * @param {Config} config 调用getPagesRoutes时,返回值保留字段 * @param {string} pagesPath pages.json 文件相对与项目根目录的位置 * @memberof TransformPages */ constructor(config: Config, pagesPath: string) { config = { ...this.CONFIG, ...config, }; this.CONFIG = config; this.pagesPath = path.resolve(process.cwd(), pagesPath); this.uniPagesJSON = require(resolvePath( "@dcloudio/uni-cli-shared/dist/json/pages.js" )); this.platform = process.env["UNI_PLATFORM"]; this.routes = this.getPagesRoutes().concat(this.getNotMpRoutes()); } /** * 获取所有pages.json下的内容 返回json */ get pagesJson() { return this.uniPagesJSON.parsePagesJson(this.pagesPath, this.platform); } /** * 通过读取pages.json文件 生成直接可用的routes */ getPagesRoutes(pages = this.pagesJson.pages, rootPath = null) { const routes = []; let route, value; pages.forEach((pItem, pIndex) => { route = {}; value = ""; this.CONFIG.includes.forEach((cItem, cIndex) => { value = pItem[cItem]; if (cItem === "path") { value = rootPath ? `/${rootPath}/${value}` : `/${value}`; } if (cItem === "aliasPath" && pIndex == 0 && rootPath == null) { route[cItem] = route[cItem] || "/"; } else { route[cItem] = value ? value : {}; } }); routes.push(route); }); return routes; } /** * 解析小程序分包路径 */ getNotMpRoutes() { const { subPackages } = this.pagesJson; let routes = [], subPages, root, subRoutes; if (subPackages == null || subPackages.length == 0) { return []; } subPackages.forEach((item) => { subPages = item.pages; root = item.root; subRoutes = this.getPagesRoutes(subPages, root); routes = routes.concat(subRoutes); }); return routes; } /** * 单条page对象解析 * @param {Object} pageCallback * @param {Object} subPageCallback */ parsePages(pageCallback, subPageCallback) { this.PARSEPAGES(this.pagesJson, pageCallback, subPageCallback); } //历史版本的parsePages PARSEPAGES(pagesJson, pageCallback, subPageCallback) { if (!pagesJson) { pagesJson = this.pagesJson(); } // pages pagesJson.pages.forEach((page) => { pageCallback && pageCallback(page); }); // subPackages if (Array.isArray(pagesJson.subPackages) && pagesJson.subPackages.length) { pagesJson.subPackages.forEach((subPackage) => { const { root, pages } = subPackage; pages.forEach((page) => { root && subPageCallback && subPageCallback(root, page, subPackage); }); }); } } } export default TransformPages;