zcw-shared 1.22.0 → 1.24.0

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 (46) hide show
  1. package/dist/functions/algorithm/visualizeGarbageCollection.d.ts +44 -0
  2. package/dist/functions/algorithm/visualizeGarbageCollection.js +263 -0
  3. package/dist/functions/algorithm/visualizeGarbageCollection.js.map +1 -0
  4. package/dist/functions/dom/computePosition.d.ts +6 -0
  5. package/dist/functions/dom/computePosition.js +49 -0
  6. package/dist/functions/dom/computePosition.js.map +1 -0
  7. package/dist/functions/dom/createThrottledEventListener.d.ts +11 -0
  8. package/dist/functions/dom/createThrottledEventListener.js +51 -0
  9. package/dist/functions/dom/createThrottledEventListener.js.map +1 -0
  10. package/dist/functions/dom/getAlignment.d.ts +2 -0
  11. package/dist/functions/dom/getAlignment.js +5 -0
  12. package/dist/functions/dom/getAlignment.js.map +1 -0
  13. package/dist/functions/dom/getBasePlacement.d.ts +2 -0
  14. package/dist/functions/dom/getBasePlacement.js +4 -0
  15. package/dist/functions/dom/getBasePlacement.js.map +1 -0
  16. package/dist/functions/dom/getCrossAxisFlip.d.ts +2 -0
  17. package/dist/functions/dom/getCrossAxisFlip.js +11 -0
  18. package/dist/functions/dom/getCrossAxisFlip.js.map +1 -0
  19. package/dist/functions/dom/getFlipPlacements.d.ts +2 -0
  20. package/dist/functions/dom/getFlipPlacements.js +13 -0
  21. package/dist/functions/dom/getFlipPlacements.js.map +1 -0
  22. package/dist/functions/dom/getMainAxisFlip.d.ts +2 -0
  23. package/dist/functions/dom/getMainAxisFlip.js +17 -0
  24. package/dist/functions/dom/getMainAxisFlip.js.map +1 -0
  25. package/dist/functions/dom/isValidPlacement.d.ts +2 -0
  26. package/dist/functions/dom/isValidPlacement.js +16 -0
  27. package/dist/functions/dom/isValidPlacement.js.map +1 -0
  28. package/dist/functions/string/testRegex.d.ts +20 -0
  29. package/dist/functions/string/testRegex.js +300 -0
  30. package/dist/functions/string/testRegex.js.map +1 -0
  31. package/dist/functions/string/visualizeRegexSteps.d.ts +39 -0
  32. package/dist/functions/string/visualizeRegexSteps.js +446 -0
  33. package/dist/functions/string/visualizeRegexSteps.js.map +1 -0
  34. package/dist/functions/tencent-cloud/upload.cos.js +44 -36
  35. package/dist/functions/tencent-cloud/upload.cos.js.map +1 -1
  36. package/dist/reactive/useReactiveSSE.d.ts +46 -0
  37. package/dist/reactive/useReactiveSSE.js +212 -0
  38. package/dist/reactive/useReactiveSSE.js.map +1 -0
  39. package/dist/reactive/useReactiveWebsocket.d.ts +50 -0
  40. package/dist/reactive/useReactiveWebsocket.js +250 -0
  41. package/dist/reactive/useReactiveWebsocket.js.map +1 -0
  42. package/package.json +19 -3
  43. package/references/browser.d.ts +4 -0
  44. package/references/eventsource.d.ts +121 -0
  45. package/references/websocket.d.ts +121 -0
  46. package/types/placement.d.ts +15 -0
