vscroll 1.6.3 → 1.7.0

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 (315) hide show
  1. package/dist/bundles/vscroll.esm5.js +5704 -5705
  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 +5193 -5194
  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 +5712 -5714
  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 +43 -43
  14. package/dist/esm2015/classes/adapter/context.js.map +1 -1
  15. package/dist/esm2015/classes/adapter/props.js +300 -300
  16. package/dist/esm2015/classes/adapter/wanted.js +28 -28
  17. package/dist/esm2015/classes/adapter/wanted.js.map +1 -1
  18. package/dist/esm2015/classes/adapter.js +487 -487
  19. package/dist/esm2015/classes/adapter.js.map +1 -1
  20. package/dist/esm2015/classes/buffer/cache.js +246 -246
  21. package/dist/esm2015/classes/buffer/cache.js.map +1 -1
  22. package/dist/esm2015/classes/buffer/checkCall.js +48 -48
  23. package/dist/esm2015/classes/buffer/checkCall.js.map +1 -1
  24. package/dist/esm2015/classes/buffer/defaultSize.js +127 -127
  25. package/dist/esm2015/classes/buffer/defaultSize.js.map +1 -1
  26. package/dist/esm2015/classes/buffer.js +342 -342
  27. package/dist/esm2015/classes/buffer.js.map +1 -1
  28. package/dist/esm2015/classes/datasource.js +23 -24
  29. package/dist/esm2015/classes/datasource.js.map +1 -1
  30. package/dist/esm2015/classes/domRoutines.js +160 -160
  31. package/dist/esm2015/classes/domRoutines.js.map +1 -1
  32. package/dist/esm2015/classes/item.js +61 -61
  33. package/dist/esm2015/classes/item.js.map +1 -1
  34. package/dist/esm2015/classes/logger.js +186 -186
  35. package/dist/esm2015/classes/logger.js.map +1 -1
  36. package/dist/esm2015/classes/paddings.js +72 -72
  37. package/dist/esm2015/classes/paddings.js.map +1 -1
  38. package/dist/esm2015/classes/reactive.js +54 -54
  39. package/dist/esm2015/classes/reactive.js.map +1 -1
  40. package/dist/esm2015/classes/settings.js +39 -39
  41. package/dist/esm2015/classes/settings.js.map +1 -1
  42. package/dist/esm2015/classes/state/clip.js +16 -16
  43. package/dist/esm2015/classes/state/clip.js.map +1 -1
  44. package/dist/esm2015/classes/state/cycle.js +60 -60
  45. package/dist/esm2015/classes/state/cycle.js.map +1 -1
  46. package/dist/esm2015/classes/state/fetch.js +122 -122
  47. package/dist/esm2015/classes/state/fetch.js.map +1 -1
  48. package/dist/esm2015/classes/state/render.js +14 -14
  49. package/dist/esm2015/classes/state/scroll.js +30 -30
  50. package/dist/esm2015/classes/state/scroll.js.map +1 -1
  51. package/dist/esm2015/classes/state.js +62 -62
  52. package/dist/esm2015/classes/state.js.map +1 -1
  53. package/dist/esm2015/classes/viewport.js +72 -72
  54. package/dist/esm2015/classes/viewport.js.map +1 -1
  55. package/dist/esm2015/index.js +9 -9
  56. package/dist/esm2015/inputs/adapter.js +242 -242
  57. package/dist/esm2015/inputs/common.js +11 -11
  58. package/dist/esm2015/inputs/datasource.js +20 -20
  59. package/dist/esm2015/inputs/index.js +7 -7
  60. package/dist/esm2015/inputs/settings.js +146 -146
  61. package/dist/esm2015/inputs/validation.js +371 -374
  62. package/dist/esm2015/inputs/validation.js.map +1 -1
  63. package/dist/esm2015/inputs/workflow.js +30 -30
  64. package/dist/esm2015/interfaces/adapter.js +1 -1
  65. package/dist/esm2015/interfaces/datasource.js +1 -1
  66. package/dist/esm2015/interfaces/index.js +1 -1
  67. package/dist/esm2015/interfaces/item.js +1 -1
  68. package/dist/esm2015/interfaces/process.js +1 -1
  69. package/dist/esm2015/interfaces/process.js.map +1 -1
  70. package/dist/esm2015/interfaces/routines.js +1 -1
  71. package/dist/esm2015/interfaces/settings.js +1 -1
  72. package/dist/esm2015/interfaces/state.js +1 -1
  73. package/dist/esm2015/interfaces/validation.js +1 -1
  74. package/dist/esm2015/interfaces/workflow.js +1 -1
  75. package/dist/esm2015/processes/adapter/append.js +36 -36
  76. package/dist/esm2015/processes/adapter/append.js.map +1 -1
  77. package/dist/esm2015/processes/adapter/check.js +32 -32
  78. package/dist/esm2015/processes/adapter/check.js.map +1 -1
  79. package/dist/esm2015/processes/adapter/clip.js +12 -12
  80. package/dist/esm2015/processes/adapter/fix.js +77 -77
  81. package/dist/esm2015/processes/adapter/fix.js.map +1 -1
  82. package/dist/esm2015/processes/adapter/insert.js +73 -73
  83. package/dist/esm2015/processes/adapter/insert.js.map +1 -1
  84. package/dist/esm2015/processes/adapter/pause.js +22 -22
  85. package/dist/esm2015/processes/adapter/pause.js.map +1 -1
  86. package/dist/esm2015/processes/adapter/reload.js +19 -19
  87. package/dist/esm2015/processes/adapter/reload.js.map +1 -1
  88. package/dist/esm2015/processes/adapter/remove.js +102 -102
  89. package/dist/esm2015/processes/adapter/remove.js.map +1 -1
  90. package/dist/esm2015/processes/adapter/replace.js +39 -39
  91. package/dist/esm2015/processes/adapter/replace.js.map +1 -1
  92. package/dist/esm2015/processes/adapter/reset.js +35 -35
  93. package/dist/esm2015/processes/adapter/reset.js.map +1 -1
  94. package/dist/esm2015/processes/adapter/update.js +43 -43
  95. package/dist/esm2015/processes/adapter/update.js.map +1 -1
  96. package/dist/esm2015/processes/adjust.js +141 -141
  97. package/dist/esm2015/processes/adjust.js.map +1 -1
  98. package/dist/esm2015/processes/clip.js +49 -49
  99. package/dist/esm2015/processes/clip.js.map +1 -1
  100. package/dist/esm2015/processes/end.js +52 -52
  101. package/dist/esm2015/processes/end.js.map +1 -1
  102. package/dist/esm2015/processes/fetch.js +91 -91
  103. package/dist/esm2015/processes/fetch.js.map +1 -1
  104. package/dist/esm2015/processes/index.js +24 -24
  105. package/dist/esm2015/processes/init.js +14 -14
  106. package/dist/esm2015/processes/misc/base.js +30 -30
  107. package/dist/esm2015/processes/misc/base.js.map +1 -1
  108. package/dist/esm2015/processes/misc/enums.js +36 -36
  109. package/dist/esm2015/processes/misc/index.js +2 -2
  110. package/dist/esm2015/processes/postFetch.js +65 -65
  111. package/dist/esm2015/processes/postFetch.js.map +1 -1
  112. package/dist/esm2015/processes/preClip.js +85 -85
  113. package/dist/esm2015/processes/preClip.js.map +1 -1
  114. package/dist/esm2015/processes/preFetch.js +240 -240
  115. package/dist/esm2015/processes/preFetch.js.map +1 -1
  116. package/dist/esm2015/processes/render.js +54 -54
  117. package/dist/esm2015/processes/render.js.map +1 -1
  118. package/dist/esm2015/processes/scroll.js +97 -97
  119. package/dist/esm2015/processes/scroll.js.map +1 -1
  120. package/dist/esm2015/processes/start.js +11 -11
  121. package/dist/esm2015/scroller.js +86 -86
  122. package/dist/esm2015/scroller.js.map +1 -1
  123. package/dist/esm2015/version.js +4 -4
  124. package/dist/esm2015/version.js.map +1 -1
  125. package/dist/esm2015/workflow-transducer.js +218 -218
  126. package/dist/esm2015/workflow-transducer.js.map +1 -1
  127. package/dist/esm2015/workflow.js +174 -174
  128. package/dist/esm2015/workflow.js.map +1 -1
  129. package/dist/esm5/classes/adapter/context.js +50 -50
  130. package/dist/esm5/classes/adapter/context.js.map +1 -1
  131. package/dist/esm5/classes/adapter/props.js +300 -300
  132. package/dist/esm5/classes/adapter/wanted.js +29 -29
  133. package/dist/esm5/classes/adapter/wanted.js.map +1 -1
  134. package/dist/esm5/classes/adapter.js +535 -535
  135. package/dist/esm5/classes/adapter.js.map +1 -1
  136. package/dist/esm5/classes/buffer/cache.js +260 -260
  137. package/dist/esm5/classes/buffer/cache.js.map +1 -1
  138. package/dist/esm5/classes/buffer/checkCall.js +56 -56
  139. package/dist/esm5/classes/buffer/checkCall.js.map +1 -1
  140. package/dist/esm5/classes/buffer/defaultSize.js +145 -145
  141. package/dist/esm5/classes/buffer/defaultSize.js.map +1 -1
  142. package/dist/esm5/classes/buffer.js +409 -409
  143. package/dist/esm5/classes/buffer.js.map +1 -1
  144. package/dist/esm5/classes/datasource.js +30 -31
  145. package/dist/esm5/classes/datasource.js.map +1 -1
  146. package/dist/esm5/classes/domRoutines.js +165 -165
  147. package/dist/esm5/classes/domRoutines.js.map +1 -1
  148. package/dist/esm5/classes/item.js +76 -76
  149. package/dist/esm5/classes/item.js.map +1 -1
  150. package/dist/esm5/classes/logger.js +210 -210
  151. package/dist/esm5/classes/logger.js.map +1 -1
  152. package/dist/esm5/classes/paddings.js +80 -80
  153. package/dist/esm5/classes/paddings.js.map +1 -1
  154. package/dist/esm5/classes/reactive.js +69 -69
  155. package/dist/esm5/classes/reactive.js.map +1 -1
  156. package/dist/esm5/classes/settings.js +47 -47
  157. package/dist/esm5/classes/settings.js.map +1 -1
  158. package/dist/esm5/classes/state/clip.js +22 -22
  159. package/dist/esm5/classes/state/clip.js.map +1 -1
  160. package/dist/esm5/classes/state/cycle.js +75 -75
  161. package/dist/esm5/classes/state/cycle.js.map +1 -1
  162. package/dist/esm5/classes/state/fetch.js +148 -148
  163. package/dist/esm5/classes/state/fetch.js.map +1 -1
  164. package/dist/esm5/classes/state/render.js +20 -20
  165. package/dist/esm5/classes/state/scroll.js +32 -32
  166. package/dist/esm5/classes/state/scroll.js.map +1 -1
  167. package/dist/esm5/classes/state.js +69 -69
  168. package/dist/esm5/classes/state.js.map +1 -1
  169. package/dist/esm5/classes/viewport.js +79 -79
  170. package/dist/esm5/classes/viewport.js.map +1 -1
  171. package/dist/esm5/index.js +9 -9
  172. package/dist/esm5/inputs/adapter.js +243 -243
  173. package/dist/esm5/inputs/common.js +11 -11
  174. package/dist/esm5/inputs/datasource.js +21 -21
  175. package/dist/esm5/inputs/index.js +7 -7
  176. package/dist/esm5/inputs/settings.js +147 -147
  177. package/dist/esm5/inputs/validation.js +393 -396
  178. package/dist/esm5/inputs/validation.js.map +1 -1
  179. package/dist/esm5/inputs/workflow.js +31 -31
  180. package/dist/esm5/interfaces/adapter.js +1 -1
  181. package/dist/esm5/interfaces/datasource.js +1 -1
  182. package/dist/esm5/interfaces/index.js +1 -1
  183. package/dist/esm5/interfaces/item.js +1 -1
  184. package/dist/esm5/interfaces/process.js +1 -1
  185. package/dist/esm5/interfaces/process.js.map +1 -1
  186. package/dist/esm5/interfaces/routines.js +1 -1
  187. package/dist/esm5/interfaces/settings.js +1 -1
  188. package/dist/esm5/interfaces/state.js +1 -1
  189. package/dist/esm5/interfaces/validation.js +1 -1
  190. package/dist/esm5/interfaces/workflow.js +1 -1
  191. package/dist/esm5/processes/adapter/append.js +44 -44
  192. package/dist/esm5/processes/adapter/append.js.map +1 -1
  193. package/dist/esm5/processes/adapter/check.js +39 -39
  194. package/dist/esm5/processes/adapter/check.js.map +1 -1
  195. package/dist/esm5/processes/adapter/clip.js +19 -19
  196. package/dist/esm5/processes/adapter/fix.js +89 -89
  197. package/dist/esm5/processes/adapter/fix.js.map +1 -1
  198. package/dist/esm5/processes/adapter/insert.js +81 -81
  199. package/dist/esm5/processes/adapter/insert.js.map +1 -1
  200. package/dist/esm5/processes/adapter/pause.js +29 -29
  201. package/dist/esm5/processes/adapter/pause.js.map +1 -1
  202. package/dist/esm5/processes/adapter/reload.js +26 -26
  203. package/dist/esm5/processes/adapter/reload.js.map +1 -1
  204. package/dist/esm5/processes/adapter/remove.js +115 -115
  205. package/dist/esm5/processes/adapter/remove.js.map +1 -1
  206. package/dist/esm5/processes/adapter/replace.js +47 -47
  207. package/dist/esm5/processes/adapter/replace.js.map +1 -1
  208. package/dist/esm5/processes/adapter/reset.js +42 -42
  209. package/dist/esm5/processes/adapter/reset.js.map +1 -1
  210. package/dist/esm5/processes/adapter/update.js +59 -59
  211. package/dist/esm5/processes/adapter/update.js.map +1 -1
  212. package/dist/esm5/processes/adjust.js +152 -152
  213. package/dist/esm5/processes/adjust.js.map +1 -1
  214. package/dist/esm5/processes/clip.js +60 -60
  215. package/dist/esm5/processes/clip.js.map +1 -1
  216. package/dist/esm5/processes/end.js +63 -63
  217. package/dist/esm5/processes/end.js.map +1 -1
  218. package/dist/esm5/processes/fetch.js +102 -102
  219. package/dist/esm5/processes/fetch.js.map +1 -1
  220. package/dist/esm5/processes/index.js +24 -24
  221. package/dist/esm5/processes/init.js +21 -21
  222. package/dist/esm5/processes/misc/base.js +44 -44
  223. package/dist/esm5/processes/misc/base.js.map +1 -1
  224. package/dist/esm5/processes/misc/enums.js +36 -36
  225. package/dist/esm5/processes/misc/index.js +2 -2
  226. package/dist/esm5/processes/postFetch.js +74 -74
  227. package/dist/esm5/processes/postFetch.js.map +1 -1
  228. package/dist/esm5/processes/preClip.js +94 -94
  229. package/dist/esm5/processes/preClip.js.map +1 -1
  230. package/dist/esm5/processes/preFetch.js +247 -247
  231. package/dist/esm5/processes/preFetch.js.map +1 -1
  232. package/dist/esm5/processes/render.js +63 -63
  233. package/dist/esm5/processes/render.js.map +1 -1
  234. package/dist/esm5/processes/scroll.js +107 -107
  235. package/dist/esm5/processes/scroll.js.map +1 -1
  236. package/dist/esm5/processes/start.js +18 -18
  237. package/dist/esm5/scroller.js +100 -100
  238. package/dist/esm5/scroller.js.map +1 -1
  239. package/dist/esm5/version.js +4 -4
  240. package/dist/esm5/version.js.map +1 -1
  241. package/dist/esm5/workflow-transducer.js +220 -220
  242. package/dist/esm5/workflow-transducer.js.map +1 -1
  243. package/dist/esm5/workflow.js +198 -198
  244. package/dist/esm5/workflow.js.map +1 -1
  245. package/dist/typings/classes/adapter/context.d.ts +4 -4
  246. package/dist/typings/classes/adapter/props.d.ts +52 -52
  247. package/dist/typings/classes/adapter/wanted.d.ts +14 -14
  248. package/dist/typings/classes/adapter.d.ts +79 -79
  249. package/dist/typings/classes/buffer/cache.d.ts +95 -95
  250. package/dist/typings/classes/buffer/checkCall.d.ts +12 -12
  251. package/dist/typings/classes/buffer/defaultSize.d.ts +32 -32
  252. package/dist/typings/classes/buffer.d.ts +64 -64
  253. package/dist/typings/classes/datasource.d.ts +11 -11
  254. package/dist/typings/classes/domRoutines.d.ts +36 -36
  255. package/dist/typings/classes/item.d.ts +28 -28
  256. package/dist/typings/classes/logger.d.ts +28 -28
  257. package/dist/typings/classes/paddings.d.ts +22 -22
  258. package/dist/typings/classes/reactive.d.ts +21 -21
  259. package/dist/typings/classes/settings.d.ts +119 -119
  260. package/dist/typings/classes/state/clip.d.ts +9 -9
  261. package/dist/typings/classes/state/cycle.d.ts +29 -29
  262. package/dist/typings/classes/state/fetch.d.ts +62 -62
  263. package/dist/typings/classes/state/render.d.ts +9 -9
  264. package/dist/typings/classes/state/scroll.d.ts +16 -16
  265. package/dist/typings/classes/state.d.ts +29 -29
  266. package/dist/typings/classes/viewport.d.ts +32 -32
  267. package/dist/typings/index.d.ts +10 -10
  268. package/dist/typings/inputs/adapter.d.ts +5 -5
  269. package/dist/typings/inputs/common.d.ts +9 -9
  270. package/dist/typings/inputs/datasource.d.ts +7 -7
  271. package/dist/typings/inputs/index.d.ts +7 -7
  272. package/dist/typings/inputs/settings.d.ts +41 -41
  273. package/dist/typings/inputs/validation.d.ts +82 -83
  274. package/dist/typings/inputs/workflow.d.ts +9 -9
  275. package/dist/typings/interfaces/adapter.d.ts +164 -164
  276. package/dist/typings/interfaces/datasource.d.ts +28 -28
  277. package/dist/typings/interfaces/index.d.ts +10 -10
  278. package/dist/typings/interfaces/item.d.ts +8 -8
  279. package/dist/typings/interfaces/process.d.ts +35 -35
  280. package/dist/typings/interfaces/routines.d.ts +166 -166
  281. package/dist/typings/interfaces/settings.d.ts +31 -31
  282. package/dist/typings/interfaces/state.d.ts +24 -24
  283. package/dist/typings/interfaces/validation.d.ts +33 -33
  284. package/dist/typings/interfaces/workflow.d.ts +53 -53
  285. package/dist/typings/processes/adapter/append.d.ts +14 -14
  286. package/dist/typings/processes/adapter/check.d.ts +6 -6
  287. package/dist/typings/processes/adapter/clip.d.ts +7 -7
  288. package/dist/typings/processes/adapter/fix.d.ts +13 -13
  289. package/dist/typings/processes/adapter/insert.d.ts +11 -11
  290. package/dist/typings/processes/adapter/pause.d.ts +8 -8
  291. package/dist/typings/processes/adapter/reload.d.ts +6 -6
  292. package/dist/typings/processes/adapter/remove.d.ts +11 -11
  293. package/dist/typings/processes/adapter/replace.d.ts +8 -8
  294. package/dist/typings/processes/adapter/reset.d.ts +7 -7
  295. package/dist/typings/processes/adapter/update.d.ts +8 -8
  296. package/dist/typings/processes/adjust.d.ts +10 -10
  297. package/dist/typings/processes/clip.d.ts +7 -7
  298. package/dist/typings/processes/end.d.ts +10 -10
  299. package/dist/typings/processes/fetch.d.ts +18 -18
  300. package/dist/typings/processes/index.d.ts +24 -24
  301. package/dist/typings/processes/init.d.ts +7 -7
  302. package/dist/typings/processes/misc/base.d.ts +4 -4
  303. package/dist/typings/processes/misc/enums.d.ts +33 -33
  304. package/dist/typings/processes/misc/index.d.ts +2 -2
  305. package/dist/typings/processes/postFetch.d.ts +8 -8
  306. package/dist/typings/processes/preClip.d.ts +12 -12
  307. package/dist/typings/processes/preFetch.d.ts +17 -17
  308. package/dist/typings/processes/render.d.ts +9 -9
  309. package/dist/typings/processes/scroll.d.ts +13 -13
  310. package/dist/typings/processes/start.d.ts +6 -6
  311. package/dist/typings/scroller.d.ts +26 -26
  312. package/dist/typings/version.d.ts +5 -5
  313. package/dist/typings/workflow-transducer.d.ts +2 -2
  314. package/dist/typings/workflow.d.ts +29 -29
  315. package/package.json +19 -18
