@samitouri / QOS-React / commits / 524a743313

Fix for Flow issues in SimpleCacheProvider (#12942)

* Fix for Flow issues in SimpleCacheProvider **what is the change?:** - Fixed some flow errors which were somehow swallowed when CI originally - Loosen flow types to avoid issue with recursive loop in Flow; https://github.com/facebook/flow/issues/5870 **why make this change?:** To unbreak master and unblock other changes we want to make. **test plan:** Flow passes! **issue:** https://github.com/facebook/react/issues/12941 * Fix lints

Flarnie Marchan committed May 30, 2018 at 15:31 UTC 524a74331399fd7102037c878f327afbd5e14f53
1 file changed +42 -21
packages/simple-cache-provider/src/SimpleCacheProvider.js
+42 -21
@@ -17,24 +17,34 @@ const Pending = 1;
17 const Resolved = 2;
18 const Rejected = 3;
19
20 -type EmptyRecord<K, V> = {|
20 +type EmptyRecord<K> = {|
21 status: 0,
22 suspender: null,
23 key: K,
24 value: null,
25 error: null,
26 - next: Record<K, V> | null,
27 - previous: Record<K, V> | null,
26 + next: any, // TODO: (issue #12941)
27 + previous: any, // TODO: (issue #12941)
28 + /**
29 + * Proper types would be something like this:
30 + * next: Record<K, V> | null,
31 + * previous: Record<K, V> | null,
32 + */
33 |};
34
35 type PendingRecord<K, V> = {|
36 status: 1,
32 - suspender: Promise<K, V>,
37 + suspender: Promise<V>,
38 key: K,
39 value: null,
40 error: null,
36 - next: Record<K, V> | null,
37 - previous: Record<K, V> | null,
41 + next: any, // TODO: (issue #12941)
42 + previous: any, // TODO: (issue #12941)
43 + /**
44 + * Proper types would be something like this:
45 + * next: Record<K, V> | null,
46 + * previous: Record<K, V> | null,
47 + */
48 |};
49
50 type ResolvedRecord<K, V> = {|
@@ -43,30 +53,41 @@ type ResolvedRecord<K, V> = {|
53 key: K,
54 value: V,
55 error: null,
46 - next: Record<K, V> | null,
47 - previous: Record<K, V> | null,
56 + next: any, // TODO: (issue #12941)
57 + previous: any, // TODO: (issue #12941)
58 + /**
59 + * Proper types would be something like this:
60 + * next: Record<K, V> | null,
61 + * previous: Record<K, V> | null,
62 + */
63 |};
64
50 -type RejectedRecord<K, V> = {|
65 +type RejectedRecord<K> = {|
66 status: 3,
67 suspender: null,
68 key: K,
69 value: null,
70 error: Error,
56 - next: Record<K, V> | null,
57 - previous: Record<K, V> | null,
71 + next: any, // TODO: (issue #12941)
72 + previous: any, // TODO: (issue #12941)
73 + /**
74 + * Proper types would be something like this:
75 + * next: Record<K, V> | null,
76 + * previous: Record<K, V> | null,
77 + */
78 |};
79
80 type Record<K, V> =
61 - | EmptyRecord<K, V>
81 + | EmptyRecord<K>
82 | PendingRecord<K, V>
83 | ResolvedRecord<K, V>
64 - | RejectedRecord<K, V>;
84 + | RejectedRecord<K>;
85
86 type RecordCache<K, V> = {|
87 map: Map<K, Record<K, V>>,
88 head: Record<K, V> | null,
89 tail: Record<K, V> | null,
90 + size: number,
91 |};
92
93 // TODO: How do you express this type with Flow?
@@ -107,7 +128,7 @@ if (__DEV__) {
128 const MAX_SIZE = 500;
129 const PAGE_SIZE = 50;
130
110 -function createRecord<K, V>(key: K): EmptyRecord<K, V> {
131 +function createRecord<K>(key: K): EmptyRecord<K> {
132 return {
133 status: Empty,
134 suspender: null,
@@ -131,7 +152,7 @@ function createRecordCache<K, V>(): RecordCache<K, V> {
152 export function createCache(invalidator: () => mixed): Cache {
153 const resourceMap: ResourceMap = new Map();
154
134 - function accessRecord<K, V>(resourceType: any, key: K): Record<V> {
155 + function accessRecord<K, V>(resourceType: any, key: K): Record<K, V> {
156 if (__DEV__) {
157 warning(
158 typeof resourceType !== 'string' && typeof resourceType !== 'number',
@@ -206,14 +227,14 @@ export function createCache(invalidator: () => mixed): Cache {
227 return newHead;
228 }
229
209 - function load<V>(emptyRecord: EmptyRecord, suspender: Promise<V>) {
210 - const pendingRecord: PendingRecord<V> = (emptyRecord: any);
230 + function load<K, V>(emptyRecord: EmptyRecord<K>, suspender: Promise<V>) {
231 + const pendingRecord: PendingRecord<K, V> = (emptyRecord: any);
232 pendingRecord.status = Pending;
233 pendingRecord.suspender = suspender;
234 suspender.then(
235 value => {
236 // Resource loaded successfully.
216 - const resolvedRecord: ResolvedRecord<V> = (pendingRecord: any);
237 + const resolvedRecord: ResolvedRecord<K, V> = (pendingRecord: any);
238 resolvedRecord.status = Resolved;
239 resolvedRecord.suspender = null;
240 resolvedRecord.value = value;
@@ -221,7 +242,7 @@ export function createCache(invalidator: () => mixed): Cache {
242 error => {
243 // Resource failed to load. Stash the error for later so we can throw it
244 // the next time it's requested.
224 - const rejectedRecord: RejectedRecord = (pendingRecord: any);
245 + const rejectedRecord: RejectedRecord<K> = (pendingRecord: any);
246 rejectedRecord.status = Rejected;
247 rejectedRecord.suspender = null;
248 rejectedRecord.error = error;
@@ -239,7 +260,7 @@ export function createCache(invalidator: () => mixed): Cache {
260 miss: A => Promise<V>,
261 missArg: A,
262 ): void {
242 - const record: Record<V> = accessRecord(resourceType, key);
263 + const record: Record<K, V> = accessRecord(resourceType, key);
264 switch (record.status) {
265 case Empty:
266 // Warm the cache.
@@ -263,7 +284,7 @@ export function createCache(invalidator: () => mixed): Cache {
284 miss: A => Promise<V>,
285 missArg: A,
286 ): V {
266 - const record: Record<V> = accessRecord(resourceType, key);
287 + const record: Record<K, V> = accessRecord(resourceType, key);
288 switch (record.status) {
289 case Empty:
290 // Load the requested resource.