@agions/taroviz 1.1.1 → 1.2.1

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.
Files changed (81) hide show
  1. package/README.md +324 -53
  2. package/dist/cjs/index.js +1 -0
  3. package/dist/esm/index.js +82979 -0
  4. package/package.json +160 -30
  5. package/src/__tests__/integration.test.tsx +168 -0
  6. package/src/adapters/__tests__/index.test.ts +91 -0
  7. package/src/adapters/h5/__tests__/index.test.ts +156 -0
  8. package/src/adapters/h5/index.ts +301 -0
  9. package/src/adapters/harmony/index.ts +274 -0
  10. package/src/adapters/index.ts +166 -0
  11. package/src/adapters/swan/index.ts +274 -0
  12. package/src/adapters/tt/index.ts +274 -0
  13. package/src/adapters/types.ts +162 -0
  14. package/src/adapters/weapp/index.ts +237 -0
  15. package/src/charts/bar/__tests__/index.test.tsx +113 -0
  16. package/src/charts/bar/index.tsx +18 -0
  17. package/src/charts/common/BaseChartWrapper.tsx +136 -0
  18. package/src/charts/funnel/index.tsx +18 -0
  19. package/src/charts/gauge/index.tsx +18 -0
  20. package/src/charts/heatmap/index.tsx +18 -0
  21. package/src/charts/index.ts +21 -0
  22. package/src/charts/line/__tests__/index.test.tsx +107 -0
  23. package/src/charts/line/index.tsx +18 -0
  24. package/src/charts/pie/__tests__/index.test.tsx +112 -0
  25. package/src/charts/pie/index.tsx +19 -0
  26. package/src/charts/radar/index.tsx +18 -0
  27. package/src/charts/scatter/index.tsx +18 -0
  28. package/src/charts/types.ts +619 -0
  29. package/src/charts/utils.ts +56 -0
  30. package/src/core/__tests__/platform.test.ts +48 -0
  31. package/src/core/animation/AnimationManager.ts +391 -0
  32. package/src/core/animation/index.ts +20 -0
  33. package/src/core/animation/types.ts +248 -0
  34. package/src/core/components/BaseChart.tsx +1313 -0
  35. package/src/core/components/ErrorBoundary.tsx +458 -0
  36. package/src/core/echarts.ts +58 -0
  37. package/src/core/index.ts +22 -0
  38. package/src/core/types/chart.ts +66 -0
  39. package/src/core/types/common.ts +224 -0
  40. package/src/core/types/index.ts +281 -0
  41. package/src/core/types/platform.ts +325 -0
  42. package/src/core/utils/__tests__/common.test.ts +52 -0
  43. package/src/core/utils/__tests__/environment.test.ts +94 -0
  44. package/src/core/utils/__tests__/i18n.test.ts +247 -0
  45. package/src/core/utils/__tests__/index.test.ts +219 -0
  46. package/src/core/utils/__tests__/uuid.test.ts +78 -0
  47. package/src/core/utils/chartInstances.ts +69 -0
  48. package/src/core/utils/codeGenerator/CodeGenerator.ts +655 -0
  49. package/src/core/utils/codeGenerator/index.ts +13 -0
  50. package/src/core/utils/codeGenerator/types.ts +198 -0
  51. package/src/core/utils/common.ts +58 -0
  52. package/src/core/utils/configGenerator/ConfigGenerator.ts +583 -0
  53. package/src/core/utils/configGenerator/index.ts +13 -0
  54. package/src/core/utils/configGenerator/types.ts +445 -0
  55. package/src/core/utils/debug/DebugPanel.tsx +637 -0
  56. package/src/core/utils/debug/debugger.ts +322 -0
  57. package/src/core/utils/debug/index.ts +21 -0
  58. package/src/core/utils/debug/types.ts +142 -0
  59. package/src/core/utils/i18n.ts +452 -0
  60. package/src/core/utils/index.ts +162 -0
  61. package/src/core/utils/performance/PerformanceAnalyzer.ts +586 -0
  62. package/src/core/utils/performance/index.ts +13 -0
  63. package/src/core/utils/performance/types.ts +180 -0
  64. package/src/core/utils/uuid.ts +30 -0
  65. package/src/editor/ThemeEditor.tsx +449 -0
  66. package/src/editor/index.ts +10 -0
  67. package/src/hooks/__tests__/index.test.tsx +333 -0
  68. package/src/hooks/index.ts +594 -0
  69. package/src/index.ts +75 -0
  70. package/src/main.tsx +247 -0
  71. package/src/react-dom.d.ts +7 -0
  72. package/src/themes/__tests__/index.test.ts +91 -0
  73. package/src/themes/index.ts +860 -0
  74. package/dist/389.index.esm.js +0 -1
  75. package/dist/389.index.js +0 -1
  76. package/dist/633.index.esm.js +0 -1
  77. package/dist/633.index.js +0 -1
  78. package/dist/967.index.esm.js +0 -1
  79. package/dist/967.index.js +0 -1
  80. package/dist/index.esm.js +0 -1
  81. package/dist/index.js +0 -1
