@tuya-sat/micro-script 3.3.17 → 3.3.18

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.
@@ -1,21 +1,75 @@
1
+ import { ConfigProviderProps } from 'antd';
1
2
  import { CaptureContext, Event, Severity } from '@sentry/types';
2
3
 
3
- type IState = { [k in string]: string | number | null };
4
- interface mainHistory {
5
- push: (path: string, state?: IState) => void;
6
- replace: (path: string, state?: IState) => void;
7
- go: (n: number) => void;
8
- goBack: () => void;
9
- goForward: () => void;
4
+ type ThemeMode = 'light' | 'dark';
5
+
6
+ interface UserInfo {
7
+ user_nick_name: string;
8
+ user_name: string;
9
+ roles: Array<{
10
+ role_code: string;
11
+ role_name: string;
12
+ }>;
13
+ mobile?: string;
14
+ email?: string;
15
+ country_code?: string;
16
+ user_id?: string;
17
+ root_namespace?: string;
18
+ current_namespace?: string;
19
+ current_namespace_name?: string;
20
+ head_pic?: string
21
+ username?: string;
22
+ nickname?: string;
23
+ timezone_display_name?: string;
10
24
  }
25
+ interface MainHistoryState {
26
+ /**
27
+ * 微应用唯一id(优先级最高)
28
+ */
29
+ universal_id?: string;
30
+ /**
31
+ * 微应用代码
32
+ */
33
+ app_code?: string;
34
+
35
+ /**
36
+ * 是否在新的标签页中打开
37
+ */
38
+ blank?: boolean;
11
39
 
12
- interface DynamicProps {
13
- setBreadcrumb: SetBreadcrumb;
40
+ /**
41
+ * 其他状态
42
+ */
14
43
  [key: string]: any;
15
- }
44
+ };
45
+ interface MainHistory {
46
+ /**
47
+ * 跳转到一个新的路径
48
+ * @param path 路径
49
+ * @param state 状态
50
+ */
51
+ push: (path: string, state?: MainHistoryState) => void;
52
+ /**
53
+ * 替换当前路径
54
+ * @param path 路径
55
+ * @param state 状态
56
+ */
57
+ replace: (path: string, state?: MainHistoryState) => void;
16
58
 
17
- interface SetBreadcrumb {
18
- (breadcrumbInfos?: BreadcrumbInfoInput[]): void;
59
+ /**
60
+ * 导航到历史记录中的上一个路径
61
+ */
62
+ go: (n: number) => void;
63
+
64
+ /**
65
+ * 导航到历史记录中的上一个路径
66
+ */
67
+ goBack: () => void;
68
+
69
+ /**
70
+ * 导航到历史记录中的下一个路径
71
+ */
72
+ goForward: () => void;
19
73
  }
20
74
 
21
75
  type BreadcrumbInfoInput =
@@ -23,40 +77,422 @@ type BreadcrumbInfoInput =
23
77
  type: 'auto' | 'root';
24
78
  name?: never;
25
79
  path?: never;
80
+ goBack?(): void;
26
81
  }
27
82
  | {
28
83
  type: 'menu';
29
84
  name?: never;
30
85
  path: string;
86
+ goBack?(): void;
31
87
  }
32
88
  | {
33
89
  type: 'c';
34
90
  name: string;
35
91
  path: string;
92
+ render?(eleTitle: HTMLDivElement): void;
93
+ goBack?(): void;
36
94
  };
37
95
 
96
+ interface SetBreadcrumb {
97
+ (
98
+ breadcrumbInfos?: BreadcrumbInfoInput[],
99
+ /**
100
+ * 针对 v5/v6 版微应用的额外操作
101
+ */
102
+ actions?: {
103
+ activeKey?: string;
104
+ hideFullScreen?: boolean;
105
+ options?: Array<{
106
+ label: string;
107
+ value: string;
108
+ tooltip: string;
109
+ }>;
110
+ onClick?(key: string): void;
111
+ renderExtra?(eleExtra: HTMLDivElement): void;
112
+ }
113
+ ): void;
114
+ }
115
+
116
+ type ThemeSubscribeGetValue =
117
+ | (
118
+ /**
119
+ * 获取当前主题(v4 版微应用)
120
+ * @example 'light' | 'dark'
121
+ */
122
+ () => ThemeMode
123
+ )
124
+ | (
125
+ /**
126
+ * 获取当前主题(v5/v6 版微应用)
127
+ * @example { theme: { themeMode: 'light' | 'dark' }, ... }
128
+ */
129
+ () => ConfigProviderProps & {
130
+ theme: ConfigProviderProps['theme'] & { themeMode: ThemeMode };
131
+ }
132
+ );
133
+
134
+
135
+ type MqttStatus = 'connected' | 'reconnecting' | 'reconnect_failed' | 'offline' | 'close' | 'error';
136
+ interface MqttStatusEvent {
137
+ status: MqttStatus;
138
+ remainingRetries?: number;
139
+ maxRetries?: number;
140
+ error?: any;
141
+ }
142
+ type MqttStatusListener = (event: MqttStatusEvent) => void;
143
+ export interface SubscribeTopicOption {
144
+ /** 为 true 时不记入 micTopics,卸载微应用时不会随 unsubscribeMicTopics 一起取消 */
145
+ isGlobal?: boolean;
146
+ /** 与 topic 一一对应;不传则仅按 topic 匹配,不校验 protocol */
147
+ protocol?: number;
148
+ }
149
+
150
+ type MqttTopic = string | ((uid: string) => string);
151
+
152
+ interface PublishTopicOption {
153
+ protocol?: number; // 下发协议号
154
+ type?: string; // 消息类型,默认 ''
155
+ v?: number; // 协议版本,默认 1
156
+ qos?: 0 | 1 | 2; // MQTT QoS 等级,默认 0
157
+ retain?: boolean; // 是否保留消息
158
+ isRaw?: boolean; // true:跳过标准封装,直接发送 data
159
+ }
160
+
161
+ /**
162
+ * 数据模型类型
163
+ * basic: 基础数据模型。对应 v4 版微应用
164
+ * smart_space: 空间智能行业。对应 v5 版微应用
165
+ * smart_home: 空间智能。对应 v6 版微应用
166
+ */
167
+ type DATA_MODEL = 'basic' | 'smart_space' | 'smart_home';
168
+
38
169
  export interface IQiankunProps {
170
+ /**
171
+ * 微应用基础路径
172
+ * @example '/apps/2004417307740209166'
173
+ */
39
174
  base: string;
40
- container: HTMLElement; // 子应用所在容器
41
- dynamicProps: DynamicProps; // 面包屑
42
- getOwnMenu: () => { entry_name: string }; // 获取当前选中菜单
175
+
176
+ /**
177
+ * 子应用所在容器
178
+ * @example document.querySelector('#root')
179
+ */
180
+ container: HTMLElement;
181
+
182
+ /**
183
+ * 微应用自定义配置
184
+ * @example '{"hello": "just for test"}'
185
+ */
186
+ customConfig: string | null;
187
+
188
+ /**
189
+ * 主应用 window 对象。
190
+ * 由于 qiankun 的沙箱机制,在使用三方包时,某些功能(比如 jsonp)无法将属性挂载到全局对象上
191
+ * 此时可以通过此属性获取主应用 window 对象,从而调用主应用的某些功能
192
+ */
193
+ mWindow: Window;
194
+
195
+ /**
196
+ * 用于微应用间跳转
197
+ */
198
+ mainHistory: MainHistory;
199
+
200
+ /**
201
+ * 当前家庭/项目ID(v5/v6 版微应用)
202
+ * @example '34808062'
203
+ */
204
+ projectId: string;
205
+
206
+ /**
207
+ * 当前业务隔离类型(v5/v6 版微应用)
208
+ * @example 'homeId'
209
+ */
210
+ isolationType: 'projectId' | 'homeId' | null;
211
+
212
+ /**
213
+ * SaaS 所属行业类型
214
+ * @example 'smart_home'
215
+ */
216
+ industryType:
217
+ | 'smart_space' // 空间智能行业
218
+ | 'smart_home' // 空间智能
219
+ | 'smart_operation' // 智能运营
220
+ | 'ems_energy' // 能源管理
221
+ | 'appliance' // 家电
222
+ | 'light' // 照明
223
+ | 'content_manage' // 内容管理
224
+ | string;
225
+
226
+ /**
227
+ * 是否支持移动端
228
+ * @example true
229
+ */
230
+ isSupportMobile: boolean;
231
+
232
+ /**
233
+ * 当前区域
234
+ * - tx: 中国大陆
235
+ * - us: 美国
236
+ * - eu: 欧洲
237
+ * - in: 印度
238
+ * - ueaz: 美东
239
+ * - we: 西欧
240
+ * - sg: 新加坡
241
+ * @example 'tx'
242
+ */
243
+ region: 'tx' | 'us' | 'eu' | 'in' | 'ueaz' | 'we' | 'sg';
244
+
245
+ /**
246
+ * 微应用静态资源入口地址前缀
247
+ * @example 'https://static1.tuyacn.com/static/xxxxx/0.0.1'
248
+ */
249
+ resourcePrefix: string;
250
+
251
+ /**
252
+ * 获取当前菜单信息
253
+ * @example { entry_name: '首页', entry_name_en: 'Home' }
254
+ */
255
+ getOwnMenu: () => {
256
+ entry_name: string;
257
+ entry_name_en: string;
258
+ };
259
+
260
+ /**
261
+ * 判断是否存在指定微应用
262
+ * @param appCodeOrUuid 微应用代码或 UUID
263
+ * @example (appCodeOrUuid: string) => true
264
+ */
265
+ hasMicroApp?: (appCodeOrUuid: string) => boolean;
266
+
267
+ /**
268
+ * 是否拥有当前微应用的某个权限点
269
+ * @param permissionCode 权限点代码
270
+ * @example (permissionCode: string) => true
271
+ */
43
272
  hasPermission: (permissionCode: string) => boolean;
44
- isSupportMobile: boolean; // 是否支持移动端
45
- mainHistory: mainHistory; // 用于微应用间跳转
46
- modifySelectedMenu: () => void; //
47
- region: 'tx' | 'us' | 'eu' | 'in' | 'ueaz' | 'we' | 'sea';
48
- resourcePrefix: string; // 静态资源地址
273
+
274
+ /**
275
+ * 是否拥有指定微应用的某个权限点
276
+ * @param appCodeOrUuid 微应用代码或 UUID
277
+ * @param permissionCode 权限点代码
278
+ * @example (appCodeOrUuid: string, permissionCode: string) => true
279
+ */
280
+ hasGPermission: (appCodeOrUuid: string, permissionCode: string) => boolean;
281
+
282
+ /**
283
+ * 动态属性
284
+ */
285
+ dynamicProps: {
286
+ /**
287
+ * 自定义面包屑
288
+ */
289
+ setBreadcrumb: SetBreadcrumb;
290
+ [key: string]: any;
291
+ };
292
+
293
+ /**
294
+ * 修改当前选中菜单(v4 版微应用)
295
+ */
296
+ modifySelectedMenu: () => void;
297
+
298
+ /**
299
+ * v5/v6 版微应用 MQTT 相关接口
300
+ */
301
+ mqtt: {
302
+ /**
303
+ * 订阅指定 topic,收到消息时调用 cbFn
304
+ * @param topic 主题
305
+ * @param cbFn 回调函数
306
+ * @param option 选项
307
+ * @example subscribeTopic((uid: string) => `topic/${uid}/test`, (msg) => { console.log(msg); })
308
+ */
309
+ subscribeTopic: (
310
+ topic: MqttTopic,
311
+ cbFn?: (msg: any) => void,
312
+ option?: SubscribeTopicOption
313
+ ) => void;
314
+
315
+ /**
316
+ * 向指定 topic 发布消息
317
+ * @param topic 主题
318
+ * @param data 消息
319
+ * @param option 选项
320
+ * @example publishTopic((uid: string) => `topic/${uid}/test`, { message: 'hello' }, { protocol: 201 })
321
+ */
322
+ publishTopic: (
323
+ topic: MqttTopic,
324
+ data: any,
325
+ option?: PublishTopicOption
326
+ ) => Promise<void>;
327
+
328
+ /**
329
+ * 取消订阅指定 topic
330
+ * @param topic 主题
331
+ * @example unsubscribeTopic((uid: string) => `topic/${uid}/test`)
332
+ */
333
+ unsubscribeTopic: (topic?: MqttTopic) => void;
334
+
335
+ /**
336
+ * 监听 MQTT 连接状态变化
337
+ * @param listener 监听函数
338
+ * @example onStatusChange((evt) => { console.log(evt); })
339
+ */
340
+ onStatusChange(listener: MqttStatusListener): () => void
341
+ }
342
+
343
+ /**
344
+ * v5/v6 版微应用使用旧版 mqtt 相关接口替代
345
+ * @deprecated 慎用,以后会移除
346
+ */
347
+ mqttV4: {
348
+ /**
349
+ * 订阅指定 topic,收到消息时调用 cbFn
350
+ * @param bizType 业务类型
351
+ * @param cbFn 回调函数
352
+ * @param option 选项
353
+ * @example subscribeTopic('somebiztype', (msg) => { console.log(msg); })
354
+ */
355
+ subscribeTopic(
356
+ bizType: string,
357
+ cbFn?: (msg: any) => void,
358
+ option?: {
359
+ isGlobal: boolean;
360
+ }
361
+ ): void;
362
+
363
+ /**
364
+ * 取消订阅指定 topic
365
+ * @param bizType 业务类型
366
+ * @example unsubscribeTopic('somebiztype')
367
+ */
368
+ unsubscribeTopic(bizType: string): void;
369
+ }
370
+
371
+ /**
372
+ * sentry 错误上报
373
+ */
49
374
  sentry: {
50
375
  captureEvent: (event: Event) => string;
51
- captureMessage: (
52
- message: string,
53
- captureContext?: CaptureContext | Severity
54
- ) => string;
55
- captureException: (
56
- exception: any,
57
- captureContext?: CaptureContext
58
- ) => string;
376
+ captureMessage: (message: string, captureContext?: CaptureContext | Severity) => string;
377
+ captureException: (exception: any, captureContext?: CaptureContext) => string;
59
378
  };
60
- tyLang: 'zh' | 'en'; // 当前语言
61
- langResource: any;
379
+
380
+ /**
381
+ * 设置微应用加载状态
382
+ * @param loading 是否加载中
383
+ */
384
+ setLoading: (loading: boolean) => void;
385
+
386
+ /**
387
+ * 当前语言
388
+ * @example 'zh'
389
+ */
390
+ tyLang: 'zh' | 'en' | string;
391
+
392
+ /**
393
+ * 微应用国际化语言资源
394
+ * @example { zh: { 'hello': '你好' }, en: { 'hello': 'Hello' } }
395
+ */
396
+ langResource: {
397
+ zh: Record<string, string>;
398
+ en: Record<string, string>;
399
+ [key: string]: Record<string, string>;
400
+ };
401
+
402
+ /**
403
+ * 获取当前登录用户信息(v5/v6 版微应用)
404
+ * @example { user_nick_name: '张三', user_name: 'zhangsan', roles: [{ role_code: 'admin', role_name: '管理员' }], mobile: '13888888888', email: 'zhangsan@tuyacn.com', country_code: '86', user_id: '1234567890', root_namespace: 'root', current_namespace: 'current', current_namespace_name: '当前空间', head_pic: 'https://static1.tuyacn.com/static/xxxxx/0.0.1', username: 'zhangsan', nickname: '张三', timezone_display_name: 'Asia/Shanghai' }
405
+ */
406
+ getCurrentUser: () => UserInfo | null;
407
+
408
+ /**
409
+ * 获取当前登录用户信息(v4 版微应用)
410
+ * @deprecated v5/v6 版使用 `getCurrentUser()` 替代
411
+ * @example { user_nick_name: '张三', user_name: 'zhangsan', roles: [{ role_code: 'admin', role_name: '管理员' }], mobile: '13888888888', email: 'zhangsan@tuyacn.com', country_code: '86', user_id: '1234567890', root_namespace: 'root', current_namespace: 'current', current_namespace_name: '当前空间', head_pic: 'https://static1.tuyacn.com/static/xxxxx/0.0.1', username: 'zhangsan', nickname: '张三', timezone_display_name: 'Asia/Shanghai' }
412
+ */
413
+ user(): UserInfo | null;
414
+
415
+ /**
416
+ * 获取当前主题
417
+ * @example 'light' | 'dark'
418
+ */
419
+ gTheme(): ThemeMode;
420
+
421
+ /**
422
+ * 订阅主题
423
+ */
424
+ themeSubscribe: {
425
+ getValue: ThemeSubscribeGetValue;
426
+ subscribe: (cb: (type: ThemeMode, data: any) => void) => () => void;
427
+ };
428
+
429
+ /**
430
+ * 设置头部是否显示(v5/v6 版微应用)
431
+ * @param visible 是否显示头部
432
+ * @returns
433
+ */
434
+ setHeaderVisible: (visible: boolean) => void;
435
+
436
+ /**
437
+ * 设置侧边栏是否显示(v5/v6 版微应用)
438
+ * @param visible 是否显示侧边栏
439
+ * @returns
440
+ */
441
+ setSiderVisible: (visible: boolean) => void;
442
+
443
+ /**
444
+ * 设置侧边栏折叠状态(v5/v6 版微应用)
445
+ * @param collapsed 是否折叠侧边栏
446
+ * @returns
447
+ */
448
+ setSiderCollapsed: (collapsed: boolean) => void;
449
+
450
+ /**
451
+ * 隐藏菜单
452
+ * @deprecated 使用 `setSiderVisible()` 替代
453
+ * @param hidden 是否隐藏菜单
454
+ * @returns
455
+ */
456
+ hideMenus: (hidden?: boolean) => void;
457
+
458
+ /**
459
+ * 隐藏导航
460
+ * @deprecated 使用 `setHeaderVisible()`
461
+ * @param hidden 是否隐藏导航
462
+ * @returns
463
+ */
464
+ hideNav: (hidden?: boolean) => void;
465
+
466
+ /**
467
+ * 切换语言(v6 版微应用)
468
+ * @param lang 语言代码
469
+ * @param reload 是否刷新页面,默认为 true
470
+ * @example switchLang('en')
471
+ */
472
+ switchLang(lang: 'zh' | 'en' | string, reload?: boolean): void;
473
+
474
+ /**
475
+ * 切换家庭(v5/v6 版微应用)
476
+ * @param homeId 家庭ID
477
+ * @param autoRefresh 是否自动刷新,默认为 true
478
+ * @returns
479
+ */
480
+ switchHome: (homeId: string) => void;
481
+
482
+ /**
483
+ * 上报 tpm 事件
484
+ * @param key 事件key
485
+ * @param params 事件参数
486
+ */
487
+ tpmTrack: (key: string, params?: Record<string, any>) => void;
488
+
489
+ /**
490
+ * 由 qiankun 注入
491
+ */
492
+ setGlobalState: (state: any) => void;
493
+
494
+ /**
495
+ * 由 qiankun 注入
496
+ */
497
+ onGlobalStateChange: (func: (state: any, prev?: any) => void, watch?: boolean) => void;
62
498
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@tuya-sat/micro-script",
3
- "version": "3.3.17",
3
+ "version": "3.3.18",
4
4
  "bin": "./dist/bin/cli.js",
5
5
  "type": "commonjs",
6
6
  "license": "MIT",
@@ -23,9 +23,9 @@
23
23
  "@babel/preset-typescript": "7.16.7",
24
24
  "@babel/traverse": "^7.20.13",
25
25
  "@pmmmwh/react-refresh-webpack-plugin": "0.5.4",
26
- "@tuya-sat/micro-dev-loader": "3.3.17",
27
- "@tuya-sat/micro-dev-proxy": "3.3.17",
28
- "@tuya-sat/micro-utils": "3.3.17",
26
+ "@tuya-sat/micro-dev-loader": "3.3.18",
27
+ "@tuya-sat/micro-dev-proxy": "3.3.18",
28
+ "@tuya-sat/micro-utils": "3.3.18",
29
29
  "@types/kill-port": "^2.0.0",
30
30
  "babel-loader": "8.2.4",
31
31
  "babel-plugin-import": "1.13.3",