remix-client-cache
Version:
Utility library to cache your client data in React Router
67 lines (64 loc) • 3.12 kB
text/typescript
import React from 'react';
import { ClientActionFunctionArgs, LoaderFunctionArgs } from 'react-router';
type ExtendedComponentProps<T> = CachedLoaderDataReturn & T;
declare const CacheRoute: (Component: (props: any) => JSX.Element, settings?: CachedLoaderDataProps) => (props: any) => React.JSX.Element;
interface CacheAdapter {
getItem: (key: string) => any | Promise<any>;
setItem: (key: string, value: any) => Promise<any> | any;
removeItem: (key: string) => Promise<any> | any;
}
type Prettify<T> = {
[K in keyof T]: T[K];
} & {};
declare let cache: CacheAdapter;
declare const createCacheAdapter: (adapter: () => CacheAdapter) => {
adapter: undefined;
} | {
adapter: CacheAdapter;
};
declare const configureGlobalCache: (newCacheInstance: () => CacheAdapter | Storage) => void;
declare const decacheClientLoader: ({ request, serverAction }: ClientActionFunctionArgs, { key, adapter, }: {
key?: string;
adapter?: CacheAdapter;
}) => Promise<unknown>;
type CacheClientLoaderArgs = {
type?: "swr" | "normal";
key?: string;
adapter?: CacheAdapter;
};
declare const cacheClientLoader: <T extends ClientLoaderFunctionArgs, TServerLoaderReturn = Awaited<ReturnType<T["serverLoader"]>>>({ request, serverLoader }: ClientLoaderFunctionArgs, { type, key, adapter, }?: CacheClientLoaderArgs) => Promise<Prettify<TServerLoaderReturn & {
serverData: TServerLoaderReturn;
deferredServerData: Promise<TServerLoaderReturn> | undefined;
key: string;
}>>;
interface ClientLoaderFunctionArgs extends LoaderFunctionArgs {
serverLoader: () => unknown;
}
declare const createClientLoaderCache: <U extends ClientLoaderFunctionArgs>(props?: CacheClientLoaderArgs) => {
(args: U): Promise<Awaited<ReturnType<U["serverLoader"]>> & {
serverData: Awaited<ReturnType<U["serverLoader"]>>;
deferredServerData: Promise<Awaited<ReturnType<U["serverLoader"]>>> | undefined;
key: string;
} extends infer T ? { [K in keyof T]: (Awaited<ReturnType<U["serverLoader"]>> & {
serverData: Awaited<ReturnType<U["serverLoader"]>>;
deferredServerData: Promise<Awaited<ReturnType<U["serverLoader"]>>> | undefined;
key: string;
})[K]; } : never>;
hydrate: boolean;
};
interface CachedLoaderDataProps {
adapter?: CacheAdapter;
}
interface CachedLoaderDataReturn {
cacheKey?: string;
invalidate: () => Promise<void>;
}
declare function useCachedLoaderData<T>({ adapter }?: CachedLoaderDataProps): T & CachedLoaderDataReturn;
declare const invalidateCache: (key: string | string[]) => Promise<void>;
declare const useCacheInvalidator: () => {
invalidateCache: (key: string | string[]) => Promise<void>;
};
declare function useSwrData<T>({ serverData, deferredServerData, ...args }: any): ({ children, }: {
children: (data: T) => React.ReactElement;
}) => React.JSX.Element;
export { CacheAdapter, CacheRoute, ExtendedComponentProps, cache, cacheClientLoader, configureGlobalCache, createCacheAdapter, createClientLoaderCache, decacheClientLoader, invalidateCache, useCacheInvalidator, useCachedLoaderData, useSwrData };