/* eslint-disable */ import { Cache as BaseCache, Memoized as BaseMemoized, Options as BaseOptions, } from 'micro-memoize'; export type AnyFn = (...args: any[]) => any; export type Moizeable = AnyFn & Record; interface MoizedReactElement { type: any; props: any; key: string | number | null; } /** * @deprecated * * Use `AnyFn` instead, as it is more flexible and works better with type inference. */ export type Fn = ( ...args: Arg[] ) => Result; /** * @deprecated * * This should not longer need to be explicitly used, as inference of the function * returning the element should suffice. */ export type FunctionalComponent = (( props: Props ) => MoizedReactElement) & { displayName?: string; }; export type Key = Arg[]; export type Value = any; export type Cache = BaseCache; export type MicroMemoizeOptions = BaseOptions; export type Expiration = { expirationMethod: () => void; key: Key; timeoutId: ReturnType; }; export type OnCacheOperation = ( cache: Cache, options: Options, moized: (...args: any[]) => any ) => void; export type IsEqual = (cacheKeyArg: any, keyArg: any) => boolean; export type IsMatchingKey = (cacheKey: Key, key: Key) => boolean; export type OnExpire = (key: Key) => any; export type Serialize = (key: Key) => string[]; export type TransformKey = (key: Key) => Key; export type UpdateCacheForKey = (key: Key) => boolean; export type Options = Partial<{ isDeepEqual: boolean; isPromise: boolean; isReact: boolean; isSerialized: boolean; isShallowEqual: boolean; matchesArg: IsEqual; matchesKey: IsMatchingKey; maxAge: number; maxArgs: number; maxSize: number; onCacheAdd: OnCacheOperation; onCacheChange: OnCacheOperation; onCacheHit: OnCacheOperation; onExpire: OnExpire; profileName: string; serializer: Serialize; transformArgs: TransformKey; updateCacheForKey: UpdateCacheForKey; updateExpire: boolean; }>; export type StatsProfile = { calls: number; hits: number; }; export type StatsObject = { calls: number; hits: number; usage: string; }; export type GlobalStatsObject = StatsObject & { profiles?: Record; }; export type StatsCache = { anonymousProfileNameCounter: number; isCollectingStats: boolean; profiles: Record; }; export type Memoized = BaseMemoized; export type Moized< MoizeableFn extends Moizeable = Moizeable, CombinedOptions extends Options = Options > = Memoized & { // values _microMemoizeOptions: Pick< CombinedOptions, 'isPromise' | 'maxSize' | 'onCacheAdd' | 'onCacheChange' | 'onCacheHit' > & { isEqual: CombinedOptions['matchesArg']; isMatchingKey: CombinedOptions['matchesKey']; transformKey: CombinedOptions['transformArgs']; }; cache: Cache; cacheSnapshot: Cache; expirations: Expiration[]; expirationsSnapshot: Expiration[]; options: CombinedOptions; originalFunction: MoizeableFn; // react-specific values contextTypes?: Record; defaultProps?: Record; displayName?: string; propTypes: Record; // methods clear: () => void; clearStats: () => void; get: (key: Key) => any; getStats: () => StatsProfile; has: (key: Key) => boolean; isCollectingStats: () => boolean; isMoized: () => true; keys: () => Cache['keys']; remove: (key: Key) => void; set: (key: Key, value: any) => void; values: () => Cache['values']; }; export type MoizeConfiguration = { expirations: Expiration[]; options: Options; originalFunction: MoizeableFn; }; export type CurriedMoize = < CurriedFn extends Moizeable, CurriedOptions extends Options >( curriedFn: CurriedFn | CurriedOptions, curriedOptions?: CurriedOptions ) => | Moized | CurriedMoize; export interface MaxAge { (maxAge: MaxAge): Moizer<{ maxAge: MaxAge }>; ( maxAge: MaxAge, expireOptions: UpdateExpire ): Moizer<{ maxAge: MaxAge; updateExpire: UpdateExpire }>; ( maxAge: MaxAge, expireOptions: ExpireHandler ): Moizer<{ maxAge: MaxAge; onExpire: ExpireHandler }>; < MaxAge extends number, ExpireHandler extends OnExpire, ExpireOptions extends { onExpire: ExpireHandler; } >( maxAge: MaxAge, expireOptions: ExpireOptions ): Moizer<{ maxAge: MaxAge; onExpire: ExpireOptions['onExpire'] }>; < MaxAge extends number, UpdateExpire extends boolean, ExpireOptions extends { updateExpire: UpdateExpire; } >( maxAge: MaxAge, expireOptions: ExpireOptions ): Moizer<{ maxAge: MaxAge; updateExpire: UpdateExpire }>; < MaxAge extends number, ExpireHandler extends OnExpire, UpdateExpire extends boolean, ExpireOptions extends { onExpire: ExpireHandler; updateExpire: UpdateExpire; } >( maxAge: MaxAge, expireOptions: ExpireOptions ): Moizer<{ maxAge: MaxAge; onExpire: ExpireHandler; updateExpire: UpdateExpire; }>; } export interface Moizer< DefaultOptions extends Options = Options > { (fn: MoizeableFn): Moized< MoizeableFn, Options & DefaultOptions >; >( fn: MoizeableFn, options: PassedOptions ): Moized< MoizeableFn, Options & DefaultOptions & PassedOptions >; >(fn: MoizedFn): Moized< MoizedFn['fn'], Options & DefaultOptions >; < MoizedFn extends Moized, PassedOptions extends Options >( fn: MoizedFn, options: PassedOptions ): Moized< MoizedFn['fn'], Options & DefaultOptions & PassedOptions >; >( options: PassedOptions ): Moizer; } export interface Moize< DefaultOptions extends Options = Options > extends Moizer { clearStats: (profileName?: string) => void; collectStats: (isCollectingStats?: boolean) => void; compose: (...moizers: Array) => Moizer; deep: Moizer<{ isDeepEqual: true }>; getStats: (profileName?: string) => StatsObject; infinite: Moizer; isCollectingStats: () => boolean; isMoized: (value: any) => value is Moized; matchesArg: ( argMatcher: Matcher ) => Moizer<{ matchesArg: Matcher }>; matchesKey: ( keyMatcher: Matcher ) => Moizer<{ matchesKey: Matcher }>; maxAge: MaxAge; maxArgs: ( args: MaxArgs ) => Moizer<{ maxArgs: MaxArgs }>; maxSize: ( size: MaxSize ) => Moizer<{ maxSize: MaxSize }>; profile: ( profileName: ProfileName ) => Moizer<{ profileName: ProfileName }>; promise: Moizer<{ isPromise: true }>; react: Moizer<{ isReact: true }>; serialize: Moizer<{ isSerialized: true }>; serializeWith: ( serializer: Serializer ) => Moizer<{ isSerialized: true; serializer: Serializer }>; shallow: Moizer<{ isShallowEqual: true }>; transformArgs: ( transformer: Transformer ) => Moizer<{ transformArgs: Transformer }>; updateCacheForKey: ( updateCacheForKey: UpdateWhen ) => Moizer<{ updateCacheForKey: UpdateWhen }>; } declare const moize: Moize; export default moize;