@pixui-dev/pxw 0.1.35 → 0.1.37

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (97) hide show
  1. package/bin/pxw.js +56 -56
  2. package/bin/wpbuild.js +10 -10
  3. package/config/daemon.js +157 -157
  4. package/config/default.conf +20 -20
  5. package/config/devops.js +550 -550
  6. package/config/h5es.js +14 -14
  7. package/config/index.html +183 -183
  8. package/config/pfbs.js +259 -259
  9. package/config/util.js +143 -143
  10. package/config/webpack.js +325 -325
  11. package/lib/assets/check.html +62 -62
  12. package/lib/assets/preact.js +4354 -4354
  13. package/lib/check/main.less +62 -62
  14. package/lib/check/main.tsx +41 -41
  15. package/lib/check/tool.js +3 -3
  16. package/lib/check/util.tsx +110 -110
  17. package/lib/grpc-web/dist/ChunkParser.js +117 -117
  18. package/lib/grpc-web/dist/Code.js +58 -58
  19. package/lib/grpc-web/dist/client.js +299 -299
  20. package/lib/grpc-web/dist/debug.js +16 -16
  21. package/lib/grpc-web/dist/detach.js +7 -7
  22. package/lib/grpc-web/dist/index.js +29 -29
  23. package/lib/grpc-web/dist/invoke.js +32 -32
  24. package/lib/grpc-web/dist/message.js +3 -3
  25. package/lib/grpc-web/dist/metadata.js +5 -5
  26. package/lib/grpc-web/dist/service.js +3 -3
  27. package/lib/grpc-web/dist/transports/Transport.js +15 -15
  28. package/lib/grpc-web/dist/transports/http/fetch.js +117 -117
  29. package/lib/grpc-web/dist/transports/http/http.js +15 -15
  30. package/lib/grpc-web/dist/transports/http/xhr.js +136 -136
  31. package/lib/grpc-web/dist/transports/http/xhrUtil.js +36 -36
  32. package/lib/grpc-web/dist/transports/websocket/websocket.js +95 -95
  33. package/lib/grpc-web/dist/typings/ChunkParser.d.ts +17 -17
  34. package/lib/grpc-web/dist/typings/Code.d.ts +20 -20
  35. package/lib/grpc-web/dist/typings/client.d.ts +25 -25
  36. package/lib/grpc-web/dist/typings/debug.d.ts +1 -1
  37. package/lib/grpc-web/dist/typings/detach.d.ts +1 -1
  38. package/lib/grpc-web/dist/typings/index.d.ts +45 -45
  39. package/lib/grpc-web/dist/typings/invoke.d.ts +20 -20
  40. package/lib/grpc-web/dist/typings/message.d.ts +8 -8
  41. package/lib/grpc-web/dist/typings/metadata.d.ts +2 -2
  42. package/lib/grpc-web/dist/typings/service.d.ts +16 -16
  43. package/lib/grpc-web/dist/typings/transports/Transport.d.ts +22 -22
  44. package/lib/grpc-web/dist/typings/transports/http/fetch.d.ts +6 -6
  45. package/lib/grpc-web/dist/typings/transports/http/http.d.ts +5 -5
  46. package/lib/grpc-web/dist/typings/transports/http/xhr.d.ts +27 -27
  47. package/lib/grpc-web/dist/typings/transports/http/xhrUtil.d.ts +3 -3
  48. package/lib/grpc-web/dist/typings/transports/websocket/websocket.d.ts +2 -2
  49. package/lib/grpc-web/dist/typings/unary.d.ts +23 -23
  50. package/lib/grpc-web/dist/typings/util.d.ts +2 -2
  51. package/lib/grpc-web/dist/unary.js +44 -44
  52. package/lib/grpc-web/dist/util.js +11 -11
  53. package/lib/grpcTransport/PixHttp2Transport.ts +107 -107
  54. package/lib/grpcTransport/PixLuaTransport.ts +82 -82
  55. package/lib/h5es-types/v1.9.2/h5es.d.ts +1756 -1756
  56. package/lib/h5es-types/v3.5.0/h5es.d.ts +1851 -1851
  57. package/lib/h5es-types/v3.5.6/h5es.d.ts +1911 -1911
  58. package/lib/pi_component/tinyList/tinyList.js +483 -483
  59. package/lib/pi_component/tinyList/tinyList.tsx +517 -517
  60. package/lib/preact-router.js +395 -395
  61. package/lib/preact.js +4355 -4355
  62. package/lib/preact.tq.js +4385 -4385
  63. package/lib/react-window/src/FixedSizeGrid.js +172 -172
  64. package/lib/react-window/src/FixedSizeList.js +91 -91
  65. package/lib/react-window/src/VariableSizeGrid.js +329 -329
  66. package/lib/react-window/src/VariableSizeList.js +231 -231
  67. package/lib/react-window/src/__tests__/FixedSizeGrid.js +942 -942
  68. package/lib/react-window/src/__tests__/FixedSizeList.js +749 -749
  69. package/lib/react-window/src/__tests__/VariableSizeGrid.js +598 -598
  70. package/lib/react-window/src/__tests__/VariableSizeList.js +345 -345
  71. package/lib/react-window/src/__tests__/__snapshots__/FixedSizeGrid.js.snap +912 -912
  72. package/lib/react-window/src/__tests__/__snapshots__/FixedSizeList.js.snap +568 -568
  73. package/lib/react-window/src/__tests__/__snapshots__/VariableSizeGrid.js.snap +542 -542
  74. package/lib/react-window/src/__tests__/__snapshots__/VariableSizeList.js.snap +331 -331
  75. package/lib/react-window/src/__tests__/areEqual.js +28 -28
  76. package/lib/react-window/src/__tests__/shouldComponentUpdate.js +32 -32
  77. package/lib/react-window/src/areEqual.js +13 -13
  78. package/lib/react-window/src/createGridComponent.js +657 -657
  79. package/lib/react-window/src/createListComponent.js +574 -574
  80. package/lib/react-window/src/domHelpers.js +69 -69
  81. package/lib/react-window/src/index.js +9 -9
  82. package/lib/react-window/src/shallowDiffers.js +17 -17
  83. package/lib/react-window/src/shouldComponentUpdate.js +11 -11
  84. package/lib/react-window/src/test.js.flow +382 -382
  85. package/lib/react-window/src/timer.js +36 -36
  86. package/lib/types/dom.ts +17 -17
  87. package/lib/types/ext.d.ts +75 -75
  88. package/lib/types/preact/css.d.ts +7478 -7476
  89. package/lib/types/preact/index.d.ts +340 -340
  90. package/lib/types/preact/internal.d.ts +94 -94
  91. package/lib/types/preact/jsx.d.ts +368 -368
  92. package/lib/types/preact-router/index.d.ts +84 -84
  93. package/package.json +127 -127
  94. package/scripts/pack.js +40 -40
  95. package/scripts/postinstall.js +12 -12
  96. package/scripts/run-pxw.js +19 -19
  97. package/tsconfig.json +30 -30
