1 | ;
|
2 | Object.defineProperty(exports, "__esModule", { value: true });
|
3 | const _ = require("lodash");
|
4 | const path = require("path");
|
5 | const declare_1 = require("../declare");
|
6 | const util_1 = require("../util");
|
7 | /**
|
8 | * 小程序转换器,用于 XcxNode 节点树的转换
|
9 | *
|
10 | * @export
|
11 | * @class XcxTraverse
|
12 | */
|
13 | class 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 | }
|
167 | exports.XcxTraverse = XcxTraverse;
|