From d968b0e9ee5cc0c1dcbb181a3f139bd43751b658 Mon Sep 17 00:00:00 2001 From: Paul Chaignon Date: Sat, 4 Nov 2017 11:16:44 +0100 Subject: [PATCH] Improve heuristic for XML/TypeScript (#3883) The heuristic for XML .ts files might match TypeScript generics starting with TS --- lib/linguist/heuristics.rb | 2 +- samples/TypeScript/cache.ts | 102 ++++++++++++++++++++++++++++++++++++ 2 files changed, 103 insertions(+), 1 deletion(-) create mode 100644 samples/TypeScript/cache.ts diff --git a/lib/linguist/heuristics.rb b/lib/linguist/heuristics.rb index e2f061b5..23373c5a 100644 --- a/lib/linguist/heuristics.rb +++ b/lib/linguist/heuristics.rb @@ -477,7 +477,7 @@ module Linguist end disambiguate ".ts" do |data| - if data.include?(" = (c: ApolloCache) => void; + +export abstract class ApolloCache implements DataProxy { + // required to implement + // core API + public abstract read(query: Cache.ReadOptions): T; + public abstract write(write: Cache.WriteOptions): void; + public abstract diff(query: Cache.DiffOptions): Cache.DiffResult; + public abstract watch(watch: Cache.WatchOptions): () => void; + public abstract evict(query: Cache.EvictOptions): Cache.EvictionResult; + public abstract reset(): Promise; + + // 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; + + /** + * 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, + ): void; + public abstract recordOptimisticTransaction( + transaction: Transaction, + 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( + options: DataProxy.Query, + optimistic: boolean = false, + ): QueryType { + return this.read({ + query: options.query, + variables: options.variables, + optimistic, + }); + } + + public readFragment( + 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), + }); + } +}