vscroll 1.6.0-beta.1 → 1.6.0-beta.2

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 (53) hide show
  1. package/README.md +31 -19
  2. package/dist/bundles/vscroll.esm5.js +103 -47
  3. package/dist/bundles/vscroll.esm5.js.map +1 -1
  4. package/dist/bundles/vscroll.esm5.min.js +2 -2
  5. package/dist/bundles/vscroll.esm5.min.js.map +1 -1
  6. package/dist/bundles/vscroll.esm6.js +74 -25
  7. package/dist/bundles/vscroll.esm6.js.map +1 -1
  8. package/dist/bundles/vscroll.esm6.min.js +2 -2
  9. package/dist/bundles/vscroll.esm6.min.js.map +1 -1
  10. package/dist/bundles/vscroll.umd.js +104 -48
  11. package/dist/bundles/vscroll.umd.js.map +1 -1
  12. package/dist/bundles/vscroll.umd.min.js +2 -2
  13. package/dist/bundles/vscroll.umd.min.js.map +1 -1
  14. package/dist/esm2015/classes/domRoutines.js +6 -2
  15. package/dist/esm2015/classes/domRoutines.js.map +1 -1
  16. package/dist/esm2015/inputs/index.js +2 -1
  17. package/dist/esm2015/inputs/index.js.map +1 -1
  18. package/dist/esm2015/inputs/validation.js +2 -2
  19. package/dist/esm2015/inputs/validation.js.map +1 -1
  20. package/dist/esm2015/inputs/workflow.js +31 -0
  21. package/dist/esm2015/inputs/workflow.js.map +1 -0
  22. package/dist/esm2015/interfaces/routines.js.map +1 -1
  23. package/dist/esm2015/processes/render.js +2 -2
  24. package/dist/esm2015/processes/render.js.map +1 -1
  25. package/dist/esm2015/scroller.js +10 -0
  26. package/dist/esm2015/scroller.js.map +1 -1
  27. package/dist/esm2015/version.js +1 -1
  28. package/dist/esm2015/version.js.map +1 -1
  29. package/dist/esm2015/workflow.js +7 -1
  30. package/dist/esm2015/workflow.js.map +1 -1
  31. package/dist/esm5/classes/domRoutines.js +6 -2
  32. package/dist/esm5/classes/domRoutines.js.map +1 -1
  33. package/dist/esm5/inputs/index.js +2 -1
  34. package/dist/esm5/inputs/index.js.map +1 -1
  35. package/dist/esm5/inputs/validation.js +2 -2
  36. package/dist/esm5/inputs/validation.js.map +1 -1
  37. package/dist/esm5/inputs/workflow.js +32 -0
  38. package/dist/esm5/inputs/workflow.js.map +1 -0
  39. package/dist/esm5/interfaces/routines.js.map +1 -1
  40. package/dist/esm5/processes/render.js +2 -2
  41. package/dist/esm5/processes/render.js.map +1 -1
  42. package/dist/esm5/scroller.js +18 -0
  43. package/dist/esm5/scroller.js.map +1 -1
  44. package/dist/esm5/version.js +1 -1
  45. package/dist/esm5/version.js.map +1 -1
  46. package/dist/esm5/workflow.js +7 -2
  47. package/dist/esm5/workflow.js.map +1 -1
  48. package/dist/typings/classes/domRoutines.d.ts +5 -2
  49. package/dist/typings/inputs/index.d.ts +2 -1
  50. package/dist/typings/inputs/workflow.d.ts +9 -0
  51. package/dist/typings/interfaces/routines.d.ts +13 -3
  52. package/dist/typings/workflow.d.ts +1 -1
  53. package/package.json +1 -1
package/README.md CHANGED
@@ -69,7 +69,7 @@ interface WorkflowParams<ItemData> {
69
69
  element: HTMLElement;
70
70
  datasource: IDatasource<ItemData>;
71
71
  run: OnDataChanged<ItemData>;
72
- Routines?: CustomRoutinesClass;
72
+ Routines?: RoutinesClassType;
73
73
  }
74
74
  ```
75
75
 
@@ -153,7 +153,7 @@ For more solid understanding the concept of the Datasource with examples, please
153
153
  A callback that is called every time the Workflow decides that the UI needs to be changed. Its argument is a list of items to be present in the UI. This is a consumer responsibility to detect changes and display them in the UI.
154
154
 
155
155
  ```js
