mirror of
				https://github.com/KevinMidboe/linguist.git
				synced 2025-10-29 17:50:22 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			103 lines
		
	
	
		
			2.8 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
			
		
		
	
	
			103 lines
		
	
	
		
			2.8 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
| import { DocumentNode } from 'graphql';
 | |
| import { getFragmentQueryDocument } from 'apollo-utilities';
 | |
| 
 | |
| import { DataProxy, Cache } from './types';
 | |
| 
 | |
| export type Transaction<T> = (c: ApolloCache<T>) => void;
 | |
| 
 | |
| export abstract class ApolloCache<TSerialized> implements DataProxy {
 | |
|   // required to implement
 | |
|   // core API
 | |
|   public abstract read<T>(query: Cache.ReadOptions): T;
 | |
|   public abstract write(write: Cache.WriteOptions): void;
 | |
|   public abstract diff<T>(query: Cache.DiffOptions): Cache.DiffResult<T>;
 | |
|   public abstract watch(watch: Cache.WatchOptions): () => void;
 | |
|   public abstract evict(query: Cache.EvictOptions): Cache.EvictionResult;
 | |
|   public abstract reset(): Promise<void>;
 | |
| 
 | |
|   // intializer / offline / ssr API
 | |
|   /**
 | |
|    * Replaces existing state in the cache (if any) with the values expressed by
 | |
|    * `serializedState`.
 | |
|    *
 | |
|    * Called when hydrating a cache (server side rendering, or offline storage),
 | |
|    * and also (potentially) during hot reloads.
 | |
|    */
 | |
|   public abstract restore(
 | |
|     serializedState: TSerialized,
 | |
|   ): ApolloCache<TSerialized>;
 | |
| 
 | |
|   /**
 | |
|    * Exposes the cache's complete state, in a serializable format for later restoration.
 | |
|    */
 | |
|   public abstract extract(optimistic: boolean): TSerialized;
 | |
| 
 | |
|   // optimistic API
 | |
|   public abstract removeOptimistic(id: string): void;
 | |
| 
 | |
|   // transactional API
 | |
|   public abstract performTransaction(
 | |
|     transaction: Transaction<TSerialized>,
 | |
|   ): void;
 | |
|   public abstract recordOptimisticTransaction(
 | |
|     transaction: Transaction<TSerialized>,
 | |
|     id: string,
 | |
|   ): void;
 | |
| 
 | |
|   // optional API
 | |
|   public transformDocument(document: DocumentNode): DocumentNode {
 | |
|     return document;
 | |
|   }
 | |
|   // experimental
 | |
|   public transformForLink(document: DocumentNode): DocumentNode {
 | |
|     return document;
 | |
|   }
 | |
| 
 | |
|   // DataProxy API
 | |
|   /**
 | |
|    *
 | |
|    * @param options
 | |
|    * @param optimistic
 | |
|    */
 | |
|   public readQuery<QueryType>(
 | |
|     options: DataProxy.Query,
 | |
|     optimistic: boolean = false,
 | |
|   ): QueryType {
 | |
|     return this.read({
 | |
|       query: options.query,
 | |
|       variables: options.variables,
 | |
|       optimistic,
 | |
|     });
 | |
|   }
 | |
| 
 | |
|   public readFragment<FragmentType>(
 | |
|     options: DataProxy.Fragment,
 | |
|     optimistic: boolean = false,
 | |
|   ): FragmentType | null {
 | |
|     return this.read({
 | |
|       query: getFragmentQueryDocument(options.fragment, options.fragmentName),
 | |
|       variables: options.variables,
 | |
|       rootId: options.id,
 | |
|       optimistic,
 | |
|     });
 | |
|   }
 | |
| 
 | |
|   public writeQuery(options: Cache.WriteQueryOptions): void {
 | |
|     this.write({
 | |
|       dataId: 'ROOT_QUERY',
 | |
|       result: options.data,
 | |
|       query: options.query,
 | |
|       variables: options.variables,
 | |
|     });
 | |
|   }
 | |
| 
 | |
|   public writeFragment(options: Cache.WriteFragmentOptions): void {
 | |
|     this.write({
 | |
|       dataId: options.id,
 | |
|       result: options.data,
 | |
|       variables: options.variables,
 | |
|       query: getFragmentQueryDocument(options.fragment, options.fragmentName),
 | |
|     });
 | |
|   }
 | |
| }
 |