@taicode/common-web 1.1.10 → 1.1.13

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 (69) hide show
  1. package/output/catalyst/alert.jsx +55 -0
  2. package/output/catalyst/auth-layout.jsx +7 -0
  3. package/output/catalyst/avatar.jsx +45 -0
  4. package/output/catalyst/badge.jsx +53 -0
  5. package/output/catalyst/button.jsx +187 -0
  6. package/output/catalyst/checkbox.jsx +105 -0
  7. package/output/catalyst/combobox.jsx +120 -0
  8. package/output/catalyst/description-list.jsx +24 -0
  9. package/output/catalyst/dialog.jsx +55 -0
  10. package/output/catalyst/divider.jsx +16 -0
  11. package/output/catalyst/dropdown.jsx +102 -0
  12. package/output/catalyst/fieldset.jsx +41 -0
  13. package/output/catalyst/heading.jsx +22 -0
  14. package/output/catalyst/input.jsx +73 -0
  15. package/output/catalyst/link.jsx +14 -0
  16. package/output/catalyst/listbox.jsx +120 -0
  17. package/output/catalyst/navbar.jsx +67 -0
  18. package/output/catalyst/pagination.jsx +52 -0
  19. package/output/catalyst/radio.jsx +103 -0
  20. package/output/catalyst/select.jsx +59 -0
  21. package/output/catalyst/sidebar-layout.jsx +58 -0
  22. package/output/catalyst/sidebar.jsx +85 -0
  23. package/output/catalyst/stacked-layout.jsx +55 -0
  24. package/output/catalyst/switch.jsx +161 -0
  25. package/output/catalyst/table.jsx +68 -0
  26. package/output/catalyst/text.jsx +29 -0
  27. package/output/catalyst/textarea.jsx +49 -0
  28. package/output/helpers/cache-api/cache-api.d.ts +13 -0
  29. package/output/helpers/cache-api/cache-api.d.ts.map +1 -0
  30. package/output/helpers/cache-api/cache-api.js +114 -0
  31. package/output/helpers/cache-api/cache-api.test.d.ts +2 -0
  32. package/output/helpers/cache-api/cache-api.test.d.ts.map +1 -0
  33. package/output/helpers/cache-api/cache-api.test.js +348 -0
  34. package/output/helpers/cache-api/index.d.ts +2 -0
  35. package/output/helpers/cache-api/index.d.ts.map +1 -0
  36. package/output/helpers/cache-api/index.js +1 -0
  37. package/output/helpers/service/index.d.ts +1 -0
  38. package/output/helpers/service/index.d.ts.map +1 -0
  39. package/output/helpers/service/index.js +1 -0
  40. package/output/helpers/service/service.d.ts +5 -0
  41. package/output/helpers/service/service.d.ts.map +1 -0
  42. package/output/helpers/service/service.js +2 -0
  43. package/output/helpers/side-cache/index.d.ts +2 -0
  44. package/output/helpers/side-cache/index.d.ts.map +1 -0
  45. package/output/helpers/side-cache/index.js +1 -0
  46. package/output/helpers/side-cache/side-cache.d.ts +10 -0
  47. package/output/helpers/side-cache/side-cache.d.ts.map +1 -0
  48. package/output/helpers/side-cache/side-cache.js +137 -0
  49. package/output/helpers/side-cache/side-cache.test.d.ts +2 -0
  50. package/output/helpers/side-cache/side-cache.test.d.ts.map +1 -0
  51. package/output/helpers/side-cache/side-cache.test.js +179 -0
  52. package/output/helpers/use-observer/index.d.ts +2 -0
  53. package/output/helpers/use-observer/index.d.ts.map +1 -0
  54. package/output/helpers/use-observer/index.js +1 -0
  55. package/output/helpers/use-observer/use-observer.d.ts +3 -0
  56. package/output/helpers/use-observer/use-observer.d.ts.map +1 -0
  57. package/output/helpers/use-observer/use-observer.js +16 -0
  58. package/output/helpers/use-observer/use-observer.test.d.ts +2 -0
  59. package/output/helpers/use-observer/use-observer.test.d.ts.map +1 -0
  60. package/output/helpers/use-observer/use-observer.test.jsx +134 -0
  61. package/output/service/service.d.ts +98 -14
  62. package/output/service/service.d.ts.map +1 -1
  63. package/output/service/service.js +65 -10
  64. package/output/service/service.test.jsx +367 -0
  65. package/output/toaster/index.d.ts +6 -0
  66. package/output/toaster/index.d.ts.map +1 -1
  67. package/output/toaster/index.js +37 -21
  68. package/output/use-observer/use-observer.test.jsx +134 -0
  69. package/package.json +7 -2