@@ -1,175 +1,175 @@
1
- import { Scroller } from './scroller';
2
- import { runStateMachine } from './workflow-transducer';
3
- import { Reactive } from './classes/reactive';
4
- import { AdapterProcess, CommonProcess, ProcessStatus as Status, } from './processes/index';
5
- import { WORKFLOW, validate } from './inputs/index';
6
- export class Workflow {
7
- constructor(params) {
8
- const { element, datasource, consumer, run, Routines } = params;
9
- const validationResult = validate(params, WORKFLOW);
10
- if (!validationResult.isValid) {
11
- throw new Error(`Invalid Workflow params: ${validationResult.errors.join(', ')}.`);
12
- }
13
- this.isInitialized = false;
14
- this.disposed = false;
15
- this.initTimer = null;
16
- this.adapterRun$ = new Reactive();
17
- this.cyclesDone = 0;
18
- this.interruptionCount = 0;
19
- this.errors = [];
20
- this.offScroll = () => null;
21
- this.propagateChanges = run;
22
- this.stateMachineMethods = {
23
- run: this.runProcess(),
24
- interrupt: this.interrupt.bind(this),
25
- done: this.done.bind(this),
26
- onError: this.onError.bind(this)
27
- };
28
- this.scroller = new Scroller({
29
- element, datasource, consumer, workflow: this.getUpdater(), Routines
30
- });
31
- if (this.scroller.settings.initializeDelay) {
32
- this.initTimer = setTimeout(() => {
33
- this.initTimer = null;
34
- this.init();
35
- }, this.scroller.settings.initializeDelay);
36
- }
37
- else {
38
- this.init();
39
- }
40
- }
41
- init() {
42
- this.scroller.init(this.adapterRun$);
43
- // set up scroll event listener
44
- const { routines } = this.scroller;
45
- const onScrollHandler = event => this.callWorkflow({
46
- process: CommonProcess.scroll,
47
- status: Status.start,
48
- payload: { event }
49
- });
50
- this.offScroll = routines.onScroll(onScrollHandler);
51
- // run the Workflow
52
- this.isInitialized = true;
53
- this.callWorkflow({
54
- process: CommonProcess.init,
55
- status: Status.start
56
- });
57
- }
58
- changeItems(items) {
59
- this.propagateChanges(items);
60
- }
61
- callWorkflow(processSubject) {
62
- if (!this.isInitialized) {
63
- return;
64
- }
65
- const { process, status } = processSubject;
66
- // if the scroller is paused, any process other than "pause" and "reset" should be blocked
67
- if (this.scroller.state.paused.get()) {
68
- if (![AdapterProcess.pause, AdapterProcess.reset].includes(process)) {
69
- this.scroller.logger.log('scroller is paused: ' + process + ' process is ignored');
70
- return;
71
- }
72
- }
73
- if (process && process.startsWith('adapter') && status !== Status.next) {
74
- this.adapterRun$.set(processSubject);
75
- }
76
- this.process(processSubject);
77
- }
78
- getUpdater() {
79
- return {
80
- call: this.callWorkflow.bind(this),
81
- onDataChanged: this.changeItems.bind(this),
82
- };
83
- }
84
- process(data) {
85
- const { status, process, payload } = data;
86
- if (this.scroller.settings.logProcessRun) {
87
- this.scroller.logger.log(() => [
88
- '%cfire%c', ...['color: #cc7777;', 'color: #000000;'],
89
- process, `"${status}"`, ...(payload !== void 0 ? [payload] : [])
90
- ]);
91
- }
92
- this.scroller.logger.logProcess(data);
93
- if (process === CommonProcess.end) {
94
- this.scroller.finalize();
95
- }
96
- runStateMachine({
97
- input: data,
98
- methods: this.stateMachineMethods
99
- });
100
- }
101
- runProcess() {
102
- return ({ run, process, name }) => (...args) => {
103
- if (this.scroller.settings.logProcessRun) {
104
- this.scroller.logger.log(() => [
105
- '%crun%c', ...['color: #333399;', 'color: #000000;'],
106
- process || name, ...args
107
- ]);
108
- }
109
- run(this.scroller, ...args);
110
- };
111
- }
112
- onError(process, payload) {
113
- const message = payload && String(payload.error) || '';
114
- const { time, cycle } = this.scroller.state;
115
- this.errors.push({
116
- process,
117
- message,
118
- time,
119
- loop: cycle.loopIdNext
120
- });
121
- this.scroller.logger.logError(message);
122
- }
123
- interrupt({ process, finalize, datasource }) {
124
- if (finalize) {
125
- const { workflow, logger } = this.scroller;
126
- // we are going to create a new reference for the scroller.workflow object
127
- // calling the old version of the scroller.workflow by any outstanding async processes will be skipped
128
- workflow.call = (_) => // eslint-disable-line @typescript-eslint/no-unused-vars
129
- logger.log('[skip wf call]');
130
- workflow.call.interrupted = true;
131
- this.scroller.workflow = this.getUpdater();
132
- this.interruptionCount++;
133
- logger.log(() => `workflow had been interrupted by the ${process} process (${this.interruptionCount})`);
134
- }
135
- if (datasource) { // Scroller re-initialization case
136
- const reInit = () => {
137
- this.scroller.logger.log('new Scroller instantiation');
138
- const scroller = new Scroller({ datasource, scroller: this.scroller });
139
- this.scroller.dispose();
140
- this.scroller = scroller;
141
- this.scroller.init();
142
- };
143
- if (this.scroller.state.cycle.busy.get()) {
144
- // todo: think about immediate re-initialization even is there are pending processes
145
- this.scroller.adapter.relax(reInit.bind(this));
146
- }
147
- else {
148
- reInit();
149
- }
150
- }
151
- }
152
- done() {
153
- const { state, logger } = this.scroller;
154
- this.cyclesDone++;
155
- logger.logCycle(false);
156
- state.endWorkflowCycle(this.cyclesDone + 1);
157
- this.finalize();
158
- }
159
- dispose() {
160
- this.scroller.logger.log(() => 'disposing workflow');
161
- if (this.initTimer) {
162
- clearTimeout(this.initTimer);
163
- }
164
- this.offScroll();
165
- this.adapterRun$.dispose();
166
- this.scroller.dispose(true);
167
- Object.getOwnPropertyNames(this).forEach(prop => {
168
- delete this[prop];
169
- });
170
- this.disposed = true;
171
- }
172
- finalize() {
173
- }
174
- }
1
+ import { Scroller } from './scroller';
2
+ import { runStateMachine } from './workflow-transducer';
3
+ import { Reactive } from './classes/reactive';
4
+ import { AdapterProcess, CommonProcess, ProcessStatus as Status, } from './processes/index';
5
+ import { WORKFLOW, validate } from './inputs/index';
6
+ export class Workflow {
7
+ constructor(params) {
8
+ const { element, datasource, consumer, run, Routines } = params;
9
+ const validationResult = validate(params, WORKFLOW);
10
+ if (!validationResult.isValid) {
11
+ throw new Error(`Invalid Workflow params: ${validationResult.errors.join(', ')}.`);
12
+ }
13
+ this.isInitialized = false;
14
+ this.disposed = false;
15
+ this.initTimer = null;
16
+ this.adapterRun$ = new Reactive();
17
+ this.cyclesDone = 0;
18
+ this.interruptionCount = 0;
19
+ this.errors = [];
20
+ this.offScroll = () => null;
21
+ this.propagateChanges = run;
22
+ this.stateMachineMethods = {
23
+ run: this.runProcess(),
24
+ interrupt: this.interrupt.bind(this),
25
+ done: this.done.bind(this),
26
+ onError: this.onError.bind(this)
27
+ };
28
+ this.scroller = new Scroller({
29
+ element, datasource, consumer, workflow: this.getUpdater(), Routines
30
+ });
31
+ if (this.scroller.settings.initializeDelay) {
32
+ this.initTimer = setTimeout(() => {
33
+ this.initTimer = null;
34
+ this.init();
35
+ }, this.scroller.settings.initializeDelay);
36
+ }
37
+ else {
38
+ this.init();
39
+ }
40
+ }
41
+ init() {
42
+ this.scroller.init(this.adapterRun$);
43
+ // set up scroll event listener
44
+ const { routines } = this.scroller;
45
+ const onScrollHandler = event => this.callWorkflow({
46
+ process: CommonProcess.scroll,
47
+ status: Status.start,
48
+ payload: { event }
49
+ });
50
+ this.offScroll = routines.onScroll(onScrollHandler);
51
+ // run the Workflow
52
+ this.isInitialized = true;
53
+ this.callWorkflow({
54
+ process: CommonProcess.init,
55
+ status: Status.start
56
+ });
57
+ }
58
+ changeItems(items) {
59
+ this.propagateChanges(items);
60
+ }
61
+ callWorkflow(processSubject) {
62
+ if (!this.isInitialized) {
63
+ return;
64
+ }
65
+ const { process, status } = processSubject;
66
+ // if the scroller is paused, any process other than "pause" and "reset" should be blocked
67
+ if (this.scroller.state.paused.get()) {
68
+ if (![AdapterProcess.pause, AdapterProcess.reset].includes(process)) {
69
+ this.scroller.logger.log('scroller is paused: ' + process + ' process is ignored');
70
+ return;
71
+ }
72
+ }
73
+ if (process && process.startsWith('adapter') && status !== Status.next) {
74
+ this.adapterRun$.set(processSubject);
75
+ }
76
+ this.process(processSubject);
77
+ }
78
+ getUpdater() {
79
+ return {
80
+ call: this.callWorkflow.bind(this),
81
+ onDataChanged: this.changeItems.bind(this),
82
+ };
83
+ }
84
+ process(data) {
85
+ const { status, process, payload } = data;
86
+ if (this.scroller.settings.logProcessRun) {
87
+ this.scroller.logger.log(() => [
88
+ '%cfire%c', ...['color: #cc7777;', 'color: #000000;'],
89
+ process, `"${status}"`, ...(payload !== void 0 ? [payload] : [])
90
+ ]);
91
+ }
92
+ this.scroller.logger.logProcess(data);
93
+ if (process === CommonProcess.end) {
94
+ this.scroller.finalize();
95
+ }
96
+ runStateMachine({
97
+ input: data,
98
+ methods: this.stateMachineMethods
99
+ });
100
+ }
101
+ runProcess() {
102
+ return ({ run, process, name }) => (...args) => {
103
+ if (this.scroller.settings.logProcessRun) {
104
+ this.scroller.logger.log(() => [
105
+ '%crun%c', ...['color: #333399;', 'color: #000000;'],
106
+ process || name, ...args
107
+ ]);
108
+ }
109
+ run(this.scroller, ...args);
110
+ };
111
+ }
112
+ onError(process, payload) {
113
+ const message = payload && String(payload.error) || '';
114
+ const { time, cycle } = this.scroller.state;
115
+ this.errors.push({
116
+ process,
117
+ message,
118
+ time,
119
+ loop: cycle.loopIdNext
120
+ });
121
+ this.scroller.logger.logError(message);
122
+ }
123
+ interrupt({ process, finalize, datasource }) {
124
+ if (finalize) {
125
+ const { workflow, logger } = this.scroller;
126
+ // we are going to create a new reference for the scroller.workflow object
127
+ // calling the old version of the scroller.workflow by any outstanding async processes will be skipped
128
+ workflow.call = (_) => // eslint-disable-line @typescript-eslint/no-unused-vars
129
+ logger.log('[skip wf call]');
130
+ workflow.call.interrupted = true;
131
+ this.scroller.workflow = this.getUpdater();
132
+ this.interruptionCount++;
133
+ logger.log(() => `workflow had been interrupted by the ${process} process (${this.interruptionCount})`);
134
+ }
135
+ if (datasource) { // Scroller re-initialization case
136
+ const reInit = () => {
137
+ this.scroller.logger.log('new Scroller instantiation');
138
+ const scroller = new Scroller({ datasource, scroller: this.scroller });
139
+ this.scroller.dispose();
140
+ this.scroller = scroller;
141
+ this.scroller.init();
142
+ };
143
+ if (this.scroller.state.cycle.busy.get()) {
144
+ // todo: think about immediate re-initialization even is there are pending processes
145
+ this.scroller.adapter.relax(reInit.bind(this));
146
+ }
147
+ else {
148
+ reInit();
149
+ }
150
+ }
151
+ }
152
+ done() {
153
+ const { state, logger } = this.scroller;
154
+ this.cyclesDone++;
155
+ logger.logCycle(false);
156
+ state.endWorkflowCycle(this.cyclesDone + 1);
157
+ this.finalize();
158
+ }
159
+ dispose() {
160
+ this.scroller.logger.log(() => 'disposing workflow');
161
+ if (this.initTimer) {
162
+ clearTimeout(this.initTimer);
163
+ }
164
+ this.offScroll();
165
+ this.adapterRun$.dispose();
166
+ this.scroller.dispose(true);
167
+ Object.getOwnPropertyNames(this).forEach(prop => {
168
+ delete this[prop];
169
+ });
170
+ this.disposed = true;
171
+ }
172
+ finalize() {
173
+ }
174
+ }
175
175
  //# sourceMappingURL=workflow.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"workflow.js","sourceRoot":"","sources":["../../src/workflow.ts"],"names":[],"mappings":"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","sourcesContent":["import { Scroller } from './scroller';\r\nimport { runStateMachine } from './workflow-transducer';\r\nimport { Reactive } from './classes/reactive';\r\nimport { Item } from './classes/item';\r\nimport { AdapterProcess, CommonProcess, ProcessStatus as Status, } from './processes/index';\r\nimport { WORKFLOW, validate } from './inputs/index';\r\nimport {\r\n WorkflowParams,\r\n ProcessName,\r\n ProcessPayload,\r\n ProcessClass,\r\n ProcessSubject,\r\n WorkflowError,\r\n InterruptParams,\r\n StateMachineMethods,\r\n ScrollerWorkflow,\r\n} from './interfaces/index';\r\n\r\nexport class Workflow<ItemData = unknown> {\r\n\r\n isInitialized: boolean;\r\n disposed: boolean;\r\n initTimer: ReturnType<typeof setTimeout> | null;\r\n adapterRun$: Reactive<ProcessSubject>;\r\n cyclesDone: number;\r\n interruptionCount: number;\r\n errors: WorkflowError[];\r\n\r\n private offScroll: () => void;\r\n readonly propagateChanges: WorkflowParams<ItemData>['run'];\r\n readonly stateMachineMethods: StateMachineMethods<ItemData>;\r\n\r\n scroller: Scroller<ItemData>;\r\n\r\n constructor(params: WorkflowParams<ItemData>) {\r\n const { element, datasource, consumer, run, Routines } = params;\r\n\r\n const validationResult = validate(params, WORKFLOW);\r\n if (!validationResult.isValid) {\r\n throw new Error(`Invalid Workflow params: ${validationResult.errors.join(', ')}.`);\r\n }\r\n\r\n this.isInitialized = false;\r\n this.disposed = false;\r\n this.initTimer = null;\r\n this.adapterRun$ = new Reactive();\r\n this.cyclesDone = 0;\r\n this.interruptionCount = 0;\r\n this.errors = [];\r\n this.offScroll = () => null;\r\n this.propagateChanges = run;\r\n this.stateMachineMethods = {\r\n run: this.runProcess(),\r\n interrupt: this.interrupt.bind(this),\r\n done: this.done.bind(this),\r\n onError: this.onError.bind(this)\r\n };\r\n\r\n this.scroller = new Scroller<ItemData>({\r\n element, datasource, consumer, workflow: this.getUpdater(), Routines\r\n });\r\n\r\n if (this.scroller.settings.initializeDelay) {\r\n this.initTimer = setTimeout(() => {\r\n this.initTimer = null;\r\n this.init();\r\n }, this.scroller.settings.initializeDelay);\r\n } else {\r\n this.init();\r\n }\r\n }\r\n\r\n init(): void {\r\n this.scroller.init(this.adapterRun$);\r\n\r\n // set up scroll event listener\r\n const { routines } = this.scroller;\r\n const onScrollHandler: EventListener =\r\n event => this.callWorkflow({\r\n process: CommonProcess.scroll,\r\n status: Status.start,\r\n payload: { event }\r\n });\r\n this.offScroll = routines.onScroll(onScrollHandler);\r\n\r\n // run the Workflow\r\n this.isInitialized = true;\r\n this.callWorkflow({\r\n process: CommonProcess.init,\r\n status: Status.start\r\n });\r\n }\r\n\r\n changeItems(items: Item<ItemData>[]): void {\r\n this.propagateChanges(items);\r\n }\r\n\r\n callWorkflow(processSubject: ProcessSubject): void {\r\n if (!this.isInitialized) {\r\n return;\r\n }\r\n const { process, status } = processSubject;\r\n // if the scroller is paused, any process other than \"pause\" and \"reset\" should be blocked\r\n if (this.scroller.state.paused.get()) {\r\n if (![AdapterProcess.pause, AdapterProcess.reset].includes(process as AdapterProcess)) {\r\n this.scroller.logger.log('scroller is paused: ' + process + ' process is ignored');\r\n return;\r\n }\r\n }\r\n if (process && process.startsWith('adapter') && status !== Status.next) {\r\n this.adapterRun$.set(processSubject);\r\n }\r\n this.process(processSubject);\r\n }\r\n\r\n getUpdater(): ScrollerWorkflow<ItemData> {\r\n return {\r\n call: this.callWorkflow.bind(this),\r\n onDataChanged: this.changeItems.bind(this),\r\n };\r\n }\r\n\r\n process(data: ProcessSubject): void {\r\n const { status, process, payload } = data;\r\n if (this.scroller.settings.logProcessRun) {\r\n this.scroller.logger.log(() => [\r\n '%cfire%c', ...['color: #cc7777;', 'color: #000000;'],\r\n process, `\"${status}\"`, ...(payload !== void 0 ? [payload] : [])\r\n ]);\r\n }\r\n this.scroller.logger.logProcess(data);\r\n\r\n if (process === CommonProcess.end) {\r\n this.scroller.finalize();\r\n }\r\n runStateMachine({\r\n input: data,\r\n methods: this.stateMachineMethods as StateMachineMethods<unknown>\r\n });\r\n }\r\n\r\n runProcess() {\r\n return ({ run, process, name }: ProcessClass) =>\r\n (...args: unknown[]): void => {\r\n if (this.scroller.settings.logProcessRun) {\r\n this.scroller.logger.log(() => [\r\n '%crun%c', ...['color: #333399;', 'color: #000000;'],\r\n process || name, ...args\r\n ]);\r\n }\r\n run(this.scroller as Scroller, ...args);\r\n };\r\n }\r\n\r\n onError(process: ProcessName, payload?: ProcessPayload): void {\r\n const message: string = payload && String(payload.error) || '';\r\n const { time, cycle } = this.scroller.state;\r\n this.errors.push({\r\n process,\r\n message,\r\n time,\r\n loop: cycle.loopIdNext\r\n });\r\n this.scroller.logger.logError(message);\r\n }\r\n\r\n interrupt({ process, finalize, datasource }: InterruptParams<ItemData>): void {\r\n if (finalize) {\r\n const { workflow, logger } = this.scroller;\r\n // we are going to create a new reference for the scroller.workflow object\r\n // calling the old version of the scroller.workflow by any outstanding async processes will be skipped\r\n workflow.call = (_: ProcessSubject) => // eslint-disable-line @typescript-eslint/no-unused-vars\r\n logger.log('[skip wf call]');\r\n workflow.call.interrupted = true;\r\n this.scroller.workflow = this.getUpdater();\r\n this.interruptionCount++;\r\n logger.log(() => `workflow had been interrupted by the ${process} process (${this.interruptionCount})`);\r\n }\r\n if (datasource) { // Scroller re-initialization case\r\n const reInit = () => {\r\n this.scroller.logger.log('new Scroller instantiation');\r\n const scroller = new Scroller<ItemData>({ datasource, scroller: this.scroller });\r\n this.scroller.dispose();\r\n this.scroller = scroller;\r\n this.scroller.init();\r\n };\r\n if (this.scroller.state.cycle.busy.get()) {\r\n // todo: think about immediate re-initialization even is there are pending processes\r\n this.scroller.adapter.relax(reInit.bind(this));\r\n } else {\r\n reInit();\r\n }\r\n }\r\n }\r\n\r\n done(): void {\r\n const { state, logger } = this.scroller;\r\n this.cyclesDone++;\r\n logger.logCycle(false);\r\n state.endWorkflowCycle(this.cyclesDone + 1);\r\n this.finalize();\r\n }\r\n\r\n dispose(): void {\r\n this.scroller.logger.log(() => 'disposing workflow');\r\n if (this.initTimer) {\r\n clearTimeout(this.initTimer);\r\n }\r\n this.offScroll();\r\n this.adapterRun$.dispose();\r\n this.scroller.dispose(true);\r\n Object.getOwnPropertyNames(this).forEach(prop => {\r\n delete (this as Record<string, unknown>)[prop];\r\n });\r\n this.disposed = true;\r\n }\r\n\r\n finalize(): void {\r\n }\r\n\r\n}\r\n"]}
