@ray-js/build-plugin-router 0.6.21 → 0.6.22-beta-2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/lib/index.js CHANGED
@@ -1,4 +1,15 @@
1
1
  "use strict";
2
+ var __rest = (this && this.__rest) || function (s, e) {
3
+ var t = {};
4
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
5
+ t[p] = s[p];
6
+ if (s != null && typeof Object.getOwnPropertySymbols === "function")
7
+ for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
8
+ if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
9
+ t[p[i]] = s[p[i]];
10
+ }
11
+ return t;
12
+ };
2
13
  var __importDefault = (this && this.__importDefault) || function (mod) {
3
14
  return (mod && mod.__esModule) ? mod : { "default": mod };
4
15
  };
@@ -10,17 +21,148 @@ const lodash_1 = __importDefault(require("lodash"));
10
21
  const fs_extra_1 = __importDefault(require("fs-extra"));
11
22
  const ejs_1 = __importDefault(require("ejs"));
12
23
  const shared_1 = require("@ray-js/shared");
24
+ const url_1 = __importDefault(require("url"));
25
+ const path_to_regexp_1 = require("path-to-regexp");
13
26
  function ejsRender(file, data, options) {
14
27
  const str = fs_extra_1.default.readFileSync(file).toString();
15
28
  return ejs_1.default.render(str, data, Object.assign(Object.assign({}, options), { async: false }));
16
29
  }
17
30
  colors_1.default.enable();
18
31
  const LOG_PREFIX = `build-plugin-router`;
