UNPKG

4.83 kBJavaScriptView Raw
1"use strict";
2Object.defineProperty(exports, "__esModule", { value: true });
3const _ = require("lodash");
4const path = require("path");
5const declare_1 = require("../declare");
6const util_1 = require("../util");
7/**
8 * 小程序转换器,用于 XcxNode 节点树的转换
9 *
10 * @export
11 * @class XcxTraverse
12 */
13class XcxTraverse {
14 /**
15 * Creates an instance of XcxTraverse.
16 * @param {XcxTraverse.Options} options
17 * @memberof XcxTraverse
18 */
19 constructor(options) {
20 this.options = options;
21 /**
22 * pages 页面路径列表,与 app.json 中的 pages 字段的格式一致
23 *
24 * @private
25 * @type {string[]}
26 * @memberof XcxTraverse
27 */
28 this.pages = [];
29 /**
30 * components 组件路径列表
31 *
32 * @private
33 * @type {string[]}
34 * @memberof XcxTraverse
35 */
36 this.components = [];
37 }
38 /**
39 * 转换,它是一个静态方法
40 *
41 * @static
42 * @param {(XcxNode | XcxNode[])} parent
43 * @param {XcxTraverse.Options} options
44 * @memberof XcxTraverse
45 */
46 static traverse(parent, options) {
47 let xcxTraverse = new XcxTraverse(options);
48 xcxTraverse.traverse(parent);
49 }
50 /**
51 * 转换
52 *
53 * @param {(XcxNode | XcxNode[])} parent
54 * @memberof XcxTraverse
55 */
56 traverse(parent) {
57 if (_.isArray(parent) && parent.length === 0) {
58 return;
59 }
60 // 触发 start 开始访问器
61 this.trigger('start', undefined);
62 // 递归
63 this.recursive(parent);
64 // 触发 pages 页面列表访问器
65 if (this.pages.length > 0) {
66 this.trigger('pages', this.pages);
67 }
68 // 触发 components 组件列表访问器
69 if (this.components.length > 0) {
70 this.trigger('components', this.components);
71 }
72 // 触发 end 结束访问器
73 this.trigger('end', undefined);
74 }
75 /**
76 * page 页面地址替换器
77 *
78 * @private
79 * @param {string} destRelative
80 * @returns {string}
81 * @memberof XcxTraverse
82 */
83 pageReplacer(destRelative) {
84 let regExp = new RegExp(`(^${util_1.config.dest}\\${path.sep})|(${util_1.config.ext.wxp}$)`, 'g');
85 return destRelative.replace(regExp, '').split(path.sep).join('/');
86 }
87 /**
88 * component 组件地址替换器
89 *
90 * @private
91 * @param {string} destRelative
92 * @returns {string}
93 * @memberof XcxTraverse
94 */
95 componentReplacer(destRelative) {
96 let regExp = new RegExp(`(^${util_1.config.dest}\\${path.sep})|(${util_1.config.ext.wxc}$)`, 'g');
97 return destRelative.replace(regExp, '').split(path.sep).join('/');
98 }
99 /**
100 * 递归节点树
101 *
102 * @private
103 * @param {(XcxNode | XcxNode[])} parent
104 * @memberof XcxTraverse
105 */
106 recursive(parent) {
107 if (_.isArray(parent)) {
108 parent.forEach(this.resolve.bind(this));
109 }
110 else if (parent) {
111 this.resolve(parent);
112 }
113 }
114 /**
115 * 解析一个 XcxNode 节点
116 *
117 * @private
118 * @param {XcxNode} xcxNode
119 * @memberof XcxTraverse
120 */
121 resolve(xcxNode) {
122 // 触发 enter 进入访问器
123 this.trigger('enter', xcxNode);
124 let { request } = xcxNode;
125 switch (request.requestType) {
126 case declare_1.RequestType.WXA:
127 // 触发 app 应用访问器
128 this.trigger('app', xcxNode);
129 break;
130 case declare_1.RequestType.WXP:
131 this.pages = _.union(this.pages, [
132 this.pageReplacer(request.destRelative)
133 ]);
134 // 触发 page 页面访问器
135 this.trigger('page', xcxNode);
136 break;
137 case declare_1.RequestType.WXC:
138 this.components = _.union(this.components, [
139 this.componentReplacer(request.destRelative)
140 ]);
141 // 触发 component 组件访问器
142 this.trigger('component', xcxNode);
143 break;
144 default:
145 break;
146 }
147 // 递归子集
148 this.recursive(xcxNode.children);
149 // 触发 exit 退出访问器
150 this.trigger('exit', xcxNode);
151 }
152 /**
153 * 触发访问者事件
154 *
155 * @private
156 * @param {XcxTraverse.VisitType} method
157 * @param {(undefined | string[] | XcxNode | XcxNode[])} value
158 * @memberof XcxTraverse
159 */
160 trigger(method, value) {
161 let _method = this.options[method];
162 if (_.isFunction(_method)) {
163 _method.call(this.options, value);
164 }
165 }
166}
167exports.XcxTraverse = XcxTraverse;