@@ -0,0 +1,134 @@
1
+ import { describe, it, expect } from 'vitest';
2
+ import { renderHook, act } from '@testing-library/react';
3
+ import { observable, action } from 'mobx';
4
+ import { useObserver } from './use-observer';
5
+ describe('useObserver', () => {
6
+ it('应该返回初始值当没有selector时', () => {
7
+ const initialValue = '初始值';
8
+ const { result } = renderHook(() => useObserver(initialValue));
9
+ expect(result.current).toBe(initialValue);
10
+ });
11
+ it('应该使用selector转换值', () => {
12
+ const initialValue = { count: 5 };
13
+ const selector = (value) => value.count * 2;
14
+ const { result } = renderHook(() => useObserver(initialValue, selector));
15
+ expect(result.current).toBe(10);
16
+ });
17
+ it('应该在观察对象变化时重新渲染', async () => {
18
+ const observableStore = observable({
19
+ count: 0,
20
+ increment: action(() => {
21
+ observableStore.count++;
22
+ })
23
+ });
24
+ const { result } = renderHook(() => useObserver(observableStore, (store) => store.count));
25
+ expect(result.current).toBe(0);
26
+ // 改变observable的值
27
+ act(() => {
28
+ observableStore.increment();
29
+ });
30
+ // 等待React更新
31
+ await new Promise(resolve => setTimeout(resolve, 0));
32
+ expect(result.current).toBe(1);
33
+ });
34
+ it('应该处理复杂的selector函数', () => {
35
+ const store = observable({
36
+ users: [
37
+ { id: 1, name: '张三', active: true },
38
+ { id: 2, name: '李四', active: false },
39
+ { id: 3, name: '王五', active: true }
40
+ ]
41
+ });
42
+ const selector = (store) => store.users.filter((user) => user.active).map((user) => user.name);
43
+ const { result } = renderHook(() => useObserver(store, selector));
44
+ expect(result.current).toEqual(['张三', '王五']);
45
+ });
46
+ it('应该在observable数组变化时重新渲染', async () => {
47
+ const store = observable({
48
+ items: ['项目1', '项目2'],
49
+ addItem: action((item) => {
50
+ store.items.push(item);
51
+ })
52
+ });
53
+ const { result } = renderHook(() => useObserver(store, (store) => store.items.length));
54
+ expect(result.current).toBe(2);
55
+ act(() => {
56
+ store.addItem('项目3');
57
+ });
58
+ await new Promise(resolve => setTimeout(resolve, 0));
59
+ expect(result.current).toBe(3);
60
+ });
61
+ it('应该处理null值的初始值', () => {
62
+ const { result } = renderHook(() => useObserver(null));
63
+ expect(result.current).toBeNull();
64
+ });
65
+ it('应该处理undefined值的初始值', () => {
66
+ const { result } = renderHook(() => useObserver(undefined));
67
+ expect(result.current).toBeUndefined();
68
+ });
69
+ it('应该在selector为null时返回原值', () => {
70
+ const initialValue = { data: '测试数据' };
71
+ const { result } = renderHook(() => useObserver(initialValue, null));
72
+ expect(result.current).toBe(initialValue);
73
+ });
74
+ it('应该处理嵌套observable对象', async () => {
75
+ const store = observable({
76
+ user: {
77
+ profile: {
78
+ name: '测试用户',
79
+ email: 'test@example.com'
80
+ }
81
+ },
82
+ updateName: action((name) => {
83
+ store.user.profile.name = name;
84
+ })
85
+ });
86
+ const { result } = renderHook(() => useObserver(store, (store) => store.user.profile.name));
87
+ expect(result.current).toBe('测试用户');
88
+ act(() => {
89
+ store.updateName('新用户名');
90
+ });
91
+ await new Promise(resolve => setTimeout(resolve, 0));
92
+ expect(result.current).toBe('新用户名');
93
+ });
94
+ it('应该处理多个observable属性的变化', async () => {
95
+ const store = observable({
96
+ firstName: '张',
97
+ lastName: '三',
98
+ updateFirstName: action((name) => {
99
+ store.firstName = name;
100
+ }),
101
+ updateLastName: action((name) => {
102
+ store.lastName = name;
103
+ })
104
+ });
105
+ const { result } = renderHook(() => useObserver(store, (store) => `${store.firstName}${store.lastName}`));
106
+ expect(result.current).toBe('张三');
107
+ act(() => {
108
+ store.updateFirstName('李');
109
+ });
110
+ await new Promise(resolve => setTimeout(resolve, 0));
111
+ expect(result.current).toBe('李三');
112
+ act(() => {
113
+ store.updateLastName('四');
114
+ });
115
+ await new Promise(resolve => setTimeout(resolve, 0));
116
+ expect(result.current).toBe('李四');
117
+ });
118
+ it('应该在组件卸载时清理reaction', () => {
119
+ const store = observable({ count: 0 });
120
+ const { unmount } = renderHook(() => useObserver(store, (store) => store.count));
121
+ // 卸载组件应该不会抛出错误
122
+ expect(() => unmount()).not.toThrow();
123
+ });
124
+ it('应该处理boolean类型的返回值', () => {
125
+ const store = observable({ isActive: true });
126
+ const { result } = renderHook(() => useObserver(store, (store) => store.isActive));
127
+ expect(result.current).toBe(true);
128
+ });
129
+ it('应该处理数字类型的返回值', () => {
130
+ const store = observable({ count: 42 });
131
+ const { result } = renderHook(() => useObserver(store, (store) => store.count));
132
+ expect(result.current).toBe(42);
133
+ });
134
+ });
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@taicode/common-web",
3
- "version": "1.1.10",
3
+ "version": "1.1.13",
4
4
  "author": "Alain",
5
5
  "license": "ISC",
6
6
  "description": "",
@@ -23,6 +23,7 @@
23
23
  "test": "vitest",
24
24
  "test:ui": "vitest --ui",
25
25
  "test:run": "vitest run",
26
+ "postinstall": "npm run build",
26
27
  "prepublishOnly": "npm run build",
27
28
  "build": "tsc -p tsconfig.json",
28
29
  "dev": "tsc -p tsconfig.json --watch"
@@ -44,6 +45,10 @@
44
45
  "@testing-library/jest-dom": "^6.1.0",
45
46
  "jsdom": "^23.0.0",
46
47
  "vitest": "^1.0.0",
47
- "@vitest/ui": "^1.0.0"
48
+ "@vitest/ui": "^1.0.0",
49
+ "@needle-di/core": "^1.0.0",
50
+ "@types/react": "^18.0.0",
51
+ "mobx": "^6.0.0",
52
+ "react": "^18.0.0"
48
53
  }
49
54
  }