vscroll 1.7.0 → 1.8.1

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 (230) hide show
  1. package/dist/bundles/vscroll.esm5.js +518 -368
  2. package/dist/bundles/vscroll.esm5.js.map +1 -1
  3. package/dist/bundles/vscroll.esm5.min.js +2 -2
  4. package/dist/bundles/vscroll.esm5.min.js.map +1 -1
  5. package/dist/bundles/vscroll.esm6.js +408 -260
  6. package/dist/bundles/vscroll.esm6.js.map +1 -1
  7. package/dist/bundles/vscroll.esm6.min.js +2 -2
  8. package/dist/bundles/vscroll.esm6.min.js.map +1 -1
  9. package/dist/bundles/vscroll.umd.js +519 -369
  10. package/dist/bundles/vscroll.umd.js.map +1 -1
  11. package/dist/bundles/vscroll.umd.min.js +2 -2
  12. package/dist/bundles/vscroll.umd.min.js.map +1 -1
  13. package/dist/esm2015/classes/adapter/context.js +2 -1
  14. package/dist/esm2015/classes/adapter/context.js.map +1 -1
  15. package/dist/esm2015/classes/adapter/props.js +2 -2
  16. package/dist/esm2015/classes/adapter/props.js.map +1 -1
  17. package/dist/esm2015/classes/adapter.js +17 -18
  18. package/dist/esm2015/classes/adapter.js.map +1 -1
  19. package/dist/esm2015/classes/buffer/cache.js +11 -8
  20. package/dist/esm2015/classes/buffer/cache.js.map +1 -1
  21. package/dist/esm2015/classes/buffer/checkCall.js +4 -5
  22. package/dist/esm2015/classes/buffer/checkCall.js.map +1 -1
  23. package/dist/esm2015/classes/buffer/defaultSize.js +2 -1
  24. package/dist/esm2015/classes/buffer/defaultSize.js.map +1 -1
  25. package/dist/esm2015/classes/buffer.js +12 -11
  26. package/dist/esm2015/classes/buffer.js.map +1 -1
  27. package/dist/esm2015/classes/datasource.js +16 -3
  28. package/dist/esm2015/classes/datasource.js.map +1 -1
  29. package/dist/esm2015/classes/domRoutines.js +14 -14
  30. package/dist/esm2015/classes/domRoutines.js.map +1 -1
  31. package/dist/esm2015/classes/logger.js +74 -31
  32. package/dist/esm2015/classes/logger.js.map +1 -1
  33. package/dist/esm2015/classes/paddings.js +6 -2
  34. package/dist/esm2015/classes/paddings.js.map +1 -1
  35. package/dist/esm2015/classes/reactive.js.map +1 -1
  36. package/dist/esm2015/classes/settings.js.map +1 -1
  37. package/dist/esm2015/classes/state/clip.js.map +1 -1
  38. package/dist/esm2015/classes/state/fetch.js +4 -2
  39. package/dist/esm2015/classes/state/fetch.js.map +1 -1
  40. package/dist/esm2015/classes/state.js +6 -4
  41. package/dist/esm2015/classes/state.js.map +1 -1
  42. package/dist/esm2015/classes/viewport.js +4 -2
  43. package/dist/esm2015/classes/viewport.js.map +1 -1
  44. package/dist/esm2015/index.js +1 -1
  45. package/dist/esm2015/index.js.map +1 -1
  46. package/dist/esm2015/inputs/adapter.js +44 -24
  47. package/dist/esm2015/inputs/adapter.js.map +1 -1
  48. package/dist/esm2015/inputs/datasource.js.map +1 -1
  49. package/dist/esm2015/inputs/index.js +1 -1
  50. package/dist/esm2015/inputs/index.js.map +1 -1
  51. package/dist/esm2015/inputs/settings.js +8 -3
  52. package/dist/esm2015/inputs/settings.js.map +1 -1
  53. package/dist/esm2015/inputs/validation.js +8 -14
  54. package/dist/esm2015/inputs/validation.js.map +1 -1
  55. package/dist/esm2015/inputs/workflow.js.map +1 -1
  56. package/dist/esm2015/interfaces/datasource.js.map +1 -1
  57. package/dist/esm2015/interfaces/index.js.map +1 -1
  58. package/dist/esm2015/interfaces/process.js.map +1 -1
  59. package/dist/esm2015/interfaces/routines.js.map +1 -1
  60. package/dist/esm2015/interfaces/settings.js.map +1 -1
  61. package/dist/esm2015/interfaces/validation.js.map +1 -1
  62. package/dist/esm2015/interfaces/workflow.js.map +1 -1
  63. package/dist/esm2015/processes/adapter/append.js +2 -1
  64. package/dist/esm2015/processes/adapter/append.js.map +1 -1
  65. package/dist/esm2015/processes/adapter/check.js +2 -1
  66. package/dist/esm2015/processes/adapter/check.js.map +1 -1
  67. package/dist/esm2015/processes/adapter/clip.js.map +1 -1
  68. package/dist/esm2015/processes/adapter/fix.js +4 -2
  69. package/dist/esm2015/processes/adapter/fix.js.map +1 -1
  70. package/dist/esm2015/processes/adapter/insert.js +4 -3
  71. package/dist/esm2015/processes/adapter/insert.js.map +1 -1
  72. package/dist/esm2015/processes/adapter/pause.js.map +1 -1
  73. package/dist/esm2015/processes/adapter/reload.js.map +1 -1
  74. package/dist/esm2015/processes/adapter/remove.js +8 -5
  75. package/dist/esm2015/processes/adapter/remove.js.map +1 -1
  76. package/dist/esm2015/processes/adapter/replace.js +1 -1
  77. package/dist/esm2015/processes/adapter/replace.js.map +1 -1
  78. package/dist/esm2015/processes/adapter/reset.js +5 -5
  79. package/dist/esm2015/processes/adapter/reset.js.map +1 -1
  80. package/dist/esm2015/processes/adapter/update.js +4 -3
  81. package/dist/esm2015/processes/adapter/update.js.map +1 -1
  82. package/dist/esm2015/processes/adjust.js +15 -10
  83. package/dist/esm2015/processes/adjust.js.map +1 -1
  84. package/dist/esm2015/processes/clip.js +4 -4
  85. package/dist/esm2015/processes/clip.js.map +1 -1
  86. package/dist/esm2015/processes/end.js +2 -1
  87. package/dist/esm2015/processes/end.js.map +1 -1
  88. package/dist/esm2015/processes/fetch.js +6 -4
  89. package/dist/esm2015/processes/fetch.js.map +1 -1
  90. package/dist/esm2015/processes/index.js +1 -1
  91. package/dist/esm2015/processes/index.js.map +1 -1
  92. package/dist/esm2015/processes/init.js.map +1 -1
  93. package/dist/esm2015/processes/misc/base.js +1 -2
  94. package/dist/esm2015/processes/misc/base.js.map +1 -1
  95. package/dist/esm2015/processes/misc/enums.js.map +1 -1
  96. package/dist/esm2015/processes/postFetch.js +13 -12
  97. package/dist/esm2015/processes/postFetch.js.map +1 -1
  98. package/dist/esm2015/processes/preClip.js +6 -5
  99. package/dist/esm2015/processes/preClip.js.map +1 -1
  100. package/dist/esm2015/processes/preFetch.js +28 -15
  101. package/dist/esm2015/processes/preFetch.js.map +1 -1
  102. package/dist/esm2015/processes/render.js +6 -4
  103. package/dist/esm2015/processes/render.js.map +1 -1
  104. package/dist/esm2015/processes/scroll.js +19 -10
  105. package/dist/esm2015/processes/scroll.js.map +1 -1
  106. package/dist/esm2015/processes/start.js.map +1 -1
  107. package/dist/esm2015/scroller.js +14 -9
  108. package/dist/esm2015/scroller.js.map +1 -1
  109. package/dist/esm2015/version.js +1 -1
  110. package/dist/esm2015/version.js.map +1 -1
  111. package/dist/esm2015/workflow-transducer.js +3 -2
  112. package/dist/esm2015/workflow-transducer.js.map +1 -1
  113. package/dist/esm2015/workflow.js +28 -17
  114. package/dist/esm2015/workflow.js.map +1 -1
  115. package/dist/esm5/classes/adapter/context.js +2 -1
  116. package/dist/esm5/classes/adapter/context.js.map +1 -1
  117. package/dist/esm5/classes/adapter/props.js +2 -2
  118. package/dist/esm5/classes/adapter/props.js.map +1 -1
  119. package/dist/esm5/classes/adapter.js +22 -19
  120. package/dist/esm5/classes/adapter.js.map +1 -1
  121. package/dist/esm5/classes/buffer/cache.js +11 -9
  122. package/dist/esm5/classes/buffer/cache.js.map +1 -1
  123. package/dist/esm5/classes/buffer/checkCall.js +4 -7
  124. package/dist/esm5/classes/buffer/checkCall.js.map +1 -1
  125. package/dist/esm5/classes/buffer/defaultSize.js +2 -1
  126. package/dist/esm5/classes/buffer/defaultSize.js.map +1 -1
  127. package/dist/esm5/classes/buffer.js +15 -14
  128. package/dist/esm5/classes/buffer.js.map +1 -1
  129. package/dist/esm5/classes/datasource.js +20 -3
  130. package/dist/esm5/classes/datasource.js.map +1 -1
  131. package/dist/esm5/classes/domRoutines.js +14 -14
  132. package/dist/esm5/classes/domRoutines.js.map +1 -1
  133. package/dist/esm5/classes/logger.js +75 -34
  134. package/dist/esm5/classes/logger.js.map +1 -1
  135. package/dist/esm5/classes/paddings.js +6 -2
  136. package/dist/esm5/classes/paddings.js.map +1 -1
  137. package/dist/esm5/classes/reactive.js.map +1 -1
  138. package/dist/esm5/classes/settings.js.map +1 -1
  139. package/dist/esm5/classes/state/clip.js.map +1 -1
  140. package/dist/esm5/classes/state/fetch.js +4 -2
  141. package/dist/esm5/classes/state/fetch.js.map +1 -1
  142. package/dist/esm5/classes/state.js +6 -4
  143. package/dist/esm5/classes/state.js.map +1 -1
  144. package/dist/esm5/classes/viewport.js +3 -2
  145. package/dist/esm5/classes/viewport.js.map +1 -1
  146. package/dist/esm5/index.js +1 -1
  147. package/dist/esm5/index.js.map +1 -1
  148. package/dist/esm5/inputs/adapter.js +32 -12
  149. package/dist/esm5/inputs/adapter.js.map +1 -1
  150. package/dist/esm5/inputs/datasource.js.map +1 -1
  151. package/dist/esm5/inputs/index.js +1 -1
  152. package/dist/esm5/inputs/index.js.map +1 -1
  153. package/dist/esm5/inputs/settings.js +5 -0
  154. package/dist/esm5/inputs/settings.js.map +1 -1
  155. package/dist/esm5/inputs/validation.js +99 -93
  156. package/dist/esm5/inputs/validation.js.map +1 -1
  157. package/dist/esm5/inputs/workflow.js.map +1 -1
  158. package/dist/esm5/interfaces/datasource.js.map +1 -1
  159. package/dist/esm5/interfaces/index.js.map +1 -1
  160. package/dist/esm5/interfaces/process.js.map +1 -1
  161. package/dist/esm5/interfaces/routines.js.map +1 -1
  162. package/dist/esm5/interfaces/settings.js.map +1 -1
  163. package/dist/esm5/interfaces/validation.js.map +1 -1
  164. package/dist/esm5/interfaces/workflow.js.map +1 -1
  165. package/dist/esm5/processes/adapter/append.js +2 -1
  166. package/dist/esm5/processes/adapter/append.js.map +1 -1
  167. package/dist/esm5/processes/adapter/check.js +7 -6
  168. package/dist/esm5/processes/adapter/check.js.map +1 -1
  169. package/dist/esm5/processes/adapter/clip.js.map +1 -1
  170. package/dist/esm5/processes/adapter/fix.js +4 -2
  171. package/dist/esm5/processes/adapter/fix.js.map +1 -1
  172. package/dist/esm5/processes/adapter/insert.js +4 -3
  173. package/dist/esm5/processes/adapter/insert.js.map +1 -1
  174. package/dist/esm5/processes/adapter/pause.js.map +1 -1
  175. package/dist/esm5/processes/adapter/reload.js.map +1 -1
  176. package/dist/esm5/processes/adapter/remove.js +11 -10
  177. package/dist/esm5/processes/adapter/remove.js.map +1 -1
  178. package/dist/esm5/processes/adapter/replace.js +1 -1
  179. package/dist/esm5/processes/adapter/replace.js.map +1 -1
  180. package/dist/esm5/processes/adapter/reset.js +5 -5
  181. package/dist/esm5/processes/adapter/reset.js.map +1 -1
  182. package/dist/esm5/processes/adapter/update.js +20 -15
  183. package/dist/esm5/processes/adapter/update.js.map +1 -1
  184. package/dist/esm5/processes/adjust.js +16 -11
  185. package/dist/esm5/processes/adjust.js.map +1 -1
  186. package/dist/esm5/processes/clip.js +4 -4
  187. package/dist/esm5/processes/clip.js.map +1 -1
  188. package/dist/esm5/processes/end.js +2 -1
  189. package/dist/esm5/processes/end.js.map +1 -1
  190. package/dist/esm5/processes/fetch.js +5 -3
  191. package/dist/esm5/processes/fetch.js.map +1 -1
  192. package/dist/esm5/processes/index.js +1 -1
  193. package/dist/esm5/processes/index.js.map +1 -1
  194. package/dist/esm5/processes/init.js.map +1 -1
  195. package/dist/esm5/processes/misc/base.js +1 -2
  196. package/dist/esm5/processes/misc/base.js.map +1 -1
  197. package/dist/esm5/processes/misc/enums.js.map +1 -1
  198. package/dist/esm5/processes/postFetch.js +14 -15
  199. package/dist/esm5/processes/postFetch.js.map +1 -1
  200. package/dist/esm5/processes/preClip.js +5 -4
  201. package/dist/esm5/processes/preClip.js.map +1 -1
  202. package/dist/esm5/processes/preFetch.js +26 -14
  203. package/dist/esm5/processes/preFetch.js.map +1 -1
  204. package/dist/esm5/processes/render.js +7 -7
  205. package/dist/esm5/processes/render.js.map +1 -1
  206. package/dist/esm5/processes/scroll.js +18 -12
  207. package/dist/esm5/processes/scroll.js.map +1 -1
  208. package/dist/esm5/processes/start.js.map +1 -1
  209. package/dist/esm5/scroller.js +11 -7
  210. package/dist/esm5/scroller.js.map +1 -1
  211. package/dist/esm5/version.js +1 -1
  212. package/dist/esm5/version.js.map +1 -1
  213. package/dist/esm5/workflow-transducer.js +3 -2
  214. package/dist/esm5/workflow-transducer.js.map +1 -1
  215. package/dist/esm5/workflow.js +31 -25
  216. package/dist/esm5/workflow.js.map +1 -1
  217. package/dist/typings/classes/buffer/cache.d.ts +0 -1
  218. package/dist/typings/classes/datasource.d.ts +1 -1
  219. package/dist/typings/classes/domRoutines.d.ts +1 -1
  220. package/dist/typings/classes/logger.d.ts +4 -0
  221. package/dist/typings/classes/settings.d.ts +7 -0
  222. package/dist/typings/index.d.ts +3 -3
  223. package/dist/typings/inputs/index.d.ts +1 -1
  224. package/dist/typings/inputs/settings.d.ts +1 -0
  225. package/dist/typings/interfaces/index.d.ts +10 -10
  226. package/dist/typings/interfaces/settings.d.ts +1 -0
  227. package/dist/typings/processes/index.d.ts +1 -1
  228. package/dist/typings/processes/scroll.d.ts +1 -1
  229. package/dist/typings/workflow.d.ts +1 -0
  230. package/package.json +23 -22
