104 lines
		
	
	
		
			2.8 KiB
		
	
	
	
		
			JavaScript
		
	
	
			
		
		
	
	
			104 lines
		
	
	
		
			2.8 KiB
		
	
	
	
		
			JavaScript
		
	
	
| 'use strict';
 | |
| Object.defineProperty(exports, '__esModule', {
 | |
|   value: true,
 | |
| });
 | |
| const fs = require('fs');
 | |
| import stripJsonComments from './strip-json-comments';
 | |
| import { isArray, isEmpty } from 'lodash';
 | |
| 
 | |
| class TransformPages {
 | |
|   constructor({ includes, pagesJsonDir }) {
 | |
|     this.includes = includes;
 | |
|     this.uniPagesJSON = JSON.parse(stripJsonComments(fs.readFileSync(pagesJsonDir, 'utf-8')));
 | |
|     this.routes = this.getPagesRoutes().concat(this.getSubPackagesRoutes());
 | |
|     this.tabbar = this.getTabbarRoutes();
 | |
|     this.routesMap = this.transformPathToKey(this.routes);
 | |
|   }
 | |
|   /**
 | |
|    * 通过读取pages.json文件 生成直接可用的routes
 | |
|    */
 | |
|   getPagesRoutes(pages = this.uniPagesJSON.pages, rootPath = null) {
 | |
|     let routes = [];
 | |
|     for (let i = 0; i < pages.length; i++) {
 | |
|       const item = pages[i];
 | |
|       let route = {};
 | |
|       for (let j = 0; j < this.includes.length; j++) {
 | |
|         const key = this.includes[j];
 | |
|         let value = item[key];
 | |
|         if (key === 'path') {
 | |
|           value = rootPath ? `/${rootPath}/${value}` : `/${value}`;
 | |
|         }
 | |
|         if (key === 'aliasPath' && i == 0 && rootPath == null) {
 | |
|           route[key] = route[key] || '/';
 | |
|         } else if (value !== undefined) {
 | |
|           route[key] = value;
 | |
|         }
 | |
|       }
 | |
|       routes.push(route);
 | |
|     }
 | |
|     return routes;
 | |
|   }
 | |
|   /**
 | |
|    * 解析小程序分包路径
 | |
|    */
 | |
|   getSubPackagesRoutes() {
 | |
|     if (!(this.uniPagesJSON && this.uniPagesJSON.subPackages)) {
 | |
|       return [];
 | |
|     }
 | |
|     const subPackages = this.uniPagesJSON.subPackages;
 | |
|     let routes = [];
 | |
|     for (let i = 0; i < subPackages.length; i++) {
 | |
|       const subPages = subPackages[i].pages;
 | |
|       const root = subPackages[i].root;
 | |
|       const subRoutes = this.getPagesRoutes(subPages, root);
 | |
|       routes = routes.concat(subRoutes);
 | |
|     }
 | |
|     return routes;
 | |
|   }
 | |
| 
 | |
|   getTabbarRoutes() {
 | |
|     if (!(this.uniPagesJSON && this.uniPagesJSON.tabBar && this.uniPagesJSON.tabBar.list)) {
 | |
|       return [];
 | |
|     }
 | |
|     const tabbar = this.uniPagesJSON.tabBar.list;
 | |
|     let tabbarMap = [];
 | |
|     tabbar.forEach((bar) => {
 | |
|       tabbarMap.push('/' + bar.pagePath);
 | |
|     });
 | |
|     return tabbarMap;
 | |
|   }
 | |
| 
 | |
|   transformPathToKey(list) {
 | |
|     if (!isArray(list) || isEmpty(list)) {
 | |
|       return [];
 | |
|     }
 | |
|     let map = {};
 | |
|     list.forEach((i) => {
 | |
|       map[i.path] = i;
 | |
|     });
 | |
|     return map;
 | |
|   }
 | |
| }
 | |
| 
 | |
| function uniReadPagesV3Plugin({ pagesJsonDir, includes }) {
 | |
|   let defaultIncludes = ['path', 'aliasPath', 'name'];
 | |
|   includes = [...defaultIncludes, ...includes];
 | |
|   let pages = new TransformPages({
 | |
|     pagesJsonDir,
 | |
|     includes,
 | |
|   });
 | |
|   return {
 | |
|     name: 'uni-read-pages-v3',
 | |
|     config(config) {
 | |
|       return {
 | |
|         define: {
 | |
|           ROUTES: pages.routes,
 | |
|           ROUTES_MAP: pages.routesMap,
 | |
|           TABBAR: pages.tabbar,
 | |
|         },
 | |
|       };
 | |
|     },
 | |
|   };
 | |
| }
 | |
| exports.default = uniReadPagesV3Plugin;
 |