@cloudcome/utils-vue 1.10.1 → 1.11.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.
@@ -0,0 +1,54 @@
1
+ import { MaybePromise } from '@cloudcome/utils-core/types';
2
+ export type HookListener = () => MaybePromise<unknown>;
3
+ export type HookListenerWithDispose = () => MaybePromise<undefined | HookListener>;
4
+ /**
5
+ * 页面挂载前生命周期钩子
6
+ *
7
+ * @param beforeMount - 在组件挂载前执行的回调函数,可以返回一个清理函数
8
+ *
9
+ * @example
10
+ * ```ts
11
+ * useMount(() => {
12
+ * console.log('组件即将挂载');
13
+ * // 可以返回一个清理函数,在组件卸载前执行
14
+ * return () => {
15
+ * console.log('组件即将卸载');
16
+ * };
17
+ * });
18
+ * ```
19
+ */
20
+ export declare function useMount(beforeMount: HookListenerWithDispose): void;
21
+ /**
22
+ * 页面挂载后生命周期钩子
23
+ *
24
+ * @param mounted - 在组件挂载后执行的回调函数,可以返回一个清理函数
25
+ *
26
+ * @example
27
+ * ```ts
28
+ * useMounted(() => {
29
+ * console.log('组件已挂载');
30
+ * // 可以返回一个清理函数,在组件卸载前执行
31
+ * return () => {
32
+ * console.log('组件即将卸载');
33
+ * };
34
+ * });
35
+ * ```
36
+ */
37
+ export declare function useMounted(mounted: HookListenerWithDispose): void;
38
+ /**
39
+ * 页面激活时生命周期钩子
40
+ *
41
+ * @param activated - 在组件被激活时执行的回调函数,可以返回一个清理函数
42
+ *
43
+ * @example
44
+ * ```ts
45
+ * useActivated(() => {
46
+ * console.log('组件已激活');
47
+ * // 可以返回一个清理函数,在组件失活前执行
48
+ * return () => {
49
+ * console.log('组件即将失活');
50
+ * };
51
+ * });
52
+ * ```
53
+ */
54
+ export declare function useActivated(activated: HookListenerWithDispose): void;
@@ -0,0 +1,61 @@
1
+ import { Ref } from 'vue';
2
+ import { ComponentExposed, ComponentProps } from 'vue-component-type-helpers';
3
+ /**
4
+ * 创建一个响应式引用,用于暴露组件实例
5
+ * @template T 组件类型
6
+ * @param {T} Comp 组件定义
7
+ * @returns 返回一个可响应式访问的组件实例引用
8
+ * @example
9
+ * const compRef = useExpose(MyComponent)
10
+ */
11
+ export declare function useExpose<T>(Comp: T): Ref<ComponentExposed<T> | null>;
12
+ /**
13
+ * 将字符串的首字母转换为小写
14
+ * @template S 字符串类型
15
+ * @typedef {S extends `${infer First}${infer Rest}` ? `${Lowercase<First>}${Rest}` : S} LowercaseFirst
16
+ */
17
+ type LowercaseFirst<S extends string> = S extends `${infer First}${infer Rest}` ? `${Lowercase<First>}${Rest}` : S;
18
+ /**
19
+ * 从组件props中提取事件类型
20
+ * @template T 组件props类型
21
+ * @typedef {Object} PickEmits
22
+ * @property {Object} [K in keyof T as K extends `on${infer Rest}`...] 转换后的emit事件名
23
+ * - @property {Function} [...args: P] 事件回调函数
24
+ */
25
+ type PickEmits<T> = {
26
+ [K in keyof T as K extends `on${infer Rest}` ? T[K] extends (...args: any[]) => any ? LowercaseFirst<Rest> : never : never]: T[K] extends (...args: infer P) => any ? (...args: P) => unknown : never;
27
+ };
28
+ /**
29
+ * 创建一个组件emit事件监听器
30
+ * @template T 组件类型
31
+ * @template E 从组件props中提取的事件类型
32
+ * @template K 事件名
33
+ * @param {T} Comp 组件定义
34
+ * @param {K} event 事件名称
35
+ * @param {E[K]} listener 事件监听函数
36
+ * @returns {E[K]} 返回传入的事件监听函数
37
+ * @example
38
+ * const handleClick = useEmit(MyComponent, 'click', (payload) => {
39
+ * console.log('click event', payload)
40
+ * })
41
+ */
42
+ export declare function useEmit<T, E extends PickEmits<Required<ComponentProps<T>>>, K extends keyof E>(Comp: T, event: K, listener: E[K]): E[K];
43
+ type PickMethods<T> = {
44
+ [K in keyof T]: T[K] extends (...args: infer P) => any ? T[K] : never;
45
+ };
46
+ /**
47
+ * 从组件props中提取方法并返回指定方法
48
+ * @template T 组件类型
49
+ * @template M 从组件props中提取的方法类型
50
+ * @template K 方法名类型
51
+ * @param {T} Comp 组件定义
52
+ * @param {K} name 方法名称
53
+ * @param {M[K]} method 要返回的方法
54
+ * @returns {M[K]} 返回传入的方法
55
+ * @example
56
+ * const handleUpdate = useMethod(MyComponent, 'update', (value) => {
57
+ * console.log('update value', value)
58
+ * })
59
+ */
60
+ export declare function useMethod<T, M extends PickMethods<Required<ComponentProps<T>>>, K extends keyof M>(Comp: T, name: K, method: M[K]): M[K];
61
+ export {};
@@ -1,6 +1,7 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
3
  const vue = require("vue");
4
+ const life = require("./life.cjs");
4
5
  function useExpose(Comp) {
5
6
  return vue.ref(null);
6
7
  }
