/* eslint-disable */ import { MicroMemoize } from 'micro-memoize/src/types'; export type Fn = ( ...args: Arg[] ) => Result; export type FunctionalComponent = Fn & { displayName?: string; }; export type Key = Arg[]; export type Value = any; export type Cache = MicroMemoize.Cache; export type MicroMemoizeOptions = MicroMemoize.Options; 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 Moizeable = Fn & Record; export type Memoized = MicroMemoize.Memoized< OriginalFn >; export type Moized< OriginalFn 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: OriginalFn; // 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: OriginalFn; }; export type CurriedMoize = < CurriedFn extends Moizeable, CurriedOptions extends Options >( curriedFn: CurriedFn | CurriedOptions, curriedOptions?: CurriedOptions ) => | Moized | CurriedMoize; export interface MaxAge { (maxAge: MaxAge): Moize<{ maxAge: MaxAge }>; ( maxAge: MaxAge, expireOptions: UpdateExpire ): Moize<{ maxAge: MaxAge; updateExpire: UpdateExpire }>; ( maxAge: MaxAge, expireOptions: ExpireHandler ): Moize<{ maxAge: MaxAge; onExpire: ExpireHandler }>; < MaxAge extends number, ExpireHandler extends OnExpire, ExpireOptions extends { onExpire: ExpireHandler; } >( maxAge: MaxAge, expireOptions: ExpireOptions ): Moize<{ maxAge: MaxAge; onExpire: ExpireOptions['onExpire'] }>; < MaxAge extends number, UpdateExpire extends boolean, ExpireOptions extends { updateExpire: UpdateExpire; } >( maxAge: MaxAge, expireOptions: ExpireOptions ): Moize<{ maxAge: MaxAge; updateExpire: UpdateExpire }>; < MaxAge extends number, ExpireHandler extends OnExpire, UpdateExpire extends boolean, ExpireOptions extends { onExpire: ExpireHandler; updateExpire: UpdateExpire; } >( maxAge: MaxAge, expireOptions: ExpireOptions ): Moize<{ maxAge: MaxAge; onExpire: ExpireHandler; updateExpire: UpdateExpire; }>; } export interface Moize { (fn: Fn): Moized; ( fn: Fn, options: PassedOptions ): Moized; >(fn: Fn): Moized< Fn['fn'], Options & DefaultOptions >; , PassedOptions extends Options>( fn: Fn, options: PassedOptions ): Moized; (options: PassedOptions): Moize< PassedOptions >; clearStats: (profileName?: string) => void; collectStats: (isCollectingStats?: boolean) => void; compose: (...moizers: Moize[]) => Moize; deep: Moize<{ isDeepEqual: true }>; getStats: (profileName?: string) => StatsObject; infinite: Moize; isCollectingStats: () => boolean; isMoized: (value: any) => value is Moized; matchesArg: ( argMatcher: Matcher ) => Moize<{ matchesArg: Matcher }>; matchesKey: ( keyMatcher: Matcher ) => Moize<{ matchesKey: Matcher }>; maxAge: MaxAge; maxArgs: ( args: MaxArgs ) => Moize<{ maxArgs: MaxArgs }>; maxSize: ( size: MaxSize ) => Moize<{ maxSize: MaxSize }>; profile: ( profileName: ProfileName ) => Moize<{ profileName: ProfileName }>; promise: Moize<{ isPromise: true }>; react: Moize<{ isReact: true }>; serialize: Moize<{ isSerialized: true }>; serializeWith: ( serializer: Serializer ) => Moize<{ isSerialized: true; serializer: Serializer }>; shallow: Moize<{ isShallowEqual: true }>; transformArgs: ( transformer: Transformer ) => Moize<{ transformArgs: Transformer }>; updateCacheForKey: ( updateCacheForKey: UpdateWhen ) => Moize<{ updateCacheForKey: UpdateWhen }>; } declare const moize: Moize; export default moize;