@@ -0,0 +1,619 @@
1
+ /**
2
+ * TaroViz Charts 类型定义 - 增强版
3
+ */
4
+ import type { CSSProperties, ReactNode } from 'react';
5
+ import type { EChartsOption, ECharts } from 'echarts';
6
+
7
+ // ============================================================================
8
+ // 基础类型定义
9
+ // ============================================================================
10
+
11
+ /** 尺寸类型 */
12
+ export type SizeValue = number | string | 'auto';
13
+
14
+ /** 尺寸配置 */
15
+ export interface SizeConfig {
16
+ width?: SizeValue;
17
+ height?: SizeValue;
18
+ }
19
+
20
+ /** 主题配置 */
21
+ export interface ThemeConfig {
22
+ /** 主题名称 */
23
+ name?: string;
24
+ /** 主题对象 */
25
+ theme?: Record<string, unknown>;
26
+ /** 是否为暗色主题 */
27
+ isDark?: boolean;
28
+ }
29
+
30
+ /** 渲染器类型 */
31
+ export type RendererType = 'canvas' | 'svg';
32
+
33
+ /** 图表加载状态 */
34
+ export interface LoadingState {
35
+ /** 是否显示加载 */
36
+ show: boolean;
37
+ /** 加载文本 */
38
+ text?: string;
39
+ /** 加载动画配置 */
40
+ options?: LoadingOptions;
41
+ }
42
+
43
+ /** 加载动画配置 */
44
+ export interface LoadingOptions {
45
+ /** 动画效果 */
46
+ effect?: 'spin' | 'circle' | 'rect' | 'triangle' | 'dotted';
47
+ /** 颜色 */
48
+ color?: string;
49
+ /** 背景色 */
50
+ backgroundColor?: string;
51
+ /** 文字颜色 */
52
+ textColor?: string;
53
+ /** 文字大小 */
54
+ textFontSize?: number;
55
+ /** 动画时长 */
56
+ duration?: number;
57
+ /** 遮罩层颜色 */
58
+ maskColor?: string;
59
+ /** 是否显示遮罩 */
60
+ showMask?: boolean;
61
+ }
62
+
63
+ // ============================================================================
64
+ // 事件回调类型
65
+ // ============================================================================
66
+
67
+ /** 图表初始化回调 */
68
+ export type ChartInitCallback = (chart: ECharts) => void;
69
+
70
+ /** 图表就绪回调 */
71
+ export type ChartReadyCallback = (chart: ECharts) => void;
72
+
73
+ /** 图表事件回调 */
74
+ export type ChartEventCallback<T = unknown> = (params: T) => void;
75
+
76
+ /** 图表事件映射 */
77
+ export interface ChartEvents {
78
+ /** 点击事件 */
79
+ click?: ChartEventCallback;
80
+ /** 双击事件 */
81
+ dblclick?: ChartEventCallback;
82
+ /** 右键菜单事件 */
83
+ contextmenu?: ChartEventCallback;
84
+ /** 鼠标按下事件 */
85
+ mousedown?: ChartEventCallback;
86
+ /** 鼠标释放事件 */
87
+ mouseup?: ChartEventCallback;
88
+ /** 鼠标悬停事件 */
89
+ mouseover?: ChartEventCallback;
90
+ /** 鼠标离开事件 */
91
+ mouseout?: ChartEventCallback;
92
+ /** 数据范围改变事件 */
93
+ datazoom?: ChartEventCallback;
94
+ /** 图例选择变化事件 */
95
+ legendselectchanged?: ChartEventCallback;
96
+ /** 图例悬停事件 */
97
+ legendhoverlink?: ChartEventCallback;
98
+ /** 序列数据项高亮 */
99
+ highlight?: ChartEventCallback;
100
+ /** 序列数据项取消高亮 */
101
+ downplay?: ChartEventCallback;
102
+ /** 工具提示触发事件 */
103
+ showtip?: ChartEventCallback;
104
+ /** 隐藏工具提示事件 */
105
+ hidetip?: ChartEventCallback;
106
+ }
107
+
108
+ // ============================================================================
109
+ // 响应式配置
110
+ // ============================================================================
111
+
112
+ /** 响应式断点 */
113
+ export interface ResponsiveBreakpoints {
114
+ /** 小屏幕 (< 576px) */
115
+ sm?: Partial<BaseChartProps>;
116
+ /** 中等屏幕 (≥ 576px) */
117
+ md?: Partial<BaseChartProps>;
118
+ /** 大屏幕 (≥ 992px) */
119
+ lg?: Partial<BaseChartProps>;
120
+ /** 超大屏幕 (≥ 1200px) */
121
+ xl?: Partial<BaseChartProps>;
122
+ }
123
+
124
+ /** 响应式配置 */
125
+ export interface ResponsiveConfig {
126
+ /** 是否启用响应式 */
127
+ enabled?: boolean;
128
+ /** 断点配置 */
129
+ breakpoints?: ResponsiveBreakpoints;
130
+ /** 切换去抖延迟 (ms) */
131
+ debounceDelay?: number;
132
+ }
133
+
134
+ // ============================================================================
135
+ // 数据类型
136
+ // ============================================================================
137
+
138
+ /** 数据系列 */
139
+ export interface DataSeries<T = unknown> {
140
+ /** 系列名称 */
141
+ name: string;
142
+ /** 系列数据 */
143
+ data: T[];
144
+ /** 系列类型 */
145
+ type?: string;
146
+ /** 系列样式 */
147
+ style?: Record<string, unknown>;
148
+ /** 是否禁用 */
149
+ disabled?: boolean;
150
+ }
151
+
152
+ /** 图表数据 */
153
+ export interface ChartData {
154
+ /** 类别轴数据 (用于折线图、柱状图等) */
155
+ categories?: (string | number)[];
156
+ /** 数据系列 */
157
+ series?: DataSeries[];
158
+ /** 原始数据 (用于饼图、散点图等) */
159
+ values?: unknown[];
160
+ }
161
+
162
+ // ============================================================================
163
+ // 动画配置
164
+ // ============================================================================
165
+
166
+ /** 动画配置 */
167
+ export interface AnimationConfig {
168
+ /** 是否启用动画 */
169
+ enabled?: boolean;
170
+ /** 动画时长 (ms) */
171
+ duration?: number;
172
+ /** 动画缓动函数 */
173
+ easing?: string;
174
+ /** 动画延迟 (ms) */
175
+ delay?: number;
176
+ /** 是否在渲染时使用动画 */
177
+ animate?: boolean;
178
+ /** 是否在数据更新时使用动画 */
179
+ animateUpdate?: boolean;
180
+ }
181
+
182
+ // ============================================================================
183
+ // 基础图表属性
184
+ // ============================================================================
185
+
186
+ /**
187
+ * 图表组件基本属性
188
+ */
189
+ export interface BaseChartProps {
190
+ // ---------- 核心配置 ----------
191
+
192
+ /**
193
+ * 图表配置项 (EChartsOption)
194
+ * 支持所有 ECharts 配置项
195
+ */
196
+ option?: EChartsOption;
197
+
198
+ /**
199
+ * 简化的数据配置
200
+ * 用于快速配置图表数据
201
+ */
202
+ data?: ChartData;
203
+
204
+ // ---------- 尺寸配置 ----------
205
+
206
+ /**
207
+ * 宽度
208
+ * @default '100%'
209
+ */
210
+ width?: SizeValue;
211
+
212
+ /**
213
+ * 高度
214
+ * @default 400
215
+ */
216
+ height?: SizeValue;
217
+
218
+ /**
219
+ * 最小宽度
220
+ */
221
+ minWidth?: SizeValue;
222
+
223
+ /**
224
+ * 最小高度
225
+ */
226
+ minHeight?: SizeValue;
227
+
228
+ /**
229
+ * 最大宽度
230
+ */
231
+ maxWidth?: SizeValue;
232
+
233
+ /**
234
+ * 最大高度
235
+ */
236
+ maxHeight?: SizeValue;
237
+
238
+ // ---------- 主题配置 ----------
239
+
240
+ /**
241
+ * 主题名称或主题对象
242
+ * 可使用内置主题: 'default', 'dark', 'light', 'vintage', 'macarons', 'infographic'
243
+ * 或自定义主题对象
244
+ */
245
+ theme?: string | Record<string, unknown>;
246
+
247
+ /**
248
+ * 暗色模式
249
+ * @default false
250
+ */
251
+ darkMode?: boolean;
252
+
253
+ // ---------- 样式配置 ----------
254
+
255
+ /**
256
+ * 容器样式
257
+ */
258
+ style?: CSSProperties;
259
+
260
+ /**
261
+ * 容器类名
262
+ */
263
+ className?: string;
264
+
265
+ /**
266
+ * 容器 ID
267
+ */
268
+ id?: string;
269
+
270
+ // ---------- 响应式配置 ----------
271
+
272
+ /**
273
+ * 是否自动调整大小
274
+ * @default true
275
+ */
276
+ autoResize?: boolean;
277
+
278
+ /**
279
+ * 响应式配置
280
+ */
281
+ responsive?: ResponsiveConfig;
282
+
283
+ // ---------- 加载状态 ----------
284
+
285
+ /**
286
+ * 是否显示加载动画
287
+ * @default false
288
+ */
289
+ loading?: boolean;
290
+
291
+ /**
292
+ * 加载动画配置
293
+ */
294
+ loadingOption?: LoadingOptions;
295
+
296
+ /**
297
+ * 加载状态文本
298
+ */
299
+ loadingText?: string;
300
+
301
+ // ---------- 回调函数 ----------
302
+
303
+ /**
304
+ * 图表实例初始化完成回调
305
+ */
306
+ onChartInit?: ChartInitCallback;
307
+
308
+ /**
309
+ * 图表渲染完成回调
310
+ */
311
+ onChartReady?: ChartReadyCallback;
312
+
313
+ /**
314
+ * 图表事件回调
315
+ */
316
+ onEvents?: ChartEvents;
317
+
318
+ /**
319
+ * 错误回调
320
+ */
321
+ onError?: (error: Error) => void;
322
+
323
+ // ---------- 渲染配置 ----------
324
+
325
+ /**
326
+ * 渲染器类型
327
+ * @default 'canvas'
328
+ */
329
+ renderer?: RendererType;
330
+
331
+ /**
332
+ * 设备像素比
333
+ * 默认自动获取
334
+ */
335
+ devicePixelRatio?: number;
336
+
337
+ // ---------- 动画配置 ----------
338
+
339
+ /**
340
+ * 全局动画配置
341
+ */
342
+ animation?: AnimationConfig;
343
+
344
+ // ---------- 标题配置 ----------
345
+
346
+ /**
347
+ * 图表标题
348
+ */
349
+ title?: string | { text: string; subtext?: string; [key: string]: unknown };
350
+
351
+ /**
352
+ * 是否显示标题
353
+ * @default true
354
+ */
355
+ showTitle?: boolean;
356
+
357
+ // ---------- 图例配置 ----------
358
+
359
+ /**
360
+ * 是否显示图例
361
+ * @default true
362
+ */
363
+ showLegend?: boolean;
364
+
365
+ // ---------- 工具提示配置 ----------
366
+
367
+ /**
368
+ * 是否显示工具提示
369
+ * @default true
370
+ */
371
+ showTooltip?: boolean;
372
+
373
+ /**
374
+ * 工具提示配置
375
+ */
376
+ tooltip?: Record<string, unknown>;
377
+ }
378
+
379
+ // ============================================================================
380
+ // 特定图表类型属性
381
+ // ============================================================================
382
+
383
+ /**
384
+ * 折线图属性
385
+ */
386
+ export interface LineChartProps extends BaseChartProps {
387
+ /** 图表类型 */
388
+ type?: 'line' | 'area' | 'stacked' | 'percent';
389
+
390
+ /** 是否平滑曲线 */
391
+ smooth?: boolean;
392
+
393
+ /** 是否显示面积 */
394
+ showArea?: boolean;
395
+
396
+ /** 是否显示数据点 */
397
+ showSymbol?: boolean;
398
+
399
+ /** 面积样式 */
400
+ areaStyle?: Record<string, unknown>;
401
+
402
+ /** 线条样式 */
403
+ lineStyle?: Record<string, unknown>;
404
+
405
+ /** 标记点样式 */
406
+ itemStyle?: Record<string, unknown>;
407
+ }
408
+
409
+ /**
410
+ * 柱状图属性
411
+ */
412
+ export interface BarChartProps extends BaseChartProps {
413
+ /** 图表类型 */
414
+ type?: 'bar' | 'stacked' | 'percent' | 'group';
415
+
416
+ /** 柱条方向 */
417
+ orientation?: 'vertical' | 'horizontal';
418
+
419
+ /** 柱条宽度 */
420
+ barWidth?: number | string;
421
+
422
+ /** 柱条最大宽度 */
423
+ barMaxWidth?: number | string;
424
+
425
+ /** 柱条最小高度 */
426
+ barMinHeight?: number;
427
+
428
+ /** 圆角 */
429
+ borderRadius?: number | number[];
430
+ }
431
+
432
+ /**
433
+ * 饼图属性
434
+ */
435
+ export interface PieChartProps extends BaseChartProps {
436
+ /** 饼图类型 */
437
+ type?: 'pie' | 'ring' | 'rose' | 'nightingale';
438
+
439
+ /** 饼图半径 */
440
+ radius?: number | string | [number | string, number | string];
441
+
442
+ /** 中心点 */
443
+ center?: [number | string, number | string];
444
+
445
+ /** 是否显示标签 */
446
+ showLabel?: boolean;
447
+
448
+ /** 标签位置 */
449
+ labelPosition?: 'outside' | 'inside' | 'center';
450
+
451
+ /** 最小角度 */
452
+ minAngle?: number;
453
+ }
454
+
455
+ /**
456
+ * 散点图属性
457
+ */
458
+ export interface ScatterChartProps extends BaseChartProps {
459
+ /** 符号类型 */
460
+ symbol?: string;
461
+
462
+ /** 符号大小 */
463
+ symbolSize?: number | ((value: number[]) => number);
464
+
465
+ /** 大量数据优化 */
466
+ large?: boolean;
467
+
468
+ /** 大数据阈值 */
469
+ largeThreshold?: number;
470
+ }
471
+
472
+ /**
473
+ * 雷达图属性
474
+ */
475
+ export interface RadarChartProps extends BaseChartProps {
476
+ /** 雷达图指示器 */
477
+ indicators?: Array<{ name: string; max?: number; color?: string }>;
478
+
479
+ /** 雷达图形状 */
480
+ shape?: 'polygon' | 'circle';
481
+
482
+ /** 中心点 */
483
+ center?: [number | string, number | string];
484
+
485
+ /** 半径 */
486
+ radius?: number | string;
487
+ }
488
+
489
+ /**
490
+ * 漏斗图属性
491
+ */
492
+ export interface FunnelChartProps extends BaseChartProps {
493
+ /** 漏斗排序方式 */
494
+ sort?: 'ascending' | 'descending' | 'none';
495
+
496
+ /** 漏斗对齐方式 */
497
+ align?: 'left' | 'center' | 'right';
498
+
499
+ /** 间隙 */
500
+ gap?: number;
501
+
502
+ /** 最小高度 */
503
+ min?: number;
504
+
505
+ /** 最大高度 */
506
+ max?: number;
507
+ }
508
+
509
+ /**
510
+ * 仪表盘属性
511
+ */
512
+ export interface GaugeChartProps extends BaseChartProps {
513
+ /** 最小值 */
514
+ min?: number;
515
+
516
+ /** 最大值 */
517
+ max?: number;
518
+
519
+ /** 当前值 */
520
+ value?: number;
521
+
522
+ /** 刻度分段数 */
523
+ splitNumber?: number;
524
+
525
+ /** 半径 */
526
+ radius?: number | string;
527
+
528
+ /** 起始角度 */
529
+ startAngle?: number;
530
+
531
+ /** 结束角度 */
532
+ endAngle?: number;
533
+
534
+ /** 进度显示 */
535
+ showProgress?: boolean;
536
+ }
537
+
538
+ /**
539
+ * 热力图属性
540
+ */
541
+ export interface HeatmapChartProps extends BaseChartProps {
542
+ /** X 轴数据 */
543
+ xAxisData?: (string | number)[];
544
+
545
+ /** Y 轴数据 */
546
+ yAxisData?: (string | number)[];
547
+
548
+ /** 视觉映射配置 */
549
+ visualMap?: Record<string, unknown>;
550
+ }
551
+
552
+ /**
553
+ * 树图属性
554
+ */
555
+ export interface TreeChartProps extends BaseChartProps {
556
+ /** 树方向 */
557
+ orient?: 'orthogonal' | 'radial';
558
+
559
+ /** 展开层级 */
560
+ initialTreeDepth?: number;
561
+
562
+ /** 节点标签位置 */
563
+ labelPosition?: 'left' | 'right' | 'top' | 'bottom';
564
+
565
+ /** 是否显示连接线 */
566
+ showLine?: boolean;
567
+ }
568
+
569
+ /**
570
+ * 旭日图属性
571
+ */
572
+ export interface SunburstChartProps extends BaseChartProps {
573
+ /** 半径 */
574
+ radius?: number | string | [number | string, number | string];
575
+
576
+ /** 起始角度 */
577
+ startAngle?: number;
578
+
579
+ /** 最小角度 */
580
+ minAngle?: number;
581
+
582
+ /** 层级间隔 */
583
+ levelGap?: number;
584
+ }
585
+
586
+ // ============================================================================
587
+ // 组件Slots (用于 React 19+)
588
+ // ============================================================================
589
+
590
+ /** 图表内部插槽 */
591
+ export interface ChartSlots {
592
+ /** 标题区域 */
593
+ title?: ReactNode;
594
+ /** 图例区域 */
595
+ legend?: ReactNode;
596
+ /** 工具提示 */
597
+ tooltip?: ReactNode;
598
+ /** 自定义加载 */
599
+ loading?: ReactNode;
600
+ /** 错误提示 */
601
+ error?: ReactNode;
602
+ }
603
+
604
+ // ============================================================================
605
+ // 工具类型
606
+ // ============================================================================
607
+
608
+ /** 图表配置构建器选项 */
609
+ export interface ChartBuilderOptions<T extends BaseChartProps = BaseChartProps> {
610
+ /** 初始属性 */
611
+ props?: Partial<T>;
612
+ /** 主题 */
613
+ theme?: string;
614
+ /** 是否启用动画 */
615
+ animation?: boolean;
616
+ }
617
+
618
+ // 重新导出 ECharts 类型
619
+ export type { EChartsOption, ECharts, EChartsCoreOption };
@@ -0,0 +1,56 @@
1
+ /**
2
+ * TaroViz 图表工具函数
3
+ */
4
+
5
+ /**
6
+ * 处理适配器配置参数类型
7
+ * 解决类型不匹配问题
8
+ */
9
+ export function processAdapterConfig(config: {
10
+ width?: string | number;
11
+ height?: string | number;
12
+ theme?: string | object;
13
+ autoResize?: boolean;
14
+ canvasId?: string;
15
+ containerRef?: any;
16
+ option?: any;
17
+ renderer?: 'canvas' | 'svg';
18
+ [key: string]: any;
19
+ }): any {
20
+ // 将复杂类型转换为简单类型
21
+ const processedConfig = {
22
+ width: typeof config.width === 'number' ? config.width : undefined,
23
+ height: typeof config.height === 'number' ? config.height : undefined,
24
+ theme: typeof config.theme === 'string' ? config.theme : undefined,
25
+ autoResize: config.autoResize,
26
+ canvasId: config.canvasId,
27
+ containerRef: config.containerRef,
28
+ option: config.option,
29
+ renderer: config.renderer,
30
+ };
31
+
32
+ // 复制其他可能存在的属性
33
+ const result: Record<string, any> = { ...processedConfig };
34
+ Object.keys(config).forEach((key) => {
35
+ if (!(key in processedConfig)) {
36
+ result[key] = config[key];
37
+ }
38
+ });
39
+
40
+ return result;
41
+ }
42
+
43
+ /**
44
+ * 安全地调用适配器渲染方法
45
+ * 解决 render 方法可能不存在的问题
46
+ */
47
+ export function safeRenderAdapter(adapter: any): JSX.Element | null {
48
+ if (adapter && typeof adapter.render === 'function') {
49
+ try {
50
+ return adapter.render();
51
+ } catch (error) {
52
+ console.error('[TaroViz] Error rendering adapter:', error);
53
+ }
54
+ }
55
+ return null;
56
+ }
@@ -0,0 +1,48 @@
1
+ import { PlatformType } from '../index';
2
+
3
+ describe('Platform Core Tests', () => {
4
+ describe('PlatformType', () => {
5
+ it('should have correct enum values', () => {
6
+ // 测试PlatformType枚举值
7
+ expect(PlatformType.H5).toBe('h5');
8
+ expect(PlatformType.WEAPP).toBe('weapp');
9
+ expect(PlatformType.ALIPAY).toBe('alipay');
10
+ expect(PlatformType.SWAN).toBe('swan');
11
+ expect(PlatformType.TT).toBe('tt');
12
+ expect(PlatformType.QQ).toBe('qq');
13
+ expect(PlatformType.JD).toBe('jd');
14
+ expect(PlatformType.DD).toBe('dd');
15
+ expect(PlatformType.QYWX).toBe('qywx');
16
+ expect(PlatformType.LARK).toBe('lark');
17
+ expect(PlatformType.HARMONY).toBe('harmony');
18
+ });
19
+
20
+ it('should have all expected platform types', () => {
21
+ // 测试所有预期的平台类型都存在
22
+ const expectedPlatforms = [
23
+ 'h5',
24
+ 'weapp',
25
+ 'alipay',
26
+ 'swan',
27
+ 'tt',
28
+ 'qq',
29
+ 'jd',
30
+ 'dd',
31
+ 'qywx',
32
+ 'lark',
33
+ 'harmony',
34
+ ];
35
+
36
+ const actualPlatforms = Object.values(PlatformType);
37
+ expectedPlatforms.forEach((platform) => {
38
+ expect(actualPlatforms).toContain(platform);
39
+ });
40
+ });
41
+
42
+ it('should be usable as a type', () => {
43
+ // 测试PlatformType作为类型的使用
44
+ const platform: PlatformType = PlatformType.H5;
45
+ expect(platform).toBe('h5');
46
+ });
47
+ });
48
+ });