@@ -10,6 +11,9 @@ function useEmit(Comp, event, listener) {
10
11
  function useMethod(Comp, name, method) {
11
12
  return method;
12
13
  }
14
+ exports.useActivated = life.useActivated;
15
+ exports.useMount = life.useMount;
16
+ exports.useMounted = life.useMounted;
13
17
  exports.useEmit = useEmit;
14
18
  exports.useExpose = useExpose;
15
19
  exports.useMethod = useMethod;
@@ -1 +1 @@
1
- {"version":3,"file":"component.cjs","sources":["../src/component.ts"],"sourcesContent":["import { type Ref, ref } from 'vue';\nimport type { ComponentExposed, ComponentProps } from 'vue-component-type-helpers';\n\n/**\n * 创建一个响应式引用,用于暴露组件实例\n * @template T 组件类型\n * @param {T} Comp 组件定义\n * @returns 返回一个可响应式访问的组件实例引用\n * @example\n * const compRef = useExpose(MyComponent)\n */\nexport function useExpose<T>(Comp: T) {\n // 这里必须类型断言,否则构建会失败\n return ref<ComponentExposed<T> | null>(null) as Ref<ComponentExposed<T> | null>;\n}\n\n/**\n * 将字符串的首字母转换为小写\n * @template S 字符串类型\n * @typedef {S extends `${infer First}${infer Rest}` ? `${Lowercase<First>}${Rest}` : S} LowercaseFirst\n */\ntype LowercaseFirst<S extends string> = S extends `${infer First}${infer Rest}` ? `${Lowercase<First>}${Rest}` : S;\n\n/**\n * 从组件props中提取事件类型\n * @template T 组件props类型\n * @typedef {Object} PickEmits\n * @property {Object} [K in keyof T as K extends `on${infer Rest}`...] 转换后的emit事件名\n * - @property {Function} [...args: P] 事件回调函数\n */\ntype PickEmits<T> = {\n [K in keyof T as K extends `on${infer Rest}`\n ? // biome-ignore lint/suspicious/noExplicitAny: <explanation>\n T[K] extends (...args: any[]) => any\n ? LowercaseFirst<Rest>\n : never\n : // biome-ignore lint/suspicious/noExplicitAny: <explanation>\n never]: T[K] extends (...args: infer P) => any ? (...args: P) => unknown : never;\n};\n\n/**\n * 创建一个组件emit事件监听器\n * @template T 组件类型\n * @template E 从组件props中提取的事件类型\n * @template K 事件名\n * @param {T} Comp 组件定义\n * @param {K} event 事件名称\n * @param {E[K]} listener 事件监听函数\n * @returns {E[K]} 返回传入的事件监听函数\n * @example\n * const handleClick = useEmit(MyComponent, 'click', (payload) => {\n * console.log('click event', payload)\n * })\n */\nexport function useEmit<T, E extends PickEmits<Required<ComponentProps<T>>>, K extends keyof E>(\n Comp: T,\n event: K,\n listener: E[K],\n) {\n return listener;\n}\n\ntype PickMethods<T> = {\n // biome-ignore lint/suspicious/noExplicitAny: <explanation>\n [K in keyof T]: T[K] extends (...args: infer P) => any ? T[K] : never;\n};\n\n/**\n * 从组件props中提取方法并返回指定方法\n * @template T 组件类型\n * @template M 从组件props中提取的方法类型\n * @template K 方法名类型\n * @param {T} Comp 组件定义\n * @param {K} name 方法名称\n * @param {M[K]} method 要返回的方法\n * @returns {M[K]} 返回传入的方法\n * @example\n * const handleUpdate = useMethod(MyComponent, 'update', (value) => {\n * console.log('update value', value)\n * })\n */\nexport function useMethod<T, M extends PickMethods<Required<ComponentProps<T>>>, K extends keyof M>(\n Comp: T,\n name: K,\n method: M[K],\n) {\n return method;\n}\n"],"names":["ref"],"mappings":";;;AAWO,SAAS,UAAa,MAAS;AAEpC,SAAOA,IAAAA,IAAgC,IAAI;AAC7C;AAwCgB,SAAA,QACd,MACA,OACA,UACA;AACO,SAAA;AACT;AAqBgB,SAAA,UACd,MACA,MACA,QACA;AACO,SAAA;AACT;;;;"}
1
+ {"version":3,"file":"component.cjs","sources":["../src/component/self.ts"],"sourcesContent":["import { type Ref, ref } from 'vue';\nimport type { ComponentExposed, ComponentProps } from 'vue-component-type-helpers';\n\n/**\n * 创建一个响应式引用,用于暴露组件实例\n * @template T 组件类型\n * @param {T} Comp 组件定义\n * @returns 返回一个可响应式访问的组件实例引用\n * @example\n * const compRef = useExpose(MyComponent)\n */\nexport function useExpose<T>(Comp: T) {\n // 这里必须类型断言,否则构建会失败\n return ref<ComponentExposed<T> | null>(null) as Ref<ComponentExposed<T> | null>;\n}\n\n/**\n * 将字符串的首字母转换为小写\n * @template S 字符串类型\n * @typedef {S extends `${infer First}${infer Rest}` ? `${Lowercase<First>}${Rest}` : S} LowercaseFirst\n */\ntype LowercaseFirst<S extends string> = S extends `${infer First}${infer Rest}` ? `${Lowercase<First>}${Rest}` : S;\n\n/**\n * 从组件props中提取事件类型\n * @template T 组件props类型\n * @typedef {Object} PickEmits\n * @property {Object} [K in keyof T as K extends `on${infer Rest}`...] 转换后的emit事件名\n * - @property {Function} [...args: P] 事件回调函数\n */\ntype PickEmits<T> = {\n [K in keyof T as K extends `on${infer Rest}`\n ? // biome-ignore lint/suspicious/noExplicitAny: <explanation>\n T[K] extends (...args: any[]) => any\n ? LowercaseFirst<Rest>\n : never\n : // biome-ignore lint/suspicious/noExplicitAny: <explanation>\n never]: T[K] extends (...args: infer P) => any ? (...args: P) => unknown : never;\n};\n\n/**\n * 创建一个组件emit事件监听器\n * @template T 组件类型\n * @template E 从组件props中提取的事件类型\n * @template K 事件名\n * @param {T} Comp 组件定义\n * @param {K} event 事件名称\n * @param {E[K]} listener 事件监听函数\n * @returns {E[K]} 返回传入的事件监听函数\n * @example\n * const handleClick = useEmit(MyComponent, 'click', (payload) => {\n * console.log('click event', payload)\n * })\n */\nexport function useEmit<T, E extends PickEmits<Required<ComponentProps<T>>>, K extends keyof E>(\n Comp: T,\n event: K,\n listener: E[K],\n) {\n return listener;\n}\n\ntype PickMethods<T> = {\n // biome-ignore lint/suspicious/noExplicitAny: <explanation>\n [K in keyof T]: T[K] extends (...args: infer P) => any ? T[K] : never;\n};\n\n/**\n * 从组件props中提取方法并返回指定方法\n * @template T 组件类型\n * @template M 从组件props中提取的方法类型\n * @template K 方法名类型\n * @param {T} Comp 组件定义\n * @param {K} name 方法名称\n * @param {M[K]} method 要返回的方法\n * @returns {M[K]} 返回传入的方法\n * @example\n * const handleUpdate = useMethod(MyComponent, 'update', (value) => {\n * console.log('update value', value)\n * })\n */\nexport function useMethod<T, M extends PickMethods<Required<ComponentProps<T>>>, K extends keyof M>(\n Comp: T,\n name: K,\n method: M[K],\n) {\n return method;\n}\n"],"names":["ref"],"mappings":";;;;AAWO,SAAS,UAAa,MAAS;AAEpC,SAAOA,IAAAA,IAAgC,IAAI;AAC7C;AAwCgB,SAAA,QACd,MACA,OACA,UACA;AACO,SAAA;AACT;AAqBgB,SAAA,UACd,MACA,MACA,QACA;AACO,SAAA;AACT;;;;;;;"}
@@ -1,61 +1,2 @@
1
- import { Ref } from 'vue';
2
- import { ComponentExposed, ComponentProps } from 'vue-component-type-helpers';
3
- /**
4
- * 创建一个响应式引用,用于暴露组件实例
5
- * @template T 组件类型
6
- * @param {T} Comp 组件定义
7
- * @returns 返回一个可响应式访问的组件实例引用
8
- * @example
9
- * const compRef = useExpose(MyComponent)
10
- */
11
- export declare function useExpose<T>(Comp: T): Ref<ComponentExposed<T> | null>;
12
- /**
13
- * 将字符串的首字母转换为小写
14
- * @template S 字符串类型
15
- * @typedef {S extends `${infer First}${infer Rest}` ? `${Lowercase<First>}${Rest}` : S} LowercaseFirst
16
- */
17
- type LowercaseFirst<S extends string> = S extends `${infer First}${infer Rest}` ? `${Lowercase<First>}${Rest}` : S;
18
- /**
19
- * 从组件props中提取事件类型
20
- * @template T 组件props类型
21
- * @typedef {Object} PickEmits
22
- * @property {Object} [K in keyof T as K extends `on${infer Rest}`...] 转换后的emit事件名
23
- * - @property {Function} [...args: P] 事件回调函数
24
- */
25
- type PickEmits<T> = {
26
- [K in keyof T as K extends `on${infer Rest}` ? T[K] extends (...args: any[]) => any ? LowercaseFirst<Rest> : never : never]: T[K] extends (...args: infer P) => any ? (...args: P) => unknown : never;
27
- };
28
- /**
29
- * 创建一个组件emit事件监听器
30
- * @template T 组件类型
31
- * @template E 从组件props中提取的事件类型
32
- * @template K 事件名
33
- * @param {T} Comp 组件定义
34
- * @param {K} event 事件名称
35
- * @param {E[K]} listener 事件监听函数
36
- * @returns {E[K]} 返回传入的事件监听函数
37
- * @example
38
- * const handleClick = useEmit(MyComponent, 'click', (payload) => {
39
- * console.log('click event', payload)
40
- * })
41
- */
42
- export declare function useEmit<T, E extends PickEmits<Required<ComponentProps<T>>>, K extends keyof E>(Comp: T, event: K, listener: E[K]): E[K];
43
- type PickMethods<T> = {
44
- [K in keyof T]: T[K] extends (...args: infer P) => any ? T[K] : never;
45
- };
46
- /**
47
- * 从组件props中提取方法并返回指定方法
48
- * @template T 组件类型
49
- * @template M 从组件props中提取的方法类型
50
- * @template K 方法名类型
51
- * @param {T} Comp 组件定义
52
- * @param {K} name 方法名称
53
- * @param {M[K]} method 要返回的方法
54
- * @returns {M[K]} 返回传入的方法
55
- * @example
56
- * const handleUpdate = useMethod(MyComponent, 'update', (value) => {
57
- * console.log('update value', value)
58
- * })
59
- */
60
- export declare function useMethod<T, M extends PickMethods<Required<ComponentProps<T>>>, K extends keyof M>(Comp: T, name: K, method: M[K]): M[K];
61
- export {};
1
+ export * from './component/self';
2
+ export * from './component/life';
@@ -1,4 +1,5 @@
1
1
  import { ref } from "vue";
2
+ import { b, u, a } from "./life.mjs";
2
3
  function useExpose(Comp) {
3
4
  return ref(null);
4
5
  }
@@ -9,8 +10,11 @@ function useMethod(Comp, name, method) {
9
10
  return method;
10
11
  }
11
12
  export {
13
+ b as useActivated,
12
14
  useEmit,
13
15
  useExpose,
14
- useMethod
16
+ useMethod,
17
+ u as useMount,
18
+ a as useMounted
15
19
  };
16
20
  //# sourceMappingURL=component.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"component.mjs","sources":["../src/component.ts"],"sourcesContent":["import { type Ref, ref } from 'vue';\nimport type { ComponentExposed, ComponentProps } from 'vue-component-type-helpers';\n\n/**\n * 创建一个响应式引用,用于暴露组件实例\n * @template T 组件类型\n * @param {T} Comp 组件定义\n * @returns 返回一个可响应式访问的组件实例引用\n * @example\n * const compRef = useExpose(MyComponent)\n */\nexport function useExpose<T>(Comp: T) {\n // 这里必须类型断言,否则构建会失败\n return ref<ComponentExposed<T> | null>(null) as Ref<ComponentExposed<T> | null>;\n}\n\n/**\n * 将字符串的首字母转换为小写\n * @template S 字符串类型\n * @typedef {S extends `${infer First}${infer Rest}` ? `${Lowercase<First>}${Rest}` : S} LowercaseFirst\n */\ntype LowercaseFirst<S extends string> = S extends `${infer First}${infer Rest}` ? `${Lowercase<First>}${Rest}` : S;\n\n/**\n * 从组件props中提取事件类型\n * @template T 组件props类型\n * @typedef {Object} PickEmits\n * @property {Object} [K in keyof T as K extends `on${infer Rest}`...] 转换后的emit事件名\n * - @property {Function} [...args: P] 事件回调函数\n */\ntype PickEmits<T> = {\n [K in keyof T as K extends `on${infer Rest}`\n ? // biome-ignore lint/suspicious/noExplicitAny: <explanation>\n T[K] extends (...args: any[]) => any\n ? LowercaseFirst<Rest>\n : never\n : // biome-ignore lint/suspicious/noExplicitAny: <explanation>\n never]: T[K] extends (...args: infer P) => any ? (...args: P) => unknown : never;\n};\n\n/**\n * 创建一个组件emit事件监听器\n * @template T 组件类型\n * @template E 从组件props中提取的事件类型\n * @template K 事件名\n * @param {T} Comp 组件定义\n * @param {K} event 事件名称\n * @param {E[K]} listener 事件监听函数\n * @returns {E[K]} 返回传入的事件监听函数\n * @example\n * const handleClick = useEmit(MyComponent, 'click', (payload) => {\n * console.log('click event', payload)\n * })\n */\nexport function useEmit<T, E extends PickEmits<Required<ComponentProps<T>>>, K extends keyof E>(\n Comp: T,\n event: K,\n listener: E[K],\n) {\n return listener;\n}\n\ntype PickMethods<T> = {\n // biome-ignore lint/suspicious/noExplicitAny: <explanation>\n [K in keyof T]: T[K] extends (...args: infer P) => any ? T[K] : never;\n};\n\n/**\n * 从组件props中提取方法并返回指定方法\n * @template T 组件类型\n * @template M 从组件props中提取的方法类型\n * @template K 方法名类型\n * @param {T} Comp 组件定义\n * @param {K} name 方法名称\n * @param {M[K]} method 要返回的方法\n * @returns {M[K]} 返回传入的方法\n * @example\n * const handleUpdate = useMethod(MyComponent, 'update', (value) => {\n * console.log('update value', value)\n * })\n */\nexport function useMethod<T, M extends PickMethods<Required<ComponentProps<T>>>, K extends keyof M>(\n Comp: T,\n name: K,\n method: M[K],\n) {\n return method;\n}\n"],"names":[],"mappings":";AAWO,SAAS,UAAa,MAAS;AAEpC,SAAO,IAAgC,IAAI;AAC7C;AAwCgB,SAAA,QACd,MACA,OACA,UACA;AACO,SAAA;AACT;AAqBgB,SAAA,UACd,MACA,MACA,QACA;AACO,SAAA;AACT;"}
1
+ {"version":3,"file":"component.mjs","sources":["../src/component/self.ts"],"sourcesContent":["import { type Ref, ref } from 'vue';\nimport type { ComponentExposed, ComponentProps } from 'vue-component-type-helpers';\n\n/**\n * 创建一个响应式引用,用于暴露组件实例\n * @template T 组件类型\n * @param {T} Comp 组件定义\n * @returns 返回一个可响应式访问的组件实例引用\n * @example\n * const compRef = useExpose(MyComponent)\n */\nexport function useExpose<T>(Comp: T) {\n // 这里必须类型断言,否则构建会失败\n return ref<ComponentExposed<T> | null>(null) as Ref<ComponentExposed<T> | null>;\n}\n\n/**\n * 将字符串的首字母转换为小写\n * @template S 字符串类型\n * @typedef {S extends `${infer First}${infer Rest}` ? `${Lowercase<First>}${Rest}` : S} LowercaseFirst\n */\ntype LowercaseFirst<S extends string> = S extends `${infer First}${infer Rest}` ? `${Lowercase<First>}${Rest}` : S;\n\n/**\n * 从组件props中提取事件类型\n * @template T 组件props类型\n * @typedef {Object} PickEmits\n * @property {Object} [K in keyof T as K extends `on${infer Rest}`...] 转换后的emit事件名\n * - @property {Function} [...args: P] 事件回调函数\n */\ntype PickEmits<T> = {\n [K in keyof T as K extends `on${infer Rest}`\n ? // biome-ignore lint/suspicious/noExplicitAny: <explanation>\n T[K] extends (...args: any[]) => any\n ? LowercaseFirst<Rest>\n : never\n : // biome-ignore lint/suspicious/noExplicitAny: <explanation>\n never]: T[K] extends (...args: infer P) => any ? (...args: P) => unknown : never;\n};\n\n/**\n * 创建一个组件emit事件监听器\n * @template T 组件类型\n * @template E 从组件props中提取的事件类型\n * @template K 事件名\n * @param {T} Comp 组件定义\n * @param {K} event 事件名称\n * @param {E[K]} listener 事件监听函数\n * @returns {E[K]} 返回传入的事件监听函数\n * @example\n * const handleClick = useEmit(MyComponent, 'click', (payload) => {\n * console.log('click event', payload)\n * })\n */\nexport function useEmit<T, E extends PickEmits<Required<ComponentProps<T>>>, K extends keyof E>(\n Comp: T,\n event: K,\n listener: E[K],\n) {\n return listener;\n}\n\ntype PickMethods<T> = {\n // biome-ignore lint/suspicious/noExplicitAny: <explanation>\n [K in keyof T]: T[K] extends (...args: infer P) => any ? T[K] : never;\n};\n\n/**\n * 从组件props中提取方法并返回指定方法\n * @template T 组件类型\n * @template M 从组件props中提取的方法类型\n * @template K 方法名类型\n * @param {T} Comp 组件定义\n * @param {K} name 方法名称\n * @param {M[K]} method 要返回的方法\n * @returns {M[K]} 返回传入的方法\n * @example\n * const handleUpdate = useMethod(MyComponent, 'update', (value) => {\n * console.log('update value', value)\n * })\n */\nexport function useMethod<T, M extends PickMethods<Required<ComponentProps<T>>>, K extends keyof M>(\n Comp: T,\n name: K,\n method: M[K],\n) {\n return method;\n}\n"],"names":[],"mappings":";;AAWO,SAAS,UAAa,MAAS;AAEpC,SAAO,IAAgC,IAAI;AAC7C;AAwCgB,SAAA,QACd,MACA,OACA,UACA;AACO,SAAA;AACT;AAqBgB,SAAA,UACd,MACA,MACA,QACA;AACO,SAAA;AACT;"}
package/dist/index.cjs CHANGED
@@ -1,5 +1,5 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
- const VERSION = "1.10.0";
3
+ const VERSION = "1.10.1";
4
4
  exports.VERSION = VERSION;
5
5
  //# sourceMappingURL=index.cjs.map
package/dist/index.mjs CHANGED
@@ -1,4 +1,4 @@
1
- const VERSION = "1.10.0";
1
+ const VERSION = "1.10.1";
2
2
  export {
3
3
  VERSION
4
4
  };
package/dist/life.cjs ADDED
@@ -0,0 +1,16 @@
1
+ "use strict";
2
+ const shared = require("./shared.cjs");
3
+ const vue = require("vue");
4
+ function useMount(beforeMount) {
5
+ shared._runLifeHook(vue.onBeforeMount, vue.onBeforeUnmount, beforeMount);
6
+ }
7
+ function useMounted(mounted) {
8
+ shared._runLifeHook(vue.onMounted, vue.onUnmounted, mounted);
9
+ }
10
+ function useActivated(activated) {
11
+ shared._runLifeHook(vue.onActivated, vue.onDeactivated, activated);
12
+ }
13
+ exports.useActivated = useActivated;
14
+ exports.useMount = useMount;
15
+ exports.useMounted = useMounted;
16
+ //# sourceMappingURL=life.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"life.cjs","sources":["../src/component/life.ts"],"sourcesContent":["import { _runLifeHook } from '@/shared';\nimport type { MaybePromise } from '@cloudcome/utils-core/types';\nimport { onActivated, onBeforeMount, onBeforeUnmount, onDeactivated, onMounted, onUnmounted } from 'vue';\n\nexport type HookListener = () => MaybePromise<unknown>;\nexport type HookListenerWithDispose = () => MaybePromise<undefined | HookListener>;\n\n/**\n * 页面挂载前生命周期钩子\n *\n * @param beforeMount - 在组件挂载前执行的回调函数,可以返回一个清理函数\n *\n * @example\n * ```ts\n * useMount(() => {\n * console.log('组件即将挂载');\n * // 可以返回一个清理函数,在组件卸载前执行\n * return () => {\n * console.log('组件即将卸载');\n * };\n * });\n * ```\n */\nexport function useMount(beforeMount: HookListenerWithDispose) {\n _runLifeHook(onBeforeMount, onBeforeUnmount, beforeMount);\n}\n\n/**\n * 页面挂载后生命周期钩子\n *\n * @param mounted - 在组件挂载后执行的回调函数,可以返回一个清理函数\n *\n * @example\n * ```ts\n * useMounted(() => {\n * console.log('组件已挂载');\n * // 可以返回一个清理函数,在组件卸载前执行\n * return () => {\n * console.log('组件即将卸载');\n * };\n * });\n * ```\n */\nexport function useMounted(mounted: HookListenerWithDispose) {\n _runLifeHook(onMounted, onUnmounted, mounted);\n}\n\n/**\n * 页面激活时生命周期钩子\n *\n * @param activated - 在组件被激活时执行的回调函数,可以返回一个清理函数\n *\n * @example\n * ```ts\n * useActivated(() => {\n * console.log('组件已激活');\n * // 可以返回一个清理函数,在组件失活前执行\n * return () => {\n * console.log('组件即将失活');\n * };\n * });\n * ```\n */\nexport function useActivated(activated: HookListenerWithDispose) {\n _runLifeHook(onActivated, onDeactivated, activated);\n}\n"],"names":["_runLifeHook","onBeforeMount","onBeforeUnmount","onMounted","onUnmounted","onActivated","onDeactivated"],"mappings":";;;AAuBO,SAAS,SAAS,aAAsC;AAChDA,sBAAAC,IAAAA,eAAeC,qBAAiB,WAAW;AAC1D;AAkBO,SAAS,WAAW,SAAkC;AAC9CF,sBAAAG,IAAAA,WAAWC,iBAAa,OAAO;AAC9C;AAkBO,SAAS,aAAa,WAAoC;AAClDJ,sBAAAK,IAAAA,aAAaC,mBAAe,SAAS;AACpD;;;;"}
package/dist/life.mjs ADDED
@@ -0,0 +1,17 @@
1
+ import { _runLifeHook } from "./shared.mjs";
2
+ import { onBeforeUnmount, onBeforeMount, onUnmounted, onMounted, onDeactivated, onActivated } from "vue";
3
+ function useMount(beforeMount) {
4
+ _runLifeHook(onBeforeMount, onBeforeUnmount, beforeMount);
5
+ }
6
+ function useMounted(mounted) {
7
+ _runLifeHook(onMounted, onUnmounted, mounted);
8
+ }
9
+ function useActivated(activated) {
10
+ _runLifeHook(onActivated, onDeactivated, activated);
11
+ }
12
+ export {
13
+ useMounted as a,
14
+ useActivated as b,
15
+ useMount as u
16
+ };
17
+ //# sourceMappingURL=life.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"life.mjs","sources":["../src/component/life.ts"],"sourcesContent":["import { _runLifeHook } from '@/shared';\nimport type { MaybePromise } from '@cloudcome/utils-core/types';\nimport { onActivated, onBeforeMount, onBeforeUnmount, onDeactivated, onMounted, onUnmounted } from 'vue';\n\nexport type HookListener = () => MaybePromise<unknown>;\nexport type HookListenerWithDispose = () => MaybePromise<undefined | HookListener>;\n\n/**\n * 页面挂载前生命周期钩子\n *\n * @param beforeMount - 在组件挂载前执行的回调函数,可以返回一个清理函数\n *\n * @example\n * ```ts\n * useMount(() => {\n * console.log('组件即将挂载');\n * // 可以返回一个清理函数,在组件卸载前执行\n * return () => {\n * console.log('组件即将卸载');\n * };\n * });\n * ```\n */\nexport function useMount(beforeMount: HookListenerWithDispose) {\n _runLifeHook(onBeforeMount, onBeforeUnmount, beforeMount);\n}\n\n/**\n * 页面挂载后生命周期钩子\n *\n * @param mounted - 在组件挂载后执行的回调函数,可以返回一个清理函数\n *\n * @example\n * ```ts\n * useMounted(() => {\n * console.log('组件已挂载');\n * // 可以返回一个清理函数,在组件卸载前执行\n * return () => {\n * console.log('组件即将卸载');\n * };\n * });\n * ```\n */\nexport function useMounted(mounted: HookListenerWithDispose) {\n _runLifeHook(onMounted, onUnmounted, mounted);\n}\n\n/**\n * 页面激活时生命周期钩子\n *\n * @param activated - 在组件被激活时执行的回调函数,可以返回一个清理函数\n *\n * @example\n * ```ts\n * useActivated(() => {\n * console.log('组件已激活');\n * // 可以返回一个清理函数,在组件失活前执行\n * return () => {\n * console.log('组件即将失活');\n * };\n * });\n * ```\n */\nexport function useActivated(activated: HookListenerWithDispose) {\n _runLifeHook(onActivated, onDeactivated, activated);\n}\n"],"names":[],"mappings":";;AAuBO,SAAS,SAAS,aAAsC;AAChD,eAAA,eAAe,iBAAiB,WAAW;AAC1D;AAkBO,SAAS,WAAW,SAAkC;AAC9C,eAAA,WAAW,aAAa,OAAO;AAC9C;AAkBO,SAAS,aAAa,WAAoC;AAClD,eAAA,aAAa,eAAe,SAAS;AACpD;"}
@@ -0,0 +1,33 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
+ const type = require("@cloudcome/utils-core/type");
4
+ const vue = require("vue");
5
+ function _runLifeHook(enterHook, leaveHook, onEnter) {
6
+ let onLeave;
7
+ enterHook(async () => {
8
+ const enterResult = await onEnter();
9
+ if (type.isFunction(enterResult)) {
10
+ onLeave = enterResult;
11
+ }
12
+ });
13
+ leaveHook(() => {
14
+ onLeave?.();
15
+ });
16
+ }
17
+ function _runScope(runner) {
18
+ const scope = vue.effectScope();
19
+ let dispose;
20
+ scope.run(async () => {
21
+ const result = await runner();
22
+ if (type.isFunction(result)) {
23
+ dispose = result;
24
+ }
25
+ });
26
+ vue.onScopeDispose(() => {
27
+ dispose?.();
28
+ scope.stop();
29
+ });
30
+ }
31
+ exports._runLifeHook = _runLifeHook;
32
+ exports._runScope = _runScope;
33
+ //# sourceMappingURL=shared.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shared.cjs","sources":["../src/shared.ts"],"sourcesContent":["import { isFunction } from '@cloudcome/utils-core/type';\nimport type { AnyFunction, MaybePromise } from '@cloudcome/utils-core/types';\nimport { effectScope, onScopeDispose } from 'vue';\n\nexport type HookListener = () => MaybePromise<unknown>;\nexport type HookListenerWithDispose = () => MaybePromise<unknown | HookListener>;\n\n/**\n * 运行生命周期钩子函数的工具函数\n *\n * @protected 内部方法\n * @template T - 泛型参数(未在函数中使用)\n * @param enterHook - 进入时执行的钩子函数,接收一个回调函数作为参数\n * @param leaveHook - 离开时执行的钩子函数,接收一个回调函数作为参数\n * @param onEnter - 进入时的监听器,可以返回一个清理函数\n *\n * @example\n * _runLifeHook(\n * (hook) => onMounted(hook), // 在组件挂载时执行进入逻辑\n * (hook) => onUnmounted(hook), // 在组件卸载时执行离开逻辑\n * () => {\n * // 执行进入时的逻辑\n * console.log('组件已挂载');\n *\n * // 返回一个清理函数,在离开时执行\n * return () => {\n * console.log('组件将要卸载');\n * };\n * }\n * );\n */\nexport function _runLifeHook<T>(\n enterHook: (hook: AnyFunction) => unknown,\n leaveHook: (hook: AnyFunction) => unknown,\n onEnter: HookListenerWithDispose,\n) {\n // 存储离开时需要执行的清理函数\n let onLeave: HookListener | undefined;\n\n // 注册进入钩子,在 enterHook 触发时执行\n enterHook(async () => {\n // 执行进入时的监听器逻辑\n const enterResult = await onEnter();\n\n // 如果返回结果是一个函数,则将其作为离开时的清理函数保存\n if (isFunction(enterResult)) {\n onLeave = enterResult;\n }\n });\n\n // 注册离开钩子,在 leaveHook 触发时执行\n leaveHook(() => {\n // 如果存在清理函数,则执行它\n onLeave?.();\n });\n}\n\n/**\n * 运行作用域钩子函数的工具函数\n *\n * 该函数创建一个独立的响应式作用域,在该作用域内执行传入的回调函数,\n * 并在适当的时机自动清理资源。这确保了响应式副作用的隔离和自动回收。\n *\n * @protected 内部方法\n * @param runner - 需要在作用域内执行的回调函数,可以返回一个清理函数\n *\n * @example\n * // 基本用法\n * _runScope(() => {\n * // 在这里创建的响应式副作用会被限制在当前作用域内\n * const stop = watch(someRef, (val) => {\n * console.log(val);\n * });\n *\n * // 返回一个清理函数,在作用域销毁时执行\n * return () => {\n * stop();\n * };\n * });\n *\n * @example\n * // 异步用法\n * _runScope(async () => {\n * const data = await fetchData();\n *\n * // 根据获取的数据创建响应式监听\n * const stop = watch(() => data.value, (val) => {\n * console.log(val);\n * });\n *\n * // 返回清理函数\n * return () => {\n * stop();\n * };\n * });\n */\nexport function _runScope(runner: HookListenerWithDispose) {\n // 创建一个独立的响应式作用域,用于收集和管理响应式副作用\n const scope = effectScope();\n // 存储用户提供的清理函数\n let dispose: HookListener | undefined;\n\n // 在创建的作用域内执行回调函数\n scope.run(async () => {\n // 执行传入的回调函数并等待其完成(支持异步操作)\n const result = await runner();\n\n // 如果回调函数返回了一个函数,则将其作为清理函数保存\n if (isFunction(result)) {\n dispose = result;\n }\n });\n\n // 注册作用域销毁时的回调函数\n onScopeDispose(() => {\n // 如果存在用户提供的清理函数,则执行它\n dispose?.();\n // 停止并清理整个作用域内的所有响应式副作用\n scope.stop();\n });\n}\n"],"names":["isFunction","effectScope","onScopeDispose"],"mappings":";;;;AA+BgB,SAAA,aACd,WACA,WACA,SACA;AAEI,MAAA;AAGJ,YAAU,YAAY;AAEd,UAAA,cAAc,MAAM,QAAQ;AAG9B,QAAAA,KAAAA,WAAW,WAAW,GAAG;AACjB,gBAAA;AAAA,IAAA;AAAA,EACZ,CACD;AAGD,YAAU,MAAM;AAEJ,cAAA;AAAA,EAAA,CACX;AACH;AAyCO,SAAS,UAAU,QAAiC;AAEzD,QAAM,QAAQC,IAAAA,YAAY;AAEtB,MAAA;AAGJ,QAAM,IAAI,YAAY;AAEd,UAAA,SAAS,MAAM,OAAO;AAGxB,QAAAD,KAAAA,WAAW,MAAM,GAAG;AACZ,gBAAA;AAAA,IAAA;AAAA,EACZ,CACD;AAGDE,MAAAA,eAAe,MAAM;AAET,cAAA;AAEV,UAAM,KAAK;AAAA,EAAA,CACZ;AACH;;;"}
@@ -0,0 +1,68 @@
1
+ import { AnyFunction, MaybePromise } from '@cloudcome/utils-core/types';
2
+ export type HookListener = () => MaybePromise<unknown>;
3
+ export type HookListenerWithDispose = () => MaybePromise<unknown | HookListener>;
4
+ /**
5
+ * 运行生命周期钩子函数的工具函数
6
+ *
7
+ * @protected 内部方法
8
+ * @template T - 泛型参数(未在函数中使用)
9
+ * @param enterHook - 进入时执行的钩子函数,接收一个回调函数作为参数
10
+ * @param leaveHook - 离开时执行的钩子函数,接收一个回调函数作为参数
11
+ * @param onEnter - 进入时的监听器,可以返回一个清理函数
12
+ *
13
+ * @example
14
+ * _runLifeHook(
15
+ * (hook) => onMounted(hook), // 在组件挂载时执行进入逻辑
16
+ * (hook) => onUnmounted(hook), // 在组件卸载时执行离开逻辑
17
+ * () => {
18
+ * // 执行进入时的逻辑
19
+ * console.log('组件已挂载');
20
+ *
21
+ * // 返回一个清理函数,在离开时执行
22
+ * return () => {
23
+ * console.log('组件将要卸载');
24
+ * };
25
+ * }
26
+ * );
27
+ */
28
+ export declare function _runLifeHook<T>(enterHook: (hook: AnyFunction) => unknown, leaveHook: (hook: AnyFunction) => unknown, onEnter: HookListenerWithDispose): void;
29
+ /**
30
+ * 运行作用域钩子函数的工具函数
31
+ *
32
+ * 该函数创建一个独立的响应式作用域,在该作用域内执行传入的回调函数,
33
+ * 并在适当的时机自动清理资源。这确保了响应式副作用的隔离和自动回收。
34
+ *
35
+ * @protected 内部方法
36
+ * @param runner - 需要在作用域内执行的回调函数,可以返回一个清理函数
37
+ *
38
+ * @example
39
+ * // 基本用法
40
+ * _runScope(() => {
41
+ * // 在这里创建的响应式副作用会被限制在当前作用域内
42
+ * const stop = watch(someRef, (val) => {
43
+ * console.log(val);
44
+ * });
45
+ *
46
+ * // 返回一个清理函数,在作用域销毁时执行
47
+ * return () => {
48
+ * stop();
49
+ * };
50
+ * });
51
+ *
52
+ * @example
53
+ * // 异步用法
54
+ * _runScope(async () => {
55
+ * const data = await fetchData();
56
+ *
57
+ * // 根据获取的数据创建响应式监听
58
+ * const stop = watch(() => data.value, (val) => {
59
+ * console.log(val);
60
+ * });
61
+ *
62
+ * // 返回清理函数
63
+ * return () => {
64
+ * stop();
65
+ * };
66
+ * });
67
+ */
68
+ export declare function _runScope(runner: HookListenerWithDispose): void;
@@ -0,0 +1,33 @@
1
+ import { isFunction } from "@cloudcome/utils-core/type";
2
+ import { effectScope, onScopeDispose } from "vue";
3
+ function _runLifeHook(enterHook, leaveHook, onEnter) {
4
+ let onLeave;
5
+ enterHook(async () => {
6
+ const enterResult = await onEnter();
7
+ if (isFunction(enterResult)) {
8
+ onLeave = enterResult;
9
+ }
10
+ });
11
+ leaveHook(() => {
12
+ onLeave?.();
13
+ });
14
+ }
15
+ function _runScope(runner) {
16
+ const scope = effectScope();
17
+ let dispose;
18
+ scope.run(async () => {
19
+ const result = await runner();
20
+ if (isFunction(result)) {
21
+ dispose = result;
22
+ }
23
+ });
24
+ onScopeDispose(() => {
25
+ dispose?.();
26
+ scope.stop();
27
+ });
28
+ }
29
+ export {
30
+ _runLifeHook,
31
+ _runScope
32
+ };
33
+ //# sourceMappingURL=shared.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shared.mjs","sources":["../src/shared.ts"],"sourcesContent":["import { isFunction } from '@cloudcome/utils-core/type';\nimport type { AnyFunction, MaybePromise } from '@cloudcome/utils-core/types';\nimport { effectScope, onScopeDispose } from 'vue';\n\nexport type HookListener = () => MaybePromise<unknown>;\nexport type HookListenerWithDispose = () => MaybePromise<unknown | HookListener>;\n\n/**\n * 运行生命周期钩子函数的工具函数\n *\n * @protected 内部方法\n * @template T - 泛型参数(未在函数中使用)\n * @param enterHook - 进入时执行的钩子函数,接收一个回调函数作为参数\n * @param leaveHook - 离开时执行的钩子函数,接收一个回调函数作为参数\n * @param onEnter - 进入时的监听器,可以返回一个清理函数\n *\n * @example\n * _runLifeHook(\n * (hook) => onMounted(hook), // 在组件挂载时执行进入逻辑\n * (hook) => onUnmounted(hook), // 在组件卸载时执行离开逻辑\n * () => {\n * // 执行进入时的逻辑\n * console.log('组件已挂载');\n *\n * // 返回一个清理函数,在离开时执行\n * return () => {\n * console.log('组件将要卸载');\n * };\n * }\n * );\n */\nexport function _runLifeHook<T>(\n enterHook: (hook: AnyFunction) => unknown,\n leaveHook: (hook: AnyFunction) => unknown,\n onEnter: HookListenerWithDispose,\n) {\n // 存储离开时需要执行的清理函数\n let onLeave: HookListener | undefined;\n\n // 注册进入钩子,在 enterHook 触发时执行\n enterHook(async () => {\n // 执行进入时的监听器逻辑\n const enterResult = await onEnter();\n\n // 如果返回结果是一个函数,则将其作为离开时的清理函数保存\n if (isFunction(enterResult)) {\n onLeave = enterResult;\n }\n });\n\n // 注册离开钩子,在 leaveHook 触发时执行\n leaveHook(() => {\n // 如果存在清理函数,则执行它\n onLeave?.();\n });\n}\n\n/**\n * 运行作用域钩子函数的工具函数\n *\n * 该函数创建一个独立的响应式作用域,在该作用域内执行传入的回调函数,\n * 并在适当的时机自动清理资源。这确保了响应式副作用的隔离和自动回收。\n *\n * @protected 内部方法\n * @param runner - 需要在作用域内执行的回调函数,可以返回一个清理函数\n *\n * @example\n * // 基本用法\n * _runScope(() => {\n * // 在这里创建的响应式副作用会被限制在当前作用域内\n * const stop = watch(someRef, (val) => {\n * console.log(val);\n * });\n *\n * // 返回一个清理函数,在作用域销毁时执行\n * return () => {\n * stop();\n * };\n * });\n *\n * @example\n * // 异步用法\n * _runScope(async () => {\n * const data = await fetchData();\n *\n * // 根据获取的数据创建响应式监听\n * const stop = watch(() => data.value, (val) => {\n * console.log(val);\n * });\n *\n * // 返回清理函数\n * return () => {\n * stop();\n * };\n * });\n */\nexport function _runScope(runner: HookListenerWithDispose) {\n // 创建一个独立的响应式作用域,用于收集和管理响应式副作用\n const scope = effectScope();\n // 存储用户提供的清理函数\n let dispose: HookListener | undefined;\n\n // 在创建的作用域内执行回调函数\n scope.run(async () => {\n // 执行传入的回调函数并等待其完成(支持异步操作)\n const result = await runner();\n\n // 如果回调函数返回了一个函数,则将其作为清理函数保存\n if (isFunction(result)) {\n dispose = result;\n }\n });\n\n // 注册作用域销毁时的回调函数\n onScopeDispose(() => {\n // 如果存在用户提供的清理函数,则执行它\n dispose?.();\n // 停止并清理整个作用域内的所有响应式副作用\n scope.stop();\n });\n}\n"],"names":[],"mappings":";;AA+BgB,SAAA,aACd,WACA,WACA,SACA;AAEI,MAAA;AAGJ,YAAU,YAAY;AAEd,UAAA,cAAc,MAAM,QAAQ;AAG9B,QAAA,WAAW,WAAW,GAAG;AACjB,gBAAA;AAAA,IAAA;AAAA,EACZ,CACD;AAGD,YAAU,MAAM;AAEJ,cAAA;AAAA,EAAA,CACX;AACH;AAyCO,SAAS,UAAU,QAAiC;AAEzD,QAAM,QAAQ,YAAY;AAEtB,MAAA;AAGJ,QAAM,IAAI,YAAY;AAEd,UAAA,SAAS,MAAM,OAAO;AAGxB,QAAA,WAAW,MAAM,GAAG;AACZ,gBAAA;AAAA,IAAA;AAAA,EACZ,CACD;AAGD,iBAAe,MAAM;AAET,cAAA;AAEV,UAAM,KAAK;AAAA,EAAA,CACZ;AACH;"}
package/dist/time.cjs ADDED
@@ -0,0 +1,42 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
+ const vue = require("vue");
4
+ const life = require("./life.cjs");
5
+ const shared = require("./shared.cjs");
6
+ function useLazyValue(initialValue, delay) {
7
+ const lazyValue = vue.ref(initialValue.value);
8
+ let changedAt = 0;
9
+ shared._runScope(() => {
10
+ let t;
11
+ vue.watch(initialValue, (value) => {
12
+ const delayValue = vue.toValue(delay) || 100;
13
+ clearTimeout(t);
14
+ if (changedAt > 0 && Date.now() - changedAt > delayValue) {
15
+ lazyValue.value = value;
16
+ } else {
17
+ t = setTimeout(() => {
18
+ lazyValue.value = value;
19
+ }, delayValue);
20
+ }
21
+ changedAt = Date.now();
22
+ });
23
+ return () => {
24
+ clearTimeout(t);
25
+ };
26
+ });
27
+ return vue.computed(() => {
28
+ return lazyValue.value;
29
+ });
30
+ }
31
+ function useInterval(callback, delay) {
32
+ life.useMount(() => {
33
+ const delayValue = vue.toValue(delay) || 100;
34
+ const t = setInterval(callback, delayValue);
35
+ return () => {
36
+ clearInterval(t);
37
+ };
38
+ });
39
+ }
40
+ exports.useInterval = useInterval;
41
+ exports.useLazyValue = useLazyValue;
42
+ //# sourceMappingURL=time.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"time.cjs","sources":["../src/time.ts"],"sourcesContent":["import { type Ref, computed, effectScope, onScopeDispose, ref, toValue, watch } from 'vue';\nimport { useMount } from './component';\nimport { _runLifeHook, _runScope } from './shared';\n\n/**\n * 创建一个延迟更新的响应式值\n *\n * 该函数创建一个基于原始响应式值的延迟更新值,当原始值发生变化时,\n * 延迟值会在指定的延迟时间后更新。如果在延迟期间原始值再次变化,\n * 则会重新计算延迟时间。\n *\n * @param initialValue 原始响应式值,类型为Ref<T>\n * @param delay 延迟时间,可以是数字或响应式数字,默认为100毫秒\n * @returns 返回一个计算属性,其值会在延迟后更新为原始值\n */\nexport function useLazyValue<T>(initialValue: Ref<T>, delay?: number | Ref<number>) {\n const lazyValue = ref(initialValue.value);\n let changedAt = 0;\n\n _runScope(() => {\n // biome-ignore lint/suspicious/noExplicitAny: <explanation>\n let t: any;\n\n watch(initialValue, (value) => {\n const delayValue = toValue(delay) || 100;\n clearTimeout(t);\n\n if (changedAt > 0 && Date.now() - changedAt > delayValue) {\n lazyValue.value = value;\n } else {\n t = setTimeout(() => {\n lazyValue.value = value;\n }, delayValue);\n }\n\n changedAt = Date.now();\n });\n\n return () => {\n clearTimeout(t);\n };\n });\n\n return computed<T>(() => {\n return lazyValue.value;\n });\n}\n\nexport function useInterval(callback: () => void, delay?: number | Ref<number>) {\n useMount(() => {\n const delayValue = toValue(delay) || 100;\n const t = setInterval(callback, delayValue);\n\n return () => {\n clearInterval(t);\n };\n });\n}\n"],"names":["ref","_runScope","watch","toValue","computed","useMount"],"mappings":";;;;;AAegB,SAAA,aAAgB,cAAsB,OAA8B;AAC5E,QAAA,YAAYA,IAAAA,IAAI,aAAa,KAAK;AACxC,MAAI,YAAY;AAEhBC,SAAAA,UAAU,MAAM;AAEV,QAAA;AAEEC,cAAA,cAAc,CAAC,UAAU;AACvB,YAAA,aAAaC,IAAAA,QAAQ,KAAK,KAAK;AACrC,mBAAa,CAAC;AAEd,UAAI,YAAY,KAAK,KAAK,IAAI,IAAI,YAAY,YAAY;AACxD,kBAAU,QAAQ;AAAA,MAAA,OACb;AACL,YAAI,WAAW,MAAM;AACnB,oBAAU,QAAQ;AAAA,WACjB,UAAU;AAAA,MAAA;AAGf,kBAAY,KAAK,IAAI;AAAA,IAAA,CACtB;AAED,WAAO,MAAM;AACX,mBAAa,CAAC;AAAA,IAChB;AAAA,EAAA,CACD;AAED,SAAOC,aAAY,MAAM;AACvB,WAAO,UAAU;AAAA,EAAA,CAClB;AACH;AAEgB,SAAA,YAAY,UAAsB,OAA8B;AAC9EC,OAAAA,SAAS,MAAM;AACP,UAAA,aAAaF,IAAAA,QAAQ,KAAK,KAAK;AAC/B,UAAA,IAAI,YAAY,UAAU,UAAU;AAE1C,WAAO,MAAM;AACX,oBAAc,CAAC;AAAA,IACjB;AAAA,EAAA,CACD;AACH;;;"}
@@ -6,8 +6,9 @@ import { Ref } from 'vue';
6
6
  * 延迟值会在指定的延迟时间后更新。如果在延迟期间原始值再次变化,
7
7
  * 则会重新计算延迟时间。
8
8
  *
9
- * @param boolean 原始响应式值,类型为Ref<T>
9
+ * @param initialValue 原始响应式值,类型为Ref<T>
10
10
  * @param delay 延迟时间,可以是数字或响应式数字,默认为100毫秒
11
11
  * @returns 返回一个计算属性,其值会在延迟后更新为原始值
12
12
  */
13
- export declare function useLazyValue<T>(boolean: Ref<T>, delay?: number | Ref<number>): import('vue').ComputedRef<T>;
13
+ export declare function useLazyValue<T>(initialValue: Ref<T>, delay?: number | Ref<number>): import('vue').ComputedRef<T>;
14
+ export declare function useInterval(callback: () => void, delay?: number | Ref<number>): void;
package/dist/time.mjs ADDED
@@ -0,0 +1,42 @@
1
+ import { ref, watch, toValue, computed } from "vue";
2
+ import { u as useMount } from "./life.mjs";
3
+ import { _runScope } from "./shared.mjs";
4
+ function useLazyValue(initialValue, delay) {
5
+ const lazyValue = ref(initialValue.value);
6
+ let changedAt = 0;
7
+ _runScope(() => {
8
+ let t;
9
+ watch(initialValue, (value) => {
10
+ const delayValue = toValue(delay) || 100;
11
+ clearTimeout(t);
12
+ if (changedAt > 0 && Date.now() - changedAt > delayValue) {
13
+ lazyValue.value = value;
14
+ } else {
15
+ t = setTimeout(() => {
16
+ lazyValue.value = value;
17
+ }, delayValue);
18
+ }
19
+ changedAt = Date.now();
20
+ });
21
+ return () => {
22
+ clearTimeout(t);
23
+ };
24
+ });
25
+ return computed(() => {
26
+ return lazyValue.value;
27
+ });
28
+ }
29
+ function useInterval(callback, delay) {
30
+ useMount(() => {
31
+ const delayValue = toValue(delay) || 100;
32
+ const t = setInterval(callback, delayValue);
33
+ return () => {
34
+ clearInterval(t);
35
+ };
36
+ });
37
+ }
38
+ export {
39
+ useInterval,
40
+ useLazyValue
41
+ };
42
+ //# sourceMappingURL=time.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"time.mjs","sources":["../src/time.ts"],"sourcesContent":["import { type Ref, computed, effectScope, onScopeDispose, ref, toValue, watch } from 'vue';\nimport { useMount } from './component';\nimport { _runLifeHook, _runScope } from './shared';\n\n/**\n * 创建一个延迟更新的响应式值\n *\n * 该函数创建一个基于原始响应式值的延迟更新值,当原始值发生变化时,\n * 延迟值会在指定的延迟时间后更新。如果在延迟期间原始值再次变化,\n * 则会重新计算延迟时间。\n *\n * @param initialValue 原始响应式值,类型为Ref<T>\n * @param delay 延迟时间,可以是数字或响应式数字,默认为100毫秒\n * @returns 返回一个计算属性,其值会在延迟后更新为原始值\n */\nexport function useLazyValue<T>(initialValue: Ref<T>, delay?: number | Ref<number>) {\n const lazyValue = ref(initialValue.value);\n let changedAt = 0;\n\n _runScope(() => {\n // biome-ignore lint/suspicious/noExplicitAny: <explanation>\n let t: any;\n\n watch(initialValue, (value) => {\n const delayValue = toValue(delay) || 100;\n clearTimeout(t);\n\n if (changedAt > 0 && Date.now() - changedAt > delayValue) {\n lazyValue.value = value;\n } else {\n t = setTimeout(() => {\n lazyValue.value = value;\n }, delayValue);\n }\n\n changedAt = Date.now();\n });\n\n return () => {\n clearTimeout(t);\n };\n });\n\n return computed<T>(() => {\n return lazyValue.value;\n });\n}\n\nexport function useInterval(callback: () => void, delay?: number | Ref<number>) {\n useMount(() => {\n const delayValue = toValue(delay) || 100;\n const t = setInterval(callback, delayValue);\n\n return () => {\n clearInterval(t);\n };\n });\n}\n"],"names":[],"mappings":";;;AAegB,SAAA,aAAgB,cAAsB,OAA8B;AAC5E,QAAA,YAAY,IAAI,aAAa,KAAK;AACxC,MAAI,YAAY;AAEhB,YAAU,MAAM;AAEV,QAAA;AAEE,UAAA,cAAc,CAAC,UAAU;AACvB,YAAA,aAAa,QAAQ,KAAK,KAAK;AACrC,mBAAa,CAAC;AAEd,UAAI,YAAY,KAAK,KAAK,IAAI,IAAI,YAAY,YAAY;AACxD,kBAAU,QAAQ;AAAA,MAAA,OACb;AACL,YAAI,WAAW,MAAM;AACnB,oBAAU,QAAQ;AAAA,WACjB,UAAU;AAAA,MAAA;AAGf,kBAAY,KAAK,IAAI;AAAA,IAAA,CACtB;AAED,WAAO,MAAM;AACX,mBAAa,CAAC;AAAA,IAChB;AAAA,EAAA,CACD;AAED,SAAO,SAAY,MAAM;AACvB,WAAO,UAAU;AAAA,EAAA,CAClB;AACH;AAEgB,SAAA,YAAY,UAAsB,OAA8B;AAC9E,WAAS,MAAM;AACP,UAAA,aAAa,QAAQ,KAAK,KAAK;AAC/B,UAAA,IAAI,YAAY,UAAU,UAAU;AAE1C,WAAO,MAAM;AACX,oBAAc,CAAC;AAAA,IACjB;AAAA,EAAA,CACD;AACH;"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@cloudcome/utils-vue",
3
- "version": "1.10.1",
3
+ "version": "1.11.0",
4
4
  "description": "cloudcome utils for vue",
5
5
  "engines": {
6
6
  "node": ">=22"
@@ -29,21 +29,21 @@
29
29
  "import": "./dist/event.mjs",
30
30
  "require": "./dist/event.cjs"
31
31
  },
32
- "./lazy": {
33
- "types": "./dist/lazy.d.ts",
34
- "import": "./dist/lazy.mjs",
35
- "require": "./dist/lazy.cjs"
36
- },
37
- "./page": {
38
- "types": "./dist/page.d.ts",
39
- "import": "./dist/page.mjs",
40
- "require": "./dist/page.cjs"
41
- },
42
32
  "./request": {
43
33
  "types": "./dist/request.d.ts",
44
34
  "import": "./dist/request.mjs",
45
35
  "require": "./dist/request.cjs"
46
36
  },
37
+ "./shared": {
38
+ "types": "./dist/shared.d.ts",
39
+ "import": "./dist/shared.mjs",
40
+ "require": "./dist/shared.cjs"
41
+ },
42
+ "./time": {
43
+ "types": "./dist/time.d.ts",
44
+ "import": "./dist/time.mjs",
45
+ "require": "./dist/time.cjs"
46
+ },
47
47
  "./types": {
48
48
  "types": "./dist/types.d.ts",
49
49
  "import": "./dist/types.mjs",
@@ -61,15 +61,15 @@
61
61
  "event": [
62
62
  "./dist/event.d.ts"
63
63
  ],
64
- "lazy": [
65
- "./dist/lazy.d.ts"
66
- ],
67
- "page": [
68
- "./dist/page.d.ts"
69
- ],
70
64
  "request": [
71
65
  "./dist/request.d.ts"
72
66
  ],
67
+ "shared": [
68
+ "./dist/shared.d.ts"
69
+ ],
70
+ "time": [
71
+ "./dist/time.d.ts"
72
+ ],
73
73
  "types": [
74
74
  "./dist/types.d.ts"
75
75
  ]
package/dist/lazy.cjs DELETED
@@ -1,32 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
- const vue = require("vue");
4
- function useLazyValue(boolean, delay) {
5
- const scope = vue.effectScope();
6
- const lazyBoolean = vue.ref(boolean.value);
7
- let changedAt = 0;
8
- let t;
9
- scope.run(() => {
10
- vue.watch(boolean, (value) => {
11
- const delayValue = vue.toValue(delay) || 100;
12
- clearTimeout(t);
13
- if (changedAt > 0 && Date.now() - changedAt > delayValue) {
14
- lazyBoolean.value = value;
15
- } else {
16
- t = setTimeout(() => {
17
- lazyBoolean.value = value;
18
- }, delayValue);
19
- }
20
- changedAt = Date.now();
21
- });
22
- });
23
- vue.onScopeDispose(() => {
24
- clearTimeout(t);
25
- scope.stop();
26
- });
27
- return vue.computed(() => {
28
- return lazyBoolean.value;
29
- });
30
- }
31
- exports.useLazyValue = useLazyValue;
32
- //# sourceMappingURL=lazy.cjs.map
package/dist/lazy.cjs.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"file":"lazy.cjs","sources":["../src/lazy.ts"],"sourcesContent":["import { type Ref, computed, effectScope, onScopeDispose, ref, toValue, watch } from 'vue';\n\n/**\n * 创建一个延迟更新的响应式值\n *\n * 该函数创建一个基于原始响应式值的延迟更新值,当原始值发生变化时,\n * 延迟值会在指定的延迟时间后更新。如果在延迟期间原始值再次变化,\n * 则会重新计算延迟时间。\n *\n * @param boolean 原始响应式值,类型为Ref<T>\n * @param delay 延迟时间,可以是数字或响应式数字,默认为100毫秒\n * @returns 返回一个计算属性,其值会在延迟后更新为原始值\n */\nexport function useLazyValue<T>(boolean: Ref<T>, delay?: number | Ref<number>) {\n const scope = effectScope();\n const lazyBoolean = ref(boolean.value);\n let changedAt = 0;\n // biome-ignore lint/suspicious/noExplicitAny: <explanation>\n let t: any;\n\n scope.run(() => {\n watch(boolean, (value) => {\n const delayValue = toValue(delay) || 100;\n clearTimeout(t);\n\n if (changedAt > 0 && Date.now() - changedAt > delayValue) {\n lazyBoolean.value = value;\n } else {\n t = setTimeout(() => {\n lazyBoolean.value = value;\n }, delayValue);\n }\n\n changedAt = Date.now();\n });\n });\n\n onScopeDispose(() => {\n clearTimeout(t);\n scope.stop();\n });\n\n return computed<T>(() => {\n return lazyBoolean.value;\n });\n}\n"],"names":["effectScope","ref","watch","toValue","onScopeDispose","computed"],"mappings":";;;AAagB,SAAA,aAAgB,SAAiB,OAA8B;AAC7E,QAAM,QAAQA,IAAAA,YAAY;AACpB,QAAA,cAAcC,IAAAA,IAAI,QAAQ,KAAK;AACrC,MAAI,YAAY;AAEZ,MAAA;AAEJ,QAAM,IAAI,MAAM;AACRC,cAAA,SAAS,CAAC,UAAU;AAClB,YAAA,aAAaC,IAAAA,QAAQ,KAAK,KAAK;AACrC,mBAAa,CAAC;AAEd,UAAI,YAAY,KAAK,KAAK,IAAI,IAAI,YAAY,YAAY;AACxD,oBAAY,QAAQ;AAAA,MAAA,OACf;AACL,YAAI,WAAW,MAAM;AACnB,sBAAY,QAAQ;AAAA,WACnB,UAAU;AAAA,MAAA;AAGf,kBAAY,KAAK,IAAI;AAAA,IAAA,CACtB;AAAA,EAAA,CACF;AAEDC,MAAAA,eAAe,MAAM;AACnB,iBAAa,CAAC;AACd,UAAM,KAAK;AAAA,EAAA,CACZ;AAED,SAAOC,aAAY,MAAM;AACvB,WAAO,YAAY;AAAA,EAAA,CACpB;AACH;;"}
package/dist/lazy.mjs DELETED
@@ -1,32 +0,0 @@
1
- import { effectScope, ref, watch, toValue, onScopeDispose, computed } from "vue";
2
- function useLazyValue(boolean, delay) {
3
- const scope = effectScope();
4
- const lazyBoolean = ref(boolean.value);
5
- let changedAt = 0;
6
- let t;
7
- scope.run(() => {
8
- watch(boolean, (value) => {
9
- const delayValue = toValue(delay) || 100;
10
- clearTimeout(t);
11
- if (changedAt > 0 && Date.now() - changedAt > delayValue) {
12
- lazyBoolean.value = value;
13
- } else {
14
- t = setTimeout(() => {
15
- lazyBoolean.value = value;
16
- }, delayValue);
17
- }
18
- changedAt = Date.now();
19
- });
20
- });
21
- onScopeDispose(() => {
22
- clearTimeout(t);
23
- scope.stop();
24
- });
25
- return computed(() => {
26
- return lazyBoolean.value;
27
- });
28
- }
29
- export {
30
- useLazyValue
31
- };
32
- //# sourceMappingURL=lazy.mjs.map
package/dist/lazy.mjs.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"file":"lazy.mjs","sources":["../src/lazy.ts"],"sourcesContent":["import { type Ref, computed, effectScope, onScopeDispose, ref, toValue, watch } from 'vue';\n\n/**\n * 创建一个延迟更新的响应式值\n *\n * 该函数创建一个基于原始响应式值的延迟更新值,当原始值发生变化时,\n * 延迟值会在指定的延迟时间后更新。如果在延迟期间原始值再次变化,\n * 则会重新计算延迟时间。\n *\n * @param boolean 原始响应式值,类型为Ref<T>\n * @param delay 延迟时间,可以是数字或响应式数字,默认为100毫秒\n * @returns 返回一个计算属性,其值会在延迟后更新为原始值\n */\nexport function useLazyValue<T>(boolean: Ref<T>, delay?: number | Ref<number>) {\n const scope = effectScope();\n const lazyBoolean = ref(boolean.value);\n let changedAt = 0;\n // biome-ignore lint/suspicious/noExplicitAny: <explanation>\n let t: any;\n\n scope.run(() => {\n watch(boolean, (value) => {\n const delayValue = toValue(delay) || 100;\n clearTimeout(t);\n\n if (changedAt > 0 && Date.now() - changedAt > delayValue) {\n lazyBoolean.value = value;\n } else {\n t = setTimeout(() => {\n lazyBoolean.value = value;\n }, delayValue);\n }\n\n changedAt = Date.now();\n });\n });\n\n onScopeDispose(() => {\n clearTimeout(t);\n scope.stop();\n });\n\n return computed<T>(() => {\n return lazyBoolean.value;\n });\n}\n"],"names":[],"mappings":";AAagB,SAAA,aAAgB,SAAiB,OAA8B;AAC7E,QAAM,QAAQ,YAAY;AACpB,QAAA,cAAc,IAAI,QAAQ,KAAK;AACrC,MAAI,YAAY;AAEZ,MAAA;AAEJ,QAAM,IAAI,MAAM;AACR,UAAA,SAAS,CAAC,UAAU;AAClB,YAAA,aAAa,QAAQ,KAAK,KAAK;AACrC,mBAAa,CAAC;AAEd,UAAI,YAAY,KAAK,KAAK,IAAI,IAAI,YAAY,YAAY;AACxD,oBAAY,QAAQ;AAAA,MAAA,OACf;AACL,YAAI,WAAW,MAAM;AACnB,sBAAY,QAAQ;AAAA,WACnB,UAAU;AAAA,MAAA;AAGf,kBAAY,KAAK,IAAI;AAAA,IAAA,CACtB;AAAA,EAAA,CACF;AAED,iBAAe,MAAM;AACnB,iBAAa,CAAC;AACd,UAAM,KAAK;AAAA,EAAA,CACZ;AAED,SAAO,SAAY,MAAM;AACvB,WAAO,YAAY;AAAA,EAAA,CACpB;AACH;"}
package/dist/page.cjs DELETED
@@ -1,24 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
- const vue = require("vue");
4
- function usePageMount(onBeforeMount) {
5
- let un;
6
- vue.onBeforeMount(async () => {
7
- un = await onBeforeMount();
8
- });
9
- vue.onBeforeUnmount(() => {
10
- un?.();
11
- });
12
- }
13
- function usePageMounted(onMounted) {
14
- let un;
15
- vue.onMounted(async () => {
16
- un = await onMounted();
17
- });
18
- vue.onUnmounted(() => {
19
- un?.();
20
- });
21
- }
22
- exports.usePageMount = usePageMount;
23
- exports.usePageMounted = usePageMounted;
24
- //# sourceMappingURL=page.cjs.map
package/dist/page.cjs.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"file":"page.cjs","sources":["../src/page.ts"],"sourcesContent":["import type { MaybePromise } from '@cloudcome/utils-core/types';\nimport { onBeforeMount as onBeforeMountHook, onBeforeUnmount, onMounted as onMountedHook, onUnmounted } from 'vue';\n\nexport type HookListener = () => MaybePromise<unknown>;\nexport type HookListenerWithDispose = () => MaybePromise<undefined | HookListener>;\n\nexport function usePageMount(onBeforeMount: HookListenerWithDispose) {\n let un: HookListener | undefined;\n\n onBeforeMountHook(async () => {\n un = await onBeforeMount();\n });\n\n onBeforeUnmount(() => {\n un?.();\n });\n}\n\nexport function usePageMounted(onMounted: HookListenerWithDispose) {\n let un: HookListener | undefined;\n\n onMountedHook(async () => {\n un = await onMounted();\n });\n\n onUnmounted(() => {\n un?.();\n });\n}\n"],"names":["onBeforeMountHook","onBeforeUnmount","onMountedHook","onUnmounted"],"mappings":";;;AAMO,SAAS,aAAa,eAAwC;AAC/D,MAAA;AAEJA,MAAAA,cAAkB,YAAY;AAC5B,SAAK,MAAM,cAAc;AAAA,EAAA,CAC1B;AAEDC,MAAAA,gBAAgB,MAAM;AACf,SAAA;AAAA,EAAA,CACN;AACH;AAEO,SAAS,eAAe,WAAoC;AAC7D,MAAA;AAEJC,MAAAA,UAAc,YAAY;AACxB,SAAK,MAAM,UAAU;AAAA,EAAA,CACtB;AAEDC,MAAAA,YAAY,MAAM;AACX,SAAA;AAAA,EAAA,CACN;AACH;;;"}
package/dist/page.d.ts DELETED
@@ -1,5 +0,0 @@
1
- import { MaybePromise } from '@cloudcome/utils-core/types';
2
- export type HookListener = () => MaybePromise<unknown>;
3
- export type HookListenerWithDispose = () => MaybePromise<undefined | HookListener>;
4
- export declare function usePageMount(onBeforeMount: HookListenerWithDispose): void;
5
- export declare function usePageMounted(onMounted: HookListenerWithDispose): void;
package/dist/page.mjs DELETED
@@ -1,24 +0,0 @@
1
- import { onBeforeMount, onBeforeUnmount, onMounted, onUnmounted } from "vue";
2
- function usePageMount(onBeforeMount$1) {
3
- let un;
4
- onBeforeMount(async () => {
5
- un = await onBeforeMount$1();
6
- });
7
- onBeforeUnmount(() => {
8
- un?.();
9
- });
10
- }
11
- function usePageMounted(onMounted$1) {
12
- let un;
13
- onMounted(async () => {
14
- un = await onMounted$1();
15
- });
16
- onUnmounted(() => {
17
- un?.();
18
- });
19
- }
20
- export {
21
- usePageMount,
22
- usePageMounted
23
- };
24
- //# sourceMappingURL=page.mjs.map
package/dist/page.mjs.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"file":"page.mjs","sources":["../src/page.ts"],"sourcesContent":["import type { MaybePromise } from '@cloudcome/utils-core/types';\nimport { onBeforeMount as onBeforeMountHook, onBeforeUnmount, onMounted as onMountedHook, onUnmounted } from 'vue';\n\nexport type HookListener = () => MaybePromise<unknown>;\nexport type HookListenerWithDispose = () => MaybePromise<undefined | HookListener>;\n\nexport function usePageMount(onBeforeMount: HookListenerWithDispose) {\n let un: HookListener | undefined;\n\n onBeforeMountHook(async () => {\n un = await onBeforeMount();\n });\n\n onBeforeUnmount(() => {\n un?.();\n });\n}\n\nexport function usePageMounted(onMounted: HookListenerWithDispose) {\n let un: HookListener | undefined;\n\n onMountedHook(async () => {\n un = await onMounted();\n });\n\n onUnmounted(() => {\n un?.();\n });\n}\n"],"names":["onBeforeMount","onBeforeMountHook","onMounted","onMountedHook"],"mappings":";AAMO,SAAS,aAAaA,iBAAwC;AAC/D,MAAA;AAEJC,gBAAkB,YAAY;AAC5B,SAAK,MAAMD,gBAAc;AAAA,EAAA,CAC1B;AAED,kBAAgB,MAAM;AACf,SAAA;AAAA,EAAA,CACN;AACH;AAEO,SAAS,eAAeE,aAAoC;AAC7D,MAAA;AAEJC,YAAc,YAAY;AACxB,SAAK,MAAMD,YAAU;AAAA,EAAA,CACtB;AAED,cAAY,MAAM;AACX,SAAA;AAAA,EAAA,CACN;AACH;"}