10000 Flow updated to latest version (#1863) · DreadedX/immutable-js@6b03706 · GitHub
[go: up one dir, main page]

Skip to content

Commit 6b03706

Browse files
authored
Flow updated to latest version (immutable-js#1863)
1 parent 2a642f7 commit 6b03706

File tree

7 files changed

+81
-61
lines changed

7 files changed

+81
-61
lines changed

package-lock.json

Lines changed: 19 additions & 8 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -114,7 +114,7 @@
114114
"eslint-plugin-prettier": "^3.4.0",
115115
"eslint-plugin-react": "7.24.0",
116116
"eslint-plugin-react-hooks": "4.2.0",
117-
"flow-bin": "0.89.0",
117+
"flow-bin": "0.156.0",
118118
"jasmine-check": "0.1.5",
119119
"jest": "26.6.3",
120120
"make-synchronous": "^0.1.1",

type-definitions/flow-tests/.flowconfig

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,6 @@
22
../../
33

44
[options]
5-
suppress_comment=\\(.\\|\n\\)*\\$FlowExpectedError
6-
suppress_comment=\\(.\\|\n\\)*\\$FlowFixMe
75
module.name_mapper='^immutable$' -> '../../type-definitions/immutable.js.flow'
86

97
[ignore]

type-definitions/flow-tests/immutable-flow.js

Lines changed: 12 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -184,7 +184,7 @@ numberList = List.of('a').merge(List.of(1));
184184
// Functional API
185185

186186
numberList = merge(List([1]), List([2]));
187-
numberOrStringList = merge(List(['a']), List([1]));
187+
numberOrStringList = merge<List<string | number>>(List(['a']), List([1]));
188188
// $FlowExpectedError[incompatible-call]
189189
numberList = merge(List(['a']), List([1]));
190190

@@ -332,6 +332,7 @@ stringToNumberOrString = Map({ a: 1 }).update('a', (value) => 'a');
332332
stringToNumber = Map({ a: 1 }).update('a', (value) => 'a');
333333

334334
stringToNumberOrString = Map({ a: 1 }).update('a', 'b', (value) => 'a');
335+
// $FlowExpectedError[incompatible-type-arg]
335336
// $FlowExpectedError[incompatible-call]
336337
stringToNumber = Map({ a: 1 }).update('a', 'b', (value) => 'a');
337338
// $FlowExpectedError[incompatible-type-arg]
@@ -422,17 +423,18 @@ stringToNumber = Map({ a: 1 }).updateIn(['a'], (v) => 'a');
422423
stringToNumber = Map({ a: 1 }).updateIn(['a'], (v) => v + 1);
423424
stringToNumber = Map({ a: 1 }).updateIn(['a'], 0, (v) => v + 1);
424425

425-
// $FlowExpectedError[incompatible-call]
426-
Map({ x: Map({ y: Map({ z: 1 }) }) }).updateIn(['x', 'y', 1], (v) => v + 1);
427-
// $FlowExpectedError[incompatible-call]
428-
Map({ x: Map({ y: Map({ z: 1 }) }) }).updateIn(['x', 'y', 'z'], (v) => 'a');
429426
Map({ x: Map({ y: Map({ z: 1 }) }) }).updateIn(['x', 'y', 'z'], (v) => v + 1);
430427
Map({ x: Map({ y: Map({ z: 1 }) }) }).updateIn(
431428
['x', 'y', 'z'],
432429
0,
433430
(v) => v + 1
434431
);
435432

433+
// $FlowExpectedError[incompatible-call]
434+
Map({ x: Map({ y: Map({ z: 1 }) }) }).updateIn(['x', 'y', 1], (v) => v + 1);
435+
// $FlowExpectedError[incompatible-call]
436+
Map({ x: Map({ y: Map({ z: 1 }) }) }).updateIn(['x', 'y', 'z'], (v) => 'a');
437+
436438
stringToNumber = Map({ a: 1 }).mergeIn([], []);
437439
stringToNumber = Map({ a: 1 }).mergeDeepIn([], []);
438440

@@ -567,6 +569,7 @@ orderedStringToNumber = OrderedMap({ a: 1 }).mergeWith(
567569
{ a: 2, b: 3 }
568570
);
569571
orderedStringToNumber = OrderedMap({ a: 1 }).mergeWith(
572+
// $FlowExpectedError[incompatible-call]
570573
(prev, next) => next,
571574
// $FlowExpectedError[incompatible-type-arg] - this is actually an OrderedMap<string, number|string>
572575
{ a: '2', b: '3' }
@@ -1169,8 +1172,8 @@ const friendlies: List<PersonRecord2> = List([makePersonRecord2()]);
11691172
// $FlowExpectedError[incompatible-call]
11701173
friendlies.setIn([0, 'friends', 0, 'name'], 123);
11711174
friendlies.setIn([0, 'friends', 0, 'name'], 'Sally');
1172-
// $FlowExpectedError[prop-missing]
11731175
friendlies.updateIn([0, 'friends', 0, 'name'], (value) =>
1176+
// $FlowExpectedError[prop-missing]
11741177
value.unknownFunction()
11751178
);
11761179
friendlies.updateIn([0, 'friends', 0, 'name'], (value) => value.toUpperCase());
@@ -1192,11 +1195,11 @@ const plainFriendlies: List<PlainPerson> = List([plainFriendly]);
11921195
const fail: ?number = plainFriendlies.getIn([0, 'fraaands', 0, 0]);
11931196
}
11941197
{
1195-
// $FlowExpectedError[incompatible-call] string is not a number
1198+
// $FlowExpectedError[incompatible-type] string is not a number
11961199
const fail: ?number = plainFriendlies.getIn([0, 'friends', 0, 'name']);
11971200
}
11981201
{
1199-
// $FlowExpectedError[incompatible-call] can return undefined
1202+
// $FlowExpectedError[incompatible-type] can return undefined
12001203
const fail: string = plainFriendlies.getIn([0, 'friends', 0, 'name']);
12011204
}
12021205
{
@@ -1208,7 +1211,7 @@ plainFriendlies.setIn([0, 'friends', 0, 'name'], 123);
12081211
plainFriendlies.setIn([0, 'friends', 0, 'name'], 'Morgan');
12091212

12101213
plainFriendlies.updateIn([0, 'friends', 0, 'name'], (value) =>
1211-
// $FlowExpectedError[incompatible-call] value is a string, this is an unknown function
1214+
// $FlowExpectedError[prop-missing] value is a string, this is an unknown function
12121215
value.unknownFunction()
12131216
);
12141217
plainFriendlies.updateIn([0, 'friends', 0, 'name'], (value) =>

type-definitions/flow-tests/merge.js

Lines changed: 13 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -42,34 +42,6 @@ const objMap: ObjMap<number> = { x: 12, y: 34 };
4242
// $FlowExpectedError[incompatible-call]
4343
(merge(objMap, List([123])): ObjMap<number>);
4444

45-
// merge: Records
46-
47-
type XYPoint = { x: number, y: number };
48-
type XYPointRecord = RecordOf<XYPoint>;
49-
const xyRecord: RecordFactory<XYPoint> = Record({ x: 0, y: 0 });
50-
const record = xyRecord();
51-
(merge(record, { x: 321 }): XYPointRecord);
52-
(merge(record, xyRecord({ x: 321 })): XYPointRecord);
53-
// $FlowExpectedError[incompatible-call]
54-
(merge(record, { z: 321 }): XYPointRecord);
55-
// $FlowExpectedError[incompatible-call]
56-
(merge(record, { x: 'abc' }): XYPointRecord);
57-
(merge(record, [['x', 321]]): XYPointRecord);
58-
// $FlowExpectedError[prop-missing]]
59-
(merge(record, [['z', 321]]): XYPointRecord);
60-
// $FlowExpectedError[incompatible-call]
61-
(merge(record, [['x', 'abc']]): XYPointRecord);
62-
// $FlowExpectedError[incompatible-call]
63-
(merge(record, [321]): XYPointRecord);
64-
(merge(record, Map({ x: 123 })): XYPointRecord);
65-
// $FlowExpectedError[incompatible-call]
66-
(merge(record, Map({ z: 123 })): XYPointRecord);
67-
(merge(record, Map([['x', 123]])): XYPointRecord);
68-
// $FlowExpectedError[incompatible-call]
69-
(merge(record, Map([['z', 123]])): XYPointRecord);
70-
// $FlowExpectedError[incompatible-call]
71-
(merge(record, List([123])): XYPointRecord);
72-
7345
// merge: Maps
7446

7547
const map = Map({ key: 'value' });
@@ -117,27 +89,30 @@ const list = List([1, 2, 3]);
11789

11890
// merge: Objects as Records
11991

92+
type XYPoint = { x: number, y: number };
12093
const objRecord: XYPoint = { x: 12, y: 34 };
12194
(merge(objRecord, { x: 321 }): XYPoint);
122-
(merge(objRecord, xyRecord({ x: 321 })): XYPoint);
123-
// $FlowExpectedError[incompatible-call]
124-
(merge(objRecord, { z: 321 }): XYPoint);
95+
(merge(objRecord, [['x', 321]]): XYPoint);
96+
(merge(objRecord, Map({ x: 123 })): XYPoint);
97+
(merge(objRecord, Map([['x', 123]])): XYPoint);
98+
const xyPointRecord = Record({ x: 0, y: 0 });
99+
(merge(objRecord, xyPointRecord({ x: 321 })): XYPoint);
125100
// $FlowExpectedError[incompatible-call]
126101
(merge(objRecord, { x: 'abc' }): XYPoint);
127-
(merge(objRecord, [['x', 321]]): XYPoint);
128-
// $FlowExpectedError[prop-missing]]
129-
(merge(objRecord, [['z', 321]]): XYPoint);
130102
// $FlowExpectedError[incompatible-call]
131-
(merge(objRecord, [['x', 'abc']]): XYPoint);
103+
(merge({ x: 12, y: 34 }, [['x', 'abc']]): XYPoint);
132104
// $FlowExpectedError[incompatible-call]
133-
(merge(objRecord, [321]): XYPoint);
134-
(merge(objRecord, Map({ x: 123 })): XYPoint);
105+
(merge(objRecord, { z: 321 }): XYPoint);
106+
// $FlowExpectedError[prop-missing]]
107+
// $FlowExpectedError[invalid-call-util]]
108+
(merge(objRecord, [['z', 321]]): XYPoint);
135109
// $FlowExpectedError[incompatible-call]
136110
(merge(objRecord, Map({ z: 123 })): XYPoint);
137-
(merge(objRecord, Map([['x', 123]])): XYPoint);
138111
// $FlowExpectedError[incompatible-call]
139112
(merge(objRecord, Map([['z', 123]])): XYPoint);
140113
// $FlowExpectedError[incompatible-call]
114+
(merge(objRecord, [321]): XYPoint);
115+
// $FlowExpectedError[incompatible-call]
141116
(merge(objRecord, List([123])): XYPoint);
142117

143118
// merge: Arrays

type-definitions/flow-tests/record.js

Lines changed: 31 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
// Some tests look like they are repeated in order to avoid false positives.
33
// Flow might not complain about an instance of (what it thinks is) T to be assigned to T<K, V>
44

5-
import { Record, type RecordFactory, type RecordOf } from 'immutable';
5+
import { Record, type RecordFactory, type RecordOf, Map, List, merge } from 'immutable';
66

77
// Use the RecordFactory type to annotate
88
const Point2: RecordFactory<{ x: number, y: number }> = Record({ x: 0, y: 0 });
@@ -122,6 +122,7 @@ const originAlt2: $ReadOnly<TPointNew> = MakePointNew();
122122

123123
// Use of new may only return a class instance, not a record
124124
// (supported but discouraged)
125+
// $FlowExpected F438 Error[class-object-subtyping]
125126
// $FlowExpectedError[prop-missing]
126127
const mistakeOriginNew: PointNew = new MakePointNew();
127128
// An alternative type strategy is instance based
@@ -185,3 +186,32 @@ const person2 = new PersonWithoutTypes();
185186
person2.get('name');
186187
// Note: no error
187188
person2.get('unknown');
189+
190+
191+
// Functional Merge
192+
193+
type XYPoint = { x: number, y: number };
194+
type XYPointRecord = RecordOf<XYPoint>;
195+
const xyRecord: RecordFactory<XYPoint> = Record({ x: 0, y: 0 });
196+
const record = xyRecord();
197+
(merge(record, { x: 321 }): XYPointRecord);
198+
(merge(record, xyRecord({ x: 321 })): XYPointRecord);
199+
// $FlowExpectedError[incompatible-call]
200+
(merge(record, { z: 321 }): XYPointRecord);
201+
// $FlowExpectedError[incompatible-call]
202+
(merge(record, { x: 'abc' }): XYPointRecord);
203+
(merge(record, [['x', 321]]): XYPointRecord);
204+
// $FlowExpectedError[prop-missing]]
205+
(merge(record, [['z', 321]]): XYPointRecord);
206+
// $FlowExpectedError[incompatible-call]
207+
(merge(record, [['x', 'abc']]): XYPointRecord);
208+
// $FlowExpectedError[incompatible-call]
209+
(merge(record, [321]): XYPointRecord);
210+
(merge(record, Map({ x: 123 })): XYPointRecord);
211+
// $FlowExpectedError[incompatible-call]
212+
(merge(record, Map({ z: 123 })): XYPointRecord);
213+
(merge(record, Map([['x', 123]])): XYPointRecord);
214+
// $FlowExpectedError[incompatible-call]
215+
(merge(record, Map([['z', 123]])): XYPointRecord);
216+
// $FlowExpectedError[incompatible-call]
217+
(merge(record, List([123])): XYPointRecord);

type-definitions/immutable.js.flow

+5Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,19 +25,22 @@
2525
// some constructors and functions.
2626
type PlainObjInput<K, V> = { +[key: K]: V, __proto__: null };
2727

28+
type K<T> = $Keys<T>;
29+
2830
// Helper types to extract the "keys" and "values" use by the *In() methods.
2931
type $KeyOf<C> = $Call<
3032
(<K>(?_Collection<K, mixed>) => K) &
3133
(<T>(?$ReadOnlyArray<T>) => number) &
32-
(<T>(?RecordInstance<T> | T) => $Keys<T>),
34+
(<T>(?RecordInstance<T> | T) => $Keys<T>) &
35+
(<T: Object>(T) => $Keys<T>),
3336
C
3437
>;
3538

3639
type $ValOf<C, K = $KeyOf<C>> = $Call<
3740
(<V>(?_Collection<any, V>) => V) &
3841
(<T>(?$ReadOnlyArray<T>) => T) &
3942
(<T, K: $Keys<T>>(?RecordInstance<T> | T, K) => $ElementType<T, K>) &
40-
(<V>(?{ [any]: V }) => V),
43+
(<T: Object>(T) => $Values<T>),
4144
C,
4245
K
4346
>;

0 commit comments

Comments
 (0)
0