@@ -1,231 +1,231 @@
1
- // @flow
2
-
3
- import createListComponent from './createListComponent';
4
-
5
- import type { Props, ScrollToAlign } from './createListComponent';
6
-
7
- const DEFAULT_ESTIMATED_ITEM_SIZE = 50;
8
-
9
- type VariableSizeProps = {|
10
- estimatedItemSize: number,
11
- ...Props<any>,
12
- |};
13
-
14
- type itemSizeGetter = (index: number) => number;
15
-
16
- type ItemMetadata = {|
17
- offset: number,
18
- size: number,
19
- |};
20
- type InstanceProps = {|
21
- itemMetadataMap: { [index: number]: ItemMetadata },
22
- estimatedItemSize: number,
23
- lastMeasuredIndex: number,
24
- |};
25
-
26
- const getItemMetadata = (props: Props<any>, index: number, instanceProps: InstanceProps): ItemMetadata => {
27
- const { itemSize } = ((props: any): VariableSizeProps);
28
- const { itemMetadataMap, lastMeasuredIndex } = instanceProps;
29
-
30
- if (index > lastMeasuredIndex) {
31
- let offset = 0;
32
- if (lastMeasuredIndex >= 0) {
33
- const itemMetadata = itemMetadataMap[lastMeasuredIndex];
34
- offset = itemMetadata.offset + itemMetadata.size;
35
- }
36
-
37
- for (let i = lastMeasuredIndex + 1; i <= index; i++) {
38
- let size = ((itemSize: any): itemSizeGetter)(i);
39
-
40
- itemMetadataMap[i] = {
41
- offset,
42
- size,
43
- };
44
-
45
- offset += size;
46
- }
47
-
48
- instanceProps.lastMeasuredIndex = index;
49
- }
50
-
51
- return itemMetadataMap[index];
52
- };
53
-
54
- const findNearestItem = (props: Props<any>, instanceProps: InstanceProps, offset: number) => {
55
- const { itemMetadataMap, lastMeasuredIndex } = instanceProps;
56
-
57
- const lastMeasuredItemOffset = lastMeasuredIndex > 0 ? itemMetadataMap[lastMeasuredIndex].offset : 0;
58
-
59
- if (lastMeasuredItemOffset >= offset) {
60
- // If we've already measured items within this range just use a binary search as it's faster.
61
- return findNearestItemBinarySearch(props, instanceProps, lastMeasuredIndex, 0, offset);
62
- } else {
63
- // If we haven't yet measured this high, fallback to an exponential search with an inner binary search.
64
- // The exponential search avoids pre-computing sizes for the full set of items as a binary search would.
65
- // The overall complexity for this approach is O(log n).
66
- return findNearestItemExponentialSearch(props, instanceProps, Math.max(0, lastMeasuredIndex), offset);
67
- }
68
- };
69
-
70
- const findNearestItemBinarySearch = (props: Props<any>, instanceProps: InstanceProps, high: number, low: number, offset: number): number => {
71
- while (low <= high) {
72
- const middle = low + Math.floor((high - low) / 2);
73
- const currentOffset = getItemMetadata(props, middle, instanceProps).offset;
74
-
75
- if (currentOffset === offset) {
76
- return middle;
77
- } else if (currentOffset < offset) {
78
- low = middle + 1;
79
- } else if (currentOffset > offset) {
80
- high = middle - 1;
81
- }
82
- }
83
-
84
- if (low > 0) {
85
- return low - 1;
86
- } else {
87
- return 0;
88
- }
89
- };
90
-
91
- const findNearestItemExponentialSearch = (props: Props<any>, instanceProps: InstanceProps, index: number, offset: number): number => {
92
- const { itemCount } = props;
93
- let interval = 1;
94
-
95
- while (index < itemCount && getItemMetadata(props, index, instanceProps).offset < offset) {
96
- index += interval;
97
- interval *= 2;
98
- }
99
-
100
- return findNearestItemBinarySearch(props, instanceProps, Math.min(index, itemCount - 1), Math.floor(index / 2), offset);
101
- };
102
-
103
- const getEstimatedTotalSize = ({ itemCount }: Props<any>, { itemMetadataMap, estimatedItemSize, lastMeasuredIndex }: InstanceProps) => {
104
- let totalSizeOfMeasuredItems = 0;
105
-
106
- // Edge case check for when the number of items decreases while a scroll is in progress.
107
- // https://github.com/bvaughn/react-window/pull/138
108
- if (lastMeasuredIndex >= itemCount) {
109
- lastMeasuredIndex = itemCount - 1;
110
- }
111
-
112
- if (lastMeasuredIndex >= 0) {
113
- const itemMetadata = itemMetadataMap[lastMeasuredIndex];
114
- totalSizeOfMeasuredItems = itemMetadata.offset + itemMetadata.size;
115
- }
116
-
117
- const numUnmeasuredItems = itemCount - lastMeasuredIndex - 1;
118
- const totalSizeOfUnmeasuredItems = numUnmeasuredItems * estimatedItemSize;
119
-
120
- return totalSizeOfMeasuredItems + totalSizeOfUnmeasuredItems;
121
- };
122
-
123
- const VariableSizeList = createListComponent({
124
- getItemOffset: (props: Props<any>, index: number, instanceProps: InstanceProps): number => getItemMetadata(props, index, instanceProps).offset,
125
-
126
- getItemSize: (props: Props<any>, index: number, instanceProps: InstanceProps): number => instanceProps.itemMetadataMap[index].size,
127
-
128
- getEstimatedTotalSize,
129
-
130
- getOffsetForIndexAndAlignment: (props: Props<any>, index: number, align: ScrollToAlign, scrollOffset: number, instanceProps: InstanceProps): number => {
131
- const { direction, height, layout, width } = props;
132
-
133
- // TODO Deprecate direction "horizontal"
134
- const isHorizontal = direction === 'horizontal' || layout === 'horizontal';
135
- const size = (((isHorizontal ? width : height): any): number);
136
- const itemMetadata = getItemMetadata(props, index, instanceProps);
137
-
138
- // Get estimated total size after ItemMetadata is computed,
139
- // To ensure it reflects actual measurements instead of just estimates.
140
- const estimatedTotalSize = getEstimatedTotalSize(props, instanceProps);
141
-
142
- const maxOffset = Math.max(0, Math.min(estimatedTotalSize - size, itemMetadata.offset));
143
- const minOffset = Math.max(0, itemMetadata.offset - size + itemMetadata.size);
144
-
145
- if (align === 'smart') {
146
- if (scrollOffset >= minOffset - size && scrollOffset <= maxOffset + size) {
147
- align = 'auto';
148
- } else {
149
- align = 'center';
150
- }
151
- }
152
-
153
- switch (align) {
154
- case 'start':
155
- return maxOffset;
156
- case 'end':
157
- return minOffset;
158
- case 'center':
159
- return Math.round(minOffset + (maxOffset - minOffset) / 2);
160
- case 'auto':
161
- default:
162
- if (scrollOffset >= minOffset && scrollOffset <= maxOffset) {
163
- return scrollOffset;
164
- } else if (scrollOffset < minOffset) {
165
- return minOffset;
166
- } else {
167
- return maxOffset;
168
- }
169
- }
170
- },
171
-
172
- getStartIndexForOffset: (props: Props<any>, offset: number, instanceProps: InstanceProps): number => findNearestItem(props, instanceProps, offset),
173
-
174
- getStopIndexForStartIndex: (props: Props<any>, startIndex: number, scrollOffset: number, instanceProps: InstanceProps): number => {
175
- const { direction, height, itemCount, layout, width } = props;
176
-
177
- // TODO Deprecate direction "horizontal"
178
- const isHorizontal = direction === 'horizontal' || layout === 'horizontal';
179
- const size = (((isHorizontal ? width : height): any): number);
180
- const itemMetadata = getItemMetadata(props, startIndex, instanceProps);
181
- const maxOffset = scrollOffset + size;
182
-
183
- let offset = itemMetadata.offset + itemMetadata.size;
184
- let stopIndex = startIndex;
185
-
186
- while (stopIndex < itemCount - 1 && offset < maxOffset) {
187
- stopIndex++;
188
- offset += getItemMetadata(props, stopIndex, instanceProps).size;
189
- }
190
-
191
- return stopIndex;
192
- },
193
-
194
- initInstanceProps(props: Props<any>, instance: any): InstanceProps {
195
- const { estimatedItemSize } = ((props: any): VariableSizeProps);
196
-
197
- const instanceProps = {
198
- itemMetadataMap: {},
199
- estimatedItemSize: estimatedItemSize || DEFAULT_ESTIMATED_ITEM_SIZE,
200
- lastMeasuredIndex: -1,
201
- };
202
-
203
- instance.resetAfterIndex = (index: number, shouldForceUpdate?: boolean = true) => {
204
- instanceProps.lastMeasuredIndex = Math.min(instanceProps.lastMeasuredIndex, index - 1);
205
-
206
- // We could potentially optimize further by only evicting styles after this index,
207
- // But since styles are only cached while scrolling is in progress-
208
- // It seems an unnecessary optimization.
209
- // It's unlikely that resetAfterIndex() will be called while a user is scrolling.
210
- instance._getItemStyleCache(-1);
211
-
212
- if (shouldForceUpdate) {
213
- instance.forceUpdate();
214
- }
215
- };
216
-
217
- return instanceProps;
218
- },
219
-
220
- shouldResetStyleCacheOnItemSizeChange: false,
221
-
222
- validateProps: ({ itemSize }: Props<any>): void => {
223
- if (process.env.NODE_ENV !== 'production') {
224
- if (typeof itemSize !== 'function') {
225
- throw Error('An invalid "itemSize" prop has been specified. ' + 'Value should be a function. ' + `"${itemSize === null ? 'null' : typeof itemSize}" was specified.`);
226
- }
227
- }
228
- },
229
- });
230
-
231
- export default VariableSizeList;
1
+ // @flow
2
+
3
+ import createListComponent from './createListComponent';
4
+
5
+ import type { Props, ScrollToAlign } from './createListComponent';
6
+
7
+ const DEFAULT_ESTIMATED_ITEM_SIZE = 50;
8
+
9
+ type VariableSizeProps = {|
10
+ estimatedItemSize: number,
11
+ ...Props<any>,
12
+ |};
13
+
14
+ type itemSizeGetter = (index: number) => number;
15
+
16
+ type ItemMetadata = {|
17
+ offset: number,
18
+ size: number,
19
+ |};
20
+ type InstanceProps = {|
21
+ itemMetadataMap: { [index: number]: ItemMetadata },
22
+ estimatedItemSize: number,
23
+ lastMeasuredIndex: number,
24
+ |};
25
+
26
+ const getItemMetadata = (props: Props<any>, index: number, instanceProps: InstanceProps): ItemMetadata => {
27
+ const { itemSize } = ((props: any): VariableSizeProps);
28
+ const { itemMetadataMap, lastMeasuredIndex } = instanceProps;
29
+
30
+ if (index > lastMeasuredIndex) {
31
+ let offset = 0;
32
+ if (lastMeasuredIndex >= 0) {
33
+ const itemMetadata = itemMetadataMap[lastMeasuredIndex];
34
+ offset = itemMetadata.offset + itemMetadata.size;
35
+ }
36
+
37
+ for (let i = lastMeasuredIndex + 1; i <= index; i++) {
38
+ let size = ((itemSize: any): itemSizeGetter)(i);
39
+
40
+ itemMetadataMap[i] = {
41
+ offset,
42
+ size,
43
+ };
44
+
45
+ offset += size;
46
+ }
47
+
48
+ instanceProps.lastMeasuredIndex = index;
49
+ }
50
+
51
+ return itemMetadataMap[index];
52
+ };
53
+
54
+ const findNearestItem = (props: Props<any>, instanceProps: InstanceProps, offset: number) => {
55
+ const { itemMetadataMap, lastMeasuredIndex } = instanceProps;
56
+
57
+ const lastMeasuredItemOffset = lastMeasuredIndex > 0 ? itemMetadataMap[lastMeasuredIndex].offset : 0;
58
+
59
+ if (lastMeasuredItemOffset >= offset) {
60
+ // If we've already measured items within this range just use a binary search as it's faster.
61
+ return findNearestItemBinarySearch(props, instanceProps, lastMeasuredIndex, 0, offset);
62
+ } else {
63
+ // If we haven't yet measured this high, fallback to an exponential search with an inner binary search.
64
+ // The exponential search avoids pre-computing sizes for the full set of items as a binary search would.
65
+ // The overall complexity for this approach is O(log n).
66
+ return findNearestItemExponentialSearch(props, instanceProps, Math.max(0, lastMeasuredIndex), offset);
67
+ }
68
+ };
69
+
70
+ const findNearestItemBinarySearch = (props: Props<any>, instanceProps: InstanceProps, high: number, low: number, offset: number): number => {
71
+ while (low <= high) {
72
+ const middle = low + Math.floor((high - low) / 2);
73
+ const currentOffset = getItemMetadata(props, middle, instanceProps).offset;
74
+
75
+ if (currentOffset === offset) {
76
+ return middle;
77
+ } else if (currentOffset < offset) {
78
+ low = middle + 1;
79
+ } else if (currentOffset > offset) {
80
+ high = middle - 1;
81
+ }
82
+ }
83
+
84
+ if (low > 0) {
85
+ return low - 1;
86
+ } else {
87
+ return 0;
88
+ }
89
+ };
90
+
91
+ const findNearestItemExponentialSearch = (props: Props<any>, instanceProps: InstanceProps, index: number, offset: number): number => {
92
+ const { itemCount } = props;
93
+ let interval = 1;
94
+
95
+ while (index < itemCount && getItemMetadata(props, index, instanceProps).offset < offset) {
96
+ index += interval;
97
+ interval *= 2;
98
+ }
99
+
100
+ return findNearestItemBinarySearch(props, instanceProps, Math.min(index, itemCount - 1), Math.floor(index / 2), offset);
101
+ };
102
+
103
+ const getEstimatedTotalSize = ({ itemCount }: Props<any>, { itemMetadataMap, estimatedItemSize, lastMeasuredIndex }: InstanceProps) => {
104
+ let totalSizeOfMeasuredItems = 0;
105
+
106
+ // Edge case check for when the number of items decreases while a scroll is in progress.
107
+ // https://github.com/bvaughn/react-window/pull/138
108
+ if (lastMeasuredIndex >= itemCount) {
109
+ lastMeasuredIndex = itemCount - 1;
110
+ }
111
+
112
+ if (lastMeasuredIndex >= 0) {
113
+ const itemMetadata = itemMetadataMap[lastMeasuredIndex];
114
+ totalSizeOfMeasuredItems = itemMetadata.offset + itemMetadata.size;
115
+ }
116
+
117
+ const numUnmeasuredItems = itemCount - lastMeasuredIndex - 1;
118
+ const totalSizeOfUnmeasuredItems = numUnmeasuredItems * estimatedItemSize;
119
+
120
+ return totalSizeOfMeasuredItems + totalSizeOfUnmeasuredItems;
121
+ };
122
+
123
+ const VariableSizeList = createListComponent({
124
+ getItemOffset: (props: Props<any>, index: number, instanceProps: InstanceProps): number => getItemMetadata(props, index, instanceProps).offset,
125
+
126
+ getItemSize: (props: Props<any>, index: number, instanceProps: InstanceProps): number => instanceProps.itemMetadataMap[index].size,
127
+
128
+ getEstimatedTotalSize,
129
+
130
+ getOffsetForIndexAndAlignment: (props: Props<any>, index: number, align: ScrollToAlign, scrollOffset: number, instanceProps: InstanceProps): number => {
131
+ const { direction, height, layout, width } = props;
132
+
133
+ // TODO Deprecate direction "horizontal"
134
+ const isHorizontal = direction === 'horizontal' || layout === 'horizontal';
135
+ const size = (((isHorizontal ? width : height): any): number);
136
+ const itemMetadata = getItemMetadata(props, index, instanceProps);
137
+
138
+ // Get estimated total size after ItemMetadata is computed,
139
+ // To ensure it reflects actual measurements instead of just estimates.
140
+ const estimatedTotalSize = getEstimatedTotalSize(props, instanceProps);
141
+
142
+ const maxOffset = Math.max(0, Math.min(estimatedTotalSize - size, itemMetadata.offset));
143
+ const minOffset = Math.max(0, itemMetadata.offset - size + itemMetadata.size);
144
+
145
+ if (align === 'smart') {
146
+ if (scrollOffset >= minOffset - size && scrollOffset <= maxOffset + size) {
147
+ align = 'auto';
148
+ } else {
149
+ align = 'center';
150
+ }
151
+ }
152
+
153
+ switch (align) {
154
+ case 'start':
155
+ return maxOffset;
156
+ case 'end':
157
+ return minOffset;
158
+ case 'center':
159
+ return Math.round(minOffset + (maxOffset - minOffset) / 2);
160
+ case 'auto':
161
+ default:
162
+ if (scrollOffset >= minOffset && scrollOffset <= maxOffset) {
163
+ return scrollOffset;
164
+ } else if (scrollOffset < minOffset) {
165
+ return minOffset;
166
+ } else {
167
+ return maxOffset;
168
+ }
169
+ }
170
+ },
171
+
172
+ getStartIndexForOffset: (props: Props<any>, offset: number, instanceProps: InstanceProps): number => findNearestItem(props, instanceProps, offset),
173
+
174
+ getStopIndexForStartIndex: (props: Props<any>, startIndex: number, scrollOffset: number, instanceProps: InstanceProps): number => {
175
+ const { direction, height, itemCount, layout, width } = props;
176
+
177
+ // TODO Deprecate direction "horizontal"
178
+ const isHorizontal = direction === 'horizontal' || layout === 'horizontal';
179
+ const size = (((isHorizontal ? width : height): any): number);
180
+ const itemMetadata = getItemMetadata(props, startIndex, instanceProps);
181
+ const maxOffset = scrollOffset + size;
182
+
183
+ let offset = itemMetadata.offset + itemMetadata.size;
184
+ let stopIndex = startIndex;
185
+
186
+ while (stopIndex < itemCount - 1 && offset < maxOffset) {
187
+ stopIndex++;
188
+ offset += getItemMetadata(props, stopIndex, instanceProps).size;
189
+ }
190
+
191
+ return stopIndex;
192
+ },
193
+
194
+ initInstanceProps(props: Props<any>, instance: any): InstanceProps {
195
+ const { estimatedItemSize } = ((props: any): VariableSizeProps);
196
+
197
+ const instanceProps = {
198
+ itemMetadataMap: {},
199
+ estimatedItemSize: estimatedItemSize || DEFAULT_ESTIMATED_ITEM_SIZE,
200
+ lastMeasuredIndex: -1,
201
+ };
202
+
203
+ instance.resetAfterIndex = (index: number, shouldForceUpdate?: boolean = true) => {
204
+ instanceProps.lastMeasuredIndex = Math.min(instanceProps.lastMeasuredIndex, index - 1);
205
+
206
+ // We could potentially optimize further by only evicting styles after this index,
207
+ // But since styles are only cached while scrolling is in progress-
208
+ // It seems an unnecessary optimization.
209
+ // It's unlikely that resetAfterIndex() will be called while a user is scrolling.
210
+ instance._getItemStyleCache(-1);
211
+
212
+ if (shouldForceUpdate) {
213
+ instance.forceUpdate();
214
+ }
215
+ };
216
+
217
+ return instanceProps;
218
+ },
219
+
220
+ shouldResetStyleCacheOnItemSizeChange: false,
221
+
222
+ validateProps: ({ itemSize }: Props<any>): void => {
223
+ if (process.env.NODE_ENV !== 'production') {
224
+ if (typeof itemSize !== 'function') {
225
+ throw Error('An invalid "itemSize" prop has been specified. ' + 'Value should be a function. ' + `"${itemSize === null ? 'null' : typeof itemSize}" was specified.`);
226
+ }
227
+ }
228
+ },
229
+ });
230
+
231
+ export default VariableSizeList;