156
- run: (newItems) => {
156
+ const run = newItems => {
157
157
  // assume oldItems contains a list of items that are currently present in the UI
158
158
  if (!newItems.length && !oldItems.length) {
159
159
  return;
@@ -186,37 +186,49 @@ There are some requirements on how the items should be processed by `run` call:
186
186
 
187
187
  ### 5. Routines
188
188
 
189
- A special class allowing to override the default behavior related to the DOM. All DOM-specific operations are implemented as the [DOM Routines class](https://github.com/dhilt/vscroll/blob/v1.5.0/src/classes/domRoutines.ts) methods inside core. When the `Routines` class setting is passed among the Workflow arguments, its methods override the base class methods. The Routines methods description can be taken from the [IRoutines interface](https://github.com/dhilt/vscroll/blob/v1.5.0/src/interfaces/routines.ts) sources. For example, there is a method that throws an error if its argument is not an HTML element:
189
+ A special class allowing to override the default behavior related to the DOM. All DOM-specific operations are implemented as the [DOM Routines class](https://github.com/dhilt/vscroll/blob/v1.5.0/src/classes/domRoutines.ts) methods inside core. When the `Routines` class setting is passed among the Workflow arguments, it replaces the core Routines. The custom Routines class must extend the core class, which can be taken from the VScroll imports:
190
+
191
+ ```js
192
+ import { Routines, Workflow } from 'vscroll';
193
+
194
+ class CustomRoutines extends Routines { ... }
195
+
196
+ new Workflow({
197
+ // consumer, element, datasource, run,
198
+ Routines: CustomRoutines
199
+ })
200
+ ```
201
+
202
+ The Routines methods description can be taken from the [IRoutines interface](https://github.com/dhilt/vscroll/blob/v1.5.0/src/interfaces/routines.ts) sources. For example, there is a method that calculates the scroller's offset:
190
203
 
191
204
  ```typescript
192
- checkElement(element: HTMLElement): void {
193
- if (!element) {
194
- throw new Error('HTML element is not defined');
195
- }
205
+ getOffset(): number {
206
+ const get = (element: HTMLElement) =>
207
+ (this.settings.horizontal ? element.offsetLeft : element.offsetTop) || 0;
208
+ return get(this.element) - (!this.settings.window ? get(this.viewport) : 0);
196
209
  }
197
210
  ```
198
211
 
199
- With the `Routines` class setting it can be overridden as follows:
212
+ If we have a table layout case where we need to specify the offset of the table header, the base method can be overridden as follows:
200
213
 
201
214
  ```js
202
- new Workflow({
203
- consumer, element, datasource, run,
204
- Routines: class {
205
- checkElement(element) {
206
- if (!element || typeof element.querySelector !== 'function') {
207
- throw new Error('Fatal: expecting HTML element');
208
- }
215
+ new Workflow({
216
+ // consumer, element, datasource, run,
217
+ Routines: class extends Routines {
218
+ getOffset(element) {
219
+ return document.querySelector('#viewport thead')?.offsetHeight || 0;
209
220
  }
210
221
  }
211
222
  });
212
223
  ```
213
224
 
214
- Another example is the table layout case where we need to specify the offset of the table header:
225
+ It's worth noting that thanks to the extending, we can use parent methods and have access to the correct context after the engine instantiates the Routines:
215
226
 
216
227
  ```js
217
- const Routines = class {
218
- getOffset() {
219
- return document.querySelector('#viewport thead')?.offsetHeight || 0;
228
+ class CustomRoutines extends Routines {
229
+ onInit(...args) {
230
+ console.log('Routines settings:', this.settings);
231
+ super.onInit(...args);
220
232
  }
221
233
  }
222
234
  ```
@@ -1,6 +1,6 @@
1
1
  /**
2
2
  * vscroll (https://github.com/dhilt/vscroll) FESM5
3
- * Version: 1.6.0-beta.1 (2023-11-26T02:11:26.673Z)
3
+ * Version: 1.6.0-beta.2 (2023-12-02T15:09:23.845Z)
4
4
  * Author: Denis Hilt
5
5
  * License: MIT
6
6
  */
@@ -345,7 +345,7 @@ var reactiveConfigStorage = new Map();
345
345
 
346
346
  var core = {
347
347
  name: 'vscroll',
348
- version: '1.6.0-beta.1'
348
+ version: '1.6.0-beta.2'
349
349
  };
350
350
 
351
351
  var getBox = function (id) {
@@ -554,14 +554,14 @@ var onBoolean = function (value) {
554
554
  };
555
555
  var onObject = function (value) {
556
556
  var errors = [];
557
- if (Object.prototype.toString.call(value) !== '[object Object]') {
557
+ if (!value || Object.prototype.toString.call(value) !== '[object Object]') {
558
558
  errors.push(ValidatorType.object);
559
559
  }
560
560
  return { value: value, isSet: true, isValid: !errors.length, errors: errors };
561
561
  };
562
562
  var onHtmlElement = function (value) {
563
563
  var errors = [];
564
- if (!(value instanceof Element) && !(value instanceof HTMLDocument)) {
564
+ if (!(value instanceof Element) && !(value instanceof Document)) {
565
565
  errors.push(ValidatorType.element);
566
566
  }
567
567
  return { value: value, isSet: true, isValid: !errors.length, errors: errors };
@@ -854,29 +854,29 @@ var validate = function (context, params) {
854
854
  return data;
855
855
  };
856
856
 
857
- var _a$3;
858
- var OBJECT$1 = VALIDATORS.OBJECT, FUNC_WITH_X_AND_MORE_ARGUMENTS$1 = VALIDATORS.FUNC_WITH_X_AND_MORE_ARGUMENTS;
857
+ var _a$4;
858
+ var OBJECT$2 = VALIDATORS.OBJECT, FUNC_WITH_X_AND_MORE_ARGUMENTS$1 = VALIDATORS.FUNC_WITH_X_AND_MORE_ARGUMENTS;
859
859
  var DatasourceProps;
860
860
  (function (DatasourceProps) {
861
861
  DatasourceProps["get"] = "get";
862
862
  DatasourceProps["settings"] = "settings";
863
863
  DatasourceProps["devSettings"] = "devSettings";
864
864
  })(DatasourceProps || (DatasourceProps = {}));
865
- var DATASOURCE = (_a$3 = {},
866
- _a$3[DatasourceProps.get] = {
865
+ var DATASOURCE = (_a$4 = {},
866
+ _a$4[DatasourceProps.get] = {
867
867
  validators: [FUNC_WITH_X_AND_MORE_ARGUMENTS$1(2)],
868
868
  mandatory: true
869
869
  },
870
- _a$3[DatasourceProps.settings] = {
871
- validators: [OBJECT$1]
870
+ _a$4[DatasourceProps.settings] = {
871
+ validators: [OBJECT$2]
872
872
  },
873
- _a$3[DatasourceProps.devSettings] = {
874
- validators: [OBJECT$1]
873
+ _a$4[DatasourceProps.devSettings] = {
874
+ validators: [OBJECT$2]
875
875
  },
876
- _a$3);
876
+ _a$4);
877
877
 
878
- var _a$2, _b$2, _c$1;
879
- var NUMBER = VALIDATORS.NUMBER, INTEGER$1 = VALIDATORS.INTEGER, INTEGER_UNLIMITED$1 = VALIDATORS.INTEGER_UNLIMITED, MORE_OR_EQUAL = VALIDATORS.MORE_OR_EQUAL, BOOLEAN$1 = VALIDATORS.BOOLEAN, ELEMENT = VALIDATORS.ELEMENT, FUNC = VALIDATORS.FUNC, OR$1 = VALIDATORS.OR, ENUM = VALIDATORS.ENUM;
878
+ var _a$3, _b$2, _c$1;
879
+ var NUMBER = VALIDATORS.NUMBER, INTEGER$1 = VALIDATORS.INTEGER, INTEGER_UNLIMITED$1 = VALIDATORS.INTEGER_UNLIMITED, MORE_OR_EQUAL = VALIDATORS.MORE_OR_EQUAL, BOOLEAN$1 = VALIDATORS.BOOLEAN, ELEMENT$1 = VALIDATORS.ELEMENT, FUNC$1 = VALIDATORS.FUNC, OR$1 = VALIDATORS.OR, ENUM = VALIDATORS.ENUM;
880
880
  var Settings$1;
881
881
  (function (Settings) {
882
882
  Settings["adapter"] = "adapter";
@@ -908,14 +908,14 @@ var DevSettings;
908
908
  DevSettings["dismissOverflowAnchor"] = "dismissOverflowAnchor";
909
909
  DevSettings["directionPriority"] = "directionPriority";
910
910
  })(DevSettings || (DevSettings = {}));
911
- var MIN = (_a$2 = {},
912
- _a$2[Settings$1.itemSize] = 1,
913
- _a$2[Settings$1.bufferSize] = 1,
914
- _a$2[Settings$1.padding] = 0.01,
915
- _a$2[DevSettings.throttle] = 0,
916
- _a$2[DevSettings.initDelay] = 0,
917
- _a$2[DevSettings.initWindowDelay] = 0,
918
- _a$2);
911
+ var MIN = (_a$3 = {},
912
+ _a$3[Settings$1.itemSize] = 1,
913
+ _a$3[Settings$1.bufferSize] = 1,
914
+ _a$3[Settings$1.padding] = 0.01,
915
+ _a$3[DevSettings.throttle] = 0,
916
+ _a$3[DevSettings.initDelay] = 0,
917
+ _a$3[DevSettings.initWindowDelay] = 0,
918
+ _a$3);
919
919
  var SETTINGS = (_b$2 = {},
920
920
  _b$2[Settings$1.adapter] = {
921
921
  validators: [BOOLEAN$1],
@@ -958,7 +958,7 @@ var SETTINGS = (_b$2 = {},
958
958
  defaultValue: false
959
959
  },
960
960
  _b$2[Settings$1.viewportElement] = {
961
- validators: [OR$1([ELEMENT, FUNC])],
961
+ validators: [OR$1([ELEMENT$1, FUNC$1])],
962
962
  defaultValue: null
963
963
  },
964
964
  _b$2[Settings$1.inverse] = {
@@ -966,7 +966,7 @@ var SETTINGS = (_b$2 = {},
966
966
  defaultValue: false
967
967
  },
968
968
  _b$2[Settings$1.onBeforeClip] = {
969
- validators: [FUNC],
969
+ validators: [FUNC$1],
970
970
  defaultValue: null
971
971
  },
972
972
  _b$2[Settings$1.sizeStrategy] = {
@@ -1057,23 +1057,23 @@ var ProcessStatus;
1057
1057
  ProcessStatus["error"] = "error";
1058
1058
  })(ProcessStatus || (ProcessStatus = {}));
1059
1059
 
1060
- var _a$1, _b$1, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m;
1061
- var INTEGER = VALIDATORS.INTEGER, INTEGER_UNLIMITED = VALIDATORS.INTEGER_UNLIMITED, BOOLEAN = VALIDATORS.BOOLEAN, OBJECT = VALIDATORS.OBJECT, ITEM_LIST = VALIDATORS.ITEM_LIST, FUNC_WITH_X_ARGUMENTS = VALIDATORS.FUNC_WITH_X_ARGUMENTS, FUNC_WITH_X_AND_MORE_ARGUMENTS = VALIDATORS.FUNC_WITH_X_AND_MORE_ARGUMENTS, FUNC_WITH_X_TO_Y_ARGUMENTS = VALIDATORS.FUNC_WITH_X_TO_Y_ARGUMENTS, ONE_OF_MUST = VALIDATORS.ONE_OF_MUST, ONE_OF_CAN = VALIDATORS.ONE_OF_CAN, OR = VALIDATORS.OR;
1060
+ var _a$2, _b$1, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m;
1061
+ var INTEGER = VALIDATORS.INTEGER, INTEGER_UNLIMITED = VALIDATORS.INTEGER_UNLIMITED, BOOLEAN = VALIDATORS.BOOLEAN, OBJECT$1 = VALIDATORS.OBJECT, ITEM_LIST = VALIDATORS.ITEM_LIST, FUNC_WITH_X_ARGUMENTS$1 = VALIDATORS.FUNC_WITH_X_ARGUMENTS, FUNC_WITH_X_AND_MORE_ARGUMENTS = VALIDATORS.FUNC_WITH_X_AND_MORE_ARGUMENTS, FUNC_WITH_X_TO_Y_ARGUMENTS = VALIDATORS.FUNC_WITH_X_TO_Y_ARGUMENTS, ONE_OF_MUST = VALIDATORS.ONE_OF_MUST, ONE_OF_CAN = VALIDATORS.ONE_OF_CAN, OR = VALIDATORS.OR;
1062
1062
  var AdapterNoParams;
1063
1063
  (function (AdapterNoParams) {
1064
1064
  })(AdapterNoParams || (AdapterNoParams = {}));
1065
1065
  var NO_METHOD_PARAMS = {};
1066
- var RESET_METHOD_PARAMS = (_a$1 = {},
1067
- _a$1[DatasourceProps.get] = {
1066
+ var RESET_METHOD_PARAMS = (_a$2 = {},
1067
+ _a$2[DatasourceProps.get] = {
1068
1068
  validators: [FUNC_WITH_X_AND_MORE_ARGUMENTS(2)]
1069
1069
  },
1070
- _a$1[DatasourceProps.settings] = {
1071
- validators: [OBJECT]
1070
+ _a$2[DatasourceProps.settings] = {
1071
+ validators: [OBJECT$1]
1072
1072
  },
1073
- _a$1[DatasourceProps.devSettings] = {
1074
- validators: [OBJECT]
1073
+ _a$2[DatasourceProps.devSettings] = {
1074
+ validators: [OBJECT$1]
1075
1075
  },
1076
- _a$1);
1076
+ _a$2);
1077
1077
  var AdapterReloadParams;
1078
1078
  (function (AdapterReloadParams) {
1079
1079
  AdapterReloadParams["reloadIndex"] = "reloadIndex";
@@ -1131,7 +1131,7 @@ var AdapterRemoveParams;
1131
1131
  })(AdapterRemoveParams || (AdapterRemoveParams = {}));
1132
1132
  var REMOVE_METHOD_PARAMS = (_e = {},
1133
1133
  _e[AdapterRemoveParams.predicate] = {
1134
- validators: [FUNC_WITH_X_ARGUMENTS(1), ONE_OF_MUST([AdapterRemoveParams.indexes])]
1134
+ validators: [FUNC_WITH_X_ARGUMENTS$1(1), ONE_OF_MUST([AdapterRemoveParams.indexes])]
1135
1135
  },
1136
1136
  _e[AdapterRemoveParams.indexes] = {
1137
1137
  validators: [ITEM_LIST, ONE_OF_MUST([AdapterRemoveParams.predicate])]
@@ -1171,12 +1171,12 @@ var INSERT_METHOD_PARAMS = (_g = {},
1171
1171
  mandatory: true
1172
1172
  },
1173
1173
  _g[AdapterInsertParams.before] = {
1174
- validators: [FUNC_WITH_X_ARGUMENTS(1), ONE_OF_MUST([
1174
+ validators: [FUNC_WITH_X_ARGUMENTS$1(1), ONE_OF_MUST([
1175
1175
  AdapterInsertParams.after, AdapterInsertParams.beforeIndex, AdapterInsertParams.afterIndex
1176
1176
  ])]
1177
1177
  },
1178
1178
  _g[AdapterInsertParams.after] = {
1179
- validators: [FUNC_WITH_X_ARGUMENTS(1), ONE_OF_MUST([
1179
+ validators: [FUNC_WITH_X_ARGUMENTS$1(1), ONE_OF_MUST([
1180
1180
  AdapterInsertParams.before, AdapterInsertParams.beforeIndex, AdapterInsertParams.afterIndex
1181
1181
  ])]
1182
1182
  },
@@ -1207,7 +1207,7 @@ var REPLACE_METHOD_PARAMS = (_h = {},
1207
1207
  mandatory: true
1208
1208
  },
1209
1209
  _h[AdapterReplaceParams.predicate] = {
1210
- validators: [FUNC_WITH_X_ARGUMENTS(1)],
1210
+ validators: [FUNC_WITH_X_ARGUMENTS$1(1)],
1211
1211
  mandatory: true
1212
1212
  },
1213
1213
  _h[AdapterReplaceParams.fixRight] = {
@@ -1222,7 +1222,7 @@ var AdapterUpdateParams;
1222
1222
  })(AdapterUpdateParams || (AdapterUpdateParams = {}));
1223
1223
  var UPDATE_METHOD_PARAMS = (_j = {},
1224
1224
  _j[AdapterUpdateParams.predicate] = {
1225
- validators: [FUNC_WITH_X_ARGUMENTS(1)],
1225
+ validators: [FUNC_WITH_X_ARGUMENTS$1(1)],
1226
1226
  mandatory: true
1227
1227
  },
1228
1228
  _j[AdapterUpdateParams.fixRight] = {
@@ -1253,10 +1253,10 @@ var FIX_METHOD_PARAMS = (_k = {},
1253
1253
  validators: [FUNC_WITH_X_TO_Y_ARGUMENTS(1, 2)]
1254
1254
  },
1255
1255
  _k[AdapterFixParams.scrollToItem] = {
1256
- validators: [FUNC_WITH_X_ARGUMENTS(1)]
1256
+ validators: [FUNC_WITH_X_ARGUMENTS$1(1)]
1257
1257
  },
1258
1258
  _k[AdapterFixParams.scrollToItemOpt] = {
1259
- validators: [OR([BOOLEAN, OBJECT])]
1259
+ validators: [OR([BOOLEAN, OBJECT$1])]
1260
1260
  },
1261
1261
  _k);
1262
1262
  var AdapterMethods = (_l = {},
@@ -1286,6 +1286,37 @@ var ADAPTER_METHODS = (_m = {},
1286
1286
  _m[AdapterProcess.fix] = FIX_METHOD_PARAMS,
1287
1287
  _m);
1288
1288
 
1289
+ var _a$1;
1290
+ var ELEMENT = VALIDATORS.ELEMENT, OBJECT = VALIDATORS.OBJECT, FUNC = VALIDATORS.FUNC, FUNC_WITH_X_ARGUMENTS = VALIDATORS.FUNC_WITH_X_ARGUMENTS;
1291
+ var WorkflowProps;
1292
+ (function (WorkflowProps) {
1293
+ WorkflowProps["consumer"] = "consumer";
1294
+ WorkflowProps["element"] = "element";
1295
+ WorkflowProps["datasource"] = "datasource";
1296
+ WorkflowProps["run"] = "run";
1297
+ WorkflowProps["Routines"] = "Routines";
1298
+ })(WorkflowProps || (WorkflowProps = {}));
1299
+ var WORKFLOW = (_a$1 = {},
1300
+ _a$1[WorkflowProps.consumer] = {
1301
+ validators: [OBJECT]
1302
+ },
1303
+ _a$1[WorkflowProps.element] = {
1304
+ validators: [ELEMENT],
1305
+ mandatory: true
1306
+ },
1307
+ _a$1[WorkflowProps.datasource] = {
1308
+ validators: [OBJECT],
1309
+ mandatory: true
1310
+ },
1311
+ _a$1[WorkflowProps.run] = {
1312
+ validators: [FUNC_WITH_X_ARGUMENTS(1)],
1313
+ mandatory: true
1314
+ },
1315
+ _a$1[WorkflowProps.Routines] = {
1316
+ validators: [FUNC]
1317
+ },
1318
+ _a$1);
1319
+
1289
1320
  var Settings = /** @class */ (function () {
1290
1321
  function Settings(settings, devSettings, instanceIndex) {
1291
1322
  this.parseInput(settings, SETTINGS);
@@ -2536,7 +2567,7 @@ var Render = /** @class */ (function (_super) {
2536
2567
  return _super !== null && _super.apply(this, arguments) || this;
2537
2568
  }
2538
2569
  Render.run = function (scroller) {
2539
- var workflow = scroller.workflow, _a = scroller.state, cycle = _a.cycle, render = _a.render, scroll = _a.scroll, viewport = scroller.viewport, routines = scroller.routines;
2570
+ var workflow = scroller.workflow, _a = scroller.state, cycle = _a.cycle, render = _a.render, scroll = _a.scroll, fetch = _a.fetch, viewport = scroller.viewport, routines = scroller.routines;
2540
2571
  scroller.logger.stat('before new items render');
2541
2572
  if (scroll.positionBeforeAsync === null) {
2542
2573
  scroll.positionBeforeAsync = viewport.scrollPosition;
@@ -2557,7 +2588,7 @@ var Render = /** @class */ (function (_super) {
2557
2588
  payload: { error: 'Can\'t associate item with element' }
2558
2589
  });
2559
2590
  }
2560
- });
2591
+ }, { items: fetch.items.map(function (i) { return i.get(); }) });
2561
2592
  };
2562
2593
  Render.doRender = function (scroller) {
2563
2594
  var _a = scroller.state, fetch = _a.fetch, render = _a.render, viewport = scroller.viewport, buffer = scroller.buffer, logger = scroller.logger;
@@ -3187,7 +3218,7 @@ var Routines = /** @class */ (function () {
3187
3218
  return parent;
3188
3219
  };
3189
3220
  Routines.prototype.onInit = function (settings) {
3190
- console.log('routines on-init');
3221
+ console.log('routines on-init (original)');
3191
3222
  if (settings.windowViewport) {
3192
3223
  if ('scrollRestoration' in history) {
3193
3224
  history.scrollRestoration = 'manual';
@@ -3207,6 +3238,9 @@ var Routines = /** @class */ (function () {
3207
3238
  Routines.prototype.findItemElement = function (id) {
3208
3239
  return this.findElementBySelector(this.element, "[data-sid=\"".concat(id, "\"]"));
3209
3240
  };
3241
+ Routines.prototype.findItemChildBySelector = function (id, selector) {
3242
+ return this.findElementBySelector(this.element, "[data-sid=\"".concat(id, "\"] ").concat(selector));
3243
+ };
3210
3244
  Routines.prototype.getScrollPosition = function () {
3211
3245
  if (this.settings.window) {
3212
3246
  return this.settings.horizontal ? window.pageXOffset : window.pageYOffset;
@@ -3302,7 +3336,8 @@ var Routines = /** @class */ (function () {
3302
3336
  this.checkElement(element);
3303
3337
  element.scrollIntoView(argument);
3304
3338
  };
3305
- Routines.prototype.render = function (cb) {
3339
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
3340
+ Routines.prototype.render = function (cb, params) {
3306
3341
  var timeoutId = setTimeout(function () { return cb(); });
3307
3342
  return function () { return clearTimeout(timeoutId); };
3308
3343
  };
@@ -5195,6 +5230,23 @@ var Scroller = /** @class */ (function () {
5195
5230
  var packageInfo = scroller ? scroller.state.packageInfo : { consumer: consumer, core: core };
5196
5231
  element = scroller ? scroller.routines.element : element;
5197
5232
  workflow = scroller ? scroller.workflow : workflow;
5233
+ // In general, custom Routines must extend the original Routines. If not, we provide implicit extending.
5234
+ // This is undocumented feature. It should be removed in vscroll v2.
5235
+ if (CustomRoutines && !(CustomRoutines.prototype instanceof Routines)) {
5236
+ var __Routines_1 = /** @class */ (function (_super) {
5237
+ __extends(__Routines, _super);
5238
+ function __Routines() {
5239
+ return _super !== null && _super.apply(this, arguments) || this;
5240
+ }
5241
+ return __Routines;
5242
+ }(Routines));
5243
+ Object.getOwnPropertyNames(CustomRoutines.prototype)
5244
+ .filter(function (method) { return method !== 'constructor'; })
5245
+ .forEach(function (method) {
5246
+ return __Routines_1.prototype[method] = CustomRoutines === null || CustomRoutines === void 0 ? void 0 : CustomRoutines.prototype[method];
5247
+ });
5248
+ CustomRoutines = __Routines_1;
5249
+ }
5198
5250
  this.workflow = workflow;
5199
5251
  this.settings = new Settings(datasource.settings, datasource.devSettings, ++instanceCount);
5200
5252
  this.logger = new Logger(this, packageInfo, datasource.adapter);
@@ -5467,9 +5519,13 @@ var runStateMachine = function (_a) {
5467
5519
  };
5468
5520
 
5469
5521
  var Workflow = /** @class */ (function () {
5470
- function Workflow(_a) {
5471
- var element = _a.element, datasource = _a.datasource, consumer = _a.consumer, run = _a.run, Routines = _a.Routines;
5522
+ function Workflow(params) {
5472
5523
  var _this = this;
5524
+ var element = params.element, datasource = params.datasource, consumer = params.consumer, run = params.run, Routines = params.Routines;
5525
+ var validationResult = validate(params, WORKFLOW);
5526
+ if (!validationResult.isValid) {
5527
+ throw new Error("Invalid Workflow params: ".concat(validationResult.errors.join(', '), "."));
5528
+ }
5473
5529
  this.isInitialized = false;
5474
5530
  this.disposed = false;
5475
5531
  this.initTimer = null;