@cloudcome/utils-vue 1.3.0 → 1.3.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.
package/src/request.ts DELETED
@@ -1,200 +0,0 @@
1
- import { MemoryCache, type TCache, type TCacheOptions, type TCached } from '@cloudcome/utils-core/cache';
2
- import type { TDateValue } from '@cloudcome/utils-core/date';
3
- import { isFunction, isObject } from '@cloudcome/utils-core/type';
4
- import type { AnyArray, MaybeCallable, MaybePromise } from '@cloudcome/utils-core/types';
5
- import type { ComputedRef, Ref } from 'vue';
6
- import { computed, ref } from 'vue';
7
- import { type TUseAsyncOptions, type TUseAsyncReturns, type TUseAsyncState, useAsync } from './async';
8
-
9
- /**
10
- * 请求缓存配置选项。
11
- * @template T 缓存数据的类型。
12
- */
13
- export type TRequestCacheOptions<T> = TCacheOptions & {
14
- /**
15
- * 是否禁用缓存,默认为 false。
16
- * 如果设置为 true,则不会使用缓存。
17
- */
18
- disabled?: boolean;
19
-
20
- /**
21
- * 自定义缓存存储实现。
22
- * 可以传入自定义的缓存类来替代默认的内存缓存。
23
- */
24
- storage?: TCache<T>;
25
- };
26
-
27
- export type TRequestShareOptions = {
28
- /**
29
- * 是否禁用共享请求,默认为 false。
30
- * 如果设置为 true,则不会共享请求结果。
31
- */
32
- disabled?: boolean;
33
-
34
- /**
35
- * 共享的最大时长(毫秒),为 0 时表示永久共享。
36
- * 超过该时长后,共享的请求结果将被清除。
37
- */
38
- maxAge?: number;
39
-
40
- /**
41
- * 共享的过期时间(时间戳、日期字符串、日期对象等)。
42
- * 优先级比 maxAge 更高,指定具体的过期时间。
43
- */
44
- expiredAt?: TDateValue;
45
- };
46
-
47
- export type TRetryOptions = {
48
- /**
49
- * 是否禁用共享请求,默认为 false。
50
- * 如果设置为 true,则不会重试。
51
- */
52
- disabled?: boolean;
53
- };
54
-
55
- /**
56
- * 请求选项,扩展了异步操作的选项。
57
- * @template T 请求返回的数据类型。
58
- * @template I 请求参数的类型。
59
- */
60
- export type TRequestOptions<I extends AnyArray, O> = TUseAsyncOptions<I, O> & {
61
- /**
62
- * 请求的唯一标识符,可以是字符串或函数返回的字符串。
63
- * 用于缓存和共享的键值。
64
- */
65
- id?: MaybeCallable<string>;
66
-
67
- /**
68
- * 缓存配置,可以是布尔值或完整的缓存选项。
69
- * 如果为 true,则启用默认缓存;如果为对象,则可以自定义缓存行为。
70
- */
71
- cache?: boolean | TRequestCacheOptions<O>;
72
-
73
- /**
74
- * 共享配置,可以是布尔值或完整的共享选项。
75
- * 共享时,相同的请求 ID 会复用第一次发出且没有响应完成的请求。
76
- *
77
- * 例如,10 组件同时或先后发起 10 次请求用于获取用户信息,
78
- * 那么这 10 个组件会共同等待第一次发起的请求,直到完成。
79
- *
80
- * 共享与缓存是不同的概念,共享是进行时,缓存是过去时,即:
81
- * - 共享是共享**正在发送**的请求
82
- * - 缓存是缓存**已经发送**的请求
83
- *
84
- * 如果为 true,则启用默认共享;如果为对象,则可以自定义共享行为。
85
- */
86
- share?: boolean | TRequestShareOptions;
87
-
88
- /**
89
- * 当命中缓存时的回调函数。
90
- * 在缓存命中时触发,接收缓存的数据作为参数。
91
- */
92
- onCacheHit?: (cached: TCached<O>) => unknown;
93
- };
94
-
95
- export type TUseRequestState<O> = TUseAsyncState<O> & {
96
- /**
97
- * 是否命中共享数据
98
- */
99
- hitShare: boolean;
100
-
101
- /**
102
- * 是否命中缓存
103
- */
104
- hitCache: boolean;
105
- };
106
- export type TUseRequestReturns<I extends AnyArray, O> = Omit<TUseAsyncReturns<I, O>, 'run' | 'runAsync' | 'state'> & {
107
- state: ComputedRef<TUseRequestState<O>>;
108
- send: (...inputs: I) => void;
109
- sendAsync: (...inputs: I) => Promise<O>;
110
- hitShare: Ref<boolean>;
111
- hitCache: Ref<boolean>;
112
- };
113
-
114
- const defaultCacheStorage = new MemoryCache();
115
- const defaultShareStorage = new MemoryCache();
116
-
117
- /**
118
- * 使用请求功能的组合式函数。
119
- * 支持缓存和异步操作的封装。
120
- *
121
- * @template O 请求返回的数据类型。
122
- * @template I 请求参数的类型。
123
- * @param {() => Promise<O>} fn 实际的请求函数,返回一个 Promise。
124
- * @param {TRequestOptions<I, O>} [options] 请求选项,包括缓存和回调配置。
125
- * @returns 返回一个对象,包含以下内容:
126
- * - 异步操作的状态(如 loading、error 等)。
127
- * - 是否命中缓存(hitCache)。
128
- * - 是否命中共享请求(hitShare)。
129
- */
130
- export function useRequest<I extends AnyArray, O>(
131
- fn: (...inputs: I) => Promise<O>,
132
- options?: TRequestOptions<I, O>,
133
- ): TUseRequestReturns<I, O> {
134
- const { id, cache, share, onCacheHit, onSuccess } = options || {};
135
-
136
- const shareStorage = defaultShareStorage as MemoryCache<Promise<O>>;
137
- const shareAble = isObject(share) ? !share.disabled : share;
138
- const shareOptions = isObject(share) ? share : {};
139
- const hitShare = ref(false);
140
-
141
- const _cached = defaultCacheStorage as TCache<O>;
142
- const cacheStorage = isObject(cache) ? cache.storage || _cached : _cached;
143
- const cacheAble = isObject(cache) ? !cache.disabled : cache;
144
- const cacheOptions = isObject(cache) ? cache : {};
145
- const hitCache = ref(false);
146
-
147
- const cacheableFn = async (...inputs: I) => {
148
- const requestId = isFunction(id) ? id() : id;
149
-
150
- if (requestId && shareAble) {
151
- const shared = shareStorage.get(requestId);
152
- if (shared) {
153
- hitShare.value = true;
154
- return await shared.data;
155
- }
156
- }
157
-
158
- if (requestId && cacheAble) {
159
- const cached = await cacheStorage.get(requestId);
160
-
161
- if (cached) {
162
- const data = cached.data;
163
- hitCache.value = true;
164
- onCacheHit?.(cached);
165
- onSuccess?.(data, ...inputs);
166
- return data;
167
- }
168
- }
169
-
170
- const promise = fn(...inputs);
171
-
172
- if (requestId && shareAble) {
173
- shareStorage.set(requestId, promise, shareOptions);
174
- }
175
-
176
- const data = await promise;
177
-
178
- if (requestId && cacheAble) {
179
- cacheStorage.set(requestId, data, cacheOptions);
180
- }
181
-
182
- return data;
183
- };
184
- const { state: asyncState, run: send, runAsync: sendAsync, ...async } = useAsync(cacheableFn, options);
185
-
186
- const state = computed(() => ({
187
- ...asyncState.value,
188
- hitShare: hitShare.value,
189
- hitCache: hitCache.value,
190
- }));
191
-
192
- return {
193
- ...async,
194
- state,
195
- send,
196
- sendAsync,
197
- hitShare,
198
- hitCache,
199
- };
200
- }
@@ -1,104 +0,0 @@
1
- import { promiseDelay } from '@cloudcome/utils-core/promise';
2
- import { describe, expect, it, vi } from 'vitest';
3
- import { ref } from 'vue';
4
- import { useAsync } from '../src/async';
5
-
6
- describe('useAsync 组合式函数', () => {
7
- const mockAsyncFn = vi.fn();
8
- const mockOptions = {
9
- onBefore: vi.fn(),
10
- onSuccess: vi.fn(),
11
- onError: vi.fn(),
12
- onAfter: vi.fn(),
13
- };
14
-
15
- beforeEach(() => {
16
- vi.resetAllMocks();
17
- });
18
-
19
- it('应该正确处理异步操作', async () => {
20
- const mockData = { id: 1 };
21
- mockAsyncFn.mockResolvedValue(mockData);
22
- const { loading, data, error, runAsync } = useAsync(mockAsyncFn, mockOptions);
23
-
24
- const promise = runAsync('test');
25
- expect(loading.value).toBe(true);
26
- expect(mockOptions.onBefore).toHaveBeenCalled();
27
-
28
- await promise;
29
- expect(loading.value).toBe(false);
30
- expect(data.value).toEqual(mockData);
31
- expect(error.value).toBeNull();
32
- expect(mockOptions.onSuccess).toHaveBeenCalledWith(mockData, 'test');
33
- expect(mockOptions.onAfter).toHaveBeenCalled();
34
- });
35
-
36
- it('应该处理异步操作失败', async () => {
37
- const mockError = new Error('test error');
38
- mockAsyncFn.mockRejectedValue(mockError);
39
- const { loading, error, runAsync } = useAsync(mockAsyncFn, mockOptions);
40
-
41
- await expect(runAsync('test1', 'test2')).rejects.toThrow(mockError);
42
- expect(loading.value).toBe(false);
43
- expect(error.value).toEqual(mockError);
44
- expect(mockOptions.onError).toHaveBeenCalledWith(mockError, 'test1', 'test2');
45
- expect(mockOptions.onAfter).toHaveBeenCalled();
46
- });
47
-
48
- it('应该支持 run 方法', async () => {
49
- const mockData = { id: 1 };
50
- mockAsyncFn.mockResolvedValue(mockData);
51
- const { run } = useAsync(mockAsyncFn);
52
-
53
- run('test');
54
- await new Promise((resolve) => setTimeout(resolve, 0));
55
-
56
- expect(mockAsyncFn).toHaveBeenCalledWith('test');
57
- });
58
-
59
- it('应该正确处理run方法的返回值', async () => {
60
- const mockData = { id: 1 };
61
- mockAsyncFn.mockResolvedValue(mockData);
62
- const { run } = useAsync(mockAsyncFn);
63
-
64
- const result = await new Promise((resolve) => {
65
- run('test');
66
- setTimeout(() => resolve(mockAsyncFn.mock.results[0].value), 0);
67
- });
68
-
69
- expect(result).toEqual(mockData);
70
- });
71
-
72
- it('应该正确处理空options的情况', async () => {
73
- const mockData = { id: 1 };
74
- mockAsyncFn.mockResolvedValue(mockData);
75
- const { loading, data, runAsync } = useAsync(mockAsyncFn);
76
-
77
- await runAsync('test');
78
- expect(loading.value).toBe(false);
79
- expect(data.value).toEqual(mockData);
80
- });
81
-
82
- it('应该正确处理参数传递', async () => {
83
- const mockData = { id: 1 };
84
- mockAsyncFn.mockResolvedValue(mockData);
85
- const { runAsync } = useAsync(mockAsyncFn);
86
-
87
- const args = ['arg1', 2, { key: 'value' }];
88
- await runAsync(...args);
89
- expect(mockAsyncFn).toHaveBeenCalledWith(...args);
90
- });
91
-
92
- it('应该正确处理多次调用', async () => {
93
- const mockData1 = { id: 1 };
94
- const mockData2 = { id: 2 };
95
- mockAsyncFn.mockResolvedValueOnce(mockData1).mockResolvedValueOnce(mockData2);
96
- const { data, runAsync } = useAsync(mockAsyncFn);
97
-
98
- await runAsync('first');
99
- expect(data.value).toEqual(mockData1);
100
-
101
- await runAsync('second');
102
- expect(data.value).toEqual(mockData2);
103
- });
104
- });
@@ -1,61 +0,0 @@
1
- import { describe, expect, it } from 'vitest';
2
- import { ref } from 'vue';
3
- import { useEmit, useExpose } from '../src/component';
4
-
5
- describe('组件工具函数', () => {
6
- describe('useExpose', () => {
7
- it('应该创建一个可响应式访问的组件实例引用', () => {
8
- const TestComponent = {
9
- setup() {
10
- defineExpose({
11
- testMethod() {
12
- return 'test';
13
- },
14
- });
15
- },
16
- };
17
-
18
- const compRef = useExpose(TestComponent);
19
- expect(compRef.value).toBeNull();
20
-
21
- compRef.value = { testMethod: () => 'mocked' };
22
- // @ts-ignore
23
- expect(compRef.value?.testMethod()).toBe('mocked');
24
- });
25
- });
26
-
27
- describe('useEmit', () => {
28
- it('应该正确返回事件监听函数', () => {
29
- const TestComponent = {
30
- props: {
31
- onClick: Function,
32
- },
33
- };
34
-
35
- const mockListener = vi.fn();
36
- // @ts-ignore
37
- const result = useEmit(TestComponent, 'click', mockListener);
38
-
39
- expect(result).toBe(mockListener);
40
- // @ts-ignore
41
- result();
42
- expect(mockListener).toHaveBeenCalledTimes(1);
43
- });
44
-
45
- it('应该正确处理带参数的emit事件', () => {
46
- const TestComponent = {
47
- props: {
48
- onChange: Function,
49
- },
50
- };
51
-
52
- const mockListener = vi.fn();
53
- // @ts-ignore
54
- const result = useEmit(TestComponent, 'change', mockListener);
55
-
56
- // @ts-ignore
57
- result(1, 'test');
58
- expect(mockListener).toHaveBeenCalledWith(1, 'test');
59
- });
60
- });
61
- });
@@ -1,109 +0,0 @@
1
- import { mount } from '@vue/test-utils';
2
- import { describe, expect, it, vi } from 'vitest';
3
- import { createEventHook } from '../src/event';
4
-
5
- describe('createEventCenter 事件中心', () => {
6
- // 定义测试事件类型
7
- type TestEvents = {
8
- 'test-event': [string, number];
9
- 'another-event': [boolean];
10
- };
11
-
12
- it('应该正确创建事件中心实例', () => {
13
- const eventCenter = createEventHook<TestEvents>();
14
-
15
- expect(eventCenter).toBeDefined();
16
- expect(typeof eventCenter.on).toBe('function');
17
- expect(typeof eventCenter.off).toBe('function');
18
- expect(typeof eventCenter.emit).toBe('function');
19
- expect(typeof eventCenter.useEvent).toBe('function');
20
- });
21
-
22
- it('应该正确注册和触发事件', () => {
23
- const eventCenter = createEventHook<TestEvents>();
24
- const mockListener = vi.fn();
25
-
26
- eventCenter.on('test-event', mockListener);
27
- eventCenter.emit('test-event', 'hello', 123);
28
-
29
- expect(mockListener).toHaveBeenCalledTimes(1);
30
- expect(mockListener).toHaveBeenCalledWith('hello', 123);
31
- });
32
-
33
- it('应该正确取消事件监听', () => {
34
- const eventCenter = createEventHook<TestEvents>();
35
- const mockListener = vi.fn();
36
-
37
- eventCenter.on('test-event', mockListener);
38
- eventCenter.off('test-event', mockListener);
39
- eventCenter.emit('test-event', 'hello', 123);
40
-
41
- expect(mockListener).not.toHaveBeenCalled();
42
- });
43
-
44
- it('应该正确处理 useEventCenter 在 mount 阶段', async () => {
45
- const eventCenter = createEventHook<TestEvents>({ stage: 'mount' });
46
- const mockListener = vi.fn();
47
- const wrapper = mount({
48
- template: '<div>test</div>',
49
- setup() {
50
- eventCenter.useEvent('another-event', mockListener);
51
- },
52
- });
53
-
54
- await wrapper.vm.$nextTick();
55
-
56
- eventCenter.emit('another-event', true);
57
-
58
- expect(mockListener).toHaveBeenCalledTimes(1);
59
- expect(mockListener).toHaveBeenCalledWith(true);
60
-
61
- wrapper.unmount();
62
-
63
- eventCenter.emit('another-event', false);
64
- expect(mockListener).toHaveBeenCalledTimes(1);
65
- expect(mockListener).toHaveBeenCalledWith(true);
66
- });
67
-
68
- it('应该正确处理 useEventCenter 在 mounted 阶段', async () => {
69
- const eventCenter = createEventHook<TestEvents>({ stage: 'mounted' });
70
- const mockListener = vi.fn();
71
- const wrapper = mount({
72
- template: '<div>test</div>',
73
- setup() {
74
- eventCenter.useEvent('another-event', mockListener);
75
- },
76
- });
77
-
78
- await wrapper.vm.$nextTick();
79
-
80
- eventCenter.emit('another-event', true);
81
-
82
- expect(mockListener).toHaveBeenCalledTimes(1);
83
- expect(mockListener).toHaveBeenCalledWith(true);
84
-
85
- wrapper.unmount();
86
-
87
- eventCenter.emit('another-event', false);
88
- expect(mockListener).toHaveBeenCalledTimes(1);
89
- expect(mockListener).toHaveBeenCalledWith(true);
90
- });
91
-
92
- it('应该支持自定义事件发射器', () => {
93
- const customEmitter = {
94
- on: vi.fn(),
95
- off: vi.fn(),
96
- emit: vi.fn(),
97
- };
98
- const eventCenter = createEventHook<TestEvents>({ emitter: customEmitter });
99
-
100
- const mockListener = vi.fn();
101
- eventCenter.on('test-event', mockListener);
102
- eventCenter.emit('test-event', 'hello', 123);
103
- eventCenter.off('test-event', mockListener);
104
-
105
- expect(customEmitter.on).toHaveBeenCalled();
106
- expect(customEmitter.emit).toHaveBeenCalled();
107
- expect(customEmitter.off).toHaveBeenCalled();
108
- });
109
- });
@@ -1,6 +0,0 @@
1
- import { VERSION } from '@/index';
2
- import { expect, it } from 'vitest';
3
-
4
- it('version', () => {
5
- expect(VERSION).toEqual(PKG_VERSION);
6
- });
package/test/page.test.ts DELETED
@@ -1,63 +0,0 @@
1
- import { mount } from '@vue/test-utils';
2
- import { describe, expect, it, vi } from 'vitest';
3
- import { onBeforeMount, onBeforeUnmount, onMounted } from 'vue';
4
- import { usePageMount, usePageMounted } from '../src/page';
5
-
6
- describe('hook-page', () => {
7
- it('应该正确触发 usePageMount 生命周期', async () => {
8
- const fn = vi.fn();
9
- const cleanup = vi.fn();
10
- const beforeMountFn = vi.fn(() => cleanup);
11
- const wrapper = mount({
12
- template: '<div>test</div>',
13
- setup() {
14
- onBeforeMount(fn);
15
- onBeforeUnmount(fn);
16
- usePageMount(beforeMountFn);
17
- },
18
- });
19
-
20
- await wrapper.vm.$nextTick();
21
- expect(beforeMountFn).toHaveBeenCalledTimes(1);
22
- wrapper.unmount();
23
- expect(fn).toHaveBeenCalledTimes(2);
24
- expect(cleanup).toHaveBeenCalledTimes(1);
25
- });
26
-
27
- it('应该正确触发 usePageMounted 生命周期', async () => {
28
- const fn = vi.fn();
29
- const cleanup = vi.fn();
30
- const mountedFn = vi.fn(() => cleanup);
31
- const wrapper = mount({
32
- template: '<div>test</div>',
33
- setup() {
34
- onMounted(fn);
35
- onBeforeUnmount(fn);
36
- usePageMounted(mountedFn);
37
- },
38
- });
39
-
40
- await wrapper.vm.$nextTick();
41
- expect(mountedFn).toHaveBeenCalledTimes(1);
42
- wrapper.unmount();
43
- expect(fn).toHaveBeenCalledTimes(2);
44
- expect(cleanup).toHaveBeenCalledTimes(1);
45
- });
46
-
47
- it('应该支持异步回调函数', async () => {
48
- const cleanup = vi.fn();
49
- const asyncFn = vi.fn(async () => cleanup);
50
-
51
- const wrapper = mount({
52
- template: '<div>test</div>',
53
- setup() {
54
- usePageMount(asyncFn);
55
- },
56
- });
57
-
58
- await wrapper.vm.$nextTick();
59
- expect(asyncFn).toHaveBeenCalledTimes(1);
60
- wrapper.unmount();
61
- expect(cleanup).toHaveBeenCalledTimes(1);
62
- });
63
- });
@@ -1,123 +0,0 @@
1
- import { useRequest } from '@/request';
2
- import { MemoryCache } from '@cloudcome/utils-core/cache';
3
- import { describe, expect, it, vi } from 'vitest';
4
-
5
- describe('useRequest 组合式函数', () => {
6
- const mockRequestFn = vi.fn();
7
- const mockOptions = {
8
- onSuccess: vi.fn(),
9
- onCacheHit: vi.fn(),
10
- };
11
-
12
- beforeEach(() => {
13
- vi.resetAllMocks();
14
- (new MemoryCache() as MemoryCache<unknown>).clear();
15
- });
16
-
17
- it('应该正确处理基本请求', async () => {
18
- const mockData = { id: 1 };
19
- mockRequestFn.mockResolvedValue(mockData);
20
- const { loading, data, error, sendAsync } = useRequest(mockRequestFn, mockOptions);
21
-
22
- const promise = sendAsync('test');
23
- expect(loading.value).toBe(true);
24
-
25
- await promise;
26
- expect(loading.value).toBe(false);
27
- expect(data.value).toEqual(mockData);
28
- expect(error.value).toBeNull();
29
- expect(mockOptions.onSuccess).toHaveBeenCalledWith(mockData, 'test');
30
- });
31
-
32
- it('应该处理请求失败', async () => {
33
- const mockError = new Error('test error');
34
- mockRequestFn.mockRejectedValue(mockError);
35
- const { loading, error, sendAsync } = useRequest(mockRequestFn);
36
-
37
- await expect(sendAsync('test')).rejects.toThrow(mockError);
38
- expect(loading.value).toBe(false);
39
- expect(error.value).toEqual(mockError);
40
- });
41
-
42
- it('应该支持缓存功能', async () => {
43
- const mockData = { id: 1 };
44
- mockRequestFn.mockResolvedValue(mockData);
45
- const { hitCache, sendAsync } = useRequest(mockRequestFn, {
46
- id: 'test-cache',
47
- cache: true,
48
- onCacheHit: mockOptions.onCacheHit,
49
- });
50
-
51
- await sendAsync('test');
52
- expect(hitCache.value).toBe(false);
53
- expect(mockOptions.onCacheHit).not.toHaveBeenCalled();
54
-
55
- await sendAsync('test');
56
- expect(hitCache.value).toBe(true);
57
- expect(mockOptions.onCacheHit).toHaveBeenCalled();
58
- });
59
-
60
- it('应该支持共享请求功能', async () => {
61
- const mockData = { id: 1 };
62
- const fn = vi.fn().mockImplementation(async () => mockData);
63
-
64
- const id = 'test-share';
65
- const {
66
- hitShare: hs1,
67
- sendAsync: sendAsync1,
68
- data: data1,
69
- } = useRequest(fn, {
70
- id,
71
- share: true,
72
- });
73
- const {
74
- hitShare: hs2,
75
- sendAsync: sendAsync2,
76
- data: data2,
77
- } = useRequest(fn, {
78
- id,
79
- share: true,
80
- });
81
-
82
- await sendAsync1(1);
83
- await sendAsync2(1);
84
-
85
- expect(hs1.value).toBe(false);
86
- expect(hs2.value).toBe(true);
87
-
88
- expect(data1.value).toEqual(mockData);
89
- expect(data2.value).toEqual(mockData);
90
-
91
- expect(fn).toHaveBeenCalledTimes(1);
92
- });
93
-
94
- it('应该支持禁用缓存', async () => {
95
- const mockData = { id: 1 };
96
- mockRequestFn.mockResolvedValue(mockData);
97
- const { hitCache, sendAsync } = useRequest(mockRequestFn, {
98
- id: 'test-cache',
99
- cache: { disabled: true },
100
- });
101
-
102
- await sendAsync('test');
103
- await sendAsync('test');
104
- expect(hitCache.value).toBe(false);
105
- expect(mockRequestFn).toHaveBeenCalledTimes(2);
106
- });
107
-
108
- it('应该支持禁用共享请求', async () => {
109
- const mockData = { id: 1 };
110
- mockRequestFn.mockResolvedValue(mockData);
111
- const { hitShare, sendAsync } = useRequest(mockRequestFn, {
112
- id: 'test-share',
113
- share: { disabled: true },
114
- });
115
-
116
- const promise1 = sendAsync('test');
117
- const promise2 = sendAsync('test');
118
- await Promise.all([promise1, promise2]);
119
-
120
- expect(hitShare.value).toBe(false);
121
- expect(mockRequestFn).toHaveBeenCalledTimes(2);
122
- });
123
- });
package/tsconfig.json DELETED
@@ -1,31 +0,0 @@
1
- {
2
- "compilerOptions": {
3
- "jsx": "preserve",
4
- "jsxImportSource": "vue",
5
- "target": "ES2024",
6
- "module": "ESNext",
7
- "moduleResolution": "bundler",
8
-
9
- "strict": true,
10
- "noEmit": true,
11
- "allowJs": true,
12
- "sourceMap": true,
13
- "skipLibCheck": true,
14
- "esModuleInterop": true,
15
- "resolveJsonModule": true,
16
- "verbatimModuleSyntax": true,
17
- "allowImportingTsExtensions": false,
18
- "allowSyntheticDefaultImports": true,
19
- "forceConsistentCasingInFileNames": true,
20
-
21
- "lib": ["ES2024"],
22
- "types": ["node", "vite/client", "vitest/globals"],
23
- "plugins": [],
24
- "paths": {
25
- "@/*": ["./src/*"]
26
- }
27
- },
28
-
29
- "include": ["**/*.ts", "**/.*.ts", "**/*.mts", "**/*.tsx", "**/*.vue"],
30
- "exclude": []
31
- }