{"version":3,"sources":["../../src/utils/basic.ts"],"sourcesContent":["import { version as ReactVersion } from 'react'\n\nimport type { DependencyList, EffectCallback } from 'react'\n\nimport type { RefObject } from 'react'\n\nexport type ExtendedReactEffect<T = unknown> = (effect: EffectCallback, deps?: DependencyList, ...args: T[]) => void\n\nexport type Noop = () => void\nexport type AnyFunc = (...args: any[]) => any\nexport type WithThis<T extends AnyFunc> = (this: ThisParameterType<T>, ...args: Parameters<T>) => ReturnType<T>\n\nexport type PureObject<T = any> = Record<PropertyKey, T>\n\nexport type Arrayable<T> = T | T[]\nexport type Gettable<T> = T | (() => T)\nexport type Reffable<T> = T | RefObject<T>\nexport type Promisable<T> = T | Promise<T>\nexport type GettableOrReffable<T> = Gettable<T> | Reffable<T>\n\nexport type WindowEventName = keyof WindowEventMap\nexport type PointerType = 'mouse' | 'touch' | 'pen'\n\nexport type Position = {\n  /**\n   * X coordinate\n   */\n  x: number\n  /**\n   * Y coordinate\n   */\n  y: number\n}\n\nexport type Size = {\n  /**\n   * Width of the element\n   */\n  width: number\n  /**\n   * Height of the element\n   */\n  height: number\n}\n\nexport type SetTimeoutReturn = ReturnType<(typeof globalThis)['setTimeout']>\nexport type SetIntervalReturn = ReturnType<(typeof globalThis)['setInterval']>\n\ndeclare const process: {\n  env: {\n    NODE_ENV: 'development' | 'production' | (string & {})\n  }\n}\n\n// build tools are expected to replace this value when building for production\nexport const isDev: boolean = process.env.NODE_ENV !== 'production'\n\n// useful in Server-side Rendering (SSR)\n/* v8 ignore next */\nexport const isClient: boolean = Boolean(typeof window !== 'undefined' && isFunction(window?.document?.createElement))\n\nexport function noop(): undefined {}\n\nexport function wait(time = 0): Promise<void> {\n  return new Promise((resolve) => setTimeout(resolve, time))\n}\n\nexport function now(): number {\n  return Date.now()\n}\n\nexport function timestamp(): number {\n  return +Date.now()\n}\n\nexport function clamp(n: number, min: number, max: number): number {\n  return Math.min(max, Math.max(min, n))\n}\n\nexport function noNullish<T>(val: T | null): val is T {\n  return val !== null && val !== undefined\n}\n\nexport function isDefined<T = unknown>(val?: T): val is T {\n  return typeof val !== 'undefined'\n}\n\nexport function isFunction<T extends AnyFunc>(val: unknown): val is T {\n  return typeof val === 'function'\n}\n\nexport function isNumber(val: unknown): val is number {\n  return typeof val === 'number'\n}\n\nexport function isBoolean(val: unknown): val is boolean {\n  return typeof val === 'boolean'\n}\n\nexport function isString(val: unknown): val is string {\n  return typeof val === 'string'\n}\n\nexport function isObject(val: unknown): val is object {\n  return Object.prototype.toString.call(val) === '[object Object]'\n}\n\nexport function isReact18OrLater(): boolean {\n  if (!ReactVersion || !isString(ReactVersion)) {\n    return false\n  }\n\n  const mainVersion = Number(ReactVersion.split('.')[0].trim())\n\n  return Number.isNaN(mainVersion) ? false : mainVersion >= 18\n}\n\nexport function hasOwn<T extends object, K extends PropertyKey>(val: T, key: K): boolean {\n  return Object.prototype.hasOwnProperty.call(val, key)\n}\n\n// TODO: rewrite using `NoInfer` in TS 5.4, now downgrade temporarily\nexport function ensureSSRSecurity<T, S extends T>(fn: () => T, fallback: S): T {\n  return isClient ? fn() : fallback\n}\n\nexport interface PromiseWithResolversReturns<T> {\n  resolve: (value: T | PromiseLike<T>) => void\n  reject: (reason: unknown) => void\n  promise: Promise<T>\n}\n\n/**\n * TODO: re-write with `Promise.withResolvers`\n *\n * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise/withResolvers#browser_compatibility\n */\nexport function createPromiseWithResolvers<T = void>(): PromiseWithResolversReturns<T> {\n  let resolve!: (value: T | PromiseLike<T>) => void\n  let reject!: (reason: unknown) => void\n\n  const promise = new Promise<T>((_resolve, _reject) => {\n    resolve = _resolve\n    reject = _reject\n  })\n\n  return { resolve, reject, promise }\n}\n\n/**\n * Increase string a value with unit\n *\n * @example '2px' + 1 = '3px'\n * @example '15em' + (-2) = '13em'\n */\nexport function increaseWithUnit<T extends number = number>(target: T, delta: number): T\nexport function increaseWithUnit<T extends string = string>(target: T, delta: number): T\nexport function increaseWithUnit<T extends string | number = string | number>(target: T, delta: number): T\nexport function increaseWithUnit(target: string | number, delta: number) {\n  if (typeof target === 'number') return target + delta\n  const value = target.match(/^-?[0-9]+\\.?[0-9]*/)?.[0] || ''\n  const unit = target.slice(value.length)\n  const result = Number.parseFloat(value) + delta\n  if (Number.isNaN(result)) return target\n  return result + unit\n}\n\nexport function createSingletonPromise<T>(fn: () => Promise<T>): (() => Promise<T>) & { reset: () => Promise<void> } {\n  const promise = {\n    current: undefined as Promise<T> | undefined,\n  }\n\n  function wrapper() {\n    if (!promise.current) {\n      promise.current = fn()\n    }\n    return promise.current\n  }\n\n  wrapper.reset = async () => {\n    const _prev = promise.current\n    promise.current = undefined\n    if (_prev) await _prev\n  }\n\n  return wrapper\n}\n"],"names":["clamp","createPromiseWithResolvers","createSingletonPromise","ensureSSRSecurity","hasOwn","increaseWithUnit","isBoolean","isClient","isDefined","isDev","isFunction","isNumber","isObject","isReact18OrLater","isString","noNullish","noop","now","timestamp","wait","window","process","env","NODE_ENV","Boolean","document","createElement","time","Promise","resolve","setTimeout","Date","n","min","max","Math","val","undefined","Object","prototype","toString","call","ReactVersion","mainVersion","Number","split","trim","isNaN","key","hasOwnProperty","fn","fallback","reject","promise","_resolve","_reject","target","delta","value","match","unit","slice","length","result","parseFloat","current","wrapper","reset","_prev"],"mappings":"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"}