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.