@@ -1,6 +1,6 @@
1
1
  /**
2
2
  * vscroll (https://github.com/dhilt/vscroll) FESM2015
3
- * Version: 1.7.0 (2025-07-26T12:39:18.794Z)
3
+ * Version: 1.8.1 (2026-02-07T22:49:10.471Z)
4
4
  * Author: Denis Hilt
5
5
  * License: MIT
6
6
  */
@@ -139,7 +139,7 @@ const bufferInfoDefault = {
139
139
  maxIndex: NaN,
140
140
  absMinIndex: -Infinity,
141
141
  absMaxIndex: +Infinity,
142
- defaultSize: NaN,
142
+ defaultSize: NaN
143
143
  };
144
144
  const EMPTY_ITEM = {
145
145
  data: {},
@@ -308,7 +308,7 @@ const getDefaultAdapterProps = () => [
308
308
  {
309
309
  type: Type.Function,
310
310
  name: Name.relax,
311
- value: noop
311
+ value: noopWF
312
312
  },
313
313
  {
314
314
  type: Type.Function,
@@ -362,7 +362,7 @@ const reactiveConfigStorage = new Map();
362
362
 
363
363
  var core = {
364
364
  name: 'vscroll',
365
- version: '1.7.0'
365
+ version: '1.8.1'
366
366
  };
367
367
 
368
368
  const getBox = (id) => {
@@ -428,12 +428,25 @@ class AdapterContext {
428
428
  return value;
429
429
  } }, conf));
430
430
  });
431
- if (reactive) { // save both configured and default reactive props in the store
431
+ if (reactive) {
432
+ // save both configured and default reactive props in the store
432
433
  reactiveConfigStorage.set(id, reactivePropsStore);
433
434
  }
434
435
  }
435
436
  }
436
437
 
438
+ const getDefaultAdapterConfig = () => {
439
+ const reactive = getDefaultAdapterProps()
440
+ .filter(({ type }) => type === AdapterPropType.Reactive)
441
+ .reduce((acc, { name, value }) => {
442
+ acc[name] = {
443
+ source: value,
444
+ emit: (source, val) => source.set(val)
445
+ };
446
+ return acc;
447
+ }, {});
448
+ return { mock: false, reactive };
449
+ };
437
450
  class DatasourceGeneric {
438
451
  constructor(datasource, config) {
439
452
  this.get = datasource.get;
@@ -442,14 +455,15 @@ class DatasourceGeneric {
442
455
  const adapterContext = new AdapterContext(config || { mock: false });
443
456
  this.adapter = adapterContext;
444
457
  }
458
+ // todo: should it be published?
445
459
  dispose() {
446
460
  reactiveConfigStorage.delete(this.adapter.id);
447
461
  wantedStorage.delete(this.adapter.id);
448
462
  }
449
463
  }
450
- const makeDatasource = (getConfig) => class extends DatasourceGeneric {
464
+ const makeDatasource = (getAdapterConfig) => class extends DatasourceGeneric {
451
465
  constructor(datasource) {
452
- const config = typeof getConfig === 'function' ? getConfig() : void 0;
466
+ const config = typeof getAdapterConfig === 'function' ? getAdapterConfig() : getDefaultAdapterConfig();
453
467
  super(datasource, config);
454
468
  }
455
469
  };
@@ -487,9 +501,7 @@ var ValidatorType;
487
501
  ValidatorType["enum"] = "must belong to {arg1} list";
488
502
  })(ValidatorType || (ValidatorType = {}));
489
503
  const getError = (msg, args) => (args || ['']).reduce((acc, arg, index) => acc.replace(`{arg${index + 1}}`, arg), msg);