@@ -0,0 +1,212 @@
1
+ export var SSEStatus;
2
+ (function (SSEStatus) {
3
+ SSEStatus["CONNECTING"] = "CONNECTING";
4
+ SSEStatus["CONNECTED"] = "CONNECTED";
5
+ SSEStatus["DISCONNECTED"] = "DISCONNECTED";
6
+ SSEStatus["ERROR"] = "ERROR";
7
+ })(SSEStatus || (SSEStatus = {}));
8
+ export function useReactiveSSE(url, options = {}, deps) {
9
+ const defaultOptions = {
10
+ withCredentials: false,
11
+ immediate: true,
12
+ reconnect: {
13
+ enabled: true,
14
+ delay: 3000,
15
+ maxRetries: 5,
16
+ retryDelayMultiplier: 1.5
17
+ },
18
+ onConnected: () => { },
19
+ onDisconnected: () => { },
20
+ onError: () => { },
21
+ onMessage: () => { }
22
+ };
23
+ const config = { ...defaultOptions, ...options };
24
+ if (options.reconnect) {
25
+ config.reconnect = { ...defaultOptions.reconnect, ...options.reconnect };
26
+ }
27
+ const state = {
28
+ status: SSEStatus.DISCONNECTED,
29
+ data: null,
30
+ lastEventId: '',
31
+ error: null,
32
+ retryCount: 0,
33
+ es: null
34
+ };
35
+ const subscribers = new Set();
36
+ const notify = () => {
37
+ subscribers.forEach(listener => listener());
38
+ };
39
+ let reconnectTimer = null;
40
+ let isManualClose = false;
41
+ let isReconnecting = false;
42
+ const customListeners = new Map();
43
+ const clearReconnect = () => {
44
+ if (reconnectTimer !== null) {
45
+ deps.clearTimeout(reconnectTimer);
46
+ reconnectTimer = null;
47
+ }
48
+ };
49
+ const attemptReconnect = () => {
50
+ deps.log?.(`[SSE-重连] 尝试重连: enabled=${config.reconnect.enabled}, isManualClose=${isManualClose}, isReconnecting=${isReconnecting}`);
51
+ if (!config.reconnect.enabled || isManualClose || isReconnecting) {
52
+ deps.log?.('[SSE-重连] 跳过重连');
53
+ return;
54
+ }
55
+ const maxRetries = config.reconnect.maxRetries || 0;
56
+ if (maxRetries > 0 && state.retryCount >= maxRetries) {
57
+ deps.log?.(`[SSE-重连] 已达到最大重连次数 ${maxRetries}`);
58
+ state.status = SSEStatus.ERROR;
59
+ state.error = new Error(`重连失败:已达到最大重连次数 ${maxRetries}`);
60
+ notify();
61
+ isReconnecting = false;
62
+ return;
63
+ }
64
+ const delay = (config.reconnect.delay || 3000) * Math.pow(config.reconnect.retryDelayMultiplier || 1, state.retryCount);
65
+ deps.log?.(`[SSE-重连] 将在 ${delay}ms 后重连(第 ${state.retryCount + 1} 次)`);
66
+ isReconnecting = true;
67
+ clearReconnect();
68
+ state.status = SSEStatus.CONNECTING;
69
+ notify();
70
+ reconnectTimer = deps.setTimeout(() => {
71
+ state.retryCount++;
72
+ deps.log?.(`[SSE-重连] 开始第 ${state.retryCount} 次重连`);
73
+ try {
74
+ connect();
75
+ }
76
+ finally {
77
+ isReconnecting = false;
78
+ }
79
+ }, delay);
80
+ };
81
+ const connect = () => {
82
+ if (state.es && state.es.readyState !== deps.EventSource.CLOSED) {
83
+ deps.log?.('[SSE] 已有活跃连接,跳过');
84
+ return;
85
+ }
86
+ isManualClose = false;
87
+ state.status = SSEStatus.CONNECTING;
88
+ state.error = null;
89
+ notify();
90
+ try {
91
+ const eventSourceInit = config.withCredentials
92
+ ? { withCredentials: true }
93
+ : undefined;
94
+ const es = new deps.EventSource(url, eventSourceInit);
95
+ es.onopen = (event) => {
96
+ if (isManualClose) {
97
+ deps.log?.('[SSE] 连接建立但已标记为手动关闭,忽略');
98
+ es.close();
99
+ return;
100
+ }
101
+ deps.log?.('[SSE] 连接成功');
102
+ state.status = SSEStatus.CONNECTED;
103
+ state.error = null;
104
+ state.retryCount = 0;
105
+ state.es = es;
106
+ customListeners.forEach((listeners, eventType) => {
107
+ listeners.forEach(listener => {
108
+ deps.log?.(`[SSE] 注册事件监听器: ${eventType}`);
109
+ es.addEventListener(eventType, listener);
110
+ });
111
+ });
112
+ notify();
113
+ config.onConnected(es);
114
+ };
115
+ es.onmessage = (event) => {
116
+ deps.log?.('[SSE] 收到消息:', event.data);
117
+ state.data = event.data;
118
+ state.lastEventId = event.lastEventId;
119
+ notify();
120
+ config.onMessage(es, event);
121
+ };
122
+ es.onerror = (event) => {
123
+ deps.log?.('[SSE] 连接错误');
124
+ state.error = new Error('SSE 连接错误');
125
+ notify();
126
+ config.onError(es, event);
127
+ if (es.readyState === deps.EventSource.CLOSED) {
128
+ deps.log?.('[SSE] 连接已关闭');
129
+ if (state.es === es) {
130
+ state.status = SSEStatus.DISCONNECTED;
131
+ state.es = null;
132
+ notify();
133
+ }
134
+ config.onDisconnected(es, event);
135
+ if (!isManualClose && !isReconnecting) {
136
+ attemptReconnect();
137
+ }
138
+ }
139
+ };
140
+ }
141
+ catch (error) {
142
+ deps.log?.('[SSE] 创建连接失败:', error);
143
+ state.status = SSEStatus.ERROR;
144
+ state.error = error instanceof Error ? error : new Error('SSE 创建失败');
145
+ notify();
146
+ attemptReconnect();
147
+ }
148
+ };
149
+ const disconnect = () => {
150
+ deps.log?.('[SSE] 手动断开连接');
151
+ isManualClose = true;
152
+ isReconnecting = false;
153
+ clearReconnect();
154
+ const es = state.es;
155
+ if (es) {
156
+ state.es = null;
157
+ try {
158
+ es.close();
159
+ }
160
+ catch (error) {
161
+ deps.log?.('[SSE] 关闭连接失败(忽略):', error);
162
+ }
163
+ }
164
+ state.status = SSEStatus.DISCONNECTED;
165
+ state.retryCount = 0;
166
+ notify();
167
+ };
168
+ const addEventListener = (type, listener) => {
169
+ if (!customListeners.has(type)) {
170
+ customListeners.set(type, new Set());
171
+ }
172
+ customListeners.get(type).add(listener);
173
+ if (state.es) {
174
+ state.es.addEventListener(type, listener);
175
+ }
176
+ return () => {
177
+ const listeners = customListeners.get(type);
178
+ if (listeners) {
179
+ listeners.delete(listener);
180
+ if (listeners.size === 0) {
181
+ customListeners.delete(type);
182
+ }
183
+ }
184
+ if (state.es) {
185
+ state.es.removeEventListener(type, listener);
186
+ }
187
+ };
188
+ };
189
+ const subscribe = (listener) => {
190
+ subscribers.add(listener);
191
+ return () => subscribers.delete(listener);
192
+ };
193
+ const dispose = () => {
194
+ disconnect();
195
+ subscribers.clear();
196
+ customListeners.clear();
197
+ isManualClose = false;
198
+ isReconnecting = false;
199
+ };
200
+ if (config.immediate) {
201
+ connect();
202
+ }
203
+ return {
204
+ state,
205
+ connect,
206
+ disconnect,
207
+ addEventListener,
208
+ subscribe,
209
+ dispose
210
+ };
211
+ }
212
+ //# sourceMappingURL=useReactiveSSE.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useReactiveSSE.js","sourceRoot":"","sources":["../../src/reactive/useReactiveSSE.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,50 @@
1
+ import type { WebSocketConstructor, WebSocket } from '../../references/websocket.d';
2
+ import type { setTimeout, clearTimeout } from '../../references/timer.d';
3
+ import type { Blob } from '../../references/blob.d';
4
+ export type WebSocketMessage = string | ArrayBufferLike | Blob | ArrayBufferView;
5
+ export declare enum WebSocketStatus {
6
+ CONNECTING = "CONNECTING",
7
+ CONNECTED = "CONNECTED",
8
+ DISCONNECTED = "DISCONNECTED",
9
+ ERROR = "ERROR"
10
+ }
11
+ export interface ReconnectOptions {
12
+ enabled?: boolean;
13
+ delay?: number;
14
+ maxRetries?: number;
15
+ retryDelayMultiplier?: number;
16
+ }
17
+ export interface UseReactiveWebsocketOptions {
18
+ protocols?: string | string[];
19
+ immediate?: boolean;
20
+ heartbeat?: number;
21
+ heartbeatMessage?: WebSocketMessage;
22
+ heartbeatTimeout?: number;
23
+ reconnect?: ReconnectOptions;
24
+ onConnected?: (ws: WebSocket) => void;
25
+ onDisconnected?: (ws: WebSocket, event: any) => void;
26
+ onError?: (ws: WebSocket, event: any) => void;
27
+ onMessage?: (ws: WebSocket, event: any) => void;
28
+ }
29
+ export interface ReactiveWebSocketState {
30
+ status: WebSocketStatus;
31
+ data: any;
32
+ error: Error | null;
33
+ retryCount: number;
34
+ ws: WebSocket | null;
35
+ }
36
+ export interface ReactiveWebSocketReturn {
37
+ state: ReactiveWebSocketState;
38
+ send: (data: WebSocketMessage) => boolean;
39
+ connect: () => void;
40
+ disconnect: (code?: number, reason?: string) => void;
41
+ subscribe: (listener: () => void) => () => void;
42
+ dispose: () => void;
43
+ }
44
+ export interface UseReactiveWebsocketDeps {
45
+ WebSocket: WebSocketConstructor;
46
+ setTimeout: typeof setTimeout;
47
+ clearTimeout: typeof clearTimeout;
48
+ log?: (...args: any[]) => void;
49
+ }
50
+ export declare function useReactiveWebsocket(url: string, options: UseReactiveWebsocketOptions | undefined, deps: UseReactiveWebsocketDeps): ReactiveWebSocketReturn;
@@ -0,0 +1,250 @@
1
+ export var WebSocketStatus;
2
+ (function (WebSocketStatus) {
3
+ WebSocketStatus["CONNECTING"] = "CONNECTING";
4
+ WebSocketStatus["CONNECTED"] = "CONNECTED";
5
+ WebSocketStatus["DISCONNECTED"] = "DISCONNECTED";
6
+ WebSocketStatus["ERROR"] = "ERROR";
7
+ })(WebSocketStatus || (WebSocketStatus = {}));
8
+ export function useReactiveWebsocket(url, options = {}, deps) {
9
+ const defaultOptions = {
10
+ protocols: [],
11
+ immediate: true,
12
+ heartbeat: 0,
13
+ heartbeatMessage: 'ping',
14
+ heartbeatTimeout: 5000,
15
+ reconnect: {
16
+ enabled: true,
17
+ delay: 3000,
18
+ maxRetries: 5,
19
+ retryDelayMultiplier: 1.5
20
+ },
21
+ onConnected: () => { },
22
+ onDisconnected: () => { },
23
+ onError: () => { },
24
+ onMessage: () => { }
25
+ };
26
+ const config = { ...defaultOptions, ...options };
27
+ if (options.reconnect) {
28
+ config.reconnect = { ...defaultOptions.reconnect, ...options.reconnect };
29
+ }
30
+ const state = {
31
+ status: WebSocketStatus.DISCONNECTED,
32
+ data: null,
33
+ error: null,
34
+ retryCount: 0,
35
+ ws: null
36
+ };
37
+ const subscribers = new Set();
38
+ const notify = () => {
39
+ subscribers.forEach(listener => listener());
40
+ };
41
+ let heartbeatTimer = null;
42
+ let reconnectTimer = null;
43
+ let isManualClose = false;
44
+ let isReconnecting = false;
45
+ let lastMessageTime = 0;
46
+ const clearHeartbeat = () => {
47
+ if (heartbeatTimer !== null) {
48
+ deps.clearTimeout(heartbeatTimer);
49
+ heartbeatTimer = null;
50
+ }
51
+ };
52
+ const clearReconnect = () => {
53
+ if (reconnectTimer !== null) {
54
+ deps.clearTimeout(reconnectTimer);
55
+ reconnectTimer = null;
56
+ }
57
+ };
58
+ const startHeartbeat = () => {
59
+ clearHeartbeat();
60
+ if (config.heartbeat <= 0 || !state.ws) {
61
+ return;
62
+ }
63
+ const checkHeartbeat = () => {
64
+ if (!state.ws || state.ws.readyState !== deps.WebSocket.OPEN) {
65
+ deps.log?.('[心跳] 连接未打开,停止心跳检测');
66
+ return;
67
+ }
68
+ const now = Date.now();
69
+ const timeSinceLastMessage = now - lastMessageTime;
70
+ const timeoutThreshold = config.heartbeat + config.heartbeatTimeout;
71
+ deps.log?.(`[心跳] 检查: 距上次消息 ${timeSinceLastMessage}ms, 超时阈值 ${timeoutThreshold}ms`);
72
+ if (timeSinceLastMessage > timeoutThreshold) {
73
+ deps.log?.('[心跳] ⚠️ 检测到超时,主动断开并重连');
74
+ clearHeartbeat();
75
+ const oldWs = state.ws;
76
+ state.ws = null;
77
+ state.status = WebSocketStatus.DISCONNECTED;
78
+ notify();
79
+ try {
80
+ oldWs.close();
81
+ }
82
+ catch (error) {
83
+ deps.log?.('[心跳] 关闭连接失败(忽略):', error);
84
+ }
85
+ if (!isManualClose && !isReconnecting) {
86
+ deps.log?.('[心跳] 开始重连流程');
87
+ attemptReconnect();
88
+ }
89
+ return;
90
+ }
91
+ try {
92
+ deps.log?.('[心跳] 发送心跳消息');
93
+ state.ws.send(config.heartbeatMessage);
94
+ }
95
+ catch (error) {
96
+ deps.log?.('[心跳] 发送失败:', error);
97
+ }
98
+ heartbeatTimer = deps.setTimeout(checkHeartbeat, config.heartbeat);
99
+ };
100
+ heartbeatTimer = deps.setTimeout(checkHeartbeat, config.heartbeat);
101
+ };
102
+ const attemptReconnect = () => {
103
+ if (!config.reconnect.enabled || isManualClose || isReconnecting) {
104
+ return;
105
+ }
106
+ const maxRetries = config.reconnect.maxRetries || 0;
107
+ if (maxRetries > 0 && state.retryCount >= maxRetries) {
108
+ state.status = WebSocketStatus.ERROR;
109
+ state.error = new Error(`重连失败:已达到最大重连次数 ${maxRetries}`);
110
+ notify();
111
+ isReconnecting = false;
112
+ return;
113
+ }
114
+ const delay = (config.reconnect.delay || 3000) * Math.pow(config.reconnect.retryDelayMultiplier || 1, state.retryCount);
115
+ isReconnecting = true;
116
+ clearReconnect();
117
+ reconnectTimer = deps.setTimeout(() => {
118
+ state.retryCount++;
119
+ try {
120
+ connect();
121
+ }
122
+ finally {
123
+ isReconnecting = false;
124
+ }
125
+ }, delay);
126
+ };
127
+ const connect = () => {
128
+ if (state.ws && state.ws.readyState !== deps.WebSocket.CLOSED) {
129
+ deps.log?.('[连接] 已有活跃连接,跳过');
130
+ return;
131
+ }
132
+ isManualClose = false;
133
+ state.status = WebSocketStatus.CONNECTING;
134
+ state.error = null;
135
+ notify();
136
+ try {
137
+ const ws = new deps.WebSocket(url, config.protocols);
138
+ ws.onopen = (event) => {
139
+ if (isManualClose) {
140
+ deps.log?.('[连接] 连接建立但已标记为手动关闭,忽略');
141
+ ws.close();
142
+ return;
143
+ }
144
+ state.status = WebSocketStatus.CONNECTED;
145
+ state.error = null;
146
+ state.retryCount = 0;
147
+ state.ws = ws;
148
+ notify();
149
+ lastMessageTime = Date.now();
150
+ deps.log?.('[连接] 连接成功,记录时间:', lastMessageTime);
151
+ if (config.heartbeat > 0) {
152
+ deps.log?.(`[连接] 启动心跳检测: 间隔=${config.heartbeat}ms, 超时=${config.heartbeatTimeout}ms`);
153
+ }
154
+ startHeartbeat();
155
+ config.onConnected(ws);
156
+ };
157
+ ws.onmessage = (event) => {
158
+ state.data = event.data;
159
+ const oldTime = lastMessageTime;
160
+ lastMessageTime = Date.now();
161
+ deps.log?.(`[消息] 收到消息,更新时间: ${oldTime} -> ${lastMessageTime}`);
162
+ notify();
163
+ config.onMessage(ws, event);
164
+ };
165
+ ws.onerror = (event) => {
166
+ deps.log?.('[错误] WebSocket 错误');
167
+ state.error = new Error('WebSocket 连接错误');
168
+ notify();
169
+ config.onError(ws, event);
170
+ };
171
+ ws.onclose = (event) => {
172
+ clearHeartbeat();
173
+ deps.log?.(`[关闭] 连接关闭: code=${event.code}, wasClean=${event.wasClean}, isManualClose=${isManualClose}`);
174
+ if (state.ws === ws) {
175
+ state.status = WebSocketStatus.DISCONNECTED;
176
+ state.ws = null;
177
+ notify();
178
+ }
179
+ config.onDisconnected(ws, event);
180
+ const shouldReconnect = !isManualClose && !event.wasClean && !isReconnecting;
181
+ deps.log?.(`[关闭] 是否重连: ${shouldReconnect}`);
182
+ if (shouldReconnect) {
183
+ attemptReconnect();
184
+ }
185
+ };
186
+ }
187
+ catch (error) {
188
+ state.status = WebSocketStatus.ERROR;
189
+ state.error = error instanceof Error ? error : new Error('WebSocket 创建失败');
190
+ notify();
191
+ attemptReconnect();
192
+ }
193
+ };
194
+ const disconnect = (code, reason) => {
195
+ deps.log?.('[断开] 手动断开连接');
196
+ isManualClose = true;
197
+ isReconnecting = false;
198
+ clearHeartbeat();
199
+ clearReconnect();
200
+ const ws = state.ws;
201
+ if (ws) {
202
+ state.ws = null;
203
+ try {
204
+ ws.close(code, reason);
205
+ }
206
+ catch (error) {
207
+ deps.log?.('[断开] 关闭连接失败(忽略):', error);
208
+ }
209
+ }
210
+ state.status = WebSocketStatus.DISCONNECTED;
211
+ state.retryCount = 0;
212
+ notify();
213
+ };
214
+ const send = (data) => {
215
+ if (!state.ws || state.ws.readyState !== deps.WebSocket.OPEN) {
216
+ return false;
217
+ }
218
+ try {
219
+ state.ws.send(data);
220
+ return true;
221
+ }
222
+ catch (error) {
223
+ state.error = error instanceof Error ? error : new Error('发送消息失败');
224
+ notify();
225
+ return false;
226
+ }
227
+ };
228
+ const subscribe = (listener) => {
229
+ subscribers.add(listener);
230
+ return () => subscribers.delete(listener);
231
+ };
232
+ const dispose = () => {
233
+ disconnect();
234
+ subscribers.clear();
235
+ isManualClose = false;
236
+ isReconnecting = false;
237
+ };
238
+ if (config.immediate) {
239
+ connect();
240
+ }
241
+ return {
242
+ state,
243
+ send,
244
+ connect,
245
+ disconnect,
246
+ subscribe,
247
+ dispose
248
+ };
249
+ }
250
+ //# sourceMappingURL=useReactiveWebsocket.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useReactiveWebsocket.js","sourceRoot":"","sources":["../../src/reactive/useReactiveWebsocket.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "zcw-shared",
3
- "version": "1.22.0",
3
+ "version": "1.24.0",
4
4
  "files": [
5
5
  "references",
6
6
  "dist",
@@ -23,15 +23,18 @@
23
23
  "publish:prerelease": "npx tsx scripts/publish.ts prerelease",
24
24
  "docs:dev": "vitepress dev docs",
25
25
  "docs:build": "NODE_OPTIONS=--max-old-space-size=4096 vitepress build docs",
26
- "docs:preview": "vitepress preview docs"
26
+ "docs:preview": "vitepress preview docs",
27
+ "deploy:tcb": "npx tsx scripts/deploy-tcb.ts",
28
+ "deploy:cos": "npx tsx scripts/deploy-cos.ts"
27
29
  },