19
- function normalizeRoute(route) {
20
- return (0, shared_1.paramCase)(route);
32
+ function printError(msg) {
33
+ shared_1.log.error(LOG_PREFIX, '');
34
+ console.error(msg);
35
+ }
36
+ // 找出重复的项
37
+ function duplicates(arr, fn, key) {
38
+ const _arr = arr.concat().sort(fn);
39
+ const res = [];
40
+ let b = [];
41
+ for (let i = 1; i < _arr.length; i++) {
42
+ let curr = _arr[i];
43
+ let old = _arr[i - 1];
44
+ if (key) {
45
+ curr = curr[key];
46
+ old = old[key];
47
+ }
48
+ if (curr == old) {
49
+ if (!b.some((x) => (key ? x[key] : x) == curr)) {
50
+ b.unshift(_arr[i - 1]);
51
+ }
52
+ if (key) {
53
+ b.unshift(_arr[i]);
54
+ }
55
+ }
56
+ else {
57
+ if (key && b.length) {
58
+ res.push(b);
59
+ b = [];
60
+ }
61
+ }
62
+ }
63
+ if (key && b.length) {
64
+ res.push(b);
65
+ }
66
+ return key ? res : b;
67
+ }
68
+ const standardAppConfigFieldMap = [
69
+ ['textColor', 'color'],
70
+ 'borderStyle',
71
+ 'selectedColor',
72
+ 'backgroundColor',
73
+ ];
74
+ function normalizeTabBarConfig(config, routes, fields) {
75
+ let _a = config || {}, { list } = _a, rest = __rest(_a, ["list"]);
76
+ let cfg;
77
+ list = list.map((tab) => {
78
+ for (const r of routes) {
79
+ // 兼容老项目
80
+ if (tab.id === r.id) {
81
+ return Object.assign(Object.assign({}, tab), { pagePath: r.path });
82
+ }
83
+ }
84
+ return tab;
85
+ });
86
+ if (list && list.length) {
87
+ const _cfg = {};
88
+ // tabBar.list[number].pagePath 必须在 routes[number].page 中,即tab.pagePath === routes[number].page
89
+ // tabBar.list[number].route 可不配置
90
+ // tabBar.list[number].route 若未配置,则设置 tabBar.list[number].route = routes[number].page(非模式匹配)或tabBar.list[number].pagePath
91
+ // tabBar.list[number].route 不能用模式,如不能用/xxx/:id等,必须是明确的 如/xxx/123
92
+ // tabBar.list[number].route 必须要能命中对应routes[number].route 路由规则,规则详见 path-to-regexp 模块
93
+ const tabs = list
94
+ .map((tab, index) => {
95
+ var _a;
96
+ const m = routes.find((i) => {
97
+ return (tab.pagePath === i.path ||
98
+ // 兼容老项目
99
+ tab.id === i.id);
100
+ });
101
+ if (!m) {
102
+ printError(`tabBar.list[${index}].pagePath: ${tab.pagePath} 需要在路由配置中: \n${JSON.stringify(routes, null, 2)}`.red);
103
+ return;
104
+ }
105
+ let pagePath = tab.pagePath.replace(/^\//, '');
106
+ const urlObj = url_1.default.parse(pagePath);
107
+ if (urlObj.hash || urlObj.search) {
108
+ printError(`tabBar.list[${index}]: ${tab.pagePath} 不能携带参数`.red);
109
+ return;
110
+ }
111
+ pagePath = urlObj.pathname;
112
+ if (!tab.route) {
113
+ // 判断 routes[number].route 是否为模式匹配规则
114
+ tab.route = m.route && (0, path_to_regexp_1.parse)(m.route).length === 1 ? m.route : m.path;
115
+ }
116
+ // 判断是否能被路由命中
117
+ const matched = (0, path_to_regexp_1.match)((_a = m.route) !== null && _a !== void 0 ? _a : m.path)(tab.route);
118
+ if (!matched) {
119
+ printError(`tabBar.list[${index}]\n.route: ${tab.route}\n.pagePath: ${tab.pagePath}\n无法被路由命中: \n${JSON.stringify(m, null, 2)}`.red);
120
+ return;
121
+ }
122
+ // 判断是否还被其他路由命中
123
+ const otherMatched = routes
124
+ .filter((r) => tab.pagePath !== r.path)
125
+ .filter((r) => { var _a; return (0, path_to_regexp_1.match)((_a = r.route) !== null && _a !== void 0 ? _a : r.path)(tab.route); });
126
+ const unusable = otherMatched.filter((r) => r.path !== tab.pagePath);
127
+ if (unusable.length) {
128
+ printError(`tabBar.list[${index}]\n.route: ${tab.route}\n.pagePath: ${tab.pagePath}\n应被路由命中:\n${JSON.stringify(m, null, 2)}\n但同时又被其它路由命中:\n${JSON.stringify(unusable, null, 2)}`.red);
129
+ return;
130
+ }
131
+ // tab中配置的页面.route 匹配的页面为模式匹配,需给出告警
132
+ if (!lodash_1.default.isEmpty(matched.params)) {
133
+ console.warn(LOG_PREFIX, `tabBar.list[${index}].route: ${tab.route} 命中的路由 \n${JSON.stringify(m, null, 2)}.route: ${m.route} 为模式匹配\ntab页不能携带参数`.yellow);
134
+ }
135
+ return {
136
+ pagePath,
137
+ text: tab.text,
138
+ iconPath: tab.icon,
139
+ selectedIconPath: tab.activeIcon,
140
+ };
141
+ })
142
+ .filter((tab) => !!tab);
143
+ if (tabs.length < 2 || tabs.length > 5) {
144
+ printError(`tabBar.list 最少 2 个、最多 5 个 tab`.red);
145
+ return cfg;
146
+ }
147
+ _cfg.list = tabs;
148
+ // 找出 tabBar.list[number].pagePath 重复的配置
149
+ const _list = duplicates(tabs, (a, b) => (a.pagePath > b.pagePath ? 1 : a.pagePath == b.pagePath ? 0 : -1), 'pagePath');
150
+ if (_list.length) {
151
+ console.error(LOG_PREFIX, `tabBar.list不能有重复的页面: \n${JSON.stringify(_list, null, 2)}`.red);
152
+ }
153
+ cfg = fields.reduce((o, next) => {
154
+ const [src, t] = typeof next === 'string' ? [next] : next;
155
+ if (rest[src]) {
156
+ o[t || src] = rest[src];
157
+ }
158
+ return o;
159
+ }, _cfg);
160
+ }
161
+ return cfg;
21
162
  }
22
163
  function PluginRouter(api) {
23
164
  let cacheThemeLocation = {};
165
+ let timerId;
24
166
  return {
25
167
  name: '@ray-js/build-plugin-router',
26
168
  setup() {
@@ -40,160 +182,84 @@ function PluginRouter(api) {
40
182
  });
41
183
  }
42
184
  },
43
- buildRoutesConfig(immediate) {
44
- var _a;
185
+ readConfigFromConfigFile() {
45
186
  const routesConfigFile = api.searchJSFile('src/routes.config');
46
- const { target } = api.options;
47
187
  if (!routesConfigFile) {
48
- throw new Error(`missing configuration file (routes.config.ts)`);
188
+ throw new Error(`missing configuration file (routes.config.{ts|js})`);
49
189
  }
50
190
  const globalConfigFile = api.searchJSFile('src/global.config');
51
191
  const routesConfig = api.requireJSFile(routesConfigFile);
52
192
  const globalConfig = globalConfigFile ? api.requireJSFile(globalConfigFile, '*') : {};
53
- // TODO: 小程序端统一生成 app.config 需要过滤 targets 的描述页面对象
54
- if (!['tuya', 'wechat', 'thing'].includes(target)) {
55
- return this.generateWebRoutes(routesConfig);
56
- }
57
- let _target = lodash_1.default.capitalize(target);
58
- if (_target === 'Tuya') {
59
- _target = 'Thing';
60
- }
61
- const thingGlobalConfig = globalConfig['thing'] || globalConfig['tuya'] || {};
62
- const targetGlobalConfig =
63
- // @ts-ignore
64
- target === 'thing' || target === 'tuya' ? thingGlobalConfig : globalConfig[target];
65
- const appConfig = (_a = this[`get${_target}AppConfigData`]) === null || _a === void 0 ? void 0 : _a.call(this, routesConfig, targetGlobalConfig !== null && targetGlobalConfig !== void 0 ? targetGlobalConfig : {});
66
- if (lodash_1.default.isEmpty(appConfig.tabBar)) {
67
- delete appConfig.tabBar; // 微信小程序tabBar不能为空对象,所以当为空对象时,索性所有小程序都删了
193
+ return { routesConfig, globalConfig };
194
+ },
195
+ buildRoutesConfig(immediate) {
196
+ clearTimeout(timerId);
197
+ const { routesConfig, globalConfig } = this.readConfigFromConfigFile();
198
+ // target 在入口处已经统一处理,tuya 会转成 thing
199
+ const { target } = api.options;
200
+ // 不是这两端的,其他的默认为web端,tuya thing 其实为同一个端,统一成 thing
201
+ if (!['wechat', 'thing'].includes(target)) {
202
+ // web端逻辑已经移到 @ray-js/builder-web
203
+ return;
68
204
  }
205
+ const appConfig = this.getStandardAppConfigData(routesConfig, globalConfig);
69
206
  this.generateThemeConfig(appConfig);
70
207
  // FIX: 修复初始化时找不到配置文件
71
208
  // 初始化时,需要立即生成配置文件
72
209
  if (immediate) {
73
- return this.generateAppConfig({ [target]: appConfig });
210
+ return this.generateAppConfig(target, appConfig);
74
211
  }
75
212
  // FIX: 修复间接(更新routes.config.ts)更新app.config.ts文件,无法触发重新编译,导致小程序app.json未更新
76
213
  // 原因:/node_modules/@ray-core/cli/lib/build/watch.js 中的变量isRunning为true
77
214
  // 在更新routes.config.ts触发的编译未完成,又因间接更新app.config.ts的触发重新编译被remax忽略导致
78
215
  // TODO: 此为临时方案,无法确定第一次更新什么时候完成,默认延时1s
79
- setTimeout(() => {
80
- this.generateAppConfig({ [target]: appConfig });
216
+ timerId = setTimeout(() => {
217
+ this.generateAppConfig(target, appConfig);
81
218
  }, 1000);
82
219
  },
83
220
  /**
84
- * 生成微信小程序的 app.config 配置
221
+ * 获取小程序的 app.config 配置
85
222
  * @param routesConfig - routes.config 配置内容
86
- * @param appConfig - 已存在的应用配置
223
+ * @param globalConfig - 已存在的应用配置
87
224
  */
88
- getWechatAppConfigData(routesConfig, globalConfig) {
89
- const { routes, tabBar, subpackages = [] } = routesConfig;
90
- const pages = routes.map((r) => r.path.replace(/^\//, ''));
91
- const tabBarConfig = {};
92
- if (tabBar === null || tabBar === void 0 ? void 0 : tabBar.textColor) {
93
- tabBarConfig.color = tabBar.textColor;
94
- }
95
- if (tabBar === null || tabBar === void 0 ? void 0 : tabBar.borderStyle) {
96
- tabBarConfig.borderStyle = tabBar.borderStyle;
97
- }
98
- if (tabBar === null || tabBar === void 0 ? void 0 : tabBar.selectedColor) {
99
- tabBarConfig.selectedColor = tabBar.selectedColor;
100
- }
101
- if (tabBar === null || tabBar === void 0 ? void 0 : tabBar.backgroundColor) {
102
- tabBarConfig.backgroundColor = tabBar.backgroundColor;
103
- }
104
- if (tabBar === null || tabBar === void 0 ? void 0 : tabBar.list) {
105
- tabBarConfig.list = tabBar.list.map((tab) => {
106
- const pagePath = routes.find((route) => route.id === tab.id);
107
- return {
108
- pagePath: pagePath.path.replace(/^\//, ''),
109
- text: tab.text,
110
- iconPath: tab.icon,
111
- selectedIconPath: tab.activeIcon,
112
- };
113
- });
114
- }
115
- const subpackagesConfig = subpackages.map((subpackage) => {
225
+ getStandardAppConfigData(routesConfig, globalConfig) {
226
+ var _a, _b, _c, _d, _e, _f;
227
+ const { target } = api.options;
228
+ const g = target === 'thing'
229
+ ? (_b = (_a = globalConfig['thing']) !== null && _a !== void 0 ? _a : globalConfig['tuya']) !== null && _b !== void 0 ? _b : {} // 因历史原因,需要兼容老项目的老配置,老项目中都是 tuya
230
+ : (_c = globalConfig[target]) !== null && _c !== void 0 ? _c : {};
231
+ const routes = ((_d = routesConfig.routes) !== null && _d !== void 0 ? _d : []).map((item) => {
116
232
  var _a;
117
- return Object.assign(Object.assign({}, subpackage), { pages: (_a = subpackage.pages) === null || _a === void 0 ? void 0 : _a.map((r) => r.path.replace(/^\//, '')) });
118
- });
119
- const config = Object.assign({}, globalConfig, {
120
- pages,
121
- tabBar: tabBarConfig,
122
- subpackages: subpackagesConfig,
233
+ item.route = (_a = item.route) !== null && _a !== void 0 ? _a : item.path;
234
+ return item;
123
235
  });
124
- return config;
125
- },
126
- getThingAppConfigData(routesConfig, globalConfig) {
127
- const { routes, tabBar } = routesConfig;
128
- const pages = routes.map((r) => r.path.replace(/^\//, ''));
129
- const tabBarConfig = {};
130
- if (tabBar === null || tabBar === void 0 ? void 0 : tabBar.textColor) {
131
- tabBarConfig.color = tabBar.textColor;
132
- }
133
- if (tabBar === null || tabBar === void 0 ? void 0 : tabBar.borderStyle) {
134
- tabBarConfig.borderStyle = tabBar.borderStyle;
135
- }
136
- if (tabBar === null || tabBar === void 0 ? void 0 : tabBar.selectedColor) {
137
- tabBarConfig.selectedColor = tabBar.selectedColor;
138
- }
139
- if (tabBar === null || tabBar === void 0 ? void 0 : tabBar.backgroundColor) {
140
- tabBarConfig.backgroundColor = tabBar.backgroundColor;
141
- }
142
- if (tabBar === null || tabBar === void 0 ? void 0 : tabBar.list) {
143
- tabBarConfig.list = tabBar.list.map((tab) => {
144
- const pagePath = routes.find((route) => route.id === tab.id);
145
- return {
146
- pagePath: pagePath.path.replace(/^\//, ''),
147
- text: tab.text,
148
- iconPath: tab.icon,
149
- selectedIconPath: tab.activeIcon,
150
- };
236
+ const subPkgs = (_f = (_e = routesConfig.subPackages) !== null && _e !== void 0 ? _e : routesConfig.subpackages) !== null && _f !== void 0 ? _f : [];
237
+ const pages = lodash_1.default.uniq(routes.map((r) => r.path.replace(/^\//, '')));
238
+ const tabBar = normalizeTabBarConfig(routesConfig.tabBar, routes, standardAppConfigFieldMap);
239
+ const config = Object.assign(Object.assign({}, g), { pages, tabBar });
240
+ if (subPkgs && subPkgs.length) {
241
+ config.subpackages = subPkgs.map((pkg) => {
242
+ var _a;
243
+ const pages = lodash_1.default.uniq((_a = pkg.pages) === null || _a === void 0 ? void 0 : _a.map((r) => r.path.replace(/^\//, '')));
244
+ return Object.assign(Object.assign({}, pkg), { pages });
151
245
  });
152
246
  }
153
- const config = Object.assign({}, globalConfig, {
154
- pages,
155
- tabBar: tabBarConfig,
156
- });
247
+ if (lodash_1.default.isEmpty(config.tabBar)) {
248
+ lodash_1.default.unset(config, 'tabBar');
249
+ }
157
250
  return config;
158
251
  },
159
- generateAppConfig(data) {
252
+ /**
253
+ * 生成小程序app.config.{js|ts}文件
254
+ * @param data
255
+ */
256
+ generateAppConfig(target, data) {
160
257
  const templateFile = path_1.default.join(__dirname, '../templates/app.config.ejs');
161
- const context = ejsRender(templateFile, { appConfig: data });
258
+ const context = ejsRender(templateFile, { appConfig: { [target]: data } });
162
259
  api.writeFile('src/app.config.ts', context);
163
260
  shared_1.log.verbose(LOG_PREFIX, `generate`, 'src/app.config.ts'.underline.green, `for wechat platform`);
164
261
  },
165
- generateWebRoutes(params) {
166
- const { routes } = params;
167
- const routesConfig = this.routesAdditionConfig(routes);
168
- const templateFile = path_1.default.join(__dirname, '../templates/routes.config.ejs');
169
- const pages = routesConfig.map((item) => {
170
- const chunkName = normalizeRoute(item.id || item.route);
171
- return {
172
- id: item.id || '',
173
- route: item.route,
174
- path: item.path,
175
- config: item.config,
176
- chunkName,
177
- };
178
- });
179
- const context = ejsRender(templateFile, { pages });
180
- api.writeFile('.ray/router.config.ts', context);
181
- shared_1.log.verbose(LOG_PREFIX, `generate`, '.ray/router.config.ts'.green.underline, `for web platform`);
182
- },
183
- /**
184
- * 附加路由的配置信息
185
- * @param routes - 路由配置
186
- */
187
- routesAdditionConfig(routes) {
188
- return routes.map((route) => {
189
- let config = {};
190
- const configFilePath = api.searchJSFile(api.options.source + route.path + '.config');
191
- if (configFilePath) {
192
- config = `require('@${route.path + '.config'}').web || {}`;
193
- }
194
- return Object.assign(Object.assign({}, route), { config: config });
195
- });
196
- },
262
+ // todo theme 逻辑不应该在这个文件
197
263
  generateThemeConfig(appConfig) {
198
264
  const src = this.checkThemeConfig(appConfig.themeLocation);
199
265
  if (cacheThemeLocation.source && cacheThemeLocation.source !== src) {
@@ -214,6 +280,11 @@ function PluginRouter(api) {
214
280
  let { cwd, target } = api.options;
215
281
  // TODO 这里待优化
216
282
  if (target === 'thing') {
283
+ /**
284
+ * 又是历史原因
285
+ * 因老项目生成的产物目录是tuya,所以就干脆是tuya,不然会出现既 tuya 又 thing 的目录
286
+ * 将开发整懵逼
287
+ */
217
288
  // @ts-ignore
218
289
  target = 'tuya';
219
290
  }
@@ -239,4 +310,3 @@ function PluginRouter(api) {
239
310
  };
240
311
  }
241
312
  exports.default = PluginRouter;
242
- //# sourceMappingURL=index.js.map
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ray-js/build-plugin-router",
3
- "version": "0.6.21",
3
+ "version": "0.6.22-beta-2",
4
4
  "description": "Ray build plugin for router",
5
5
  "keywords": [
6
6
  "ray"
@@ -21,14 +21,16 @@
21
21
  "watch": "tsc -p ./tsconfig.build.json --watch"
22
22
  },
23
23
  "dependencies": {
24
- "@ray-js/shared": "^0.6.21",
24
+ "@ray-js/shared": "^0.6.22-beta-2",
25
25
  "chokidar": "^3.5.2",
26
26
  "colors": "1.4.0",
27
27
  "ejs": "^3.1.6",
28
- "fs-extra": "^10.0.0"
28
+ "fs-extra": "^10.0.0",
29
+ "path-to-regexp": "^6.2.1",
30
+ "url": "^0.11.0"
29
31
  },
30
32
  "devDependencies": {
31
- "@ray-js/types": "^0.6.21"
33
+ "@ray-js/types": "^0.6.22-beta-2"
32
34
  },
33
35
  "maintainers": [
34
36
  {
@@ -36,6 +38,6 @@
36
38
  "email": "tuyafe@tuya.com"
37
39
  }
38
40
  ],
39
- "gitHead": "cbb81571d068e6997e9b1fe95198c1b0275112e7",
41
+ "gitHead": "5d621bf1561047175b967cdf3aa35446f7d7198a",
40
42
  "repository": {}
41
43
  }
@@ -3,7 +3,6 @@
3
3
  export const PAGES = [
4
4
  <%_ pages.forEach(function(page) { _%>
5
5
  {
6
- id: '<%= page.id %>',
7
6
  route: '<%= page.route %>',
8
7
  path: '<%= page.path %>',
9
8
  config: <%- typeof page.config === 'string' ? page.config : JSON.stringify(page.config) %>,
package/lib/index.js.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}