490
- const getNumber = (value) => typeof value === 'number' || (typeof value === 'string' && value !== '')
491
- ? Number(value)
492
- : NaN;
504
+ const getNumber = (value) => typeof value === 'number' || (typeof value === 'string' && value !== '') ? Number(value) : NaN;
493
505
  const onNumber = (value) => {
494
506
  const parsedValue = getNumber(value);
495
507
  const errors = [];
@@ -670,7 +682,9 @@ const onOr = (validators) => (value) => {
670
682
  };
671
683
  const onEnum = (list) => (value) => {
672
684
  const errors = [];
673
- const values = Object.keys(list).filter(k => isNaN(Number(k))).map(k => list[k]);
685
+ const values = Object.keys(list)
686
+ .filter(k => isNaN(Number(k)))
687
+ .map(k => list[k]);
674
688
  if (!values.some(item => item === value)) {
675
689
  errors.push(getError(ValidatorType.enum, ['[' + values.join(',') + ']']));
676
690
  }
@@ -761,9 +775,7 @@ class ValidatedData {
761
775
  this.context = context;
762
776
  }
763
777
  setValidity() {
764
- this.errors = Object.keys(this.params).reduce((acc, key) => [
765
- ...acc, ...this.params[key].errors
766
- ], []);
778
+ this.errors = Object.keys(this.params).reduce((acc, key) => [...acc, ...this.params[key].errors], []);
767
779
  this.isValid = !this.errors.length;
768
780
  }
769
781
  setCommonError(error) {
@@ -781,9 +793,7 @@ class ValidatedData {
781
793
  this.setValidity();
782
794
  }
783
795
  showErrors() {
784
- return this.errors.length
785
- ? 'validation failed: ' + this.errors.join(', ')
786
- : '';
796
+ return this.errors.length ? 'validation failed: ' + this.errors.join(', ') : '';
787
797
  }
788
798
  }
789
799
  const runValidator = (current, validator, context) => {
@@ -801,7 +811,7 @@ const getDefault = (value, prop) => {
801
811
  const empty = value === void 0;
802
812
  const auto = !prop.mandatory && prop.defaultValue !== void 0;
803
813
  return {
804
- value: !empty ? value : (auto ? prop.defaultValue : void 0),
814
+ value: !empty ? value : auto ? prop.defaultValue : void 0,
805
815
  isSet: !empty || auto,
806
816
  isValid: !empty || !prop.mandatory,
807
817
  errors: []
@@ -833,9 +843,7 @@ const validateOne = (context, name, prop) => {
833
843
  };
834
844
  const validate = (context, params) => {
835
845
  const data = new ValidatedData(context);
836
- Object.entries(params).forEach(([key, prop]) => data.setParam(key, data.isValidContext
837
- ? validateOne(data.context, key, prop)
838
- : getDefault(void 0, prop)));
846
+ Object.entries(params).forEach(([key, prop]) => data.setParam(key, data.isValidContext ? validateOne(data.context, key, prop) : getDefault(void 0, prop)));
839
847
  return data;
840
848
  };
841
849
 
@@ -883,6 +891,7 @@ var DevSettings;
883
891
  DevSettings["immediateLog"] = "immediateLog";
884
892
  DevSettings["logProcessRun"] = "logProcessRun";
885
893
  DevSettings["logTime"] = "logTime";
894
+ DevSettings["logColor"] = "logColor";
886
895
  DevSettings["throttle"] = "throttle";
887
896
  DevSettings["initDelay"] = "initDelay";
888
897
  DevSettings["initWindowDelay"] = "initWindowDelay";
@@ -897,7 +906,7 @@ const MIN = {
897
906
  [Settings$1.padding]: 0.01,
898
907
  [DevSettings.throttle]: 0,
899
908
  [DevSettings.initDelay]: 0,
900
- [DevSettings.initWindowDelay]: 0,
909
+ [DevSettings.initWindowDelay]: 0
901
910
  };
902
911
  const SETTINGS = {
903
912
  [Settings$1.adapter]: {
@@ -955,7 +964,7 @@ const SETTINGS = {
955
964
  [Settings$1.sizeStrategy]: {
956
965
  validators: [ENUM(SizeStrategy)],
957
966
  defaultValue: SizeStrategy.Average
958
- },
967
+ }
959
968
  };
960
969
  const DEV_SETTINGS = {
961
970
  [DevSettings.debug]: {
@@ -974,6 +983,10 @@ const DEV_SETTINGS = {
974
983
  validators: [BOOLEAN$1],
975
984
  defaultValue: false
976
985
  },
986
+ [DevSettings.logColor]: {
987
+ validators: [BOOLEAN$1],
988
+ defaultValue: true
989
+ },
977
990
  [DevSettings.throttle]: {
978
991
  validators: [INTEGER$1, MORE_OR_EQUAL(MIN[DevSettings.throttle], true)],
979
992
  defaultValue: 40
@@ -1001,7 +1014,7 @@ const DEV_SETTINGS = {
1001
1014
  [DevSettings.directionPriority]: {
1002
1015
  validators: [ENUM(Direction)],
1003
1016
  defaultValue: Direction.backward
1004
- },
1017
+ }
1005
1018
  };
1006
1019
 
1007
1020
  var CommonProcess;
@@ -1041,7 +1054,7 @@ var ProcessStatus;
1041
1054
  ProcessStatus["error"] = "error";
1042
1055
  })(ProcessStatus || (ProcessStatus = {}));
1043
1056
 
1044
- const { INTEGER, INTEGER_UNLIMITED, BOOLEAN, OBJECT: OBJECT$1, ITEM_LIST, FUNC_WITH_X_ARGUMENTS: FUNC_WITH_X_ARGUMENTS$1, FUNC_WITH_X_AND_MORE_ARGUMENTS, FUNC_WITH_X_TO_Y_ARGUMENTS, ONE_OF_MUST, ONE_OF_CAN, OR, } = VALIDATORS;
1057
+ const { INTEGER, INTEGER_UNLIMITED, BOOLEAN, OBJECT: OBJECT$1, ITEM_LIST, FUNC_WITH_X_ARGUMENTS: FUNC_WITH_X_ARGUMENTS$1, FUNC_WITH_X_AND_MORE_ARGUMENTS, FUNC_WITH_X_TO_Y_ARGUMENTS, ONE_OF_MUST, ONE_OF_CAN, OR } = VALIDATORS;
1045
1058
  var AdapterNoParams;
1046
1059
  (function (AdapterNoParams) {
1047
1060
  })(AdapterNoParams || (AdapterNoParams = {}));
@@ -1055,7 +1068,7 @@ const RESET_METHOD_PARAMS = {
1055
1068
  },
1056
1069
  [DatasourceProps.devSettings]: {
1057
1070
  validators: [OBJECT$1]
1058
- },
1071
+ }
1059
1072
  };
1060
1073
  var AdapterReloadParams;
1061
1074
  (function (AdapterReloadParams) {
@@ -1064,7 +1077,7 @@ var AdapterReloadParams;
1064
1077
  const RELOAD_METHOD_PARAMS = {
1065
1078
  [AdapterReloadParams.reloadIndex]: {
1066
1079
  validators: [INTEGER]
1067
- },
1080
+ }
1068
1081
  };
1069
1082
  var AdapterPrependParams;
1070
1083
  (function (AdapterPrependParams) {
@@ -1089,7 +1102,7 @@ const PREPEND_METHOD_PARAMS = {
1089
1102
  [AdapterPrependParams.virtualize]: {
1090
1103
  validators: [BOOLEAN, ONE_OF_CAN([AdapterPrependParams.bof])],
1091
1104
  defaultValue: false
1092
- },
1105
+ }
1093
1106
  };
1094
1107
  var AdapterAppendParams;
1095
1108
  (function (AdapterAppendParams) {
@@ -1114,7 +1127,7 @@ const APPEND_METHOD_PARAMS = {
1114
1127
  [AdapterPrependParams.virtualize]: {
1115
1128
  validators: [BOOLEAN, ONE_OF_CAN([AdapterAppendParams.eof])],
1116
1129
  defaultValue: false
1117
- },
1130
+ }
1118
1131
  };
1119
1132
  var AdapterRemoveParams;
1120
1133
  (function (AdapterRemoveParams) {
@@ -1132,7 +1145,7 @@ const REMOVE_METHOD_PARAMS = {
1132
1145
  [AdapterRemoveParams.increase]: {
1133
1146
  validators: [BOOLEAN],
1134
1147
  defaultValue: false
1135
- },
1148
+ }
1136
1149
  };
1137
1150
  var AdapterClipParams;
1138
1151
  (function (AdapterClipParams) {
@@ -1147,7 +1160,7 @@ const CLIP_METHOD_PARAMS = {
1147
1160
  [AdapterClipParams.forwardOnly]: {
1148
1161
  validators: [BOOLEAN, ONE_OF_CAN([AdapterClipParams.backwardOnly])],
1149
1162
  defaultValue: false
1150
- },
1163
+ }
1151
1164
  };
1152
1165
  var AdapterInsertParams;
1153
1166
  (function (AdapterInsertParams) {
@@ -1164,29 +1177,49 @@ const INSERT_METHOD_PARAMS = {
1164
1177
  mandatory: true
1165
1178
  },
1166
1179
  [AdapterInsertParams.before]: {
1167
- validators: [FUNC_WITH_X_ARGUMENTS$1(1), ONE_OF_MUST([
1168
- AdapterInsertParams.after, AdapterInsertParams.beforeIndex, AdapterInsertParams.afterIndex
1169
- ])]
1180
+ validators: [
1181
+ FUNC_WITH_X_ARGUMENTS$1(1),
1182
+ ONE_OF_MUST([
1183
+ AdapterInsertParams.after,
1184
+ AdapterInsertParams.beforeIndex,
1185
+ AdapterInsertParams.afterIndex
1186
+ ])
1187
+ ]
1170
1188
  },
1171
1189
  [AdapterInsertParams.after]: {
1172
- validators: [FUNC_WITH_X_ARGUMENTS$1(1), ONE_OF_MUST([
1173
- AdapterInsertParams.before, AdapterInsertParams.beforeIndex, AdapterInsertParams.afterIndex
1174
- ])]
1190
+ validators: [
1191
+ FUNC_WITH_X_ARGUMENTS$1(1),
1192
+ ONE_OF_MUST([
1193
+ AdapterInsertParams.before,
1194
+ AdapterInsertParams.beforeIndex,
1195
+ AdapterInsertParams.afterIndex
1196
+ ])
1197
+ ]
1175
1198
  },
1176
1199
  [AdapterInsertParams.beforeIndex]: {
1177
- validators: [INTEGER, ONE_OF_MUST([
1178
- AdapterInsertParams.before, AdapterInsertParams.after, AdapterInsertParams.afterIndex
1179
- ])]
1200
+ validators: [
1201
+ INTEGER,
1202
+ ONE_OF_MUST([
1203
+ AdapterInsertParams.before,
1204
+ AdapterInsertParams.after,
1205
+ AdapterInsertParams.afterIndex
1206
+ ])
1207
+ ]
1180
1208
  },
1181
1209
  [AdapterInsertParams.afterIndex]: {
1182
- validators: [INTEGER, ONE_OF_MUST([
1183
- AdapterInsertParams.before, AdapterInsertParams.after, AdapterInsertParams.beforeIndex
1184
- ])]
1210
+ validators: [
1211
+ INTEGER,
1212
+ ONE_OF_MUST([
1213
+ AdapterInsertParams.before,
1214
+ AdapterInsertParams.after,
1215
+ AdapterInsertParams.beforeIndex
1216
+ ])
1217
+ ]
1185
1218
  },
1186
1219
  [AdapterInsertParams.decrease]: {
1187
1220
  validators: [BOOLEAN],
1188
1221
  defaultValue: false
1189
- },
1222
+ }
1190
1223
  };
1191
1224
  var AdapterReplaceParams;
1192
1225
  (function (AdapterReplaceParams) {
@@ -1221,7 +1254,7 @@ const UPDATE_METHOD_PARAMS = {
1221
1254
  [AdapterUpdateParams.fixRight]: {
1222
1255
  validators: [BOOLEAN],
1223
1256
  defaultValue: false
1224
- },
1257
+ }
1225
1258
  };
1226
1259
  var AdapterFixParams;
1227
1260
  (function (AdapterFixParams) {
@@ -1250,7 +1283,7 @@ const FIX_METHOD_PARAMS = {
1250
1283
  },
1251
1284
  [AdapterFixParams.scrollToItemOpt]: {
1252
1285
  validators: [OR([BOOLEAN, OBJECT$1])]
1253
- },
1286
+ }
1254
1287
  };
1255
1288
  const AdapterMethods = {
1256
1289
  [AdapterProcess.reset]: DatasourceProps,
@@ -1264,7 +1297,7 @@ const AdapterMethods = {
1264
1297
  [AdapterProcess.replace]: AdapterReplaceParams,
1265
1298
  [AdapterProcess.update]: AdapterUpdateParams,
1266
1299
  [AdapterProcess.pause]: AdapterNoParams,
1267
- [AdapterProcess.fix]: AdapterFixParams,
1300
+ [AdapterProcess.fix]: AdapterFixParams
1268
1301
  };
1269
1302
  const ADAPTER_METHODS = {
1270
1303
  [AdapterProcess.reset]: RESET_METHOD_PARAMS,
@@ -1278,7 +1311,7 @@ const ADAPTER_METHODS = {
1278
1311
  [AdapterProcess.replace]: REPLACE_METHOD_PARAMS,
1279
1312
  [AdapterProcess.update]: UPDATE_METHOD_PARAMS,
1280
1313
  [AdapterProcess.pause]: NO_METHOD_PARAMS,
1281
- [AdapterProcess.fix]: FIX_METHOD_PARAMS,
1314
+ [AdapterProcess.fix]: FIX_METHOD_PARAMS
1282
1315
  };
1283
1316
 
1284
1317
  const { ELEMENT, OBJECT, FUNC, FUNC_WITH_X_ARGUMENTS } = VALIDATORS;
@@ -1360,8 +1393,7 @@ const BaseAdapterProcessFactory = (process) => { var _a; return _a = class BaseA
1360
1393
  data: validate(options, ADAPTER_METHODS[_process || process])
1361
1394
  };
1362
1395
  if (result.data.isValid) {
1363
- result.params = Object.entries(result.data.params)
1364
- .reduce((acc, [key, { value }]) => (Object.assign(Object.assign({}, acc), { [key]: value })), {});
1396
+ result.params = Object.entries(result.data.params).reduce((acc, [key, { value }]) => (Object.assign(Object.assign({}, acc), { [key]: value })), {});
1365
1397
  }
1366
1398
  else {
1367
1399
  scroller.logger.log(() => result.data.showErrors());
@@ -1394,8 +1426,7 @@ class Init extends BaseProcessFactory(CommonProcess.init) {
1394
1426
  }
1395
1427
 
1396
1428
  class Scroll extends BaseProcessFactory(CommonProcess.scroll) {
1397
- // eslint-disable-next-line @typescript-eslint/no-unused-vars
1398
- static run(scroller, payload) {
1429
+ static run(scroller, _payload) {
1399
1430
  const { workflow, viewport } = scroller;
1400
1431
  const position = viewport.scrollPosition;
1401
1432
  if (Scroll.onSynthetic(scroller, position)) {
@@ -1412,28 +1443,34 @@ class Scroll extends BaseProcessFactory(CommonProcess.scroll) {
1412
1443
  }
1413
1444
  if (!scroll.syntheticFulfill || synthPos === position) {
1414
1445
  scroller.logger.log(() => [
1415
- 'skipping scroll', position, `[${scroll.syntheticFulfill ? '' : 'pre-'}synthetic]`
1446
+ 'skipping scroll',
1447
+ position,
1448
+ `[${scroll.syntheticFulfill ? '' : 'pre-'}synthetic]`
1416
1449
  ]);
1417
1450
  return true;
1418
1451
  }
1419
1452
  scroller.logger.log(() => [
1420
- 'synthetic scroll has been fulfilled:', position, position < synthPos ? '<' : '>', synthPos
1453
+ 'synthetic scroll has been fulfilled:',
1454
+ position,
1455
+ position < synthPos ? '<' : '>',
1456
+ synthPos
1421
1457
  ]);
1422
1458
  }
1423
1459
  return false;
1424
1460
  }
1425
1461
  static onThrottle(scroller, position, done) {
1426
- const { state: { scroll }, settings: { throttle }, logger } = scroller;
1462
+ const { state, settings, logger } = scroller;
1463
+ const { scroll } = state;
1427
1464
  scroll.current = Scroll.getScrollEvent(position, scroll.previous);
1428
1465
  const { direction, time } = scroll.current;
1429
1466
  const timeDiff = scroll.previous ? time - scroll.previous.time : Infinity;
1430
- const delta = throttle - timeDiff;
1467
+ const delta = settings.throttle - timeDiff;
1431
1468
  const shouldDelay = isFinite(delta) && delta > 0;
1432
1469
  const alreadyDelayed = !!scroll.scrollTimer;
1433
1470
  logger.log(() => [
1434
1471
  direction === Direction.backward ? '\u2934' : '\u2935',
1435
1472
  position,
1436
- shouldDelay ? (timeDiff + 'ms') : '0ms',
1473
+ shouldDelay ? timeDiff + 'ms' : '0ms',
1437
1474
  shouldDelay ? (alreadyDelayed ? 'delayed' : `/ ${delta}ms delay`) : ''
1438
1475
  ]);
1439
1476
  if (!shouldDelay) {
@@ -1451,7 +1488,7 @@ class Scroll extends BaseProcessFactory(CommonProcess.scroll) {
1451
1488
  return [
1452
1489
  curr.direction === Direction.backward ? '\u2934' : '\u2935',
1453
1490
  curr.position,
1454
- (curr.time - time) + 'ms',
1491
+ curr.time - time + 'ms',
1455
1492
  'triggered by timer set on',
1456
1493
  position
1457
1494
  ];
@@ -1475,11 +1512,15 @@ class Scroll extends BaseProcessFactory(CommonProcess.scroll) {
1475
1512
  return { position, direction, time };
1476
1513
  }
1477
1514
  static onScroll(scroller, workflow) {
1478
- const { state: { scroll, cycle } } = scroller;
1515
+ const { scroll, cycle } = scroller.state;
1479
1516
  scroll.previous = Object.assign({}, scroll.current);
1480
1517
  scroll.current = null;
1481
1518
  if (cycle.busy.get()) {
1482
- scroller.logger.log(() => ['skipping scroll', scroll.previous.position, '[pending]']);
1519
+ scroller.logger.log(() => [
1520
+ 'skipping scroll',
1521
+ scroll.previous.position,
1522
+ '[pending]'
1523
+ ]);
1483
1524
  return;
1484
1525
  }
1485
1526
  workflow.call({
@@ -1491,7 +1532,7 @@ class Scroll extends BaseProcessFactory(CommonProcess.scroll) {
1491
1532
 
1492
1533
  class Reset extends BaseAdapterProcessFactory(AdapterProcess.reset) {
1493
1534
  static run(scroller, options) {
1494
- const { datasource, buffer, viewport: { paddings }, state: { cycle } } = scroller;
1535
+ const { datasource, buffer, viewport, state } = scroller;
1495
1536
  if (options) {
1496
1537
  const { data } = Reset.parseInput(scroller, options);
1497
1538
  if (!data.isValid) {
@@ -1507,12 +1548,12 @@ class Reset extends BaseAdapterProcessFactory(AdapterProcess.reset) {
1507
1548
  });
1508
1549
  }
1509
1550
  buffer.reset(true);
1510
- paddings.backward.reset();
1511
- paddings.forward.reset();
1551
+ viewport.paddings.backward.reset();
1552
+ viewport.paddings.forward.reset();
1512
1553
  const payload = { datasource };
1513
- if (cycle.busy.get()) {
1554
+ if (state.cycle.busy.get()) {
1514
1555
  payload.finalize = true;
1515
- cycle.interrupter = Reset.process;
1556
+ state.cycle.interrupter = Reset.process;
1516
1557
  }
1517
1558
  scroller.workflow.call({
1518
1559
  process: Reset.process,
@@ -1616,7 +1657,7 @@ class Update extends BaseAdapterProcessFactory(AdapterProcess.update) {
1616
1657
  });
1617
1658
  }
1618
1659
  static doUpdate(scroller, params) {
1619
- const { buffer, viewport, state: { fetch }, routines, logger } = scroller;
1660
+ const { buffer, viewport, state, routines, logger } = scroller;
1620
1661
  if (!buffer.items) {
1621
1662
  logger.log(() => 'no items in Buffer');
1622
1663
  return false;
@@ -1632,14 +1673,15 @@ class Update extends BaseAdapterProcessFactory(AdapterProcess.update) {
1632
1673
  logger.log(() => toRemove.length
1633
1674
  ? 'items to remove: [' + toRemove.map(({ $index }) => $index).join(',') + ']'
1634
1675
  : 'no items to remove');
1635
- if (toRemove.length) { // insertions will be processed on render
1676
+ if (toRemove.length) {
1677
+ // insertions will be processed on render
1636
1678
  buffer.checkDefaultSize();
1637
1679
  }
1638
1680
  const toRender = buffer.items.filter(({ toInsert }) => toInsert);
1639
1681
  logger.log(() => toRender.length
1640
1682
  ? 'items to render: [' + toRender.map(({ $index }) => $index).join(',') + ']'
1641
1683
  : 'no items to render');
1642
- fetch.update(trackedIndex, delta, toRender, toRemove);
1684
+ state.fetch.update(trackedIndex, delta, toRender, toRemove);
1643
1685
  return !!toRemove.length || !!toRender.length;
1644
1686
  }
1645
1687
  }
@@ -1667,7 +1709,7 @@ class Insert extends BaseAdapterProcessFactory(AdapterProcess.insert) {
1667
1709
  return true;
1668
1710
  }
1669
1711
  static insertEmpty(scroller, params) {
1670
- const { buffer, routines, state: { fetch } } = scroller;
1712
+ const { buffer, routines, state } = scroller;
1671
1713
  if (buffer.size) {
1672
1714
  return false;
1673
1715
  }
@@ -1675,7 +1717,7 @@ class Insert extends BaseAdapterProcessFactory(AdapterProcess.insert) {
1675
1717
  if (!buffer.fillEmpty(items, beforeIndex, afterIndex, !!decrease, (index, data) => new Item(index, data, routines))) {
1676
1718
  return false;
1677
1719
  }
1678
- fetch.fill(buffer.items, buffer.startIndex);
1720
+ state.fetch.fill(buffer.items, buffer.startIndex);
1679
1721
  return true;
1680
1722
  }
1681
1723
  static insertInBuffer(scroller, params) {
@@ -1698,12 +1740,13 @@ class Insert extends BaseAdapterProcessFactory(AdapterProcess.insert) {
1698
1740
  }
1699
1741
  static insertVirtually(scroller, params) {
1700
1742
  const { beforeIndex, afterIndex, items, decrease } = params;
1701
- const { buffer, state: { fetch }, viewport } = scroller;
1743
+ const { buffer, state, viewport } = scroller;
1702
1744
  const direction = Number.isInteger(beforeIndex) ? Direction.backward : Direction.forward;
1703
1745
  const indexToInsert = (direction === Direction.backward ? beforeIndex : afterIndex);
1704
1746
  if (!buffer.insertVirtually(items, indexToInsert, direction, !!decrease)) {
1705
1747
  return false;
1706
1748
  }
1749
+ const { fetch } = state;
1707
1750
  const { index, diff } = viewport.getEdgeVisibleItem(buffer.items, Direction.backward);
1708
1751
  fetch.firstVisible.index = index;
1709
1752
  if (!isNaN(index)) {
@@ -1737,7 +1780,8 @@ class Append extends BaseAdapterProcessFactory(AdapterProcess.append) {
1737
1780
  items = [...items].reverse();
1738
1781
  }
1739
1782
  else {
1740
- afterIndex = (eof ? buffer.absMaxIndex : buffer.maxIndex) - (!buffer.size && !opposite ? 1 : 0);
1783
+ afterIndex =
1784
+ (eof ? buffer.absMaxIndex : buffer.maxIndex) - (!buffer.size && !opposite ? 1 : 0);
1741
1785
  }
1742
1786
  return Insert.doInsert(scroller, {
1743
1787
  items,
@@ -1751,7 +1795,7 @@ class Append extends BaseAdapterProcessFactory(AdapterProcess.append) {
1751
1795
 
1752
1796
  class Check extends BaseAdapterProcessFactory(AdapterProcess.check) {
1753
1797
  static run(scroller) {
1754
- const { workflow, buffer, state: { fetch }, viewport } = scroller;
1798
+ const { workflow, buffer, state, viewport } = scroller;
1755
1799
  let min = Infinity, max = -Infinity;
1756
1800
  buffer.items.forEach(item => {
1757
1801
  const size = item.size;
@@ -1763,6 +1807,7 @@ class Check extends BaseAdapterProcessFactory(AdapterProcess.check) {
1763
1807
  }
1764
1808
  });
1765
1809
  if (Number.isFinite(min)) {
1810
+ const { fetch } = state;
1766
1811
  fetch.first.indexBuffer = buffer.firstIndex;
1767
1812
  fetch.last.indexBuffer = buffer.lastIndex;
1768
1813
  const { index: firstIndex, diff } = viewport.getEdgeVisibleItem(buffer.items, Direction.backward);
@@ -1821,9 +1866,8 @@ class Remove extends BaseAdapterProcessFactory(AdapterProcess.remove) {
1821
1866
  if (!predicate && !indexes) {
1822
1867
  return [];
1823
1868
  }
1824
- const newPredicate = item => (predicate && predicate(item)) ||
1825
- (!!indexes && indexes.includes(item.$index));
1826
- const indexesToRemove = scroller.buffer.items.reduce((acc, item) => newPredicate(item) ? [...acc, item.$index] : acc, []);
1869
+ const newPredicate = item => (predicate && predicate(item)) || (!!indexes && indexes.includes(item.$index));
1870
+ const indexesToRemove = scroller.buffer.items.reduce((acc, item) => (newPredicate(item) ? [...acc, item.$index] : acc), []);
1827
1871
  const updateOptions = {
1828
1872
  predicate: item => !newPredicate(item),
1829
1873
  fixRight: increase
@@ -1836,7 +1880,7 @@ class Remove extends BaseAdapterProcessFactory(AdapterProcess.remove) {
1836
1880
  if (!indexes || !indexes.length) {
1837
1881
  return false;
1838
1882
  }
1839
- const { buffer, viewport, state: { fetch } } = scroller;
1883
+ const { buffer, viewport, state } = scroller;
1840
1884
  // get items to remove
1841
1885
  const { finiteAbsMinIndex, firstIndex, finiteAbsMaxIndex, lastIndex } = buffer;
1842
1886
  const toRemove = [];
@@ -1856,6 +1900,7 @@ class Remove extends BaseAdapterProcessFactory(AdapterProcess.remove) {
1856
1900
  return false;
1857
1901
  }
1858
1902
  // what should be shown after remove; Buffer removal has priority
1903
+ const { fetch } = state;
1859
1904
  if (isNaN(fetch.firstVisible.index)) {
1860
1905
  const { index, diff } = viewport.getEdgeVisibleItem(buffer.items, Direction.backward);
1861
1906
  fetch.firstVisible.index = index;
@@ -1875,7 +1920,10 @@ class Remove extends BaseAdapterProcessFactory(AdapterProcess.remove) {
1875
1920
  if (isNaN(firstVisible.index)) {
1876
1921
  return;
1877
1922
  }
1878
- const shift = listToRemove.reduce((acc, index) => acc + (((increase && index > firstVisible.index) || (!increase && index < firstVisible.index)) ? 1 : 0), 0);
1923
+ const shift = listToRemove.reduce((acc, index) => acc +
1924
+ ((increase && index > firstVisible.index) || (!increase && index < firstVisible.index)
1925
+ ? 1
1926
+ : 0), 0);
1879
1927
  firstVisible.index = firstVisible.index + (increase ? shift : -shift);
1880
1928
  }
1881
1929
  }
@@ -1901,7 +1949,7 @@ class Replace extends BaseAdapterProcessFactory(AdapterProcess.replace) {
1901
1949
  const shouldReplace = Replace.doReplace(scroller, params);
1902
1950
  scroller.workflow.call({
1903
1951
  process: Replace.process,
1904
- status: shouldReplace ? ProcessStatus.next : ProcessStatus.done,
1952
+ status: shouldReplace ? ProcessStatus.next : ProcessStatus.done
1905
1953
  });
1906
1954
  }
1907
1955
  static doReplace(scroller, params) {
@@ -1983,7 +2031,9 @@ class Fix extends BaseAdapterProcessFactory(AdapterProcess.fix) {
1983
2031
  case FixParams.scrollToItem:
1984
2032
  if (methodData.params) {
1985
2033
  const scrollToItemOpt = methodData.params[FixParams.scrollToItemOpt];
1986
- const options = scrollToItemOpt ? scrollToItemOpt.value : void 0;
2034
+ const options = scrollToItemOpt
2035
+ ? scrollToItemOpt.value
2036
+ : void 0;
1987
2037
  return Fix.scrollToItem(scroller, value, options);
1988
2038
  }
1989
2039
  return;
@@ -2011,7 +2061,7 @@ class Fix extends BaseAdapterProcessFactory(AdapterProcess.fix) {
2011
2061
  }
2012
2062
  static updateItems({ buffer, logger }, value) {
2013
2063
  let updateReference = false;
2014
- const updater = () => updateReference = true;
2064
+ const updater = () => (updateReference = true);
2015
2065
  buffer.items.forEach(item => value(item.get(), updater));
2016
2066
  if (updateReference) {
2017
2067
  logger.log(() => 'update Buffer.items reference');
@@ -2041,7 +2091,8 @@ class Start extends BaseProcessFactory(CommonProcess.start) {
2041
2091
 
2042
2092
  class PreFetch extends BaseProcessFactory(CommonProcess.preFetch) {
2043
2093
  static run(scroller) {
2044
- const { workflow, buffer, state: { fetch, cycle } } = scroller;
2094
+ const { workflow, buffer, state } = scroller;
2095
+ const { fetch, cycle } = state;
2045
2096
  fetch.minIndex = buffer.minIndex;
2046
2097
  // set first and last indexes of items to fetch
2047
2098
  PreFetch.setPositionsAndIndexes(scroller);
@@ -2068,7 +2119,8 @@ class PreFetch extends BaseProcessFactory(CommonProcess.preFetch) {
2068
2119
  scroller.logger.fetch();
2069
2120
  }
2070
2121
  static setPositions(scroller) {
2071
- const { state: { fetch: { positions } }, viewport } = scroller;
2122
+ const { state, viewport } = scroller;
2123
+ const { positions } = state.fetch;
2072
2124
  const paddingDelta = viewport.getBufferPadding();
2073
2125
  positions.before = viewport.scrollPosition;
2074
2126
  positions.startDelta = PreFetch.getStartDelta(scroller);
@@ -2077,7 +2129,9 @@ class PreFetch extends BaseProcessFactory(CommonProcess.preFetch) {
2077
2129
  positions.end = positions.relative + viewport.getSize() + paddingDelta;
2078
2130
  }
2079
2131
  static getStartDelta(scroller) {
2080
- const { buffer, viewport: { offset } } = scroller;
2132
+ // calculate size before start index
2133
+ const { buffer, viewport } = scroller;
2134
+ const { offset } = viewport;
2081
2135
  let startDelta = 0;
2082
2136
  if (offset) {
2083
2137
  startDelta += offset;
@@ -2089,13 +2143,15 @@ class PreFetch extends BaseProcessFactory(CommonProcess.preFetch) {
2089
2143
  startDelta += buffer.getSizeByIndex(index);
2090
2144
  }
2091
2145
  scroller.logger.log(() => [
2092
- `start delta is ${startDelta}`, ...(offset ? [` (+${offset} offset)`] : [])
2146
+ `start delta is ${startDelta}`,
2147
+ ...(offset ? [` (+${offset} offset)`] : [])
2093
2148
  ]);
2094
2149
  return startDelta;
2095
2150
  }
2096
2151
  static setFirstIndex(scroller) {
2097
2152
  const { state, buffer } = scroller;
2098
- const { positions: { start }, first } = state.fetch;
2153
+ const { positions, first } = state.fetch;
2154
+ const { start } = positions;
2099
2155
  let firstIndex = buffer.startIndex;
2100
2156
  let firstIndexPosition = 0;
2101
2157
  if (state.cycle.innerLoop.isInitial) {
@@ -2107,10 +2163,10 @@ class PreFetch extends BaseProcessFactory(CommonProcess.preFetch) {
2107
2163
  else {
2108
2164
  let position = firstIndexPosition;
2109
2165
  let index = firstIndex;
2110
- while (1) { // eslint-disable-line no-constant-condition
2166
+ while (true) {
2111
2167
  if (start >= 0) {
2112
2168
  const size = buffer.getSizeByIndex(index);
2113
- const diff = (position + size) - start;
2169
+ const diff = position + size - start;
2114
2170
  if (diff > 0) {
2115
2171
  firstIndex = index;
2116
2172
  firstIndexPosition = position;
@@ -2141,8 +2197,10 @@ class PreFetch extends BaseProcessFactory(CommonProcess.preFetch) {
2141
2197
  first.position = firstIndexPosition;
2142
2198
  }
2143
2199
  static setLastIndex(scroller) {
2144
- const { state: { fetch, cycle }, buffer, settings } = scroller;
2145
- const { firstVisible, positions: { relative, end }, first, last } = fetch;
2200
+ const { state, buffer, settings } = scroller;
2201
+ const { fetch, cycle } = state;
2202
+ const { firstVisible, positions, first, last } = fetch;
2203
+ const { relative, end } = positions;
2146
2204
  let lastIndex;
2147
2205
  if (!buffer.defaultSize) {
2148
2206
  // just to fetch forward bufferSize items if neither averageItemSize nor itemSize are present
@@ -2153,7 +2211,7 @@ class PreFetch extends BaseProcessFactory(CommonProcess.preFetch) {
2153
2211
  let index = first.indexBuffer;
2154
2212
  let position = first.position;
2155
2213
  lastIndex = index;
2156
- while (1) { // eslint-disable-line no-constant-condition
2214
+ while (true) {
2157
2215
  lastIndex = index;
2158
2216
  const size = buffer.getSizeByIndex(index);
2159
2217
  position += size;
@@ -2207,7 +2265,8 @@ class PreFetch extends BaseProcessFactory(CommonProcess.preFetch) {
2207
2265
  }
2208
2266
  }
2209
2267
  static checkBufferGaps(scroller) {
2210
- const { buffer, state: { fetch } } = scroller;
2268
+ const { buffer, state } = scroller;
2269
+ const { fetch } = state;
2211
2270
  if (!buffer.size) {
2212
2271
  return;
2213
2272
  }
@@ -2226,7 +2285,8 @@ class PreFetch extends BaseProcessFactory(CommonProcess.preFetch) {
2226
2285
  }
2227
2286
  }
2228
2287
  static checkFetchPackSize(scroller) {
2229
- const { buffer, state: { fetch } } = scroller;
2288
+ const { buffer, state } = scroller;
2289
+ const { fetch } = state;
2230
2290
  if (!fetch.shouldFetch) {
2231
2291
  return;
2232
2292
  }
@@ -2236,7 +2296,8 @@ class PreFetch extends BaseProcessFactory(CommonProcess.preFetch) {
2236
2296
  if (diff <= 0) {
2237
2297
  return;
2238
2298
  }
2239
- if (!buffer.size || lastIndex > buffer.items[0].$index) { // forward
2299
+ if (!buffer.size || lastIndex > buffer.items[0].$index) {
2300
+ // forward
2240
2301
  const newLastIndex = Math.min(lastIndex + diff, buffer.absMaxIndex);
2241
2302
  if (newLastIndex > lastIndex) {
2242
2303
  fetch.last.index = fetch.last.indexBuffer = newLastIndex;
@@ -2254,11 +2315,13 @@ class PreFetch extends BaseProcessFactory(CommonProcess.preFetch) {
2254
2315
  }
2255
2316
  }
2256
2317
  static setFetchDirection(scroller) {
2257
- const { buffer, state: { fetch } } = scroller;
2318
+ const { buffer, state } = scroller;
2319
+ const { fetch } = state;
2258
2320
  if (fetch.last.index) {
2259
2321
  let direction = Direction.forward;
2260
2322
  if (buffer.size) {
2261
- direction = fetch.last.index < buffer.items[0].$index ? Direction.backward : Direction.forward;
2323
+ direction =
2324
+ fetch.last.index < buffer.items[0].$index ? Direction.backward : Direction.forward;
2262
2325
  }
2263
2326
  fetch.direction = direction;
2264
2327
  scroller.logger.log(() => `fetch direction is "${direction}"`);
@@ -2311,7 +2374,8 @@ class Fetch extends BaseProcessFactory(CommonProcess.fetch) {
2311
2374
  }
2312
2375
  }
2313
2376
  else {
2314
- const { state: { scroll, fetch }, viewport } = scroller;
2377
+ const { state, viewport } = scroller;
2378
+ const { scroll, fetch } = state;
2315
2379
  if (scroll.positionBeforeAsync === null) {
2316
2380
  scroll.positionBeforeAsync = viewport.scrollPosition;
2317
2381
  }
@@ -2319,7 +2383,7 @@ class Fetch extends BaseProcessFactory(CommonProcess.fetch) {
2319
2383
  box.success = () => null;
2320
2384
  box.fail = () => null;
2321
2385
  };
2322
- result.then((data) => box.success(data), (error) => box.fail(error));
2386
+ result.then(data => box.success(data), error => box.fail(error));
2323
2387
  }
2324
2388
  }
2325
2389
  static get(scroller) {
@@ -2355,9 +2419,10 @@ class Fetch extends BaseProcessFactory(CommonProcess.fetch) {
2355
2419
  });
2356
2420
  }
2357
2421
  }
2358
- if (immediateData || immediateError) { // callback case or immediate observable
2422
+ if (immediateData || immediateError) {
2423
+ // callback case or immediate observable
2359
2424
  return {
2360
- data: immediateError ? null : (immediateData || []),
2425
+ data: immediateError ? null : immediateData || [],
2361
2426
  error: immediateError,
2362
2427
  isError: !!immediateError
2363
2428
  };
@@ -2376,44 +2441,45 @@ class PostFetch extends BaseProcessFactory(CommonProcess.postFetch) {
2376
2441
  PostFetch.setBufferLimits(scroller);
2377
2442
  workflow.call({
2378
2443
  process: PostFetch.process,
2379
- status: scroller.state.fetch.hasNewItems
2380
- ? ProcessStatus.next
2381
- : ProcessStatus.done
2444
+ status: scroller.state.fetch.hasNewItems ? ProcessStatus.next : ProcessStatus.done
2382
2445
  });
2383
2446
  }
2384
2447
  else {
2385
2448
  workflow.call({
2386
2449
  process: PostFetch.process,
2387
2450
  status: ProcessStatus.error,
2388
- payload: { error: 'Can\'t set buffer items' }
2451
+ payload: { error: 'Can not set buffer items' }
2389
2452
  });
2390
2453
  }
2391
2454
  }
2392
2455
  static setBufferLimits(scroller) {
2393
- const { buffer, state: { fetch, cycle: { innerLoop } } } = scroller;
2394
- const { items, first: { index: first }, last: { index: last } } = fetch;
2456
+ const { buffer, state } = scroller;
2457
+ const { fetch, cycle } = state;
2458
+ const { items, first, last } = fetch;
2395
2459
  if (!items.length) {
2396
- if (last < buffer.minIndex || innerLoop.isInitial) {
2460
+ if (last.index < buffer.minIndex || cycle.innerLoop.isInitial) {
2397
2461
  buffer.absMinIndex = buffer.minIndex;
2398
2462
  }
2399
- if (first > buffer.maxIndex || innerLoop.isInitial) {
2463
+ if (first.index > buffer.maxIndex || cycle.innerLoop.isInitial) {
2400
2464
  buffer.absMaxIndex = buffer.maxIndex;
2401
2465
  }
2402
2466
  }
2403
2467
  else {
2404
2468
  const lastIndex = items.length - 1;
2405
- if (first < items[0].$index) {
2469
+ if (first.index < items[0].$index) {
2406
2470
  buffer.absMinIndex = items[0].$index;
2407
2471
  }
2408
- if (last > items[lastIndex].$index) {
2472
+ if (last.index > items[lastIndex].$index) {
2409
2473
  buffer.absMaxIndex = items[lastIndex].$index;
2410
2474
  }
2411
2475
  }
2412
2476
  }
2413
2477
  static setItems(scroller) {
2414
- const { buffer, state: { fetch, cycle } } = scroller;
2478
+ const { buffer, state } = scroller;
2479
+ const { fetch, cycle } = state;
2415
2480
  const items = fetch.newItemsData;
2416
- if (!items || !items.length) { // empty result
2481
+ if (!items || !items.length) {
2482
+ // empty result
2417
2483
  return true;
2418
2484
  }
2419
2485
  // eof/bof case, need to shift fetch index if bof
@@ -2435,7 +2501,8 @@ class PostFetch extends BaseProcessFactory(CommonProcess.postFetch) {
2435
2501
 
2436
2502
  class Render extends BaseProcessFactory(CommonProcess.render) {
2437
2503
  static run(scroller) {
2438
- const { workflow, state: { cycle, render, scroll, fetch }, viewport, routines } = scroller;
2504
+ const { workflow, state, viewport, routines } = scroller;
2505
+ const { cycle, render, scroll, fetch } = state;
2439
2506
  scroller.logger.stat('before new items render');
2440
2507
  if (scroll.positionBeforeAsync === null) {
2441
2508
  scroll.positionBeforeAsync = viewport.scrollPosition;
@@ -2453,13 +2520,14 @@ class Render extends BaseProcessFactory(CommonProcess.render) {
2453
2520
  workflow.call({
2454
2521
  process: Render.process,
2455
2522
  status: ProcessStatus.error,
2456
- payload: { error: 'Can\'t associate item with element' }
2523
+ payload: { error: 'Can not associate item with element' }
2457
2524
  });
2458
2525
  }
2459
2526
  }, { items: fetch.items.map(i => i.get()) });
2460
2527
  }
2461
2528
  static doRender(scroller) {
2462
- const { state: { fetch, render }, viewport, buffer, logger } = scroller;
2529
+ const { state, viewport, buffer, logger } = scroller;
2530
+ const { fetch, render } = state;
2463
2531
  render.positionBefore = viewport.scrollPosition;
2464
2532
  if (!fetch.isCheck) {
2465
2533
  render.sizeBefore = viewport.getScrollableSize();
@@ -2470,7 +2538,7 @@ class Render extends BaseProcessFactory(CommonProcess.render) {
2470
2538
  buffer.checkDefaultSize();
2471
2539
  render.sizeAfter = viewport.getScrollableSize();
2472
2540
  logger.stat('after new items render');
2473
- logger.log(() => render.noSize ? 'viewport size has not been changed' : void 0);
2541
+ logger.log(() => (render.noSize ? 'viewport size has not been changed' : void 0));
2474
2542
  return true;
2475
2543
  }
2476
2544
  static processElement(scroller, item) {
@@ -2490,7 +2558,8 @@ class Render extends BaseProcessFactory(CommonProcess.render) {
2490
2558
  const isInterrupted = ({ call }) => !!call.interrupted;
2491
2559
  class End extends BaseProcessFactory(CommonProcess.end) {
2492
2560
  static run(scroller, { error } = {}) {
2493
- const { workflow, state: { cycle: { interrupter } } } = scroller;
2561
+ const { workflow, state } = scroller;
2562
+ const { interrupter } = state.cycle;
2494
2563
  if (!error && !interrupter) {
2495
2564
  // set out params accessible via Adapter
2496
2565
  End.calculateParams(scroller);
@@ -2541,10 +2610,10 @@ class End extends BaseProcessFactory(CommonProcess.end) {
2541
2610
 
2542
2611
  class Adjust extends BaseProcessFactory(CommonProcess.adjust) {
2543
2612
  static run(scroller) {
2544
- const { workflow, viewport, state: { scroll } } = scroller;
2545
- scroll.positionBeforeAdjust = viewport.scrollPosition;
2613
+ const { workflow, viewport, state } = scroller;
2614
+ state.scroll.positionBeforeAdjust = viewport.scrollPosition;
2546
2615
  Adjust.setPaddings(scroller);
2547
- scroll.positionAfterAdjust = viewport.scrollPosition;
2616
+ state.scroll.positionAfterAdjust = viewport.scrollPosition;
2548
2617
  // scroll position adjustments
2549
2618
  const position = Adjust.calculatePosition(scroller);
2550
2619
  // additional adjustment if the position can't be reached during the initial cycle
@@ -2556,7 +2625,7 @@ class Adjust extends BaseProcessFactory(CommonProcess.adjust) {
2556
2625
  }));
2557
2626
  }
2558
2627
  static setPaddings(scroller) {
2559
- const { viewport, buffer, settings: { inverse }, state: { fetch } } = scroller;
2628
+ const { viewport, buffer, settings, state } = scroller;
2560
2629
  const firstItem = buffer.getFirstVisibleItem();
2561
2630
  const lastItem = buffer.getLastVisibleItem();
2562
2631
  let first, last;
@@ -2565,6 +2634,7 @@ class Adjust extends BaseProcessFactory(CommonProcess.adjust) {
2565
2634
  last = lastItem.$index;
2566
2635
  }
2567
2636
  else {
2637
+ const { fetch } = state;
2568
2638
  first = !isNaN(fetch.firstVisible.index) ? fetch.firstVisible.index : buffer.startIndex;
2569
2639
  last = first - 1;
2570
2640
  }
@@ -2582,20 +2652,23 @@ class Adjust extends BaseProcessFactory(CommonProcess.adjust) {
2582
2652
  const scrollSize = bwdSize + bufferSize + fwdSize;
2583
2653
  const viewportSizeDiff = viewport.getSize() - scrollSize;
2584
2654
  if (viewportSizeDiff > 0) {
2585
- if (inverse) {
2655
+ if (settings.inverse) {
2586
2656
  bwdSize += viewportSizeDiff;
2587
2657
  }
2588
2658
  else {
2589
2659
  fwdSize += viewportSizeDiff;
2590
2660
  }
2591
- scroller.logger.log(() => inverse ? 'backward' : 'forward' + ` padding will be increased by ${viewportSizeDiff} to fill the viewport`);
2661
+ scroller.logger.log(() => settings.inverse
2662
+ ? 'backward'
2663
+ : 'forward' + ` padding will be increased by ${viewportSizeDiff} to fill the viewport`);
2592
2664
  }
2593
2665
  backward.size = bwdSize;
2594
2666
  forward.size = fwdSize;
2595
2667
  scroller.logger.stat('after paddings adjustments');
2596
2668
  }
2597
2669
  static calculatePosition(scroller) {
2598
- const { viewport, buffer, state: { fetch, render, scroll } } = scroller;
2670
+ const { viewport, buffer, state } = scroller;
2671
+ const { fetch, render, scroll } = state;
2599
2672
  let position = viewport.paddings.backward.size;
2600
2673
  // increase the position to meet the expectation of the first visible item
2601
2674
  if (!isNaN(fetch.firstVisible.index) && !isNaN(buffer.firstIndex)) {
@@ -2632,8 +2705,8 @@ class Adjust extends BaseProcessFactory(CommonProcess.adjust) {
2632
2705
  return Math.round(position);
2633
2706
  }
2634
2707
  static setAdditionalForwardPadding(scroller, position) {
2635
- const { viewport, buffer, state: { cycle } } = scroller;
2636
- if (!cycle.isInitial || !End.shouldContinueRun(scroller, null)) {
2708
+ const { viewport, buffer, state } = scroller;
2709
+ if (!state.cycle.isInitial || !End.shouldContinueRun(scroller, null)) {
2637
2710
  return;
2638
2711
  }
2639
2712
  const diff = position - viewport.getMaxScrollPosition();
@@ -2656,7 +2729,8 @@ class Adjust extends BaseProcessFactory(CommonProcess.adjust) {
2656
2729
  }
2657
2730
  }
2658
2731
  static setPosition(scroller, position, done) {
2659
- const { state: { scroll }, viewport, routines } = scroller;
2732
+ const { state, viewport, routines } = scroller;
2733
+ const { scroll } = state;
2660
2734
  if (!scroll.hasPositionChanged(position)) {
2661
2735
  return done();
2662
2736
  }
@@ -2691,7 +2765,7 @@ class PreClip extends BaseProcessFactory(CommonProcess.preClip) {
2691
2765
  });
2692
2766
  }
2693
2767
  static prepareClip(scroller) {
2694
- const { state: { fetch, clip } } = scroller;
2768
+ const { fetch, clip } = scroller.state;
2695
2769
  if (PreClip.shouldNotClip(scroller)) {
2696
2770
  return;
2697
2771
  }
@@ -2727,7 +2801,8 @@ class PreClip extends BaseProcessFactory(CommonProcess.preClip) {
2727
2801
  return false;
2728
2802
  }
2729
2803
  static isBackward(scroller, firstIndex) {
2730
- const { buffer, state: { clip, fetch } } = scroller;
2804
+ const { buffer, state } = scroller;
2805
+ const { clip, fetch } = state;
2731
2806
  if (clip.force) {
2732
2807
  return clip.forceBackward;
2733
2808
  }
@@ -2739,7 +2814,8 @@ class PreClip extends BaseProcessFactory(CommonProcess.preClip) {
2739
2814
  return false;
2740
2815
  }
2741
2816
  static isForward(scroller, lastIndex) {
2742
- const { buffer, state: { clip, fetch } } = scroller;
2817
+ const { buffer, state } = scroller;
2818
+ const { clip, fetch } = state;
2743
2819
  if (clip.force) {
2744
2820
  return clip.forceForward;
2745
2821
  }
@@ -2753,8 +2829,7 @@ class PreClip extends BaseProcessFactory(CommonProcess.preClip) {
2753
2829
  static prepareClipByDirection(scroller, direction, edgeIndex) {
2754
2830
  const forward = direction === Direction.forward;
2755
2831
  scroller.buffer.items.forEach(item => {
2756
- if ((!forward && item.$index < edgeIndex) ||
2757
- (forward && item.$index > edgeIndex)) {
2832
+ if ((!forward && item.$index < edgeIndex) || (forward && item.$index > edgeIndex)) {
2758
2833
  item.toRemove = true;
2759
2834
  item.removeDirection = direction;
2760
2835
  scroller.state.clip.doClip = true;
@@ -2773,9 +2848,9 @@ class Clip extends BaseProcessFactory(CommonProcess.clip) {
2773
2848
  });
2774
2849
  }
2775
2850
  static doClip(scroller) {
2776
- const { buffer, viewport: { paddings }, state: { clip }, logger } = scroller;
2851
+ const { buffer, viewport, state, logger } = scroller;
2777
2852
  const size = { [Direction.backward]: 0, [Direction.forward]: 0 };
2778
- logger.stat(`before clip (${++clip.callCount})`);
2853
+ logger.stat(`before clip (${++state.clip.callCount})`);
2779
2854
  const itemsToRemove = buffer.items.filter(item => {
2780
2855
  if (!item.toRemove) {
2781
2856
  return false;
@@ -2786,10 +2861,10 @@ class Clip extends BaseProcessFactory(CommonProcess.clip) {
2786
2861
  });
2787
2862
  if (itemsToRemove.length) {
2788
2863
  if (size[Direction.backward]) {
2789
- paddings.byDirection(Direction.backward).size += size[Direction.backward];
2864
+ viewport.paddings.byDirection(Direction.backward).size += size[Direction.backward];
2790
2865
  }
2791
2866
  if (size[Direction.forward]) {
2792
- paddings.byDirection(Direction.forward).size += size[Direction.forward];
2867
+ viewport.paddings.byDirection(Direction.forward).size += size[Direction.forward];
2793
2868
  }
2794
2869
  if (scroller.settings.onBeforeClip) {
2795
2870
  scroller.settings.onBeforeClip(itemsToRemove.map(item => item.get()));
@@ -2818,7 +2893,7 @@ class Logger {
2818
2893
  if (!this.debug) {
2819
2894
  return;
2820
2895
  }
2821
- const params = (args === void 0 ? [] : (Array.isArray(args) ? args : [args]))
2896
+ const params = (args === void 0 ? [] : Array.isArray(args) ? args : [args])
2822
2897
  .map((arg) => {
2823
2898
  if (typeof arg === 'function') {
2824
2899
  return 'func';
@@ -2838,24 +2913,36 @@ class Logger {
2838
2913
  this.debug = settings.debug;
2839
2914
  this.immediateLog = settings.immediateLog;
2840
2915
  this.logTime = settings.logTime;
2916
+ this.logColor = settings.logColor;
2841
2917
  this.getTime = () => scroller.state && ` // time: ${scroller.state.time}`;
2842
2918
  this.getStat = () => {
2843
2919
  const { buffer, viewport } = scroller;
2844
2920
  const first = buffer.getFirstVisibleItem();
2845
2921
  const last = buffer.getLastVisibleItem();
2846
- return 'pos: ' + viewport.scrollPosition + ', ' +
2847
- 'size: ' + viewport.getScrollableSize() + ', ' +
2848
- 'bwd_p: ' + viewport.paddings.backward.size + ', ' +
2849
- 'fwd_p: ' + viewport.paddings.forward.size + ', ' +
2850
- 'default: ' + (buffer.defaultSize || 'no') + ', ' +
2851
- 'items: ' + buffer.getVisibleItemsCount() + ', ' +
2852
- 'range: ' + (first && last ? `[${first.$index}..${last.$index}]` : 'no');
2922
+ return ('pos: ' +
2923
+ viewport.scrollPosition +
2924
+ ', ' +
2925
+ 'size: ' +
2926
+ viewport.getScrollableSize() +
2927
+ ', ' +
2928
+ 'bwd_p: ' +
2929
+ viewport.paddings.backward.size +
2930
+ ', ' +
2931
+ 'fwd_p: ' +
2932
+ viewport.paddings.forward.size +
2933
+ ', ' +
2934
+ 'default: ' +
2935
+ (buffer.defaultSize || 'no') +
2936
+ ', ' +
2937
+ 'items: ' +
2938
+ buffer.getVisibleItemsCount() +
2939
+ ', ' +
2940
+ 'range: ' +
2941
+ (first && last ? `[${first.$index}..${last.$index}]` : 'no'));
2853
2942
  };
2854
2943
  this.getFetchRange = () => {
2855
2944
  const { first: { index: first }, last: { index: last } } = scroller.state.fetch;
2856
- return !Number.isNaN(first) && !Number.isNaN(last)
2857
- ? `[${first}..${last}]`
2858
- : 'no';
2945
+ return !Number.isNaN(first) && !Number.isNaN(last) ? `[${first}..${last}]` : 'no';
2859
2946
  };
2860
2947
  this.getLoopId = () => scroller.state.cycle.loopId;
2861
2948
  this.getLoopIdNext = () => scroller.state.cycle.loopIdNext;
@@ -2871,7 +2958,7 @@ class Logger {
2871
2958
  this.log(() => [
2872
2959
  str,
2873
2960
  stringify
2874
- ? JSON.stringify(obj, (k, v) => {
2961
+ ? JSON.stringify(obj, (_, v) => {
2875
2962
  if (Number.isNaN(v)) {
2876
2963
  return 'NaN';
2877
2964
  }
@@ -2900,24 +2987,32 @@ class Logger {
2900
2987
  }
2901
2988
  stat(str) {
2902
2989
  if (this.debug) {
2903
- const logStyles = [
2904
- 'color: #888; border: dashed #888 0; border-bottom-width: 0px',
2905
- 'color: #000; border-width: 0'
2906
- ];
2907
- this.log(() => ['%cstat' + (str ? ` ${str}` : '') + ',%c ' + this.getStat(), ...logStyles]);
2990
+ if (this.logColor) {
2991
+ const logStyles = [
2992
+ 'color: #888; border: dashed #888 0; border-bottom-width: 0px',
2993
+ 'color: #000; border-width: 0'
2994
+ ];
2995
+ this.log(() => ['%cstat' + (str ? ` ${str}` : '') + ',%c ' + this.getStat(), ...logStyles]);
2996
+ }
2997
+ else {
2998
+ this.log(() => ['stat' + (str ? ` ${str}` : '') + ', ' + this.getStat()]);
2999
+ }
2908
3000
  }
2909
3001
  }
2910
3002
  fetch(str) {
2911
3003
  if (this.debug) {
2912
3004
  const _text = 'fetch interval' + (str ? ` ${str}` : '');
2913
- const logStyles = ['color: #888', 'color: #000'];
2914
- this.log(() => [`%c${_text}: %c${this.getFetchRange()}`, ...logStyles]);
3005
+ if (this.logColor) {
3006
+ const logStyles = ['color: #888', 'color: #000'];
3007
+ this.log(() => [`%c${_text}: %c${this.getFetchRange()}`, ...logStyles]);
3008
+ }
3009
+ else {
3010
+ this.log(() => [`${_text}: ${this.getFetchRange()}`]);
3011
+ }
2915
3012
  }
2916
3013
  }
2917
3014
  prepareForLog(data) {
2918
- return data instanceof Event && data.target
2919
- ? this.getScrollPosition()
2920
- : data;
3015
+ return data instanceof Event && data.target ? this.getScrollPosition() : data;
2921
3016
  }
2922
3017
  logProcess(data) {
2923
3018
  if (!this.debug) {
@@ -2927,29 +3022,49 @@ class Logger {
2927
3022
  // inner loop start-end log
2928
3023
  const loopLog = [];
2929
3024
  if (process === CommonProcess.init && status === ProcessStatus.next) {
2930
- loopLog.push(`%c---=== loop ${this.getLoopIdNext()} start`);
3025
+ const loopStart = `---=== loop ${this.getLoopIdNext()} start`;
3026
+ loopLog.push(this.logColor ? `%c${loopStart}` : loopStart);
2931
3027
  }
2932
3028
  else if (process === CommonProcess.end) {
2933
- loopLog.push(`%c---=== loop ${this.getLoopId()} done`);
3029
+ const loopDone = `---=== loop ${this.getLoopId()} done`;
3030
+ loopLog.push(this.logColor ? `%c${loopDone}` : loopDone);
2934
3031
  const parent = payload && payload.process;
2935
- if (status === ProcessStatus.next && (parent !== AdapterProcess.reset && parent !== AdapterProcess.reload)) {
3032
+ if (status === ProcessStatus.next &&
3033
+ parent !== AdapterProcess.reset &&
3034
+ parent !== AdapterProcess.reload) {
2936
3035
  loopLog[0] += `, loop ${this.getLoopIdNext()} start`;
2937
3036
  }
2938
3037
  }
2939
3038
  if (loopLog.length) {
2940
- this.log(() => [...loopLog, 'color: #006600;']);
3039
+ this.log(() => (this.logColor ? [...loopLog, 'color: #006600;'] : loopLog));
2941
3040
  }
2942
3041
  }
2943
3042
  logCycle(start = true) {
2944
3043
  const logData = this.getWorkflowCycleData();
2945
- const border = start ? '1px 0 0 1px' : '0 0 1px 1px';
2946
- const logStyles = `color: #0000aa; border: solid #555 1px; border-width: ${border}; margin-left: -2px`;
2947
- this.log(() => [`%c ~~~ WF Cycle ${logData} ${start ? 'STARTED' : 'FINALIZED'} ~~~ `, logStyles]);
3044
+ if (this.logColor) {
3045
+ const border = start ? '1px 0 0 1px' : '0 0 1px 1px';
3046
+ const logStyles = `color: #0000aa; border: solid #555 1px; border-width: ${border}; margin-left: -2px`;
3047
+ this.log(() => [
3048
+ `%c ~~~ WF Cycle ${logData} ${start ? 'STARTED' : 'FINALIZED'} ~~~ `,
3049
+ logStyles
3050
+ ]);
3051
+ }
3052
+ else {
3053
+ this.log(() => [` ~~~ WF Cycle ${logData} ${start ? 'STARTED' : 'FINALIZED'} ~~~ `]);
3054
+ }
2948
3055
  }
2949
3056
  logError(str) {
2950
3057
  if (this.debug) {
2951
- const logStyles = ['color: #a00;', 'color: #000'];
2952
- this.log(() => ['error:%c' + (str ? ` ${str}` : '') + `%c (loop ${this.getLoopIdNext()})`, ...logStyles]);
3058
+ if (this.logColor) {
3059
+ const logStyles = ['color: #a00;', 'color: #000'];
3060
+ this.log(() => [
3061
+ 'error:%c' + (str ? ` ${str}` : '') + `%c (loop ${this.getLoopIdNext()})`,
3062
+ ...logStyles
3063
+ ]);
3064
+ }
3065
+ else {
3066
+ this.log(() => ['error:' + (str ? ` ${str}` : '') + ` (loop ${this.getLoopIdNext()})`]);
3067
+ }
2953
3068
  }
2954
3069
  }
2955
3070
  log(...args) {
@@ -2995,6 +3110,9 @@ class Logger {
2995
3110
  }
2996
3111
  }
2997
3112
  }
3113
+ getLogs() {
3114
+ return this.logs;
3115
+ }
2998
3116
  }
2999
3117
 
3000
3118
  class Routines {
@@ -3073,17 +3191,18 @@ class Routines {
3073
3191
  return element.getBoundingClientRect();
3074
3192
  }
3075
3193
  getWindowParams() {
3076
- const { clientWidth, clientHeight, clientLeft, clientTop } = this.viewport;
3194
+ const height = window.innerHeight;
3195
+ const width = window.innerWidth;
3077
3196
  return {
3078
- 'height': clientHeight,
3079
- 'width': clientWidth,
3080
- 'top': clientTop,
3081
- 'bottom': clientTop + clientHeight,
3082
- 'left': clientLeft,
3083
- 'right': clientLeft + clientWidth,
3084
- 'x': clientLeft,
3085
- 'y': clientTop,
3086
- 'toJSON': () => null,
3197
+ height: height,
3198
+ width: width,
3199
+ top: 0,
3200
+ bottom: height,
3201
+ left: 0,
3202
+ right: width,
3203
+ x: 0,
3204
+ y: 0,
3205
+ toJSON: () => null
3087
3206
  };
3088
3207
  }
3089
3208
  getSize(element) {
@@ -3112,14 +3231,14 @@ class Routines {
3112
3231
  const { horizontal } = this.settings;
3113
3232
  const params = this.getElementParams(element);
3114
3233
  const isFwd = direction === Direction.forward;
3115
- return params[isFwd ? (horizontal ? 'right' : 'bottom') : (horizontal ? 'left' : 'top')];
3234
+ return params[isFwd ? (horizontal ? 'right' : 'bottom') : horizontal ? 'left' : 'top'];
3116
3235
  }
3117
3236
  getViewportEdge(direction) {
3118
3237
  const { window, horizontal } = this.settings;
3119
3238
  if (window) {
3120
3239
  const params = this.getWindowParams();
3121
3240
  const isFwd = direction === Direction.forward;
3122
- return params[isFwd ? (horizontal ? 'right' : 'bottom') : (horizontal ? 'left' : 'top')];
3241
+ return params[isFwd ? (horizontal ? 'right' : 'bottom') : horizontal ? 'left' : 'top'];
3123
3242
  }
3124
3243
  return this.getEdge(this.viewport, direction);
3125
3244
  }
@@ -3141,8 +3260,7 @@ class Routines {
3141
3260
  this.checkElement(element);
3142
3261
  element.scrollIntoView(argument);
3143
3262
  }
3144
- // eslint-disable-next-line @typescript-eslint/no-unused-vars
3145
- render(cb, params) {
3263
+ render(cb, _params) {
3146
3264
  const timeoutId = setTimeout(() => cb());
3147
3265
  return () => clearTimeout(timeoutId);
3148
3266
  }
@@ -3183,8 +3301,12 @@ class Paddings {
3183
3301
  }
3184
3302
  byDirection(direction, opposite) {
3185
3303
  return direction === Direction.backward
3186
- ? (opposite ? this.forward : this.backward)
3187
- : (opposite ? this.backward : this.forward);
3304
+ ? opposite
3305
+ ? this.forward
3306
+ : this.backward
3307
+ : opposite
3308
+ ? this.backward
3309
+ : this.forward;
3188
3310
  }
3189
3311
  reset(viewportSize, startIndex, offset) {
3190
3312
  const positive = this.getPositiveSize(startIndex, viewportSize, offset);
@@ -3252,7 +3374,9 @@ class Viewport {
3252
3374
  this.routines.setScrollPosition(value);
3253
3375
  const position = this.scrollPosition;
3254
3376
  this.logger.log(() => [
3255
- 'setting scroll position at', position, ...(position !== value ? [`(${value})`] : [])
3377
+ 'setting scroll position at',
3378
+ position,
3379
+ ...(position !== value ? [`(${value})`] : [])
3256
3380
  ]);
3257
3381
  return position;
3258
3382
  }
@@ -3291,7 +3415,7 @@ class Viewport {
3291
3415
  for (let i = bwd ? 0 : items.length - 1; bwd ? i <= items.length - 1 : i >= 0; i += bwd ? 1 : -1) {
3292
3416
  const itemEdge = this.routines.getEdge(items[i].element, opposite);
3293
3417
  diff = itemEdge - viewportEdge;
3294
- if (bwd && diff > 0 || !bwd && diff < 0) {
3418
+ if ((bwd && diff > 0) || (!bwd && diff < 0)) {
3295
3419
  item = items[i];
3296
3420
  break;
3297
3421
  }
@@ -3353,7 +3477,8 @@ class DefaultSize {
3353
3477
  if (removed.length) {
3354
3478
  const removedSize = removed.reduce((acc, item) => acc + item.size, 0);
3355
3479
  const averageSize = this.averageSizeFloat || 0;
3356
- this.averageSizeFloat = ((cacheSize + removed.length) * averageSize - removedSize) / cacheSize;
3480
+ this.averageSizeFloat =
3481
+ ((cacheSize + removed.length) * averageSize - removedSize) / cacheSize;
3357
3482
  }
3358
3483
  this.averageSize = Math.round(this.averageSizeFloat);
3359
3484
  }
@@ -3465,7 +3590,7 @@ class Cache {
3465
3590
  }
3466
3591
  getSizeByIndex(index) {
3467
3592
  const item = this.get(index);
3468
- return item && item.size || this.defaultSize.get();
3593
+ return (item && item.size) || this.defaultSize.get();
3469
3594
  }
3470
3595
  getDefaultSize() {
3471
3596
  return this.defaultSize.get();
@@ -3482,12 +3607,12 @@ class Cache {
3482
3607
  * Maintains min/max indexes and default item size.
3483
3608
  *
3484
3609
  * @param {Item<Data>} item A Buffer item to be cached, an objects with { $index, data, size } props.
3485
- *
3486
3610
  * @returns {ItemCache<Data>} Cached item.
3487
3611
  */
3488
3612
  add(item) {
3489
3613
  let itemCache = this.get(item.$index);
3490
- if (itemCache) { // adding item is already cached
3614
+ if (itemCache) {
3615
+ // adding item is already cached
3491
3616
  if (this.saveData) {
3492
3617
  itemCache.data = item.data;
3493
3618
  }
@@ -3558,7 +3683,8 @@ class Cache {
3558
3683
  }
3559
3684
  set(item);
3560
3685
  });
3561
- if (this.saveData) { // persist data with no sizes
3686
+ if (this.saveData) {
3687
+ // persist data with no sizes
3562
3688
  toInsert.forEach((data, i) => {
3563
3689
  const $index = index + i - (fixRight ? length : 0) + (direction === Direction.forward ? 1 : 0);
3564
3690
  const item = new ItemCache({ $index, data }, this.saveData);
@@ -3630,19 +3756,21 @@ class Cache {
3630
3756
  }
3631
3757
  const items = new Map();
3632
3758
  this.items.forEach(item => {
3633
- if (item.$index < minB) { // items to the left of the subset
3759
+ if (item.$index < minB) {
3760
+ // items to the left of the subset
3634
3761
  item.changeIndex(item.$index + leftDiff);
3635
3762
  items.set(item.$index, item);
3636
3763
  return;
3637
3764
  }
3638
- else if (item.$index > maxB) { // items to the right of the subset
3765
+ else if (item.$index > maxB) {
3766
+ // items to the right of the subset
3639
3767
  item.changeIndex(item.$index + rightDiff);
3640
3768
  items.set(item.$index, item);
3641
3769
  return;
3642
3770
  }
3643
3771
  });
3644
- after.forEach(item => // subset items
3645
- items.set(item.$index, new ItemCache(item, this.saveData)));
3772
+ after.forEach((item // subset items
3773
+ ) => items.set(item.$index, new ItemCache(item, this.saveData)));
3646
3774
  before // to maintain default size on remove
3647
3775
  .filter(item => item.toRemove)
3648
3776
  .forEach(item => this.defaultSize.setRemoved(item.size));
@@ -3690,11 +3818,10 @@ class CheckBufferCall {
3690
3818
  return true;
3691
3819
  }
3692
3820
  insertInBuffer(predicate, before, after) {
3693
- const index = Number.isInteger(before) ? before : (Number.isInteger(after) ? after : NaN);
3694
- const found = this.context.items.find(item => (predicate && predicate(item.get())) ||
3695
- (Number.isInteger(index) && index === item.$index));
3821
+ const index = Number.isInteger(before) ? before : Number.isInteger(after) ? after : NaN;
3822
+ const found = this.context.items.find(item => (predicate && predicate(item.get())) || (Number.isInteger(index) && index === item.$index));
3696
3823
  if (!found) {
3697
- this.logger.log('no items to insert in buffer; empty predicate\'s result');
3824
+ this.logger.log('no items to insert in buffer; empty predicate result');
3698
3825
  return NaN;
3699
3826
  }
3700
3827
  return found.$index;
@@ -3712,7 +3839,7 @@ class CheckBufferCall {
3712
3839
  }
3713
3840
  const before = direction === Direction.backward;
3714
3841
  if (!(index < firstIndex + (before ? 1 : 0) || index > lastIndex - (before ? 0 : 1))) {
3715
- this.logger.log(() => `no items to insert virtually; selected index (${index}) belongs Buffer [${firstIndex}..${lastIndex}]`);
3842
+ this.logger.log(`no items to insert virtually; selected index (${index}) belongs Buffer [${firstIndex}..${lastIndex}]`);
3716
3843
  return false;
3717
3844
  }
3718
3845
  this.logger.log(() => `going to insert ${items.length} item(s) virtually`);
@@ -3784,7 +3911,8 @@ class Buffer {
3784
3911
  }
3785
3912
  set absMinIndex(value) {
3786
3913
  if (this._absMinIndex !== value) {
3787
- this._absMinIndex = Number.isFinite(this._absMaxIndex) && value > this._absMaxIndex ? this._absMaxIndex : value;
3914
+ this._absMinIndex =
3915
+ Number.isFinite(this._absMaxIndex) && value > this._absMaxIndex ? this._absMaxIndex : value;
3788
3916
  }
3789
3917
  if (!this.pristine) {
3790
3918
  this.checkBOF();
@@ -3795,7 +3923,8 @@ class Buffer {
3795
3923
  }
3796
3924
  set absMaxIndex(value) {
3797
3925
  if (this._absMaxIndex !== value) {
3798
- this._absMaxIndex = Number.isFinite(this._absMinIndex) && value < this._absMinIndex ? this._absMinIndex : value;
3926
+ this._absMaxIndex =
3927
+ Number.isFinite(this._absMinIndex) && value < this._absMinIndex ? this._absMinIndex : value;
3799
3928
  }
3800
3929
  if (!this.pristine) {
3801
3930
  this.checkEOF();
@@ -3807,14 +3936,14 @@ class Buffer {
3807
3936
  checkBOF() {
3808
3937
  // since bof has no setter, need to call checkBOF() on items and absMinIndex change
3809
3938
  const bof = this.items.length
3810
- ? (this.items[0].$index === this.absMinIndex)
3939
+ ? this.items[0].$index === this.absMinIndex
3811
3940
  : isFinite(this.absMinIndex);
3812
3941
  this.bof.set(bof);
3813
3942
  }
3814
3943
  checkEOF() {
3815
3944
  // since eof has no setter, need to call checkEOF() on items and absMaxIndex change
3816
3945
  const eof = this.items.length
3817
- ? (this.items[this.items.length - 1].$index === this.absMaxIndex)
3946
+ ? this.items[this.items.length - 1].$index === this.absMaxIndex
3818
3947
  : isFinite(this.absMaxIndex);
3819
3948
  this.eof.set(eof);
3820
3949
  }
@@ -3908,9 +4037,7 @@ class Buffer {
3908
4037
  let shifted = false;
3909
4038
  for (let i = fixRight ? length - 1 : 0; fixRight ? i >= 0 : i < length; fixRight ? i-- : i++) {
3910
4039
  const item = this.items[i];
3911
- const diff = indexes.reduce((acc, index) => acc + (fixRight
3912
- ? (item.$index < index ? 1 : 0)
3913
- : (item.$index > index ? -1 : 0)), 0);
4040
+ const diff = indexes.reduce((acc, index) => acc + (fixRight ? (item.$index < index ? 1 : 0) : item.$index > index ? -1 : 0), 0);
3914
4041
  shifted = shifted || !!diff;
3915
4042
  item.updateIndex(item.$index + diff);
3916
4043
  }
@@ -3926,7 +4053,7 @@ class Buffer {
3926
4053
  }
3927
4054
  const before = Number.isInteger(beforeIndex);
3928
4055
  const index = (before ? beforeIndex : afterIndex);
3929
- const shift = (fixRight ? items.length : (before ? 1 : 0));
4056
+ const shift = fixRight ? items.length : before ? 1 : 0;
3930
4057
  this.items = items.map((data, i) => generator(index + i + (!before ? 1 : 0) - shift, data));
3931
4058
  this._absMinIndex = this.items[0].$index;
3932
4059
  this._absMaxIndex = this.items[this.size - 1].$index;
@@ -3956,7 +4083,7 @@ class Buffer {
3956
4083
  // if predicate result is falsy or empty array -> delete
3957
4084
  if (!result || (Array.isArray(result) && !result.length)) {
3958
4085
  item.toRemove = true;
3959
- trackedIndex += item.$index >= indexToTrack ? (fixRight ? 1 : 0) : (fixRight ? 0 : -1);
4086
+ trackedIndex += item.$index >= indexToTrack ? (fixRight ? 1 : 0) : fixRight ? 0 : -1;
3960
4087
  this.shiftExtremum(-1, fixRight);
3961
4088
  continue;
3962
4089
  }
@@ -4045,8 +4172,9 @@ class Buffer {
4045
4172
  return index >= 0 ? this.items[index] : void 0;
4046
4173
  }
4047
4174
  getEdgeVisibleItem(direction, opposite) {
4048
- return direction === (!opposite ? Direction.forward : Direction.backward) ?
4049
- this.getLastVisibleItem() : this.getFirstVisibleItem();
4175
+ return direction === (!opposite ? Direction.forward : Direction.backward)
4176
+ ? this.getLastVisibleItem()
4177
+ : this.getFirstVisibleItem();
4050
4178
  }
4051
4179
  getVisibleItemsCount() {
4052
4180
  return this.items.reduce((acc, item) => acc + (item.invisible ? 0 : 1), 0);
@@ -4193,13 +4321,15 @@ class FetchModel {
4193
4321
  return !!this.count;
4194
4322
  }
4195
4323
  get hasNewItems() {
4196
- return !!((this._newItemsData && this._newItemsData.length));
4324
+ return !!(this._newItemsData && this._newItemsData.length);
4197
4325
  }
4198
4326
  get index() {
4199
4327
  return this.first.index;
4200
4328
  }
4201
4329
  get count() {
4202
- return !isNaN(this.first.index) && !isNaN(this.last.index) ? this.last.index - this.first.index + 1 : 0;
4330
+ return !isNaN(this.first.index) && !isNaN(this.last.index)
4331
+ ? this.last.index - this.first.index + 1
4332
+ : 0;
4203
4333
  }
4204
4334
  shouldCheckPreSizeExpectation(lastBufferedIndex) {
4205
4335
  if (this.directionPriority === Direction.backward) {
@@ -4334,10 +4464,12 @@ class State {
4334
4464
  }
4335
4465
  clip.reset(clip.force);
4336
4466
  render.reset();
4337
- return Object.assign({}, (cycle.innerLoop.first ? {
4338
- process: cycle.initiator,
4339
- doRender: fetch.simulate && fetch.items.length > 0
4340
- } : {}));
4467
+ return Object.assign({}, (cycle.innerLoop.first
4468
+ ? {
4469
+ process: cycle.initiator,
4470
+ doRender: fetch.simulate && fetch.items.length > 0
4471
+ }
4472
+ : {}));
4341
4473
  }
4342
4474
  endInnerLoop() {
4343
4475
  const { fetch, clip, render, cycle } = this;
@@ -4415,7 +4547,6 @@ class Adapter {
4415
4547
  this.source = {}; // for Reactive props
4416
4548
  this.box = {}; // for Scalars over Reactive props
4417
4549
  this.demand = {}; // for Scalars on demand
4418
- // eslint-disable-next-line @typescript-eslint/no-unused-vars
4419
4550
  this.setFirstOrLastVisible = (_) => { };
4420
4551
  this.getWorkflow = getWorkflow;
4421
4552
  this.logger = logger;
@@ -4424,7 +4555,7 @@ class Adapter {
4424
4555
  this.reloadCounter = 0;
4425
4556
  const contextId = (context === null || context === void 0 ? void 0 : context.id) || -1;
4426
4557
  // public context (if exists) should provide access to Reactive props config by id
4427
- const reactivePropsStore = context && reactiveConfigStorage.get(context.id) || {};
4558
+ const reactivePropsStore = (context && reactiveConfigStorage.get(context.id)) || {};
4428
4559
  // the Adapter initialization should not trigger "wanted" props setting;
4429
4560
  // after the initialization is completed, "wanted" functionality must be unblocked
4430
4561
  wantedUtils.setBlock(true, contextId);
@@ -4439,7 +4570,7 @@ class Adapter {
4439
4570
  value = reactiveProp.default; // boolean doesn't matter here
4440
4571
  }
4441
4572
  }
4442
- return (Object.assign(Object.assign({}, prop), { value }));
4573
+ return Object.assign(Object.assign({}, prop), { value });
4443
4574
  })
4444
4575
  : getDefaultAdapterProps();
4445
4576
  // restore default reactive props if they were configured
@@ -4471,10 +4602,12 @@ class Adapter {
4471
4602
  // so this method should be called when accessing the "wanted" props through one of the following getters
4472
4603
  const processWanted = (prop) => {
4473
4604
  if (wantedUtils.setBox(prop, contextId)) {
4474
- if ([AdapterPropName.firstVisible, AdapterPropName.firstVisible$].some(n => n === prop.name)) {
4605
+ const firstPropList = [AdapterPropName.firstVisible, AdapterPropName.firstVisible$];
4606
+ const lastPropList = [AdapterPropName.lastVisible, AdapterPropName.lastVisible$];
4607
+ if (firstPropList.some(n => n === prop.name)) {
4475
4608
  this.setFirstOrLastVisible({ first: true });
4476
4609
  }
4477
- else if ([AdapterPropName.lastVisible, AdapterPropName.lastVisible$].some(n => n === prop.name)) {
4610
+ else if (lastPropList.some(n => n === prop.name)) {
4478
4611
  this.setFirstOrLastVisible({ last: true });
4479
4612
  }
4480
4613
  }
@@ -4523,8 +4656,7 @@ class Adapter {
4523
4656
  return;
4524
4657
  }
4525
4658
  // Adapter public context augmentation
4526
- adapterProps
4527
- .forEach((prop) => {
4659
+ adapterProps.forEach((prop) => {
4528
4660
  const { name, type, permanent } = prop;
4529
4661
  let value = this[name];
4530
4662
  if (type === AdapterPropType.Function) {
@@ -4567,23 +4699,23 @@ class Adapter {
4567
4699
  maxIndex: buffer.maxIndex,
4568
4700
  absMinIndex: buffer.absMinIndex,
4569
4701
  absMaxIndex: buffer.absMaxIndex,
4570
- defaultSize: buffer.defaultSize,
4702
+ defaultSize: buffer.defaultSize
4571
4703
  })
4572
4704
  });
4573
4705
  this.bof = buffer.bof.get();
4574
- buffer.bof.on(bof => this.bof = bof);
4706
+ buffer.bof.on(bof => (this.bof = bof));
4575
4707
  this.eof = buffer.eof.get();
4576
- buffer.eof.on(eof => this.eof = eof);
4708
+ buffer.eof.on(eof => (this.eof = eof));
4577
4709
  // state
4578
4710
  Object.defineProperty(this.demand, AdapterPropName.packageInfo, {
4579
4711
  get: () => state.packageInfo
4580
4712
  });
4581
4713
  this.loopPending = state.cycle.innerLoop.busy.get();
4582
- state.cycle.innerLoop.busy.on(busy => this.loopPending = busy);
4714
+ state.cycle.innerLoop.busy.on(busy => (this.loopPending = busy));
4583
4715
  this.isLoading = state.cycle.busy.get();
4584
- state.cycle.busy.on(busy => this.isLoading = busy);
4716
+ state.cycle.busy.on(busy => (this.isLoading = busy));
4585
4717
  this.paused = state.paused.get();
4586
- state.paused.on(paused => this.paused = paused);
4718
+ state.paused.on(paused => (this.paused = paused));
4587
4719
  //viewport
4588
4720
  this.setFirstOrLastVisible = ({ first, last, workflow }) => {
4589
4721
  var _a, _b, _c;
@@ -4654,8 +4786,7 @@ class Adapter {
4654
4786
  resetContext() {
4655
4787
  var _a;
4656
4788
  const reactiveStore = reactiveConfigStorage.get((_a = this.externalContext) === null || _a === void 0 ? void 0 : _a.id);
4657
- ADAPTER_PROPS_STUB
4658
- .forEach(({ type, permanent, name, value }) => {
4789
+ ADAPTER_PROPS_STUB.forEach(({ type, permanent, name, value }) => {
4659
4790
  // assign initial values to non-reactive non-permanent props
4660
4791
  if (type !== AdapterPropType.Reactive && !permanent) {
4661
4792
  Object.defineProperty(this.externalContext, name, {
@@ -4831,12 +4962,12 @@ class Adapter {
4831
4962
  if (!this.init) {
4832
4963
  return Promise.resolve(methodPreResult);
4833
4964
  }
4834
- return this.relaxRun = this.relaxRun
4965
+ return (this.relaxRun = this.relaxRun
4835
4966
  ? this.relaxRun.then(() => this.relaxUnchained(callback, reloadId))
4836
- : this.relaxUnchained(callback, reloadId).then((result) => {
4967
+ : this.relaxUnchained(callback, reloadId).then(result => {
4837
4968
  this.relaxRun = null;
4838
4969
  return result;
4839
- });
4970
+ }));
4840
4971
  }
4841
4972
  showLog() {
4842
4973
  this.logger.logAdapterMethod('showLog');
@@ -4848,7 +4979,7 @@ const INVALID_DATASOURCE_PREFIX = 'Invalid datasource:';
4848
4979
  let instanceCount = 0;
4849
4980
  class Scroller {
4850
4981
  constructor({ datasource, consumer, element, workflow, Routines: CustomRoutines, scroller }) {
4851
- const { params: { get } } = validate(datasource, DATASOURCE);
4982
+ const { get } = validate(datasource, DATASOURCE).params;
4852
4983
  if (!get.isValid) {
4853
4984
  throw new Error(`${INVALID_DATASOURCE_PREFIX} ${get.errors[0]}`);
4854
4985
  }
@@ -4862,7 +4993,8 @@ class Scroller {
4862
4993
  }
4863
4994
  Object.getOwnPropertyNames(CustomRoutines.prototype)
4864
4995
  .filter(method => method !== 'constructor')
4865
- .forEach(method => __Routines.prototype[method] = CustomRoutines === null || CustomRoutines === void 0 ? void 0 : CustomRoutines.prototype[method]);
4996
+ .forEach(method => (__Routines.prototype[method] =
4997
+ CustomRoutines === null || CustomRoutines === void 0 ? void 0 : CustomRoutines.prototype[method]));
4866
4998
  CustomRoutines = __Routines;
4867
4999
  }
4868
5000
  this.workflow = workflow;
@@ -4876,7 +5008,8 @@ class Scroller {
4876
5008
  this.initDatasource(datasource, scroller);
4877
5009
  }
4878
5010
  initDatasource(datasource, scroller) {
4879
- if (scroller) { // scroller re-instantiating case
5011
+ if (scroller) {
5012
+ // scroller re-instantiating case
4880
5013
  this.datasource = datasource;
4881
5014
  this.adapter = scroller.adapter;
4882
5015
  // todo: what about (this.settings.adapter !== scroller.setting.adapter) case?
@@ -4885,10 +5018,12 @@ class Scroller {
4885
5018
  // scroller is being instantiated for the first time
4886
5019
  const constructed = datasource instanceof DatasourceGeneric;
4887
5020
  const mockAdapter = !constructed && !this.settings.adapter;
4888
- if (constructed) { // datasource is already instantiated
5021
+ if (constructed) {
5022
+ // datasource is already instantiated
4889
5023
  this.datasource = datasource;
4890
5024
  }
4891
- else { // datasource as POJO
5025
+ else {
5026
+ // datasource as POJO
4892
5027
  const DS = makeDatasource(() => ({ mock: mockAdapter }));
4893
5028
  this.datasource = new DS(datasource);
4894
5029
  if (this.settings.adapter) {
@@ -4905,20 +5040,21 @@ class Scroller {
4905
5040
  buffer: this.buffer,
4906
5041
  state: this.state,
4907
5042
  viewport: this.viewport,
4908
- logger: this.logger, adapterRun$,
5043
+ logger: this.logger,
5044
+ adapterRun$,
4909
5045
  getWorkflow: () => this.workflow
4910
5046
  });
4911
5047
  }
4912
5048
  dispose(forever) {
4913
5049
  this.logger.log(() => 'disposing scroller' + (forever ? ' (forever)' : ''));
4914
- if (forever) { // Adapter is not re-instantiated on reset
5050
+ if (forever) {
5051
+ // Adapter is not re-instantiated on reset
4915
5052
  this.adapter.dispose();
4916
5053
  }
4917
5054
  this.buffer.dispose();
4918
5055
  this.state.dispose();
4919
5056
  }
4920
- finalize() {
4921
- }
5057
+ finalize() { }
4922
5058
  }
4923
5059
 
4924
5060
  const runStateMachine = ({ input: { process, status, payload = {} }, methods: { run, interrupt, done, onError } }) => {
@@ -4932,7 +5068,8 @@ const runStateMachine = ({ input: { process, status, payload = {} }, methods: {
4932
5068
  const { options } = payload;
4933
5069
  switch (process) {
4934
5070
  case CommonProcess.init:
4935
- if (status === ProcessStatus.start) { // App start
5071
+ if (status === ProcessStatus.start) {
5072
+ // App start
4936
5073
  run(Init)(process);
4937
5074
  }
4938
5075
  if (status === ProcessStatus.next) {
@@ -5151,6 +5288,7 @@ class Workflow {
5151
5288
  this.initTimer = null;
5152
5289
  this.adapterRun$ = new Reactive();
5153
5290
  this.cyclesDone = 0;
5291
+ this.cyclesDone$ = new Reactive(0);
5154
5292
  this.interruptionCount = 0;
5155
5293
  this.errors = [];
5156
5294
  this.offScroll = () => null;
@@ -5162,7 +5300,11 @@ class Workflow {
5162
5300
  onError: this.onError.bind(this)
5163
5301
  };
5164
5302
  this.scroller = new Scroller({
5165
- element, datasource, consumer, workflow: this.getUpdater(), Routines
5303
+ element,
5304
+ datasource,
5305
+ consumer,
5306
+ workflow: this.getUpdater(),
5307
+ Routines
5166
5308
  });
5167
5309
  if (this.scroller.settings.initializeDelay) {
5168
5310
  this.initTimer = setTimeout(() => {
@@ -5214,16 +5356,18 @@ class Workflow {
5214
5356
  getUpdater() {
5215
5357
  return {
5216
5358
  call: this.callWorkflow.bind(this),
5217
- onDataChanged: this.changeItems.bind(this),
5359
+ onDataChanged: this.changeItems.bind(this)
5218
5360
  };
5219
5361
  }
5220
5362
  process(data) {
5221
5363
  const { status, process, payload } = data;
5222
5364
  if (this.scroller.settings.logProcessRun) {
5223
- this.scroller.logger.log(() => [
5224
- '%cfire%c', ...['color: #cc7777;', 'color: #000000;'],
5225
- process, `"${status}"`, ...(payload !== void 0 ? [payload] : [])
5226
- ]);
5365
+ this.scroller.logger.log(() => {
5366
+ const _fire = this.scroller.settings.logColor
5367
+ ? ['%cfire%c', 'color: #cc7777;', 'color: #000000;']
5368
+ : ['fire'];
5369
+ return [..._fire, process, `"${status}"`, ...(payload !== void 0 ? [payload] : [])];
5370
+ });
5227
5371
  }
5228
5372
  this.scroller.logger.logProcess(data);
5229
5373
  if (process === CommonProcess.end) {
@@ -5237,16 +5381,18 @@ class Workflow {
5237
5381
  runProcess() {
5238
5382
  return ({ run, process, name }) => (...args) => {
5239
5383
  if (this.scroller.settings.logProcessRun) {
5240
- this.scroller.logger.log(() => [
5241
- '%crun%c', ...['color: #333399;', 'color: #000000;'],
5242
- process || name, ...args
5243
- ]);
5384
+ this.scroller.logger.log(() => {
5385
+ const _run = this.scroller.settings.logColor
5386
+ ? ['%crun%c', 'color: #333399;', 'color: #000000;']
5387
+ : ['run'];
5388
+ return [..._run, process || name, ...args];
5389
+ });
5244
5390
  }
5245
5391
  run(this.scroller, ...args);
5246
5392
  };
5247
5393
  }
5248
5394
  onError(process, payload) {
5249
- const message = payload && String(payload.error) || '';
5395
+ const message = (payload && String(payload.error)) || '';
5250
5396
  const { time, cycle } = this.scroller.state;
5251
5397
  this.errors.push({
5252
5398
  process,
@@ -5261,14 +5407,14 @@ class Workflow {
5261
5407
  const { workflow, logger } = this.scroller;
5262
5408
  // we are going to create a new reference for the scroller.workflow object
5263
5409
  // calling the old version of the scroller.workflow by any outstanding async processes will be skipped
5264
- workflow.call = (_) => // eslint-disable-line @typescript-eslint/no-unused-vars
5265
- logger.log('[skip wf call]');
5410
+ workflow.call = (_) => logger.log('[skip wf call]');
5266
5411
  workflow.call.interrupted = true;
5267
5412
  this.scroller.workflow = this.getUpdater();
5268
5413
  this.interruptionCount++;
5269
5414
  logger.log(() => `workflow had been interrupted by the ${process} process (${this.interruptionCount})`);
5270
5415
  }
5271
- if (datasource) { // Scroller re-initialization case
5416
+ if (datasource) {
5417
+ // Scroller re-initialization case
5272
5418
  const reInit = () => {
5273
5419
  this.scroller.logger.log('new Scroller instantiation');
5274
5420
  const scroller = new Scroller({ datasource, scroller: this.scroller });
@@ -5288,6 +5434,7 @@ class Workflow {
5288
5434
  done() {
5289
5435
  const { state, logger } = this.scroller;
5290
5436
  this.cyclesDone++;
5437
+ this.cyclesDone$.set(this.cyclesDone);
5291
5438
  logger.logCycle(false);
5292
5439
  state.endWorkflowCycle(this.cyclesDone + 1);
5293
5440
  this.finalize();
@@ -5299,14 +5446,15 @@ class Workflow {
5299
5446
  }
5300
5447
  this.offScroll();
5301
5448
  this.adapterRun$.dispose();
5449
+ this.cyclesDone$.dispose();
5302
5450
  this.scroller.dispose(true);
5303
5451
  Object.getOwnPropertyNames(this).forEach(prop => {
5304
5452
  delete this[prop];
5305
5453
  });
5454
+ this.isInitialized = false;
5306
5455
  this.disposed = true;
5307
5456
  }
5308
- finalize() {
5309
- }
5457
+ finalize() { }
5310
5458
  }
5311
5459
 
5312
5460
  export { AdapterPropName, Direction, EMPTY_ITEM, INVALID_DATASOURCE_PREFIX, Routines, SizeStrategy, Workflow, getDefaultAdapterProps, makeDatasource, core as packageInfo };