28
30
  "devDependencies": {
29
31
  "@cloudbase/manager-node": "^4.3.2",
32
+ "cos-nodejs-sdk-v5": "^2.14.4",
30
33
  "tsx": "^4.20.3",
31
34
  "typescript": "^5.8.3",
32
35
  "vitepress": "^1.6.4",
33
36
  "vue": "^3.5.22",
34
- "zcw-shared": "^1.20.0",
37
+ "zcw-shared": "^1.22.0",
35
38
  "zcw-vue-ui": "^1.11.3"
36
39
  },
37
40
  "exports": {
@@ -66,6 +69,7 @@
66
69
  "./functions/algorithm/threeSum": "./dist/functions/algorithm/threeSum.js",
67
70
  "./functions/algorithm/topologicalSort": "./dist/functions/algorithm/topologicalSort.js",
68
71
  "./functions/algorithm/trap": "./dist/functions/algorithm/trap.js",
72
+ "./functions/algorithm/visualizeGarbageCollection": "./dist/functions/algorithm/visualizeGarbageCollection.js",
69
73
  "./functions/android/buildProject": "./dist/functions/android/buildProject.js",
70
74
  "./functions/android/detectAndroidModules": "./dist/functions/android/detectAndroidModules.js",
71
75
  "./functions/android/modifyGradle": "./dist/functions/android/modifyGradle.js",
@@ -115,11 +119,19 @@
115
119
  "./functions/design-tokens/generateVariables": "./dist/functions/design-tokens/generateVariables.js",
116
120
  "./functions/design-tokens/mixColors": "./dist/functions/design-tokens/mixColors.js",
117
121
  "./functions/design-tokens/parseDesignTokens": "./dist/functions/design-tokens/parseDesignTokens.js",
122
+ "./functions/dom/computePosition": "./dist/functions/dom/computePosition.js",
123
+ "./functions/dom/createThrottledEventListener": "./dist/functions/dom/createThrottledEventListener.js",
118
124
  "./functions/dom/demonstrateResourceLoading": "./dist/functions/dom/demonstrateResourceLoading.js",
119
125
  "./functions/dom/detectOverflow": "./dist/functions/dom/detectOverflow.js",
126
+ "./functions/dom/getAlignment": "./dist/functions/dom/getAlignment.js",
127
+ "./functions/dom/getBasePlacement": "./dist/functions/dom/getBasePlacement.js",
128
+ "./functions/dom/getCrossAxisFlip": "./dist/functions/dom/getCrossAxisFlip.js",
120
129
  "./functions/dom/getElementRect": "./dist/functions/dom/getElementRect.js",
130
+ "./functions/dom/getFlipPlacements": "./dist/functions/dom/getFlipPlacements.js",
131
+ "./functions/dom/getMainAxisFlip": "./dist/functions/dom/getMainAxisFlip.js",
121
132
  "./functions/dom/getRelativePosition": "./dist/functions/dom/getRelativePosition.js",
122
133
  "./functions/dom/getViewportRect": "./dist/functions/dom/getViewportRect.js",
134
+ "./functions/dom/isValidPlacement": "./dist/functions/dom/isValidPlacement.js",
123
135
  "./functions/file/formatFileSize": "./dist/functions/file/formatFileSize.js",
124
136
  "./functions/file/getFileExtension": "./dist/functions/file/getFileExtension.js",
125
137
  "./functions/functional/compose": "./dist/functions/functional/compose.js",
@@ -188,6 +200,7 @@
188
200
  "./functions/string/palindrome": "./dist/functions/string/palindrome.js",
189
201
  "./functions/string/similarity": "./dist/functions/string/similarity.js",
190
202
  "./functions/string/template": "./dist/functions/string/template.js",
203
+ "./functions/string/testRegex": "./dist/functions/string/testRegex.js",
191
204
  "./functions/string/wordCount": "./dist/functions/string/wordCount.js",
192
205
  "./functions/tencent-cloud/deploy.tcb": "./dist/functions/tencent-cloud/deploy.tcb.js",
193
206
  "./functions/tencent-cloud/getSecret": "./dist/functions/tencent-cloud/getSecret.js",
@@ -234,6 +247,8 @@
234
247
  "./reactive/createReactivePermission": "./dist/reactive/createReactivePermission.js",
235
248
  "./reactive/createReactivePinia": "./dist/reactive/createReactivePinia.js",
236
249
  "./reactive/useReactiveCookie": "./dist/reactive/useReactiveCookie.js",
250
+ "./reactive/useReactiveSSE": "./dist/reactive/useReactiveSSE.js",
251
+ "./reactive/useReactiveWebsocket": "./dist/reactive/useReactiveWebsocket.js",
237
252
  "./vue-hooks/browser/useBattery": "./dist/vue-hooks/browser/useBattery.js",
238
253
  "./vue-hooks/browser/useBluetooth": "./dist/vue-hooks/browser/useBluetooth.js",
239
254
  "./vue-hooks/browser/useCamera": "./dist/vue-hooks/browser/useCamera.js",
@@ -277,6 +292,7 @@
277
292
  "./types/color": "./types/color.d.ts",
278
293
  "./types/design-system": "./types/design-system.d.ts",
279
294
  "./types/geometry": "./types/geometry.d.ts",
295
+ "./types/placement": "./types/placement.d.ts",
280
296
  "./types/platform": "./types/platform.d.ts",
281
297
  "./types/reactive": "./types/reactive.d.ts",
282
298
  "./types/semver": "./types/semver.d.ts",
@@ -111,6 +111,10 @@ export interface Window {
111
111
  // Navigator API
112
112
  navigator: Navigator
113
113
 
114
+ // 事件监听API
115
+ addEventListener(type: string, listener: EventListener, options?: boolean | AddEventListenerOptions): void
116
+ removeEventListener(type: string, listener: EventListener, options?: boolean | EventListenerOptions): void
117
+
114
118
  // 开发环境标识
115
119
  __DEV__?: boolean
116
120