1
+ {"version":3,"file":"workflow.js","sourceRoot":"","sources":["../../src/workflow.ts"],"names":[],"mappings":"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","sourcesContent":["import { Scroller } from './scroller';\r\nimport { runStateMachine } from './workflow-transducer';\r\nimport { Reactive } from './classes/reactive';\r\nimport { Item } from './classes/item';\r\nimport { AdapterProcess, CommonProcess, ProcessStatus as Status, } from './processes/index';\r\nimport { WORKFLOW, validate } from './inputs/index';\r\nimport {\r\n WorkflowParams,\r\n ProcessName,\r\n ProcessPayload,\r\n ProcessClass,\r\n ProcessSubject,\r\n WorkflowError,\r\n InterruptParams,\r\n StateMachineMethods,\r\n ScrollerWorkflow,\r\n} from './interfaces/index';\r\n\r\nexport class Workflow<ItemData = unknown> {\r\n\r\n isInitialized: boolean;\r\n disposed: boolean;\r\n initTimer: ReturnType<typeof setTimeout> | null;\r\n adapterRun$: Reactive<ProcessSubject>;\r\n cyclesDone: number;\r\n interruptionCount: number;\r\n errors: WorkflowError[];\r\n\r\n private offScroll: () => void;\r\n readonly propagateChanges: WorkflowParams<ItemData>['run'];\r\n readonly stateMachineMethods: StateMachineMethods<ItemData>;\r\n\r\n scroller: Scroller<ItemData>;\r\n\r\n constructor(params: WorkflowParams<ItemData>) {\r\n const { element, datasource, consumer, run, Routines } = params;\r\n\r\n const validationResult = validate(params, WORKFLOW);\r\n if (!validationResult.isValid) {\r\n throw new Error(`Invalid Workflow params: ${validationResult.errors.join(', ')}.`);\r\n }\r\n\r\n this.isInitialized = false;\r\n this.disposed = false;\r\n this.initTimer = null;\r\n this.adapterRun$ = new Reactive();\r\n this.cyclesDone = 0;\r\n this.interruptionCount = 0;\r\n this.errors = [];\r\n this.offScroll = () => null;\r\n this.propagateChanges = run;\r\n this.stateMachineMethods = {\r\n run: this.runProcess(),\r\n interrupt: this.interrupt.bind(this),\r\n done: this.done.bind(this),\r\n onError: this.onError.bind(this)\r\n };\r\n\r\n this.scroller = new Scroller<ItemData>({\r\n element, datasource, consumer, workflow: this.getUpdater(), Routines\r\n });\r\n\r\n if (this.scroller.settings.initializeDelay) {\r\n this.initTimer = setTimeout(() => {\r\n this.initTimer = null;\r\n this.init();\r\n }, this.scroller.settings.initializeDelay);\r\n } else {\r\n this.init();\r\n }\r\n }\r\n\r\n init(): void {\r\n this.scroller.init(this.adapterRun$);\r\n\r\n // set up scroll event listener\r\n const { routines } = this.scroller;\r\n const onScrollHandler: EventListener =\r\n event => this.callWorkflow({\r\n process: CommonProcess.scroll,\r\n status: Status.start,\r\n payload: { event }\r\n });\r\n this.offScroll = routines.onScroll(onScrollHandler);\r\n\r\n // run the Workflow\r\n this.isInitialized = true;\r\n this.callWorkflow({\r\n process: CommonProcess.init,\r\n status: Status.start\r\n });\r\n }\r\n\r\n changeItems(items: Item<ItemData>[]): void {\r\n this.propagateChanges(items);\r\n }\r\n\r\n callWorkflow(processSubject: ProcessSubject): void {\r\n if (!this.isInitialized) {\r\n return;\r\n }\r\n const { process, status } = processSubject;\r\n // if the scroller is paused, any process other than \"pause\" and \"reset\" should be blocked\r\n if (this.scroller.state.paused.get()) {\r\n if (![AdapterProcess.pause, AdapterProcess.reset].includes(process as AdapterProcess)) {\r\n this.scroller.logger.log('scroller is paused: ' + process + ' process is ignored');\r\n return;\r\n }\r\n }\r\n if (process && process.startsWith('adapter') && status !== Status.next) {\r\n this.adapterRun$.set(processSubject);\r\n }\r\n this.process(processSubject);\r\n }\r\n\r\n getUpdater(): ScrollerWorkflow<ItemData> {\r\n return {\r\n call: this.callWorkflow.bind(this),\r\n onDataChanged: this.changeItems.bind(this),\r\n };\r\n }\r\n\r\n process(data: ProcessSubject): void {\r\n const { status, process, payload } = data;\r\n if (this.scroller.settings.logProcessRun) {\r\n this.scroller.logger.log(() => [\r\n '%cfire%c', ...['color: #cc7777;', 'color: #000000;'],\r\n process, `\"${status}\"`, ...(payload !== void 0 ? [payload] : [])\r\n ]);\r\n }\r\n this.scroller.logger.logProcess(data);\r\n\r\n if (process === CommonProcess.end) {\r\n this.scroller.finalize();\r\n }\r\n runStateMachine({\r\n input: data,\r\n methods: this.stateMachineMethods as StateMachineMethods<unknown>\r\n });\r\n }\r\n\r\n runProcess() {\r\n return ({ run, process, name }: ProcessClass) =>\r\n (...args: unknown[]): void => {\r\n if (this.scroller.settings.logProcessRun) {\r\n this.scroller.logger.log(() => [\r\n '%crun%c', ...['color: #333399;', 'color: #000000;'],\r\n process || name, ...args\r\n ]);\r\n }\r\n run(this.scroller as Scroller, ...args);\r\n };\r\n }\r\n\r\n onError(process: ProcessName, payload?: ProcessPayload): void {\r\n const message: string = payload && String(payload.error) || '';\r\n const { time, cycle } = this.scroller.state;\r\n this.errors.push({\r\n process,\r\n message,\r\n time,\r\n loop: cycle.loopIdNext\r\n });\r\n this.scroller.logger.logError(message);\r\n }\r\n\r\n interrupt({ process, finalize, datasource }: InterruptParams<ItemData>): void {\r\n if (finalize) {\r\n const { workflow, logger } = this.scroller;\r\n // we are going to create a new reference for the scroller.workflow object\r\n // calling the old version of the scroller.workflow by any outstanding async processes will be skipped\r\n workflow.call = (_: ProcessSubject) => // eslint-disable-line @typescript-eslint/no-unused-vars\r\n logger.log('[skip wf call]');\r\n workflow.call.interrupted = true;\r\n this.scroller.workflow = this.getUpdater();\r\n this.interruptionCount++;\r\n logger.log(() => `workflow had been interrupted by the ${process} process (${this.interruptionCount})`);\r\n }\r\n if (datasource) { // Scroller re-initialization case\r\n const reInit = () => {\r\n this.scroller.logger.log('new Scroller instantiation');\r\n const scroller = new Scroller<ItemData>({ datasource, scroller: this.scroller });\r\n this.scroller.dispose();\r\n this.scroller = scroller;\r\n this.scroller.init();\r\n };\r\n if (this.scroller.state.cycle.busy.get()) {\r\n // todo: think about immediate re-initialization even is there are pending processes\r\n this.scroller.adapter.relax(reInit.bind(this));\r\n } else {\r\n reInit();\r\n }\r\n }\r\n }\r\n\r\n done(): void {\r\n const { state, logger } = this.scroller;\r\n this.cyclesDone++;\r\n logger.logCycle(false);\r\n state.endWorkflowCycle(this.cyclesDone + 1);\r\n this.finalize();\r\n }\r\n\r\n dispose(): void {\r\n this.scroller.logger.log(() => 'disposing workflow');\r\n if (this.initTimer) {\r\n clearTimeout(this.initTimer);\r\n }\r\n this.offScroll();\r\n this.adapterRun$.dispose();\r\n this.scroller.dispose(true);\r\n Object.getOwnPropertyNames(this).forEach(prop => {\r\n delete (this as Record<string, unknown>)[prop];\r\n });\r\n this.disposed = true;\r\n }\r\n\r\n finalize(): void {\r\n }\r\n\r\n}\r\n"]}
@@ -1,51 +1,51 @@
1
- import { __assign } from "tslib";
2
- import { AdapterPropName, AdapterPropType, getDefaultAdapterProps, reactiveConfigStorage } from './props';
3
- import core from '../../version';
4
- import { wantedStorage, wantedUtils } from './wanted';
5
- var instanceCount = 0;
6
- var AdapterContext = /** @class */ (function () {
7
- function AdapterContext(config) {
8
- var _this = this;
9
- var mock = config.mock, reactive = config.reactive;
10
- var id = ++instanceCount;
11
- var conf = { configurable: true };
12
- var reactivePropsStore = {};
13
- wantedStorage.set(id, { box: {}, block: false });
14
- // set up permanent props
15
- Object.defineProperty(this, AdapterPropName.id, __assign({ get: function () { return id; } }, conf));
16
- Object.defineProperty(this, AdapterPropName.mock, __assign({ get: function () { return mock; } }, conf));
17
- Object.defineProperty(this, AdapterPropName.augmented, __assign({ get: function () { return false; } }, conf));
18
- Object.defineProperty(this, AdapterPropName.version, __assign({ get: function () { return core.version; } }, conf));
19
- // set up default props, they will be reassigned during the Adapter instantiation
20
- getDefaultAdapterProps()
21
- .filter(function (_a) {
22
- var permanent = _a.permanent;
23
- return !permanent;
24
- })
25
- .forEach(function (prop) {
26
- var value = prop.value;
27
- // reactive props might be reconfigured by the vscroll consumer
28
- if (reactive && prop.type === AdapterPropType.Reactive) {
29
- var react = reactive[prop.name];
30
- if (react) {
31
- // here we have a configured reactive property that came from the outer config
32
- // this prop must be exposed via Adapter, but at the same time we need to
33
- // persist the original default value as it will be used by the Adapter internally
34
- reactivePropsStore[prop.name] = __assign(__assign({}, react), { default: value // persisting the default native Reactive prop
35
- });
36
- value = react.source; // exposing the configured prop instead of the default one
37
- }
38
- }
39
- Object.defineProperty(_this, prop.name, __assign({ get: function () {
40
- wantedUtils.setBox(prop, id);
41
- return value;
42
- } }, conf));
43
- });
44
- if (reactive) { // save both configured and default reactive props in the store
45
- reactiveConfigStorage.set(id, reactivePropsStore);
46
- }
47
- }
48
- return AdapterContext;
49
- }());
50
- export { AdapterContext };
1
+ import { __assign } from "tslib";
2
+ import { AdapterPropName, AdapterPropType, getDefaultAdapterProps, reactiveConfigStorage } from './props';
3
+ import core from '../../version';
4
+ import { wantedStorage, wantedUtils } from './wanted';
5
+ var instanceCount = 0;
6
+ var AdapterContext = /** @class */ (function () {
7
+ function AdapterContext(config) {
8
+ var _this = this;
9
+ var mock = config.mock, reactive = config.reactive;
10
+ var id = ++instanceCount;
11
+ var conf = { configurable: true };
12
+ var reactivePropsStore = {};
13
+ wantedStorage.set(id, { box: {}, block: false });
14
+ // set up permanent props
15
+ Object.defineProperty(this, AdapterPropName.id, __assign({ get: function () { return id; } }, conf));
16
+ Object.defineProperty(this, AdapterPropName.mock, __assign({ get: function () { return mock; } }, conf));
17
+ Object.defineProperty(this, AdapterPropName.augmented, __assign({ get: function () { return false; } }, conf));
18
+ Object.defineProperty(this, AdapterPropName.version, __assign({ get: function () { return core.version; } }, conf));
19
+ // set up default props, they will be reassigned during the Adapter instantiation
20
+ getDefaultAdapterProps()
21
+ .filter(function (_a) {
22
+ var permanent = _a.permanent;
23
+ return !permanent;
24
+ })
25
+ .forEach(function (prop) {
26
+ var value = prop.value;
27
+ // reactive props might be reconfigured by the vscroll consumer
28
+ if (reactive && prop.type === AdapterPropType.Reactive) {
29
+ var react = reactive[prop.name];
30
+ if (react) {
31
+ // here we have a configured reactive property that came from the outer config
32
+ // this prop must be exposed via Adapter, but at the same time we need to
33
+ // persist the original default value as it will be used by the Adapter internally
34
+ reactivePropsStore[prop.name] = __assign(__assign({}, react), { default: value // persisting the default native Reactive prop
35
+ });
36
+ value = react.source; // exposing the configured prop instead of the default one
37
+ }
38
+ }
39
+ Object.defineProperty(_this, prop.name, __assign({ get: function () {
40
+ wantedUtils.setBox(prop, id);
41
+ return value;
42
+ } }, conf));
43
+ });
44
+ if (reactive) { // save both configured and default reactive props in the store
45
+ reactiveConfigStorage.set(id, reactivePropsStore);
46
+ }
47
+ }
48
+ return AdapterContext;
49
+ }());
50
+ export { AdapterContext };
51
51
  //# sourceMappingURL=context.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"context.js","sourceRoot":"","sources":["../../../../src/classes/adapter/context.ts"],"names":[],"mappings":";AAAA,OAAO,EAAE,eAAe,EAAE,eAAe,EAAE,sBAAsB,EAAE,qBAAqB,EAAE,MAAM,SAAS,CAAC;AAC1G,OAAO,IAAI,MAAM,eAAe,CAAC;AAEjC,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAGtD,IAAI,aAAa,GAAG,CAAC,CAAC;AAEtB;IAEE,wBAAY,MAAsB;QAAlC,iBA8CC;QA7CS,IAAA,IAAI,GAAe,MAAM,KAArB,EAAE,QAAQ,GAAK,MAAM,SAAX,CAAY;QAClC,IAAM,EAAE,GAAG,EAAE,aAAa,CAAC;QAC3B,IAAM,IAAI,GAAG,EAAE,YAAY,EAAE,IAAI,EAAE,CAAC;QACpC,IAAM,kBAAkB,GAAwB,EAAE,CAAC;QACnD,aAAa,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC;QAEjD,yBAAyB;QACzB,MAAM,CAAC,cAAc,CAAC,IAAI,EAAE,eAAe,CAAC,EAAE,aAAI,GAAG,EAAE,cAAM,OAAA,EAAE,EAAF,CAAE,IAAK,IAAI,EAAG,CAAC;QAC5E,MAAM,CAAC,cAAc,CAAC,IAAI,EAAE,eAAe,CAAC,IAAI,aAAI,GAAG,EAAE,cAAM,OAAA,IAAI,EAAJ,CAAI,IAAK,IAAI,EAAG,CAAC;QAChF,MAAM,CAAC,cAAc,CAAC,IAAI,EAAE,eAAe,CAAC,SAAS,aAAI,GAAG,EAAE,cAAM,OAAA,KAAK,EAAL,CAAK,IAAK,IAAI,EAAG,CAAC;QACtF,MAAM,CAAC,cAAc,CAAC,IAAI,EAAE,eAAe,CAAC,OAAO,aAAI,GAAG,EAAE,cAAM,OAAA,IAAI,CAAC,OAAO,EAAZ,CAAY,IAAK,IAAI,EAAG,CAAC;QAE3F,iFAAiF;QACjF,sBAAsB,EAAE;aACrB,MAAM,CAAC,UAAC,EAAa;gBAAX,SAAS,eAAA;YAAO,OAAA,CAAC,SAAS;QAAV,CAAU,CAAC;aACrC,OAAO,CAAC,UAAA,IAAI;YACL,IAAA,KAAK,GAAK,IAAI,MAAT,CAAU;YAErB,+DAA+D;YAC/D,IAAI,QAAQ,IAAI,IAAI,CAAC,IAAI,KAAK,eAAe,CAAC,QAAQ,EAAE;gBACtD,IAAM,KAAK,GAAG,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBAClC,IAAI,KAAK,EAAE;oBACT,8EAA8E;oBAC9E,yEAAyE;oBACzE,kFAAkF;oBAClF,kBAAkB,CAAC,IAAI,CAAC,IAAI,CAAC,yBACxB,KAAK,KACR,OAAO,EAAE,KAA0B,CAAC,8CAA8C;uBACnF,CAAC;oBACF,KAAK,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,0DAA0D;iBACjF;aACF;YAED,MAAM,CAAC,cAAc,CAAC,KAAI,EAAE,IAAI,CAAC,IAAI,aACnC,GAAG,EAAE;oBACH,WAAW,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;oBAC7B,OAAO,KAAK,CAAC;gBACf,CAAC,IACE,IAAI,EACP,CAAC;QACL,CAAC,CAAC,CAAC;QAEL,IAAI,QAAQ,EAAE,EAAE,+DAA+D;YAC7E,qBAAqB,CAAC,GAAG,CAAC,EAAE,EAAE,kBAAkB,CAAC,CAAC;SACnD;IACH,CAAC;IACH,qBAAC;AAAD,CAAC,AAjDD,IAiDC","sourcesContent":["import { AdapterPropName, AdapterPropType, getDefaultAdapterProps, reactiveConfigStorage } from './props';\r\nimport core from '../../version';\r\nimport { Reactive } from '../reactive';\r\nimport { wantedStorage, wantedUtils } from './wanted';\r\nimport { IReactivePropsStore, IAdapterConfig } from '../../interfaces/index';\r\n\r\nlet instanceCount = 0;\r\n\r\nexport class AdapterContext {\r\n\r\n constructor(config: IAdapterConfig) {\r\n const { mock, reactive } = config;\r\n const id = ++instanceCount;\r\n const conf = { configurable: true };\r\n const reactivePropsStore: IReactivePropsStore = {};\r\n wantedStorage.set(id, { box: {}, block: false });\r\n\r\n // set up permanent props\r\n Object.defineProperty(this, AdapterPropName.id, { get: () => id, ...conf });\r\n Object.defineProperty(this, AdapterPropName.mock, { get: () => mock, ...conf });\r\n Object.defineProperty(this, AdapterPropName.augmented, { get: () => false, ...conf });\r\n Object.defineProperty(this, AdapterPropName.version, { get: () => core.version, ...conf });\r\n\r\n // set up default props, they will be reassigned during the Adapter instantiation\r\n getDefaultAdapterProps()\r\n .filter(({ permanent }) => !permanent)\r\n .forEach(prop => {\r\n let { value } = prop;\r\n\r\n // reactive props might be reconfigured by the vscroll consumer\r\n if (reactive && prop.type === AdapterPropType.Reactive) {\r\n const react = reactive[prop.name];\r\n if (react) {\r\n // here we have a configured reactive property that came from the outer config\r\n // this prop must be exposed via Adapter, but at the same time we need to\r\n // persist the original default value as it will be used by the Adapter internally\r\n reactivePropsStore[prop.name] = {\r\n ...react,\r\n default: value as Reactive<unknown> // persisting the default native Reactive prop\r\n };\r\n value = react.source; // exposing the configured prop instead of the default one\r\n }\r\n }\r\n\r\n Object.defineProperty(this, prop.name, {\r\n get: () => {\r\n wantedUtils.setBox(prop, id);\r\n return value;\r\n },\r\n ...conf\r\n });\r\n });\r\n\r\n if (reactive) { // save both configured and default reactive props in the store\r\n reactiveConfigStorage.set(id, reactivePropsStore);\r\n }\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"context.js","sourceRoot":"","sources":["../../../../src/classes/adapter/context.ts"],"names":[],"mappings":";AAAA,OAAO,EAAE,eAAe,EAAE,eAAe,EAAE,sBAAsB,EAAE,qBAAqB,EAAE,MAAM,SAAS,CAAC;AAC1G,OAAO,IAAI,MAAM,eAAe,CAAC;AAEjC,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAGtD,IAAI,aAAa,GAAG,CAAC,CAAC;AAEtB;IAEE,wBAAY,MAAsB;QAAlC,iBA8CC;QA7CS,IAAA,IAAI,GAAe,MAAM,KAArB,EAAE,QAAQ,GAAK,MAAM,SAAX,CAAY;QAClC,IAAM,EAAE,GAAG,EAAE,aAAa,CAAC;QAC3B,IAAM,IAAI,GAAG,EAAE,YAAY,EAAE,IAAI,EAAE,CAAC;QACpC,IAAM,kBAAkB,GAAwB,EAAE,CAAC;QACnD,aAAa,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC;QAEjD,yBAAyB;QACzB,MAAM,CAAC,cAAc,CAAC,IAAI,EAAE,eAAe,CAAC,EAAE,aAAI,GAAG,EAAE,cAAM,OAAA,EAAE,EAAF,CAAE,IAAK,IAAI,EAAG,CAAC;QAC5E,MAAM,CAAC,cAAc,CAAC,IAAI,EAAE,eAAe,CAAC,IAAI,aAAI,GAAG,EAAE,cAAM,OAAA,IAAI,EAAJ,CAAI,IAAK,IAAI,EAAG,CAAC;QAChF,MAAM,CAAC,cAAc,CAAC,IAAI,EAAE,eAAe,CAAC,SAAS,aAAI,GAAG,EAAE,cAAM,OAAA,KAAK,EAAL,CAAK,IAAK,IAAI,EAAG,CAAC;QACtF,MAAM,CAAC,cAAc,CAAC,IAAI,EAAE,eAAe,CAAC,OAAO,aAAI,GAAG,EAAE,cAAM,OAAA,IAAI,CAAC,OAAO,EAAZ,CAAY,IAAK,IAAI,EAAG,CAAC;QAE3F,iFAAiF;QACjF,sBAAsB,EAAE;aACrB,MAAM,CAAC,UAAC,EAAa;gBAAX,SAAS,eAAA;YAAO,OAAA,CAAC,SAAS;QAAV,CAAU,CAAC;aACrC,OAAO,CAAC,UAAA,IAAI;YACL,IAAA,KAAK,GAAK,IAAI,MAAT,CAAU;YAErB,+DAA+D;YAC/D,IAAI,QAAQ,IAAI,IAAI,CAAC,IAAI,KAAK,eAAe,CAAC,QAAQ,EAAE,CAAC;gBACvD,IAAM,KAAK,GAAG,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBAClC,IAAI,KAAK,EAAE,CAAC;oBACV,8EAA8E;oBAC9E,yEAAyE;oBACzE,kFAAkF;oBAClF,kBAAkB,CAAC,IAAI,CAAC,IAAI,CAAC,yBACxB,KAAK,KACR,OAAO,EAAE,KAA0B,CAAC,8CAA8C;uBACnF,CAAC;oBACF,KAAK,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,0DAA0D;gBAClF,CAAC;YACH,CAAC;YAED,MAAM,CAAC,cAAc,CAAC,KAAI,EAAE,IAAI,CAAC,IAAI,aACnC,GAAG,EAAE;oBACH,WAAW,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;oBAC7B,OAAO,KAAK,CAAC;gBACf,CAAC,IACE,IAAI,EACP,CAAC;QACL,CAAC,CAAC,CAAC;QAEL,IAAI,QAAQ,EAAE,CAAC,CAAC,+DAA+D;YAC7E,qBAAqB,CAAC,GAAG,CAAC,EAAE,EAAE,kBAAkB,CAAC,CAAC;QACpD,CAAC;IACH,CAAC;IACH,qBAAC;AAAD,CAAC,AAjDD,IAiDC","sourcesContent":["import { AdapterPropName, AdapterPropType, getDefaultAdapterProps, reactiveConfigStorage } from './props';\r\nimport core from '../../version';\r\nimport { Reactive } from '../reactive';\r\nimport { wantedStorage, wantedUtils } from './wanted';\r\nimport { IReactivePropsStore, IAdapterConfig } from '../../interfaces/index';\r\n\r\nlet instanceCount = 0;\r\n\r\nexport class AdapterContext {\r\n\r\n constructor(config: IAdapterConfig) {\r\n const { mock, reactive } = config;\r\n const id = ++instanceCount;\r\n const conf = { configurable: true };\r\n const reactivePropsStore: IReactivePropsStore = {};\r\n wantedStorage.set(id, { box: {}, block: false });\r\n\r\n // set up permanent props\r\n Object.defineProperty(this, AdapterPropName.id, { get: () => id, ...conf });\r\n Object.defineProperty(this, AdapterPropName.mock, { get: () => mock, ...conf });\r\n Object.defineProperty(this, AdapterPropName.augmented, { get: () => false, ...conf });\r\n Object.defineProperty(this, AdapterPropName.version, { get: () => core.version, ...conf });\r\n\r\n // set up default props, they will be reassigned during the Adapter instantiation\r\n getDefaultAdapterProps()\r\n .filter(({ permanent }) => !permanent)\r\n .forEach(prop => {\r\n let { value } = prop;\r\n\r\n // reactive props might be reconfigured by the vscroll consumer\r\n if (reactive && prop.type === AdapterPropType.Reactive) {\r\n const react = reactive[prop.name];\r\n if (react) {\r\n // here we have a configured reactive property that came from the outer config\r\n // this prop must be exposed via Adapter, but at the same time we need to\r\n // persist the original default value as it will be used by the Adapter internally\r\n reactivePropsStore[prop.name] = {\r\n ...react,\r\n default: value as Reactive<unknown> // persisting the default native Reactive prop\r\n };\r\n value = react.source; // exposing the configured prop instead of the default one\r\n }\r\n }\r\n\r\n Object.defineProperty(this, prop.name, {\r\n get: () => {\r\n wantedUtils.setBox(prop, id);\r\n return value;\r\n },\r\n ...conf\r\n });\r\n });\r\n\r\n if (reactive) { // save both configured and default reactive props in the store\r\n reactiveConfigStorage.set(id, reactivePropsStore);\r\n }\r\n }\r\n}\r\n"]}