{"version":3,"file":"index.cjs","sources":["../src/constants/types.ts","../src/Hooks/useDebounceFn.ts","../src/Hooks/useSetRefValue.ts","../src/Hooks/useThrottleFn.ts","../src/Hooks/useAsync.ts","../src/Hooks/useBrowserLocation.ts","../src/Hooks/useCounter.ts","../src/Hooks/useCreateEventHook.ts","../src/Hooks/useDebounce.ts","../src/Hooks/useGetRefValue.ts","../src/Hooks/useIntervalFn.ts","../src/Hooks/useThrottle.ts"],"sourcesContent":["import { Ref } from 'vue';\n\nexport type Fn = () => void;\nexport type MaybeRef<T> = T | Ref<T>;\nexport type FunctionArgs<Args extends any[] = any[],Return = void> = (...args: Args) => Return\n\n/** 可控制方法 */\nexport interface Pauseable {\n  isActive: Ref<boolean>;\n  pause: Fn;\n  resume: Fn;\n}\n\n/** 判断是否是本客户端 */\nexport const isClient = typeof window !== 'undefined';\n\n/** 默认window */\nexport const defaultWindow = isClient ? window : undefined;\n","import { FunctionArgs, MaybeRef } from '../constants/types';\n\n/**\n * Debounce execution of a function.\n *\n * @param  fn          A function to be executed after delay milliseconds debounced.\n * @param  delay          A zero-or-greater delay in milliseconds. For event callbacks, values around 100 or 250 (or even higher) are most useful.\n *\n * @return A new, debounce, function.\n */\nexport function useDebounceFn<T extends FunctionArgs>(fn: T, delay: number = 200) {\n  let timer: any = null;\n  return function (...args: any[]) {\n    if (timer) clearTimeout(timer);\n    timer = setTimeout(() => {\n      //@ts-expect-error\n      fn.apply(this, args);\n    }, delay);\n  };\n}\n","import { Ref } from 'vue';\nexport function useSetRefValue<T>(ref: Ref<T>, value: T): void;\nexport function useSetRefValue<O extends object, K extends keyof O>(target: O, key: K, value: O[K]): void;\n\n/**\n *\n * @param args 支持传入ref 或者 reactive 对象\n */\nexport function useSetRefValue(...args: any[]) {\n  if (args.length === 2) {\n    const [ref, value] = args;\n    ref.value = value;\n  }\n  if (args.length === 3) {\n    const [target, key, value] = args;\n    target[key] = value;\n  }\n}\n","import { FunctionArgs } from '../constants/types';\n\nexport function useThrottleFn<T extends FunctionArgs>(fn: T, delay: number = 200) {\n  let lock = false;\n  return function (...args: any[]) {\n    if (lock) return;\n    lock = true;\n    setTimeout(() => {\n      //@ts-expect-error\n      fn.apply(this, args);\n      lock = false;\n    }, delay);\n  };\n}\n","import { reactive, ref } from 'vue';\nimport { useSetRefValue } from './useSetRefValue';\n\nexport type AsyncStatus = 'idle' | 'loading' | 'error' | 'success';\n\nexport interface AsyncResponse<T = any> {\n  data: T | null;\n  error: Error | null;\n  status: AsyncStatus;\n}\n\nexport const DefaultAsyncState: AsyncResponse<null> = {\n  data: null,\n  error: null,\n  status: 'idle',\n};\n\n/**\n * 简易版异步请求封装，旨在拿到各种实时异步状态和错误信息\n *\n * 状态有 'idle' | 'loading' | 'error' | 'success';\n * @param initialState 可选-初始数据\n * @returns AsyncResponse\n */\nexport function useAsync<D = any>(initialState?: AsyncResponse<D>) {\n  const state: AsyncResponse = reactive({\n    ...DefaultAsyncState,\n    ...initialState,\n  });\n\n  const setData = (payload: D) => {\n    state.data = payload;\n    state.error = null;\n    state.status = 'success';\n  };\n\n  const setError = (error: Error) => {\n    state.error = error;\n    state.data = null;\n    state.status = 'error';\n  };\n\n  const execute = (promise: Promise<D>) => {\n    if (!promise || !promise.then) {\n      throw new Error('payload must be Promise type');\n    }\n\n    useSetRefValue(state, 'status', 'loading');\n    return promise\n      .then((res: any) => {\n        setData(res);\n        return res;\n      })\n      .catch((error) => {\n        setError(error);\n        return error;\n      });\n  };\n\n  return {\n    execute,\n    setData,\n    setError,\n    state,\n  };\n}\n","import { ref } from 'vue';\nimport { defaultWindow } from '../constants/types';\nexport interface BrowserLocationState {\n  trigger: string; // 触发\n  state?: any; // history.state\n  length?: number; // history.length\n  hash?: string; // 哈希\n  host?: string; // host\n  hostname?: string; // hostname\n  href?: string; // 完整链接\n  origin?: string; // 协议://host\n  pathname?: string; //host后面的path\n  port?: string; // 端口\n  protocol?: string; // 协议\n  search?: string; // 参数\n}\n\n/**\n * 获取当前域名location信息\n * @param window\n */\nexport function useBrowserLocation({ window = defaultWindow }: { window?: Window } = {}) {\n  const buildState = (trigger: string): BrowserLocationState => {\n    const { state, length } = window?.history || {};\n    const { hash, host, hostname, href, origin, pathname, port, protocol, search } = window?.location || {};\n\n    return {\n      trigger,\n      state,\n      length,\n      hash,\n      host,\n      hostname,\n      href,\n      origin,\n      pathname,\n      port,\n      protocol,\n      search,\n    };\n  };\n\n  // 默认\n  const state = ref(buildState('load'));\n  // 哈希改变 堆栈改变\n  if (window) {\n    window.addEventListener('popstate', () => (state.value = buildState('popstate')));\n    window.addEventListener('hashchange', () => (state.value = buildState('hashchange')));\n  }\n\n  return state;\n}\n\nexport type UseBroswerLocationReturn = ReturnType<typeof useBrowserLocation>;\n","import { ref } from 'vue';\nexport function useCounter(initialValue: number = 0) {\n  const count = ref(initialValue);\n\n  const inc = (delta: number = 1) => (count.value += delta);\n  const dec = (delta: number = 1) => (count.value -= delta);\n  const get = () => count.value;\n  const set = (val: number) => (count.value = val);\n  const reset = (val: number = initialValue) => {\n    initialValue = val;\n    return set(val);\n  };\n\n  return { count, inc, dec, get, set, reset };\n}\n","/**\n * EventHook.ts 很类似发布订阅\n * 1. 注册全局变量存储事件\n * 2. 返回三个钩子: on、off、trigger 分别代表订阅，销毁和执行\n * 3. on 和 off 钩子需要传入参数为 T 的会回调函数\n */\n\nexport type EventHookOn<T = any> = (fn: (param: T) => void) => {\n  off: (param: T) => void;\n};\nexport type EventHookOff<T = any> = (fn: (oaram: T) => void) => void;\nexport type EventHookTrigger<T = any> = (param: T) => void;\n\nexport interface EventHook<T = any> {\n  on: EventHookOn<T>;\n  off: EventHookOff<T>;\n  trigger: EventHookTrigger<T>;\n}\n\nexport function useCreateEventHook<T = any>(): EventHook<T> {\n  const fns: Array<(param: T) => void> = [];\n\n  const off = (fn: (param: T) => void) => {\n    const index = fns.indexOf(fn);\n\n    if (index !== -1) {\n      fns.splice(index, 1);\n    }\n  };\n\n  const on = (fn: (param: T) => void) => {\n    fns.push(fn);\n\n    return {\n      off: () => {\n        off(fn);\n      },\n    };\n  };\n\n  const trigger = (param: T) => {\n    fns.forEach((fn) => fn(param));\n  };\n\n  return {\n    on,\n    off,\n    trigger,\n  };\n}\n","import { Ref, ref, watch } from 'vue';\nimport { useDebounceFn } from './useDebounceFn';\n\n/** debounce for ref\n * !!! donot use reactive state */\nexport function useDebounce<T>(value: Ref<T>, delay: number = 200): Readonly<Ref<T>> {\n  if (delay <= 0) {\n    return value;\n  }\n  const debounceRef = ref(value.value as T) as Ref<T>;\n\n  const updater = useDebounceFn(() => {\n    debounceRef.value = value.value;\n  }, delay);\n\n  watch(value, () => {\n    updater();\n  });\n  return debounceRef;\n}\n","import { unref } from 'vue';\nimport { MaybeRef } from './../constants/types';\n/**\n * 直接获取 ref 的值,支持传入ref对象，key\n */\n\nexport function useGetRefValue<T>(ref: MaybeRef<T>): T;\nexport function useGetRefValue<T, K extends keyof T>(ref: MaybeRef<T>, key: K): T[K];\n\nexport function useGetRefValue(obj: MaybeRef<any>, key?: string | number | symbol) {\n  return key ? unref(obj)[key] : unref(obj);\n}\n","import { Fn, isClient, Pauseable } from '../constants/types';\nimport { ref } from 'vue';\n\nexport interface IntervalFnOptions {\n  immediate?: boolean;\n  immediateCallback?: boolean;\n}\n\n/**\n * 改造版 setInterval\n * @param cb 回调\n * @param interval delay\n * @param options 立即回调配置\n */\nexport function useIntervalFn(cb: Fn, interval = 1000, options: IntervalFnOptions = {}): Pauseable {\n  const { immediate = true, immediateCallback = false } = options;\n\n  let timer: any = null;\n  const isActive = ref(false);\n\n  function clean() {\n    if (timer) {\n      clearInterval(timer);\n      timer = null;\n    }\n  }\n\n  function pause() {\n    isActive.value = false;\n    clean();\n  }\n\n  function resume() {\n    if (interval <= 0) {\n      return;\n    }\n    isActive.value = true;\n    if (immediateCallback) {\n      cb();\n    }\n    clean();\n    timer = setInterval(cb, interval);\n  }\n\n  if (immediate && isClient) {\n    resume();\n  }\n\n  return {\n    isActive,\n    pause,\n    resume,\n  };\n}\n","import { ref, Ref, watch } from 'vue';\nimport { useThrottleFn } from './useThrottleFn';\n\nexport function useThrottle<T>(value: Ref<T>, delay: number = 200): Readonly<Ref<T>> {\n  if (delay <= 0) {\n    return value;\n  }\n\n  const throttled: Ref<T> = ref(value.value as T) as Ref<T>;\n\n  const updater = useThrottleFn(() => {\n    throttled.value = value.value;\n  }, delay);\n\n  watch(value, () => updater());\n  return throttled;\n}\n"],"names":["isClient","window","defaultWindow","undefined","useDebounceFn","fn","delay","timer","clearTimeout","setTimeout","apply","_this","useSetRefValue","args","length","ref","value","target","key","useThrottleFn","lock","DefaultAsyncState","data","error","status","initialState","state","reactive","setData","payload","setError","execute","promise","then","Error","res","buildState","trigger","history","location","hash","host","hostname","href","origin","pathname","port","protocol","search","addEventListener","initialValue","count","set","val","inc","delta","dec","get","reset","fns","off","index","indexOf","splice","on","push","param","forEach","debounceRef","updater","watch","obj","unref","cb","interval","options","immediate","immediateCallback","isActive","clean","clearInterval","resume","setInterval","pause","throttled"],"mappings":"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"}