@studiometa/js-toolkit 2.11.2 → 3.0.0-alpha.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 (407) hide show
  1. package/Base/Base.d.ts +2 -2
  2. package/Base/Base.js +142 -79
  3. package/Base/Base.js.map +2 -2
  4. package/Base/features.d.ts +10 -2
  5. package/Base/features.js +23 -1
  6. package/Base/features.js.map +2 -2
  7. package/Base/managers/AbstractManager.d.ts +3 -3
  8. package/Base/managers/AbstractManager.js +21 -0
  9. package/Base/managers/AbstractManager.js.map +1 -1
  10. package/Base/managers/ActionManager.d.ts +4 -0
  11. package/Base/managers/ActionManager.js +10 -0
  12. package/Base/managers/ActionManager.js.map +7 -0
  13. package/Base/managers/ChildrenManager.d.ts +1 -1
  14. package/Base/managers/ChildrenManager.js +41 -8
  15. package/Base/managers/ChildrenManager.js.map +2 -2
  16. package/Base/managers/EventsManager.js +88 -7
  17. package/Base/managers/EventsManager.js.map +2 -2
  18. package/Base/managers/OptionsManager.js +25 -2
  19. package/Base/managers/OptionsManager.js.map +2 -2
  20. package/Base/managers/RefsManager.js +27 -6
  21. package/Base/managers/RefsManager.js.map +2 -2
  22. package/Base/managers/ResponsiveOptionsManager.js +22 -6
  23. package/Base/managers/ResponsiveOptionsManager.js.map +2 -2
  24. package/Base/managers/ServicesManager.d.ts +2 -4
  25. package/Base/managers/ServicesManager.js +56 -7
  26. package/Base/managers/ServicesManager.js.map +2 -2
  27. package/Base/utils.js +5 -1
  28. package/Base/utils.js.map +2 -2
  29. package/decorators/index.d.ts +0 -1
  30. package/decorators/index.js +0 -1
  31. package/decorators/index.js.map +2 -2
  32. package/decorators/withBreakpointManager.js +14 -4
  33. package/decorators/withBreakpointManager.js.map +2 -2
  34. package/decorators/withBreakpointObserver.js +13 -3
  35. package/decorators/withBreakpointObserver.js.map +2 -2
  36. package/decorators/withDrag.js +6 -0
  37. package/decorators/withDrag.js.map +1 -1
  38. package/decorators/withExtraConfig.js +3 -0
  39. package/decorators/withExtraConfig.js.map +1 -1
  40. package/decorators/withFreezedOptions.js +8 -0
  41. package/decorators/withFreezedOptions.js.map +1 -1
  42. package/decorators/withIntersectionObserver.js +10 -1
  43. package/decorators/withIntersectionObserver.js.map +2 -2
  44. package/decorators/withMountOnMediaQuery.js +17 -1
  45. package/decorators/withMountOnMediaQuery.js.map +2 -2
  46. package/decorators/withMountWhenInView.js +22 -1
  47. package/decorators/withMountWhenInView.js.map +2 -2
  48. package/decorators/withRelativePointer.js +6 -0
  49. package/decorators/withRelativePointer.js.map +1 -1
  50. package/decorators/withResponsiveOptions.js +3 -0
  51. package/decorators/withResponsiveOptions.js.map +1 -1
  52. package/decorators/withScrolledInView/utils.d.ts +12 -1
  53. package/decorators/withScrolledInView/utils.js +7 -7
  54. package/decorators/withScrolledInView/utils.js.map +2 -2
  55. package/decorators/withScrolledInView/withScrolledInView.js +13 -35
  56. package/decorators/withScrolledInView/withScrolledInView.js.map +2 -2
  57. package/helpers/createApp.d.ts +2 -1
  58. package/helpers/createApp.js +2 -2
  59. package/helpers/createApp.js.map +2 -2
  60. package/helpers/getDirectChildren.js.map +1 -1
  61. package/helpers/importOnInteraction.js +4 -4
  62. package/helpers/importOnInteraction.js.map +2 -2
  63. package/helpers/importWhenVisible.js +2 -1
  64. package/helpers/importWhenVisible.js.map +2 -2
  65. package/package.json +2 -10
  66. package/services/drag.js +8 -8
  67. package/services/drag.js.map +2 -2
  68. package/services/index.d.ts +1 -1
  69. package/services/index.js.map +2 -2
  70. package/services/key.js +2 -2
  71. package/services/key.js.map +2 -2
  72. package/services/load.js +3 -0
  73. package/services/load.js.map +1 -1
  74. package/services/pointer.d.ts +1 -1
  75. package/services/pointer.js +7 -7
  76. package/services/pointer.js.map +2 -2
  77. package/services/raf.js +4 -6
  78. package/services/raf.js.map +2 -2
  79. package/services/resize.d.ts +7 -6
  80. package/services/resize.js +19 -26
  81. package/services/resize.js.map +2 -2
  82. package/services/scroll.js +8 -8
  83. package/services/scroll.js.map +2 -2
  84. package/services/service.js +2 -2
  85. package/services/service.js.map +2 -2
  86. package/utils/Queue.js +30 -0
  87. package/utils/Queue.js.map +1 -1
  88. package/utils/SmartQueue.d.ts +1 -1
  89. package/utils/SmartQueue.js +13 -1
  90. package/utils/SmartQueue.js.map +2 -2
  91. package/utils/collide/collidePointRect.js +4 -1
  92. package/utils/collide/collidePointRect.js.map +1 -1
  93. package/utils/collide/collideRectRect.js +4 -1
  94. package/utils/collide/collideRectRect.js.map +1 -1
  95. package/utils/css/animate.d.ts +33 -15
  96. package/utils/css/animate.js +80 -34
  97. package/utils/css/animate.js.map +2 -2
  98. package/utils/css/classes.js +2 -3
  99. package/utils/css/classes.js.map +2 -2
  100. package/utils/css/getOffsetSizes.js +2 -2
  101. package/utils/css/getOffsetSizes.js.map +1 -1
  102. package/utils/css/index.d.ts +2 -1
  103. package/utils/css/index.js +4 -4
  104. package/utils/css/index.js.map +2 -2
  105. package/utils/css/matrix.d.ts +1 -1
  106. package/utils/css/matrix.js.map +2 -2
  107. package/utils/css/styles.js +2 -2
  108. package/utils/css/styles.js.map +2 -2
  109. package/utils/css/transform.d.ts +1 -1
  110. package/utils/css/transform.js +1 -1
  111. package/utils/css/transform.js.map +2 -2
  112. package/utils/css/transition.js +15 -0
  113. package/utils/css/transition.js.map +1 -1
  114. package/utils/css/utils.d.ts +1 -1
  115. package/utils/css/utils.js +1 -1
  116. package/utils/css/utils.js.map +2 -2
  117. package/utils/history.js +6 -5
  118. package/utils/history.js.map +2 -2
  119. package/utils/index.d.ts +5 -4
  120. package/utils/index.js +16 -16
  121. package/utils/index.js.map +2 -2
  122. package/utils/is.d.ts +12 -0
  123. package/utils/is.js +17 -0
  124. package/utils/is.js.map +2 -2
  125. package/utils/math/ease.d.ts +1 -0
  126. package/utils/math/ease.js +2 -0
  127. package/utils/math/ease.js.map +2 -2
  128. package/utils/math/index.d.ts +4 -3
  129. package/utils/math/index.js +5 -3
  130. package/utils/math/index.js.map +2 -2
  131. package/utils/math/mean.d.ts +1 -0
  132. package/utils/math/mean.js +17 -0
  133. package/utils/math/mean.js.map +7 -0
  134. package/utils/nextFrame.d.ts +4 -22
  135. package/utils/nextFrame.js +3 -10
  136. package/utils/nextFrame.js.map +2 -2
  137. package/utils/nextMicrotask.d.ts +4 -1
  138. package/utils/nextMicrotask.js +3 -3
  139. package/utils/nextMicrotask.js.map +2 -2
  140. package/utils/nextTick.d.ts +4 -1
  141. package/utils/nextTick.js +3 -3
  142. package/utils/nextTick.js.map +2 -2
  143. package/utils/random.d.ts +15 -0
  144. package/utils/random.js +15 -0
  145. package/utils/random.js.map +7 -0
  146. package/utils/scheduler.js +4 -4
  147. package/utils/scheduler.js.map +2 -2
  148. package/utils/scrollTo.d.ts +30 -6
  149. package/utils/scrollTo.js +97 -43
  150. package/utils/scrollTo.js.map +2 -2
  151. package/utils/string/endsWith.d.ts +8 -0
  152. package/utils/string/endsWith.js +13 -0
  153. package/utils/string/endsWith.js.map +7 -0
  154. package/utils/string/index.d.ts +2 -0
  155. package/utils/string/index.js +2 -0
  156. package/utils/string/index.js.map +2 -2
  157. package/utils/string/startsWith.d.ts +8 -0
  158. package/utils/string/startsWith.js +13 -0
  159. package/utils/string/startsWith.js.map +7 -0
  160. package/utils/string/withLeadingCharacters.js.map +1 -1
  161. package/utils/string/withTrailingCharacters.js.map +1 -1
  162. package/utils/string/withoutLeadingCharacters.js.map +1 -1
  163. package/utils/string/withoutLeadingCharactersRecursive.js.map +1 -1
  164. package/utils/string/withoutTrailingCharacters.js.map +1 -1
  165. package/utils/string/withoutTrailingCharactersRecursive.js.map +1 -1
  166. package/utils/{focusTrap.d.ts → trapFocus.d.ts} +2 -10
  167. package/utils/{focusTrap.js → trapFocus.js} +5 -9
  168. package/utils/trapFocus.js.map +7 -0
  169. package/utils/tween.d.ts +59 -10
  170. package/utils/tween.js +24 -18
  171. package/utils/tween.js.map +2 -2
  172. package/Base/Base.cjs +0 -325
  173. package/Base/Base.cjs.map +0 -7
  174. package/Base/features.cjs +0 -27
  175. package/Base/features.cjs.map +0 -7
  176. package/Base/index.cjs +0 -21
  177. package/Base/index.cjs.map +0 -7
  178. package/Base/managers/AbstractManager.cjs +0 -57
  179. package/Base/managers/AbstractManager.cjs.map +0 -7
  180. package/Base/managers/ChildrenManager.cjs +0 -123
  181. package/Base/managers/ChildrenManager.cjs.map +0 -7
  182. package/Base/managers/EventsManager.cjs +0 -220
  183. package/Base/managers/EventsManager.cjs.map +0 -7
  184. package/Base/managers/OptionsManager.cjs +0 -171
  185. package/Base/managers/OptionsManager.cjs.map +0 -7
  186. package/Base/managers/RefsManager.cjs +0 -104
  187. package/Base/managers/RefsManager.cjs.map +0 -7
  188. package/Base/managers/ResponsiveOptionsManager.cjs +0 -63
  189. package/Base/managers/ResponsiveOptionsManager.cjs.map +0 -7
  190. package/Base/managers/ServicesManager.cjs +0 -111
  191. package/Base/managers/ServicesManager.cjs.map +0 -7
  192. package/Base/managers/index.cjs +0 -39
  193. package/Base/managers/index.cjs.map +0 -7
  194. package/Base/types.cjs +0 -19
  195. package/Base/types.cjs.map +0 -7
  196. package/Base/utils.cjs +0 -91
  197. package/Base/utils.cjs.map +0 -7
  198. package/decorators/index.cjs +0 -33
  199. package/decorators/index.cjs.map +0 -7
  200. package/decorators/withBreakpointManager.cjs +0 -92
  201. package/decorators/withBreakpointManager.cjs.map +0 -7
  202. package/decorators/withBreakpointObserver.cjs +0 -118
  203. package/decorators/withBreakpointObserver.cjs.map +0 -7
  204. package/decorators/withDrag.cjs +0 -50
  205. package/decorators/withDrag.cjs.map +0 -7
  206. package/decorators/withExtraConfig.cjs +0 -43
  207. package/decorators/withExtraConfig.cjs.map +0 -7
  208. package/decorators/withFreezedOptions.cjs +0 -42
  209. package/decorators/withFreezedOptions.cjs.map +0 -7
  210. package/decorators/withIntersectionObserver.cjs +0 -62
  211. package/decorators/withIntersectionObserver.cjs.map +0 -7
  212. package/decorators/withMountOnMediaQuery.cjs +0 -70
  213. package/decorators/withMountOnMediaQuery.cjs.map +0 -7
  214. package/decorators/withMountWhenInView.cjs +0 -71
  215. package/decorators/withMountWhenInView.cjs.map +0 -7
  216. package/decorators/withMountWhenPrefersMotion.cjs +0 -30
  217. package/decorators/withMountWhenPrefersMotion.cjs.map +0 -7
  218. package/decorators/withRelativePointer.cjs +0 -50
  219. package/decorators/withRelativePointer.cjs.map +0 -7
  220. package/decorators/withResponsiveOptions.cjs +0 -38
  221. package/decorators/withResponsiveOptions.cjs.map +0 -7
  222. package/decorators/withScrolledInView/index.cjs +0 -22
  223. package/decorators/withScrolledInView/index.cjs.map +0 -7
  224. package/decorators/withScrolledInView/types.cjs +0 -19
  225. package/decorators/withScrolledInView/types.cjs.map +0 -7
  226. package/decorators/withScrolledInView/utils.cjs +0 -99
  227. package/decorators/withScrolledInView/utils.cjs.map +0 -7
  228. package/decorators/withScrolledInView/withScrolledInView.cjs +0 -216
  229. package/decorators/withScrolledInView/withScrolledInView.cjs.map +0 -7
  230. package/decorators/withVue2.cjs +0 -65
  231. package/decorators/withVue2.cjs.map +0 -7
  232. package/decorators/withVue2.d.ts +0 -16
  233. package/decorators/withVue2.js +0 -43
  234. package/decorators/withVue2.js.map +0 -7
  235. package/helpers/createApp.cjs +0 -58
  236. package/helpers/createApp.cjs.map +0 -7
  237. package/helpers/getClosestParent.cjs +0 -41
  238. package/helpers/getClosestParent.cjs.map +0 -7
  239. package/helpers/getDirectChildren.cjs +0 -47
  240. package/helpers/getDirectChildren.cjs.map +0 -7
  241. package/helpers/getInstanceFromElement.cjs +0 -32
  242. package/helpers/getInstanceFromElement.cjs.map +0 -7
  243. package/helpers/importOnInteraction.cjs +0 -48
  244. package/helpers/importOnInteraction.cjs.map +0 -7
  245. package/helpers/importOnMediaQuery.cjs +0 -44
  246. package/helpers/importOnMediaQuery.cjs.map +0 -7
  247. package/helpers/importWhenIdle.cjs +0 -46
  248. package/helpers/importWhenIdle.cjs.map +0 -7
  249. package/helpers/importWhenPrefersMotion.cjs +0 -36
  250. package/helpers/importWhenPrefersMotion.cjs.map +0 -7
  251. package/helpers/importWhenVisible.cjs +0 -43
  252. package/helpers/importWhenVisible.cjs.map +0 -7
  253. package/helpers/index.cjs +0 -49
  254. package/helpers/index.cjs.map +0 -7
  255. package/helpers/utils.cjs +0 -37
  256. package/helpers/utils.cjs.map +0 -7
  257. package/index.cjs +0 -31
  258. package/index.cjs.map +0 -7
  259. package/services/drag.cjs +0 -227
  260. package/services/drag.cjs.map +0 -7
  261. package/services/index.cjs +0 -47
  262. package/services/index.cjs.map +0 -7
  263. package/services/key.cjs +0 -93
  264. package/services/key.cjs.map +0 -7
  265. package/services/load.cjs +0 -57
  266. package/services/load.cjs.map +0 -7
  267. package/services/pointer.cjs +0 -145
  268. package/services/pointer.cjs.map +0 -7
  269. package/services/raf.cjs +0 -80
  270. package/services/raf.cjs.map +0 -7
  271. package/services/resize.cjs +0 -103
  272. package/services/resize.cjs.map +0 -7
  273. package/services/scroll.cjs +0 -115
  274. package/services/scroll.cjs.map +0 -7
  275. package/services/service.cjs +0 -69
  276. package/services/service.cjs.map +0 -7
  277. package/utils/Queue.cjs +0 -63
  278. package/utils/Queue.cjs.map +0 -7
  279. package/utils/SmartQueue.cjs +0 -57
  280. package/utils/SmartQueue.cjs.map +0 -7
  281. package/utils/collide/boundingRectToCircle.cjs +0 -36
  282. package/utils/collide/boundingRectToCircle.cjs.map +0 -7
  283. package/utils/collide/collideCircleCircle.cjs +0 -35
  284. package/utils/collide/collideCircleCircle.cjs.map +0 -7
  285. package/utils/collide/collideCircleRect.cjs +0 -47
  286. package/utils/collide/collideCircleRect.cjs.map +0 -7
  287. package/utils/collide/collidePointCircle.cjs +0 -32
  288. package/utils/collide/collidePointCircle.cjs.map +0 -7
  289. package/utils/collide/collidePointRect.cjs +0 -29
  290. package/utils/collide/collidePointRect.cjs.map +0 -7
  291. package/utils/collide/collideRectRect.cjs +0 -29
  292. package/utils/collide/collideRectRect.cjs.map +0 -7
  293. package/utils/collide/index.cjs +0 -43
  294. package/utils/collide/index.cjs.map +0 -7
  295. package/utils/css/animate.cjs +0 -193
  296. package/utils/css/animate.cjs.map +0 -7
  297. package/utils/css/classes.cjs +0 -52
  298. package/utils/css/classes.cjs.map +0 -7
  299. package/utils/css/getOffsetSizes.cjs +0 -48
  300. package/utils/css/getOffsetSizes.cjs.map +0 -7
  301. package/utils/css/index.cjs +0 -48
  302. package/utils/css/index.cjs.map +0 -7
  303. package/utils/css/matrix.cjs +0 -30
  304. package/utils/css/matrix.cjs.map +0 -7
  305. package/utils/css/styles.cjs +0 -45
  306. package/utils/css/styles.cjs.map +0 -7
  307. package/utils/css/transform.cjs +0 -91
  308. package/utils/css/transform.cjs.map +0 -7
  309. package/utils/css/transition.cjs +0 -126
  310. package/utils/css/transition.cjs.map +0 -7
  311. package/utils/css/utils.cjs +0 -32
  312. package/utils/css/utils.cjs.map +0 -7
  313. package/utils/debounce.cjs +0 -35
  314. package/utils/debounce.cjs.map +0 -7
  315. package/utils/dom/ancestors.cjs +0 -37
  316. package/utils/dom/ancestors.cjs.map +0 -7
  317. package/utils/dom/index.cjs +0 -21
  318. package/utils/dom/index.cjs.map +0 -7
  319. package/utils/focusTrap.cjs +0 -89
  320. package/utils/focusTrap.cjs.map +0 -7
  321. package/utils/focusTrap.js.map +0 -7
  322. package/utils/getComponentResolver.cjs +0 -38
  323. package/utils/getComponentResolver.cjs.map +0 -7
  324. package/utils/has.cjs +0 -29
  325. package/utils/has.cjs.map +0 -7
  326. package/utils/history.cjs +0 -91
  327. package/utils/history.cjs.map +0 -7
  328. package/utils/index.cjs +0 -72
  329. package/utils/index.cjs.map +0 -7
  330. package/utils/is.cjs +0 -41
  331. package/utils/is.cjs.map +0 -7
  332. package/utils/keyCodes.cjs +0 -36
  333. package/utils/keyCodes.cjs.map +0 -7
  334. package/utils/math/clamp.cjs +0 -29
  335. package/utils/math/clamp.cjs.map +0 -7
  336. package/utils/math/clamp01.cjs +0 -36
  337. package/utils/math/clamp01.cjs.map +0 -7
  338. package/utils/math/createEases.cjs +0 -33
  339. package/utils/math/createEases.cjs.map +0 -7
  340. package/utils/math/damp.cjs +0 -29
  341. package/utils/math/damp.cjs.map +0 -7
  342. package/utils/math/ease.cjs +0 -82
  343. package/utils/math/ease.cjs.map +0 -7
  344. package/utils/math/index.cjs +0 -50
  345. package/utils/math/index.cjs.map +0 -7
  346. package/utils/math/inertiaFinalValue.cjs +0 -43
  347. package/utils/math/inertiaFinalValue.cjs.map +0 -7
  348. package/utils/math/lerp.cjs +0 -29
  349. package/utils/math/lerp.cjs.map +0 -7
  350. package/utils/math/map.cjs +0 -29
  351. package/utils/math/map.cjs.map +0 -7
  352. package/utils/math/round.cjs +0 -29
  353. package/utils/math/round.cjs.map +0 -7
  354. package/utils/memoize.cjs +0 -48
  355. package/utils/memoize.cjs.map +0 -7
  356. package/utils/nextFrame.cjs +0 -41
  357. package/utils/nextFrame.cjs.map +0 -7
  358. package/utils/nextMicrotask.cjs +0 -30
  359. package/utils/nextMicrotask.cjs.map +0 -7
  360. package/utils/nextTick.cjs +0 -31
  361. package/utils/nextTick.cjs.map +0 -7
  362. package/utils/noop.cjs +0 -32
  363. package/utils/noop.cjs.map +0 -7
  364. package/utils/object/autoBind.cjs +0 -54
  365. package/utils/object/autoBind.cjs.map +0 -7
  366. package/utils/object/autoBind.d.ts +0 -14
  367. package/utils/object/autoBind.js +0 -26
  368. package/utils/object/autoBind.js.map +0 -7
  369. package/utils/object/getAllProperties.cjs +0 -39
  370. package/utils/object/getAllProperties.cjs.map +0 -7
  371. package/utils/object/index.cjs +0 -35
  372. package/utils/object/index.cjs.map +0 -7
  373. package/utils/object/index.d.ts +0 -2
  374. package/utils/object/index.js +0 -7
  375. package/utils/object/index.js.map +0 -7
  376. package/utils/scheduler.cjs +0 -75
  377. package/utils/scheduler.cjs.map +0 -7
  378. package/utils/scrollTo.cjs +0 -84
  379. package/utils/scrollTo.cjs.map +0 -7
  380. package/utils/string/index.cjs +0 -51
  381. package/utils/string/index.cjs.map +0 -7
  382. package/utils/string/withLeadingCharacters.cjs +0 -36
  383. package/utils/string/withLeadingCharacters.cjs.map +0 -7
  384. package/utils/string/withLeadingSlash.cjs +0 -36
  385. package/utils/string/withLeadingSlash.cjs.map +0 -7
  386. package/utils/string/withTrailingCharacters.cjs +0 -36
  387. package/utils/string/withTrailingCharacters.cjs.map +0 -7
  388. package/utils/string/withTrailingSlash.cjs +0 -36
  389. package/utils/string/withTrailingSlash.cjs.map +0 -7
  390. package/utils/string/withoutLeadingCharacters.cjs +0 -29
  391. package/utils/string/withoutLeadingCharacters.cjs.map +0 -7
  392. package/utils/string/withoutLeadingCharactersRecursive.cjs +0 -41
  393. package/utils/string/withoutLeadingCharactersRecursive.cjs.map +0 -7
  394. package/utils/string/withoutLeadingSlash.cjs +0 -36
  395. package/utils/string/withoutLeadingSlash.cjs.map +0 -7
  396. package/utils/string/withoutTrailingCharacters.cjs +0 -29
  397. package/utils/string/withoutTrailingCharacters.cjs.map +0 -7
  398. package/utils/string/withoutTrailingCharactersRecursive.cjs +0 -41
  399. package/utils/string/withoutTrailingCharactersRecursive.cjs.map +0 -7
  400. package/utils/string/withoutTrailingSlash.cjs +0 -36
  401. package/utils/string/withoutTrailingSlash.cjs.map +0 -7
  402. package/utils/throttle.cjs +0 -37
  403. package/utils/throttle.cjs.map +0 -7
  404. package/utils/tween.cjs +0 -118
  405. package/utils/tween.cjs.map +0 -7
  406. package/utils/wait.cjs +0 -31
  407. package/utils/wait.cjs.map +0 -7
@@ -1,5 +1,6 @@
1
1
  import { AbstractManager } from "./AbstractManager.js";
2
2
  import { getComponentElements, addToQueue } from "../utils.js";
3
+ import { startsWith } from "../../utils/index.js";
3
4
  function __getChild(that, el, ComponentClass, name) {
4
5
  const asyncComponentPromise = that.__asyncComponentPromises.get(
5
6
  ComponentClass
@@ -36,8 +37,8 @@ function __getChild(that, el, ComponentClass, name) {
36
37
  }
37
38
  function __triggerHookForAll(that, hook) {
38
39
  addToQueue(() => {
39
- that.registeredNames.forEach((name) => {
40
- that[name].forEach((instance) => {
40
+ for (const name of that.registeredNames) {
41
+ for (const instance of that[name]) {
41
42
  if (instance instanceof Promise) {
42
43
  instance.then((resolvedInstance) => {
43
44
  addToQueue(() => that.__triggerHook(hook, resolvedInstance, name));
@@ -45,29 +46,52 @@ function __triggerHookForAll(that, hook) {
45
46
  } else {
46
47
  addToQueue(() => that.__triggerHook(hook, instance, name));
47
48
  }
48
- });
49
- });
49
+ }
50
+ }
50
51
  });
51
52
  }
52
53
  class ChildrenManager extends AbstractManager {
54
+ /**
55
+ * Store async component promises to avoid calling them multiple times and
56
+ * waiting for them when they are already resolved.
57
+ */
53
58
  __asyncComponentPromises = /* @__PURE__ */ new WeakMap();
54
59
  get registeredNames() {
55
- return Object.keys(this).filter((key) => !key.startsWith("__"));
60
+ return Object.keys(this).filter((key) => !startsWith(key, "__"));
56
61
  }
62
+ /**
63
+ * Register instances of all children components.
64
+ */
57
65
  registerAll() {
58
- Object.entries(this.__config.components).forEach(
59
- ([name, component]) => this.__register(name, component)
60
- );
66
+ for (const [name, component] of Object.entries(this.__config.components))
67
+ this.__register(name, component);
61
68
  }
69
+ /**
70
+ * Mount all child component instances.
71
+ */
62
72
  mountAll() {
63
73
  __triggerHookForAll(this, "$mount");
64
74
  }
75
+ /**
76
+ * Update all child component instances.
77
+ */
65
78
  updateAll() {
66
79
  __triggerHookForAll(this, "$update");
67
80
  }
81
+ /**
82
+ * Destroy all child component instances.
83
+ */
68
84
  destroyAll() {
69
85
  __triggerHookForAll(this, "$destroy");
70
86
  }
87
+ /**
88
+ * Execute the given hook for the given instance.
89
+ *
90
+ * @param {'$mount'|'$update'|'$destroy'} hook The hook to trigger.
91
+ * @param {Base} instance The target instance.
92
+ * @param {string} name The name of the component.
93
+ * @private
94
+ */
71
95
  __triggerHook(hook, instance, name) {
72
96
  if (hook === "$update" && !instance.$isMounted) {
73
97
  hook = "$mount";
@@ -80,6 +104,15 @@ class ChildrenManager extends AbstractManager {
80
104
  }
81
105
  instance[hook]();
82
106
  }
107
+ /**
108
+ * Register instance of a child component.
109
+ *
110
+ * @param {string} name
111
+ * The name of the child component.
112
+ * @param {BaseConstructor|BaseAsyncConstructor} component
113
+ * A Base class or a Promise for async components.
114
+ * @private
115
+ */
83
116
  __register(name, component) {
84
117
  Object.defineProperty(this, name, {
85
118
  enumerable: true,
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../packages/js-toolkit/Base/managers/ChildrenManager.ts"],
4
- "sourcesContent": ["import type { Base, BaseConstructor, BaseAsyncConstructor, BaseEl } from '../index.js';\nimport { AbstractManager } from './AbstractManager.js';\nimport { getComponentElements, addToQueue } from '../utils.js';\n\n/**\n * Get a child component's instance.\n *\n * @param {ChildrenManager} that\n * @param {HTMLElement & { __base__?: WeakMap<BaseConstructor, Base> }} el\n * The root element of the child component.\n * @param {BaseConstructor|BaseAsyncConstructor} ComponentClass\n * A Base class or a Promise for async components.\n * @param {string} name\n * The name of the child component.\n * @returns {Base|Promise<Base | 'terminated'>|'terminated'}\n * A Base instance or a Promise resolving to a Base instance.\n * @private\n */\nfunction __getChild(\n // eslint-disable-next-line no-use-before-define\n that: ChildrenManager,\n el: BaseEl,\n ComponentClass: BaseConstructor | BaseAsyncConstructor,\n name: string,\n): Base | Promise<Base | 'terminated'> | 'terminated' {\n const asyncComponentPromise = that.__asyncComponentPromises.get(\n ComponentClass as BaseAsyncConstructor,\n );\n\n // Test if we have a constructor and not a promise or if the promise has been resolved\n if (\n '$isBase' in ComponentClass ||\n (asyncComponentPromise && asyncComponentPromise.status === 'resolved')\n ) {\n let ctor = ComponentClass as BaseConstructor;\n\n // Get resolved constructor from weakmap.\n // Only test for existence as the status was checked before.\n if (asyncComponentPromise) {\n ctor = asyncComponentPromise.ctor;\n }\n\n // Return existing instance if it exists\n if (el.__base__ && el.__base__.has(ctor)) {\n return el.__base__.get(ctor);\n }\n\n // Return a new instance if the component class is a child of the Base class\n // eslint-disable-next-line new-cap\n const child = new ctor(el);\n Object.defineProperty(child, '$parent', { get: () => that.__base });\n return child;\n }\n\n const promise = asyncComponentPromise\n ? asyncComponentPromise.promise\n : ComponentClass(that.__base);\n\n if (!asyncComponentPromise) {\n that.__asyncComponentPromises.set(ComponentClass, {\n promise,\n status: 'pending',\n ctor: undefined,\n });\n }\n\n // Resolve async components\n return promise.then((module) => {\n // @ts-ignore\n const ctor = module.default ?? module;\n\n that.__asyncComponentPromises.set(ComponentClass, {\n promise,\n status: 'resolved',\n ctor,\n });\n\n return __getChild(that, el, ctor, name);\n });\n}\n\n/**\n * Execute the given hook for all children instances.\n *\n * @param {ChildrenManager} that\n * @param {'$mount'|'$update'|'$destroy'} hook The hook to execute.\n * @private\n */\n// eslint-disable-next-line no-use-before-define\nfunction __triggerHookForAll(that: ChildrenManager, hook: '$mount' | '$update' | '$destroy') {\n addToQueue(() => {\n that.registeredNames.forEach((name) => {\n that[name].forEach((instance) => {\n if (instance instanceof Promise) {\n instance.then((resolvedInstance) => {\n addToQueue(() => that.__triggerHook(hook, resolvedInstance, name));\n });\n } else {\n addToQueue(() => that.__triggerHook(hook, instance, name));\n }\n });\n });\n });\n}\n\n/**\n * Children manager.\n */\nexport class ChildrenManager extends AbstractManager {\n /**\n * Store async component promises to avoid calling them multiple times and\n * waiting for them when they are already resolved.\n */\n __asyncComponentPromises: WeakMap<\n BaseAsyncConstructor,\n {\n promise: ReturnType<BaseAsyncConstructor>;\n status: 'pending' | 'resolved';\n ctor?: BaseConstructor;\n }\n > = new WeakMap();\n\n get registeredNames(): string[] {\n return Object.keys(this).filter((key) => !key.startsWith('__'));\n }\n\n /**\n * Register instances of all children components.\n */\n registerAll() {\n Object.entries(this.__config.components).forEach(([name, component]) =>\n this.__register(name, component),\n );\n }\n\n /**\n * Mount all child component instances.\n */\n mountAll() {\n __triggerHookForAll(this, '$mount');\n }\n\n /**\n * Update all child component instances.\n */\n updateAll() {\n __triggerHookForAll(this, '$update');\n }\n\n /**\n * Destroy all child component instances.\n */\n destroyAll() {\n __triggerHookForAll(this, '$destroy');\n }\n\n /**\n * Execute the given hook for the given instance.\n *\n * @param {'$mount'|'$update'|'$destroy'} hook The hook to trigger.\n * @param {Base} instance The target instance.\n * @param {string} name The name of the component.\n * @private\n */\n __triggerHook(hook: '$mount' | '$update' | '$destroy', instance: Base, name: string) {\n if (hook === '$update' && !instance.$isMounted) {\n // eslint-disable-next-line no-param-reassign\n hook = '$mount';\n }\n\n if (hook === '$update' || hook === '$destroy') {\n this.__eventsManager.unbindChild(name, instance);\n }\n\n if (hook === '$update' || hook === '$mount') {\n this.__eventsManager.bindChild(name, instance);\n }\n\n instance[hook]();\n }\n\n /**\n * Register instance of a child component.\n *\n * @param {string} name\n * The name of the child component.\n * @param {BaseConstructor|BaseAsyncConstructor} component\n * A Base class or a Promise for async components.\n * @private\n */\n __register(name: string, component: BaseConstructor | BaseAsyncConstructor) {\n Object.defineProperty(this, name, {\n enumerable: true,\n configurable: true,\n get: () => this.__getValue(name, component),\n });\n }\n\n __getValue(name: string, component: BaseConstructor | BaseAsyncConstructor) {\n const elements = getComponentElements(name, this.__element);\n\n if (elements.length === 0) {\n return [];\n }\n\n return elements\n .map((element) => __getChild(this, element, component, name))\n .filter((instance) => instance !== 'terminated');\n }\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["import type { Base, BaseConstructor, BaseAsyncConstructor, BaseEl } from '../index.js';\nimport { AbstractManager } from './AbstractManager.js';\nimport { getComponentElements, addToQueue } from '../utils.js';\nimport { startsWith } from '../../utils/index.js';\n\n/**\n * Get a child component's instance.\n *\n * @param {ChildrenManager} that\n * @param {HTMLElement & { __base__?: WeakMap<BaseConstructor, Base> }} el\n * The root element of the child component.\n * @param {BaseConstructor|BaseAsyncConstructor} ComponentClass\n * A Base class or a Promise for async components.\n * @param {string} name\n * The name of the child component.\n * @returns {Base|Promise<Base | 'terminated'>|'terminated'}\n * A Base instance or a Promise resolving to a Base instance.\n * @private\n */\nfunction __getChild(\n // eslint-disable-next-line no-use-before-define\n that: ChildrenManager,\n el: BaseEl,\n ComponentClass: BaseConstructor | BaseAsyncConstructor,\n name: string,\n): Base | Promise<Base | 'terminated'> | 'terminated' {\n const asyncComponentPromise = that.__asyncComponentPromises.get(\n ComponentClass as BaseAsyncConstructor,\n );\n\n // Test if we have a constructor and not a promise or if the promise has been resolved\n if (\n '$isBase' in ComponentClass ||\n (asyncComponentPromise && asyncComponentPromise.status === 'resolved')\n ) {\n let ctor = ComponentClass as BaseConstructor;\n\n // Get resolved constructor from weakmap.\n // Only test for existence as the status was checked before.\n if (asyncComponentPromise) {\n ctor = asyncComponentPromise.ctor;\n }\n\n // Return existing instance if it exists\n if (el.__base__ && el.__base__.has(ctor)) {\n return el.__base__.get(ctor);\n }\n\n // Return a new instance if the component class is a child of the Base class\n // eslint-disable-next-line new-cap\n const child = new ctor(el);\n Object.defineProperty(child, '$parent', { get: () => that.__base });\n return child;\n }\n\n const promise = asyncComponentPromise\n ? asyncComponentPromise.promise\n : ComponentClass(that.__base);\n\n if (!asyncComponentPromise) {\n that.__asyncComponentPromises.set(ComponentClass, {\n promise,\n status: 'pending',\n ctor: undefined,\n });\n }\n\n // Resolve async components\n return promise.then((module) => {\n // @ts-ignore\n const ctor = module.default ?? module;\n\n that.__asyncComponentPromises.set(ComponentClass, {\n promise,\n status: 'resolved',\n ctor,\n });\n\n return __getChild(that, el, ctor, name);\n });\n}\n\n/**\n * Execute the given hook for all children instances.\n *\n * @param {ChildrenManager} that\n * @param {'$mount'|'$update'|'$destroy'} hook The hook to execute.\n * @private\n */\n// eslint-disable-next-line no-use-before-define\nfunction __triggerHookForAll(that: ChildrenManager, hook: '$mount' | '$update' | '$destroy') {\n addToQueue(() => {\n for (const name of that.registeredNames) {\n for (const instance of that[name]) {\n if (instance instanceof Promise) {\n instance.then((resolvedInstance) => {\n addToQueue(() => that.__triggerHook(hook, resolvedInstance, name));\n });\n } else {\n addToQueue(() => that.__triggerHook(hook, instance, name));\n }\n }\n }\n });\n}\n\n/**\n * Children manager.\n */\nexport class ChildrenManager extends AbstractManager {\n /**\n * Store async component promises to avoid calling them multiple times and\n * waiting for them when they are already resolved.\n */\n __asyncComponentPromises: WeakMap<\n BaseAsyncConstructor,\n {\n promise: ReturnType<BaseAsyncConstructor>;\n status: 'pending' | 'resolved';\n ctor?: BaseConstructor;\n }\n > = new WeakMap();\n\n get registeredNames(): string[] {\n return Object.keys(this).filter((key) => !startsWith(key, '__'));\n }\n\n /**\n * Register instances of all children components.\n */\n registerAll() {\n for (const [name, component] of Object.entries(this.__config.components))\n this.__register(name, component);\n }\n\n /**\n * Mount all child component instances.\n */\n mountAll() {\n __triggerHookForAll(this, '$mount');\n }\n\n /**\n * Update all child component instances.\n */\n updateAll() {\n __triggerHookForAll(this, '$update');\n }\n\n /**\n * Destroy all child component instances.\n */\n destroyAll() {\n __triggerHookForAll(this, '$destroy');\n }\n\n /**\n * Execute the given hook for the given instance.\n *\n * @param {'$mount'|'$update'|'$destroy'} hook The hook to trigger.\n * @param {Base} instance The target instance.\n * @param {string} name The name of the component.\n * @private\n */\n __triggerHook(hook: '$mount' | '$update' | '$destroy', instance: Base, name: string) {\n if (hook === '$update' && !instance.$isMounted) {\n // eslint-disable-next-line no-param-reassign\n hook = '$mount';\n }\n\n if (hook === '$update' || hook === '$destroy') {\n this.__eventsManager.unbindChild(name, instance);\n }\n\n if (hook === '$update' || hook === '$mount') {\n this.__eventsManager.bindChild(name, instance);\n }\n\n instance[hook]();\n }\n\n /**\n * Register instance of a child component.\n *\n * @param {string} name\n * The name of the child component.\n * @param {BaseConstructor|BaseAsyncConstructor} component\n * A Base class or a Promise for async components.\n * @private\n */\n __register(name: string, component: BaseConstructor | BaseAsyncConstructor) {\n Object.defineProperty(this, name, {\n enumerable: true,\n configurable: true,\n get: () => this.__getValue(name, component),\n });\n }\n\n __getValue(name: string, component: BaseConstructor | BaseAsyncConstructor) {\n const elements = getComponentElements(name, this.__element);\n\n if (elements.length === 0) {\n return [];\n }\n\n return elements\n .map((element) => __getChild(this, element, component, name))\n .filter((instance) => instance !== 'terminated');\n }\n}\n"],
5
+ "mappings": "AACA,SAAS,uBAAuB;AAChC,SAAS,sBAAsB,kBAAkB;AACjD,SAAS,kBAAkB;AAgB3B,SAAS,WAEP,MACA,IACA,gBACA,MACoD;AACpD,QAAM,wBAAwB,KAAK,yBAAyB;AAAA,IAC1D;AAAA,EACF;AAGA,MACE,aAAa,kBACZ,yBAAyB,sBAAsB,WAAW,YAC3D;AACA,QAAI,OAAO;AAIX,QAAI,uBAAuB;AACzB,aAAO,sBAAsB;AAAA,IAC/B;AAGA,QAAI,GAAG,YAAY,GAAG,SAAS,IAAI,IAAI,GAAG;AACxC,aAAO,GAAG,SAAS,IAAI,IAAI;AAAA,IAC7B;AAIA,UAAM,QAAQ,IAAI,KAAK,EAAE;AACzB,WAAO,eAAe,OAAO,WAAW,EAAE,KAAK,MAAM,KAAK,OAAO,CAAC;AAClE,WAAO;AAAA,EACT;AAEA,QAAM,UAAU,wBACZ,sBAAsB,UACtB,eAAe,KAAK,MAAM;AAE9B,MAAI,CAAC,uBAAuB;AAC1B,SAAK,yBAAyB,IAAI,gBAAgB;AAAA,MAChD;AAAA,MACA,QAAQ;AAAA,MACR,MAAM;AAAA,IACR,CAAC;AAAA,EACH;AAGA,SAAO,QAAQ,KAAK,CAAC,WAAW;AAE9B,UAAM,OAAO,OAAO,WAAW;AAE/B,SAAK,yBAAyB,IAAI,gBAAgB;AAAA,MAChD;AAAA,MACA,QAAQ;AAAA,MACR;AAAA,IACF,CAAC;AAED,WAAO,WAAW,MAAM,IAAI,MAAM,IAAI;AAAA,EACxC,CAAC;AACH;AAUA,SAAS,oBAAoB,MAAuB,MAAyC;AAC3F,aAAW,MAAM;AACf,eAAW,QAAQ,KAAK,iBAAiB;AACvC,iBAAW,YAAY,KAAK,IAAI,GAAG;AACjC,YAAI,oBAAoB,SAAS;AAC/B,mBAAS,KAAK,CAAC,qBAAqB;AAClC,uBAAW,MAAM,KAAK,cAAc,MAAM,kBAAkB,IAAI,CAAC;AAAA,UACnE,CAAC;AAAA,QACH,OAAO;AACL,qBAAW,MAAM,KAAK,cAAc,MAAM,UAAU,IAAI,CAAC;AAAA,QAC3D;AAAA,MACF;AAAA,IACF;AAAA,EACF,CAAC;AACH;AAKO,MAAM,wBAAwB,gBAAgB;AAAA;AAAA;AAAA;AAAA;AAAA,EAKnD,2BAOI,oBAAI,QAAQ;AAAA,EAEhB,IAAI,kBAA4B;AAC9B,WAAO,OAAO,KAAK,IAAI,EAAE,OAAO,CAAC,QAAQ,CAAC,WAAW,KAAK,IAAI,CAAC;AAAA,EACjE;AAAA;AAAA;AAAA;AAAA,EAKA,cAAc;AACZ,eAAW,CAAC,MAAM,SAAS,KAAK,OAAO,QAAQ,KAAK,SAAS,UAAU;AACrE,WAAK,WAAW,MAAM,SAAS;AAAA,EACnC;AAAA;AAAA;AAAA;AAAA,EAKA,WAAW;AACT,wBAAoB,MAAM,QAAQ;AAAA,EACpC;AAAA;AAAA;AAAA;AAAA,EAKA,YAAY;AACV,wBAAoB,MAAM,SAAS;AAAA,EACrC;AAAA;AAAA;AAAA;AAAA,EAKA,aAAa;AACX,wBAAoB,MAAM,UAAU;AAAA,EACtC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,cAAc,MAAyC,UAAgB,MAAc;AACnF,QAAI,SAAS,aAAa,CAAC,SAAS,YAAY;AAE9C,aAAO;AAAA,IACT;AAEA,QAAI,SAAS,aAAa,SAAS,YAAY;AAC7C,WAAK,gBAAgB,YAAY,MAAM,QAAQ;AAAA,IACjD;AAEA,QAAI,SAAS,aAAa,SAAS,UAAU;AAC3C,WAAK,gBAAgB,UAAU,MAAM,QAAQ;AAAA,IAC/C;AAEA,aAAS,IAAI,EAAE;AAAA,EACjB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWA,WAAW,MAAc,WAAmD;AAC1E,WAAO,eAAe,MAAM,MAAM;AAAA,MAChC,YAAY;AAAA,MACZ,cAAc;AAAA,MACd,KAAK,MAAM,KAAK,WAAW,MAAM,SAAS;AAAA,IAC5C,CAAC;AAAA,EACH;AAAA,EAEA,WAAW,MAAc,WAAmD;AAC1E,UAAM,WAAW,qBAAqB,MAAM,KAAK,SAAS;AAE1D,QAAI,SAAS,WAAW,GAAG;AACzB,aAAO,CAAC;AAAA,IACV;AAEA,WAAO,SACJ,IAAI,CAAC,YAAY,WAAW,MAAM,SAAS,WAAW,IAAI,CAAC,EAC3D,OAAO,CAAC,aAAa,aAAa,YAAY;AAAA,EACnD;AACF;",
6
6
  "names": []
7
7
  }
@@ -58,18 +58,22 @@ function getEventMethodsByName(that, name = "") {
58
58
  function manageRef(that, name, elements, mode = "add") {
59
59
  const action = `${mode}EventListener`;
60
60
  const methods = getEventMethodsByName(that, name);
61
- methods.forEach((method) => {
61
+ for (const method of methods) {
62
62
  const event = getEventNameByMethod(method, name);
63
- elements.filter((element) => element).forEach((element) => element[action](event, that.__refsHandler));
64
- });
63
+ for (const element of elements) {
64
+ if (element instanceof EventTarget) {
65
+ element[action](event, that.__refsHandler);
66
+ }
67
+ }
68
+ }
65
69
  }
66
70
  function manageChild(that, name, instance, mode = "add") {
67
71
  const action = mode === "add" ? "$on" : "$off";
68
72
  const methods = getEventMethodsByName(that, name);
69
- methods.forEach((method) => {
73
+ for (const method of methods) {
70
74
  const event = getEventNameByMethod(method, name);
71
75
  instance[action](event, that.__childrenHandler);
72
- });
76
+ }
73
77
  }
74
78
  const isDocumentRegex = /^onDocument[A-Z][a-z]+/;
75
79
  const isWindowRegex = /^onWindow[A-Z][a-z]+/;
@@ -81,7 +85,7 @@ function manageRootElement(that, mode = "add") {
81
85
  const modeMethod = `${mode}EventListener`;
82
86
  const methods = getEventMethodsByName(that);
83
87
  const { __base: base, __config: config } = that;
84
- methods.forEach((method) => {
88
+ for (const method of methods) {
85
89
  let event = getEventNameByMethod(method);
86
90
  if (eventIsDefinedInConfig(event, config) || eventIsNative(event, base.$el)) {
87
91
  const target = getEventTarget(base, event, config);
@@ -94,10 +98,13 @@ function manageRootElement(that, mode = "add") {
94
98
  methodIsDocument(method) ? that.__documentHandler : that.__windowHandler
95
99
  );
96
100
  }
97
- });
101
+ }
98
102
  }
99
103
  class EventsManager extends AbstractManager {
100
104
  __methodsCache = /* @__PURE__ */ new Map();
105
+ /**
106
+ * Event listener object for the root element.
107
+ */
101
108
  __rootElementHandler = {
102
109
  handleEvent: (event) => {
103
110
  const normalizedEventName = normalizeName(event.type);
@@ -109,20 +116,41 @@ class EventsManager extends AbstractManager {
109
116
  }
110
117
  }
111
118
  };
119
+ /**
120
+ * Event listener object for the root element.
121
+ *
122
+ * @type {EventListenerObject}
123
+ */
112
124
  __documentHandler = {
125
+ /**
126
+ * @param {Event|CustomEvent} event
127
+ * @returns {void}
128
+ */
113
129
  handleEvent: (event) => {
114
130
  const normalizedEventName = normalizeName(event.type);
115
131
  const method = `onDocument${normalizedEventName}`;
116
132
  this.__base[method](event);
117
133
  }
118
134
  };
135
+ /**
136
+ * Event listener object for the root element.
137
+ *
138
+ * @type {EventListenerObject}
139
+ */
119
140
  __windowHandler = {
141
+ /**
142
+ * @param {Event|CustomEvent} event
143
+ * @returns {void}
144
+ */
120
145
  handleEvent: (event) => {
121
146
  const normalizedEventName = normalizeName(event.type);
122
147
  const method = `onWindow${normalizedEventName}`;
123
148
  this.__base[method](event);
124
149
  }
125
150
  };
151
+ /**
152
+ * Event listener object for the refs.
153
+ */
126
154
  __refsHandler = {
127
155
  handleEvent: (event) => {
128
156
  const ref = event.currentTarget;
@@ -137,12 +165,16 @@ class EventsManager extends AbstractManager {
137
165
  this.__base[method](event, index);
138
166
  }
139
167
  };
168
+ /**
169
+ * Event listener object for the children.
170
+ */
140
171
  __childrenHandler = {
141
172
  handleEvent: (event) => {
142
173
  const childrenManager = this.__base.$children;
143
174
  const { name, child: resolvedChild } = childrenManager.registeredNames.map((childName) => ({
144
175
  name: childName,
145
176
  child: [...childrenManager[childName]].find(
177
+ // @ts-ignore
146
178
  (instance) => instance === event.currentTarget || instance.$el === event.currentTarget
147
179
  )
148
180
  })).find(({ child }) => child);
@@ -154,6 +186,9 @@ class EventsManager extends AbstractManager {
154
186
  this.__base[method](...args, index, event);
155
187
  }
156
188
  };
189
+ /**
190
+ * Class constructor.
191
+ */
157
192
  constructor(base) {
158
193
  super(base);
159
194
  this.__hideProperties([
@@ -165,21 +200,67 @@ class EventsManager extends AbstractManager {
165
200
  "__windowHandler"
166
201
  ]);
167
202
  }
203
+ /**
204
+ * Bind event methods to the given ref elements.
205
+ *
206
+ * @param {string} name
207
+ * The name of the ref.
208
+ * @param {HTMLElement[]} elements
209
+ * The elements of the ref.
210
+ * @returns {void}
211
+ */
168
212
  bindRef(name, elements) {
169
213
  manageRef(this, name, elements);
170
214
  }
215
+ /**
216
+ * Bind event methods to the given ref elements.
217
+ *
218
+ * @param {string} name
219
+ * The name of the ref.
220
+ * @param {HTMLElement[]} elements
221
+ * The elements of the ref.
222
+ * @returns {void}
223
+ */
171
224
  unbindRef(name, elements) {
172
225
  manageRef(this, name, elements, "remove");
173
226
  }
227
+ /**
228
+ * Bind event methods to the given child instance.
229
+ *
230
+ * @param {string} name
231
+ * The name of the ref.
232
+ * @param {Base} instance
233
+ * A base instance.
234
+ * @returns {void}
235
+ */
174
236
  bindChild(name, instance) {
175
237
  manageChild(this, name, instance);
176
238
  }
239
+ /**
240
+ * Unbind event methods to the given child instance.
241
+ *
242
+ * @param {string} name
243
+ * The name of the ref.
244
+ * @param {Base} instance
245
+ * A base instance.
246
+ * @returns {void}
247
+ */
177
248
  unbindChild(name, instance) {
178
249
  manageChild(this, name, instance, "remove");
179
250
  }
251
+ /**
252
+ * Bind event methods on the root element.
253
+ *
254
+ * @returns {void}
255
+ */
180
256
  bindRootElement() {
181
257
  manageRootElement(this);
182
258
  }
259
+ /**
260
+ * Unbind event method from the root element.
261
+ *
262
+ * @returns {void}
263
+ */
183
264
  unbindRootElement() {
184
265
  manageRootElement(this, "remove");
185
266
  }
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../packages/js-toolkit/Base/managers/EventsManager.ts"],
4
- "sourcesContent": ["import type { Base } from '../index.js';\nimport getAllProperties from '../../utils/object/getAllProperties.js';\nimport { isArray } from '../../utils/index.js';\nimport { getEventTarget, eventIsNative, eventIsDefinedInConfig } from '../utils.js';\nimport { AbstractManager } from './AbstractManager.js';\nimport { normalizeRefName } from './RefsManager.js';\n\nconst names = new Map();\nconst normalizeRegex1 = /[A-Z]([A-Z].*)/g;\nconst normalizeRegex2 = /[^a-zA-Z\\d\\s:]/g;\nconst normalizeRegex3 = /(^\\w|\\s+\\w)/g;\n\n/**\n * Normalize the given name to PascalCase, such as:\n *\n * ```\n * sentence case => SentenceCase\n * lowercase => Lowercase\n * UPPERCASE => Uppercase\n * kebab-case => KebabCase\n * snake_case => SnakeCase\n * camelCase => CamelCase\n * PascalCase => PascalCase\n * .class-selector => ClassSelector\n * .bem__selector => BemSelector\n * __id-selector => IdSelector\n * .complex[class^ =\"__\"] => ComplexClass\n * ```\n *\n * @param {string} name\n * @returns {string}\n */\nexport function normalizeName(name: string): string {\n if (!names.has(name)) {\n names.set(\n name,\n name\n .replaceAll(normalizeRegex1, (c) => c.toLowerCase())\n .replaceAll(normalizeRegex2, ' ')\n .replaceAll(normalizeRegex3, (c) => c.trim().toUpperCase())\n .trim(),\n );\n }\n\n return names.get(name);\n}\n\nconst eventNames = new Map();\n\nconst normalizeEventRegex1 = /[A-Z]/g;\nconst normalizeEventRegex2 = /^-/;\n/**\n * Normalize the event names from PascalCase to kebab-case.\n *\n * @param {string} name\n * @returns {string}\n */\nexport function normalizeEventName(name: string): string {\n if (!eventNames.has(name)) {\n eventNames.set(\n name,\n name\n .replaceAll(normalizeEventRegex1, (c) => `-${c.toLowerCase()}`)\n .replace(normalizeEventRegex2, ''),\n );\n }\n\n return eventNames.get(name);\n}\n\nconst regexes = new Map();\n\n/**\n * Get a regex with a cache;\n *\n * @param {string} regex\n * @returns {RegExp}\n */\nfunction getRegex(regex: string): RegExp {\n if (!regexes.has(regex)) {\n regexes.set(regex, new RegExp(regex));\n }\n\n return regexes.get(regex);\n}\n\n/**\n * Get the event name from the given method and its tied ref or children name.\n *\n * @param {string} method\n * @param {string} name\n * @returns {string}\n * @private\n */\nfunction getEventNameByMethod(method: string, name = ''): string {\n const regex = getRegex(`^on${normalizeName(name)}([A-Z].*)$`);\n const [, event] = method.match(regex);\n return normalizeEventName(event);\n}\n\n/**\n * Get the base instance methods matching the `onSomething` pattern.\n *\n * @param {EventsManager} that\n * @param {string} [name]\n * @returns {string[]}\n * @private\n */\n// eslint-disable-next-line no-use-before-define\nfunction getEventMethodsByName(that: EventsManager, name = ''): string[] {\n const regex = getRegex(`^on${normalizeName(name)}[A-Z].*$`);\n const key = regex.toString();\n\n let methods = that.__methodsCache.get(key);\n\n if (!methods) {\n methods = Array.from(\n getAllProperties(that.__base, [], (method) => regex.test(method)).reduce(\n (set, [method]) => set.add(method),\n new Set(),\n ),\n ) as string[];\n that.__methodsCache.set(key, methods);\n }\n\n return methods;\n}\n\n/**\n * Manage a ref event methods.\n *\n * @param {EventsManager} that\n * @param {string} name\n * The name of the ref.\n * @param {HTMLElement[]} elements\n * The elements of the ref.\n * @param {'add'|'remove'} [mode]\n * The action to perform: add or remove the event listeners.\n * @returns {void}\n * @private\n */\nfunction manageRef(\n // eslint-disable-next-line no-use-before-define\n that: EventsManager,\n name: string,\n elements: HTMLElement[],\n mode: 'add' | 'remove' = 'add',\n) {\n const action = `${mode}EventListener`;\n const methods = getEventMethodsByName(that, name);\n methods.forEach((method) => {\n const event = getEventNameByMethod(method, name);\n elements\n .filter((element) => element)\n .forEach((element) => element[action](event, that.__refsHandler));\n });\n}\n/**\n * Manage event methods to the given child instance.\n *\n * @param {EventsManager} that\n * @param {string} name\n * The name of the ref.\n * @param {Base} instance\n * A base instance.\n * @param {'add'|'remove'} [mode]\n * The action to perform: add or remove the event listeners.\n * @returns {void}\n * @private\n */\nfunction manageChild(\n // eslint-disable-next-line no-use-before-define\n that: EventsManager,\n name: string,\n instance: Base,\n mode: 'add' | 'remove' = 'add',\n) {\n const action = mode === 'add' ? '$on' : '$off';\n const methods = getEventMethodsByName(that, name);\n methods.forEach((method) => {\n const event = getEventNameByMethod(method, name);\n instance[action](event, that.__childrenHandler);\n });\n}\n\nconst isDocumentRegex = /^onDocument[A-Z][a-z]+/;\nconst isWindowRegex = /^onWindow[A-Z][a-z]+/;\nconst methodIsDocument = (method) => isDocumentRegex.test(method);\nconst methodIsWindow = (method) => isWindowRegex.test(method);\nconst methodIsGlobal = (method) => methodIsWindow(method) || methodIsDocument(method);\nconst getGlobalEventTarget = (method) => (methodIsDocument(method) ? document : window);\n\n/**\n * Manage event methods on the root element.\n *\n * @param {EventsManager} that\n * @param {'add'|'remove'} [mode]\n * The action to perform: add or remove the event listeners, defaults to 'add'.\n * @returns {void}\n * @private\n */\n// eslint-disable-next-line no-use-before-define\nfunction manageRootElement(that: EventsManager, mode: 'add' | 'remove' = 'add') {\n const modeMethod = `${mode}EventListener`;\n const methods = getEventMethodsByName(that);\n\n const { __base: base, __config: config } = that;\n\n methods.forEach((method) => {\n let event = getEventNameByMethod(method);\n\n if (eventIsDefinedInConfig(event, config) || eventIsNative(event, base.$el)) {\n const target = getEventTarget(base, event, config);\n target[modeMethod](event, that.__rootElementHandler);\n } else if (methodIsGlobal(method)) {\n event = getEventNameByMethod(method, methodIsDocument(method) ? 'document' : 'window');\n const target = getGlobalEventTarget(method);\n target[modeMethod](\n event,\n methodIsDocument(method) ? that.__documentHandler : that.__windowHandler,\n );\n }\n });\n}\n\n/**\n * Event management class.\n *\n * @todo Prevent binding of `onChildOrRefEvent` to the root element\n * @todo Use event delegation?\n */\nexport class EventsManager extends AbstractManager {\n __methodsCache: Map<string, string[]> = new Map();\n\n /**\n * Event listener object for the root element.\n */\n __rootElementHandler: EventListenerObject = {\n handleEvent: (event: Event | CustomEvent) => {\n const normalizedEventName = normalizeName(event.type);\n const method = `on${normalizedEventName}`;\n\n if (event instanceof CustomEvent && isArray(event.detail) && event.detail.length) {\n this.__base[method](...event.detail, event);\n } else {\n this.__base[method](event);\n }\n },\n };\n\n /**\n * Event listener object for the root element.\n *\n * @type {EventListenerObject}\n */\n __documentHandler = {\n /**\n * @param {Event|CustomEvent} event\n * @returns {void}\n */\n handleEvent: (event) => {\n const normalizedEventName = normalizeName(event.type);\n const method = `onDocument${normalizedEventName}`;\n\n this.__base[method](event);\n },\n };\n\n /**\n * Event listener object for the root element.\n *\n * @type {EventListenerObject}\n */\n __windowHandler = {\n /**\n * @param {Event|CustomEvent} event\n * @returns {void}\n */\n handleEvent: (event) => {\n const normalizedEventName = normalizeName(event.type);\n const method = `onWindow${normalizedEventName}`;\n\n this.__base[method](event);\n },\n };\n\n /**\n * Event listener object for the refs.\n */\n __refsHandler: EventListenerObject = {\n handleEvent: (event) => {\n const ref = event.currentTarget as HTMLElement;\n const refName = normalizeRefName(ref.dataset.ref);\n\n const normalizedRefName = normalizeName(refName);\n const normalizedEventName = normalizeName(event.type);\n const method = `on${normalizedRefName}${normalizedEventName}`;\n\n let index = 0;\n if (isArray(this.__base.$refs[refName])) {\n index = (this.__base.$refs[refName] as HTMLElement[]).indexOf(ref);\n }\n\n this.__base[method](event, index);\n },\n };\n\n /**\n * Event listener object for the children.\n */\n __childrenHandler: EventListenerObject = {\n handleEvent: (event: CustomEvent) => {\n const childrenManager = this.__base.$children;\n\n // @todo handle async child components\n const { name, child: resolvedChild } = childrenManager.registeredNames\n .map((childName) => ({\n name: childName,\n child: [...childrenManager[childName]].find(\n // @ts-ignore\n (instance) => instance === event.currentTarget || instance.$el === event.currentTarget,\n ),\n }))\n .find(({ child }) => child);\n\n const normalizedChildName = normalizeName(name);\n const normalizedEventName = normalizeName(event.type);\n const method = `on${normalizedChildName}${normalizedEventName}`;\n\n const index = [...childrenManager[name]].indexOf(resolvedChild);\n\n const args = isArray(event.detail) ? event.detail : [];\n this.__base[method](...args, index, event);\n },\n };\n\n /**\n * Class constructor.\n */\n constructor(base: Base) {\n super(base);\n\n this.__hideProperties([\n '__methodsCache',\n '__rootElementHandler',\n '__refsHandler',\n '__childrenHandler',\n '__documentHandler',\n '__windowHandler',\n ]);\n }\n\n /**\n * Bind event methods to the given ref elements.\n *\n * @param {string} name\n * The name of the ref.\n * @param {HTMLElement[]} elements\n * The elements of the ref.\n * @returns {void}\n */\n bindRef(name: string, elements: HTMLElement[]) {\n manageRef(this, name, elements);\n }\n\n /**\n * Bind event methods to the given ref elements.\n *\n * @param {string} name\n * The name of the ref.\n * @param {HTMLElement[]} elements\n * The elements of the ref.\n * @returns {void}\n */\n unbindRef(name: string, elements: HTMLElement[]) {\n manageRef(this, name, elements, 'remove');\n }\n\n /**\n * Bind event methods to the given child instance.\n *\n * @param {string} name\n * The name of the ref.\n * @param {Base} instance\n * A base instance.\n * @returns {void}\n */\n bindChild(name: string, instance: Base) {\n manageChild(this, name, instance);\n }\n\n /**\n * Unbind event methods to the given child instance.\n *\n * @param {string} name\n * The name of the ref.\n * @param {Base} instance\n * A base instance.\n * @returns {void}\n */\n unbindChild(name: string, instance: Base) {\n manageChild(this, name, instance, 'remove');\n }\n\n /**\n * Bind event methods on the root element.\n *\n * @returns {void}\n */\n bindRootElement() {\n manageRootElement(this);\n }\n\n /**\n * Unbind event method from the root element.\n *\n * @returns {void}\n */\n unbindRootElement() {\n manageRootElement(this, 'remove');\n }\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["import type { Base } from '../index.js';\nimport getAllProperties from '../../utils/object/getAllProperties.js';\nimport { isArray } from '../../utils/index.js';\nimport { getEventTarget, eventIsNative, eventIsDefinedInConfig } from '../utils.js';\nimport { AbstractManager } from './AbstractManager.js';\nimport { normalizeRefName } from './RefsManager.js';\n\nconst names = new Map();\nconst normalizeRegex1 = /[A-Z]([A-Z].*)/g;\nconst normalizeRegex2 = /[^a-zA-Z\\d\\s:]/g;\nconst normalizeRegex3 = /(^\\w|\\s+\\w)/g;\n\n/**\n * Normalize the given name to PascalCase, such as:\n *\n * ```\n * sentence case => SentenceCase\n * lowercase => Lowercase\n * UPPERCASE => Uppercase\n * kebab-case => KebabCase\n * snake_case => SnakeCase\n * camelCase => CamelCase\n * PascalCase => PascalCase\n * .class-selector => ClassSelector\n * .bem__selector => BemSelector\n * __id-selector => IdSelector\n * .complex[class^ =\"__\"] => ComplexClass\n * ```\n *\n * @param {string} name\n * @returns {string}\n */\nexport function normalizeName(name: string): string {\n if (!names.has(name)) {\n names.set(\n name,\n name\n .replaceAll(normalizeRegex1, (c) => c.toLowerCase())\n .replaceAll(normalizeRegex2, ' ')\n .replaceAll(normalizeRegex3, (c) => c.trim().toUpperCase())\n .trim(),\n );\n }\n\n return names.get(name);\n}\n\nconst eventNames = new Map();\n\nconst normalizeEventRegex1 = /[A-Z]/g;\nconst normalizeEventRegex2 = /^-/;\n/**\n * Normalize the event names from PascalCase to kebab-case.\n *\n * @param {string} name\n * @returns {string}\n */\nexport function normalizeEventName(name: string): string {\n if (!eventNames.has(name)) {\n eventNames.set(\n name,\n name\n .replaceAll(normalizeEventRegex1, (c) => `-${c.toLowerCase()}`)\n .replace(normalizeEventRegex2, ''),\n );\n }\n\n return eventNames.get(name);\n}\n\nconst regexes = new Map();\n\n/**\n * Get a regex with a cache;\n *\n * @param {string} regex\n * @returns {RegExp}\n */\nfunction getRegex(regex: string): RegExp {\n if (!regexes.has(regex)) {\n regexes.set(regex, new RegExp(regex));\n }\n\n return regexes.get(regex);\n}\n\n/**\n * Get the event name from the given method and its tied ref or children name.\n *\n * @param {string} method\n * @param {string} name\n * @returns {string}\n * @private\n */\nfunction getEventNameByMethod(method: string, name = ''): string {\n const regex = getRegex(`^on${normalizeName(name)}([A-Z].*)$`);\n const [, event] = method.match(regex);\n return normalizeEventName(event);\n}\n\n/**\n * Get the base instance methods matching the `onSomething` pattern.\n *\n * @param {EventsManager} that\n * @param {string} [name]\n * @returns {string[]}\n * @private\n */\n// eslint-disable-next-line no-use-before-define\nfunction getEventMethodsByName(that: EventsManager, name = ''): string[] {\n const regex = getRegex(`^on${normalizeName(name)}[A-Z].*$`);\n const key = regex.toString();\n\n let methods = that.__methodsCache.get(key);\n\n if (!methods) {\n methods = Array.from(\n getAllProperties(that.__base, [], (method) => regex.test(method)).reduce(\n (set, [method]) => set.add(method),\n new Set(),\n ),\n ) as string[];\n that.__methodsCache.set(key, methods);\n }\n\n return methods;\n}\n\n/**\n * Manage a ref event methods.\n *\n * @param {EventsManager} that\n * @param {string} name\n * The name of the ref.\n * @param {HTMLElement[]} elements\n * The elements of the ref.\n * @param {'add'|'remove'} [mode]\n * The action to perform: add or remove the event listeners.\n * @returns {void}\n * @private\n */\nfunction manageRef(\n // eslint-disable-next-line no-use-before-define\n that: EventsManager,\n name: string,\n elements: HTMLElement[],\n mode: 'add' | 'remove' = 'add',\n) {\n const action = `${mode}EventListener`;\n const methods = getEventMethodsByName(that, name);\n for (const method of methods) {\n const event = getEventNameByMethod(method, name);\n for (const element of elements) {\n if (element instanceof EventTarget) {\n element[action](event, that.__refsHandler);\n }\n }\n }\n}\n/**\n * Manage event methods to the given child instance.\n *\n * @param {EventsManager} that\n * @param {string} name\n * The name of the ref.\n * @param {Base} instance\n * A base instance.\n * @param {'add'|'remove'} [mode]\n * The action to perform: add or remove the event listeners.\n * @returns {void}\n * @private\n */\nfunction manageChild(\n // eslint-disable-next-line no-use-before-define\n that: EventsManager,\n name: string,\n instance: Base,\n mode: 'add' | 'remove' = 'add',\n) {\n const action = mode === 'add' ? '$on' : '$off';\n const methods = getEventMethodsByName(that, name);\n for (const method of methods) {\n const event = getEventNameByMethod(method, name);\n instance[action](event, that.__childrenHandler);\n }\n}\n\nconst isDocumentRegex = /^onDocument[A-Z][a-z]+/;\nconst isWindowRegex = /^onWindow[A-Z][a-z]+/;\nconst methodIsDocument = (method) => isDocumentRegex.test(method);\nconst methodIsWindow = (method) => isWindowRegex.test(method);\nconst methodIsGlobal = (method) => methodIsWindow(method) || methodIsDocument(method);\nconst getGlobalEventTarget = (method) => (methodIsDocument(method) ? document : window);\n\n/**\n * Manage event methods on the root element.\n *\n * @param {EventsManager} that\n * @param {'add'|'remove'} [mode]\n * The action to perform: add or remove the event listeners, defaults to 'add'.\n * @returns {void}\n * @private\n */\n// eslint-disable-next-line no-use-before-define\nfunction manageRootElement(that: EventsManager, mode: 'add' | 'remove' = 'add') {\n const modeMethod = `${mode}EventListener`;\n const methods = getEventMethodsByName(that);\n\n const { __base: base, __config: config } = that;\n\n for (const method of methods) {\n let event = getEventNameByMethod(method);\n\n if (eventIsDefinedInConfig(event, config) || eventIsNative(event, base.$el)) {\n const target = getEventTarget(base, event, config);\n target[modeMethod](event, that.__rootElementHandler);\n } else if (methodIsGlobal(method)) {\n event = getEventNameByMethod(method, methodIsDocument(method) ? 'document' : 'window');\n const target = getGlobalEventTarget(method);\n target[modeMethod](\n event,\n methodIsDocument(method) ? that.__documentHandler : that.__windowHandler,\n );\n }\n }\n}\n\n/**\n * Event management class.\n *\n * @todo Prevent binding of `onChildOrRefEvent` to the root element\n * @todo Use event delegation?\n */\nexport class EventsManager extends AbstractManager {\n __methodsCache: Map<string, string[]> = new Map();\n\n /**\n * Event listener object for the root element.\n */\n __rootElementHandler: EventListenerObject = {\n handleEvent: (event: Event | CustomEvent) => {\n const normalizedEventName = normalizeName(event.type);\n const method = `on${normalizedEventName}`;\n\n if (event instanceof CustomEvent && isArray(event.detail) && event.detail.length) {\n this.__base[method](...event.detail, event);\n } else {\n this.__base[method](event);\n }\n },\n };\n\n /**\n * Event listener object for the root element.\n *\n * @type {EventListenerObject}\n */\n __documentHandler = {\n /**\n * @param {Event|CustomEvent} event\n * @returns {void}\n */\n handleEvent: (event) => {\n const normalizedEventName = normalizeName(event.type);\n const method = `onDocument${normalizedEventName}`;\n\n this.__base[method](event);\n },\n };\n\n /**\n * Event listener object for the root element.\n *\n * @type {EventListenerObject}\n */\n __windowHandler = {\n /**\n * @param {Event|CustomEvent} event\n * @returns {void}\n */\n handleEvent: (event) => {\n const normalizedEventName = normalizeName(event.type);\n const method = `onWindow${normalizedEventName}`;\n\n this.__base[method](event);\n },\n };\n\n /**\n * Event listener object for the refs.\n */\n __refsHandler: EventListenerObject = {\n handleEvent: (event) => {\n const ref = event.currentTarget as HTMLElement;\n const refName = normalizeRefName(ref.dataset.ref);\n\n const normalizedRefName = normalizeName(refName);\n const normalizedEventName = normalizeName(event.type);\n const method = `on${normalizedRefName}${normalizedEventName}`;\n\n let index = 0;\n if (isArray(this.__base.$refs[refName])) {\n index = (this.__base.$refs[refName] as HTMLElement[]).indexOf(ref);\n }\n\n this.__base[method](event, index);\n },\n };\n\n /**\n * Event listener object for the children.\n */\n __childrenHandler: EventListenerObject = {\n handleEvent: (event: CustomEvent) => {\n const childrenManager = this.__base.$children;\n\n // @todo handle async child components\n const { name, child: resolvedChild } = childrenManager.registeredNames\n .map((childName) => ({\n name: childName,\n child: [...childrenManager[childName]].find(\n // @ts-ignore\n (instance) => instance === event.currentTarget || instance.$el === event.currentTarget,\n ),\n }))\n .find(({ child }) => child);\n\n const normalizedChildName = normalizeName(name);\n const normalizedEventName = normalizeName(event.type);\n const method = `on${normalizedChildName}${normalizedEventName}`;\n\n const index = [...childrenManager[name]].indexOf(resolvedChild);\n\n const args = isArray(event.detail) ? event.detail : [];\n this.__base[method](...args, index, event);\n },\n };\n\n /**\n * Class constructor.\n */\n constructor(base: Base) {\n super(base);\n\n this.__hideProperties([\n '__methodsCache',\n '__rootElementHandler',\n '__refsHandler',\n '__childrenHandler',\n '__documentHandler',\n '__windowHandler',\n ]);\n }\n\n /**\n * Bind event methods to the given ref elements.\n *\n * @param {string} name\n * The name of the ref.\n * @param {HTMLElement[]} elements\n * The elements of the ref.\n * @returns {void}\n */\n bindRef(name: string, elements: HTMLElement[]) {\n manageRef(this, name, elements);\n }\n\n /**\n * Bind event methods to the given ref elements.\n *\n * @param {string} name\n * The name of the ref.\n * @param {HTMLElement[]} elements\n * The elements of the ref.\n * @returns {void}\n */\n unbindRef(name: string, elements: HTMLElement[]) {\n manageRef(this, name, elements, 'remove');\n }\n\n /**\n * Bind event methods to the given child instance.\n *\n * @param {string} name\n * The name of the ref.\n * @param {Base} instance\n * A base instance.\n * @returns {void}\n */\n bindChild(name: string, instance: Base) {\n manageChild(this, name, instance);\n }\n\n /**\n * Unbind event methods to the given child instance.\n *\n * @param {string} name\n * The name of the ref.\n * @param {Base} instance\n * A base instance.\n * @returns {void}\n */\n unbindChild(name: string, instance: Base) {\n manageChild(this, name, instance, 'remove');\n }\n\n /**\n * Bind event methods on the root element.\n *\n * @returns {void}\n */\n bindRootElement() {\n manageRootElement(this);\n }\n\n /**\n * Unbind event method from the root element.\n *\n * @returns {void}\n */\n unbindRootElement() {\n manageRootElement(this, 'remove');\n }\n}\n"],
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }
@@ -46,10 +46,27 @@ function __register(that, name, config) {
46
46
  });
47
47
  }
48
48
  class OptionsManager extends AbstractManager {
49
+ /**
50
+ * An object to store Array and Object values for reference.
51
+ *
52
+ * @private
53
+ */
49
54
  __values = {};
55
+ /**
56
+ * Default value for the name property.
57
+ */
50
58
  name = "Base";
59
+ /**
60
+ * Default value for the debug property.
61
+ */
51
62
  debug = false;
63
+ /**
64
+ * Default value for the log property.
65
+ */
52
66
  log = false;
67
+ /**
68
+ * Class constructor.
69
+ */
53
70
  constructor(base) {
54
71
  super(base);
55
72
  this.__hideProperties(["__values", "__defaultValues"]);
@@ -63,14 +80,17 @@ class OptionsManager extends AbstractManager {
63
80
  type: Boolean,
64
81
  default: this.__config.log ?? false
65
82
  };
66
- Object.entries(schema).forEach(([name, config]) => {
83
+ for (const [name, config] of Object.entries(schema)) {
67
84
  __register(
68
85
  this,
69
86
  name,
70
87
  types.has(config) ? { type: config } : config
71
88
  );
72
- });
89
+ }
73
90
  }
91
+ /**
92
+ * Get an option value.
93
+ */
74
94
  get(name, config) {
75
95
  const { type, default: defaultValue } = config;
76
96
  const propertyName = __getPropertyName(name);
@@ -100,6 +120,9 @@ class OptionsManager extends AbstractManager {
100
120
  }
101
121
  return hasProperty ? value : defaultValue;
102
122
  }
123
+ /**
124
+ * Set an option value.
125
+ */
103
126
  set(name, value, config) {
104
127
  const { type, default: defaultValue } = config;
105
128
  const propertyName = __getPropertyName(name);
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../packages/js-toolkit/Base/managers/OptionsManager.ts"],
4
- "sourcesContent": ["import deepmerge from 'deepmerge';\nimport type { Options as DeepmergeOptions } from 'deepmerge';\nimport { AbstractManager } from './AbstractManager.js';\nimport { isDev, isFunction, isDefined, isBoolean, isArray, isObject } from '../../utils/index.js';\nimport type { Base } from '../index.js';\n\ntype OptionType =\n | StringConstructor\n | NumberConstructor\n | BooleanConstructor\n | ArrayConstructor\n | ObjectConstructor;\n\ntype ArrayOption = {\n type: ArrayConstructor;\n default?: () => unknown[];\n merge?: boolean | DeepmergeOptions;\n};\n\ntype ObjectOption = {\n type: ObjectConstructor;\n default?: () => unknown;\n merge?: boolean | DeepmergeOptions;\n};\n\ntype StringOption = {\n type: StringConstructor;\n default?: string;\n};\n\ntype NumberOption = {\n type: NumberConstructor;\n default?: number;\n};\n\ntype BooleanOption = {\n type: BooleanConstructor;\n default?: boolean;\n};\n\nexport type OptionObject = ArrayOption | ObjectOption | StringOption | NumberOption | BooleanOption;\nexport type OptionsSchema = { [name: string]: OptionType | OptionObject };\nexport type OptionsInterface = { [optionName: string]: unknown };\n\n/**\n * List of allowed types.\n */\nconst types: Set<OptionType> = new Set([String, Number, Boolean, Array, Object]);\n\n/**\n * The default values to return for each available type.\n */\nconst __defaultValues = {\n String: '',\n Number: 0,\n Boolean: false,\n Array: () => [],\n Object: () => ({}),\n};\n\n/**\n * Property name cache.\n */\nconst __propertyNameCache: Map<string, string> = new Map();\n\n/**\n * Get a property name.\n */\nexport function __getPropertyName(name: string, prefix = '') {\n const key = name + prefix;\n\n if (__propertyNameCache.has(key)) {\n return __propertyNameCache.get(key);\n }\n\n const propertyName = `option${prefix}${name.replace(/^\\w/, (c) => c.toUpperCase())}`;\n __propertyNameCache.set(key, propertyName);\n return propertyName;\n}\n\n/**\n * Register an option.\n *\n * @param {OptionsManager} that\n * @param {string} name\n * @param {OptionObject} config\n * @returns {void}\n * @private\n */\nfunction __register(that: OptionsManager, name: string, config: OptionObject) {\n if (!types.has(config.type)) {\n if (isDev) {\n throw new Error(\n `The \"${name}\" option has an invalid type. The allowed types are: String, Number, Boolean, Array and Object.`,\n );\n }\n return;\n }\n\n config.default = config.default ?? __defaultValues[config.type.name];\n\n if ((config.type === Array || config.type === Object) && !isFunction(config.default)) {\n if (isDev) {\n throw new Error(\n `The default value for options of type \"${config.type.name}\" must be returned by a function.`,\n );\n }\n return;\n }\n\n Object.defineProperty(that, name, {\n get: () => that.get(name, config),\n set: (value) => {\n that.set(name, value, config);\n },\n enumerable: true,\n });\n}\n\n/**\n * Class options to manage options as data attributes on an HTML element.\n *\n * @todo Use `MutationObserver` to update values? Might be more performant.\n */\nexport class OptionsManager extends AbstractManager {\n /**\n * An object to store Array and Object values for reference.\n *\n * @private\n */\n __values = {};\n\n /**\n * Default value for the name property.\n */\n name = 'Base';\n\n /**\n * Default value for the debug property.\n */\n debug = false;\n\n /**\n * Default value for the log property.\n */\n log = false;\n\n /**\n * Class constructor.\n */\n constructor(base: Base) {\n super(base);\n\n this.__hideProperties(['__values', '__defaultValues']);\n const schema: OptionsSchema = this.__config.options || {};\n this.name = this.__config.name;\n\n schema.debug = {\n type: Boolean,\n default: this.__config.debug ?? false,\n };\n\n schema.log = {\n type: Boolean,\n default: this.__config.log ?? false,\n };\n\n Object.entries(schema).forEach(([name, config]) => {\n __register(\n this,\n name,\n types.has(config as OptionType)\n ? ({ type: config as OptionType } as OptionObject)\n : (config as OptionObject),\n );\n });\n }\n\n /**\n * Get an option value.\n */\n get(name: string, config: OptionObject) {\n const { type, default: defaultValue } = config;\n const propertyName = __getPropertyName(name);\n const hasProperty = isDefined(this.__element.dataset[propertyName]);\n\n if (type === Boolean) {\n if (defaultValue) {\n const negatedPropertyName = __getPropertyName(name, 'No');\n const hasNegatedProperty = isDefined(this.__element.dataset[negatedPropertyName]);\n\n return !hasNegatedProperty;\n }\n\n return hasProperty || defaultValue;\n }\n\n const value = this.__element.dataset[propertyName];\n\n if (type === Number) {\n return hasProperty ? Number(value) : defaultValue;\n }\n\n if (type === Array || type === Object) {\n // eslint-disable-next-line no-param-reassign\n config = type === Array ? (config as ArrayOption) : (config as ObjectOption);\n\n if (!this.__values[name]) {\n let val = hasProperty ? JSON.parse(value) : config.default();\n\n if (isDefined(config.merge)) {\n val = isBoolean(config.merge)\n ? deepmerge(config.default(), val)\n : deepmerge(config.default(), val, config.merge);\n }\n\n this.__values[name] = val;\n }\n\n return this.__values[name];\n }\n\n return hasProperty ? value : defaultValue;\n }\n\n /**\n * Set an option value.\n */\n set(name: string, value: unknown, config: OptionObject) {\n const { type, default: defaultValue } = config;\n const propertyName = __getPropertyName(name);\n\n if (value.constructor.name !== type.name) {\n if (isDev) {\n const val = isArray(value) || isObject(value) ? JSON.stringify(value) : value;\n throw new TypeError(\n `The \"${val}\" value for the \"${name}\" option must be of type \"${type.name}\"`,\n );\n }\n return;\n }\n\n switch (type) {\n case Boolean:\n if (defaultValue) {\n const negatedPropertyName = __getPropertyName(name, 'No');\n\n if (value) {\n delete this.__element.dataset[negatedPropertyName];\n } else {\n this.__element.dataset[negatedPropertyName] = '';\n }\n } else if (value) {\n this.__element.dataset[propertyName] = '';\n } else {\n delete this.__element.dataset[propertyName];\n }\n break;\n case Array:\n case Object:\n this.__values[name] = value;\n break;\n default:\n this.__element.dataset[propertyName] = value as string;\n }\n }\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["import deepmerge from 'deepmerge';\nimport type { Options as DeepmergeOptions } from 'deepmerge';\nimport { AbstractManager } from './AbstractManager.js';\nimport { isDev, isFunction, isDefined, isBoolean, isArray, isObject } from '../../utils/index.js';\nimport type { Base } from '../index.js';\n\ntype OptionType =\n | StringConstructor\n | NumberConstructor\n | BooleanConstructor\n | ArrayConstructor\n | ObjectConstructor;\n\ntype ArrayOption = {\n type: ArrayConstructor;\n default?: () => unknown[];\n merge?: boolean | DeepmergeOptions;\n};\n\ntype ObjectOption = {\n type: ObjectConstructor;\n default?: () => unknown;\n merge?: boolean | DeepmergeOptions;\n};\n\ntype StringOption = {\n type: StringConstructor;\n default?: string;\n};\n\ntype NumberOption = {\n type: NumberConstructor;\n default?: number;\n};\n\ntype BooleanOption = {\n type: BooleanConstructor;\n default?: boolean;\n};\n\nexport type OptionObject = ArrayOption | ObjectOption | StringOption | NumberOption | BooleanOption;\nexport type OptionsSchema = { [name: string]: OptionType | OptionObject };\nexport type OptionsInterface = { [optionName: string]: unknown };\n\n/**\n * List of allowed types.\n */\nconst types: Set<OptionType> = new Set([String, Number, Boolean, Array, Object]);\n\n/**\n * The default values to return for each available type.\n */\nconst __defaultValues = {\n String: '',\n Number: 0,\n Boolean: false,\n Array: () => [],\n Object: () => ({}),\n};\n\n/**\n * Property name cache.\n */\nconst __propertyNameCache: Map<string, string> = new Map();\n\n/**\n * Get a property name.\n */\nexport function __getPropertyName(name: string, prefix = '') {\n const key = name + prefix;\n\n if (__propertyNameCache.has(key)) {\n return __propertyNameCache.get(key);\n }\n\n const propertyName = `option${prefix}${name.replace(/^\\w/, (c) => c.toUpperCase())}`;\n __propertyNameCache.set(key, propertyName);\n return propertyName;\n}\n\n/**\n * Register an option.\n *\n * @param {OptionsManager} that\n * @param {string} name\n * @param {OptionObject} config\n * @returns {void}\n * @private\n */\nfunction __register(that: OptionsManager, name: string, config: OptionObject) {\n if (!types.has(config.type)) {\n if (isDev) {\n throw new Error(\n `The \"${name}\" option has an invalid type. The allowed types are: String, Number, Boolean, Array and Object.`,\n );\n }\n return;\n }\n\n config.default = config.default ?? __defaultValues[config.type.name];\n\n if ((config.type === Array || config.type === Object) && !isFunction(config.default)) {\n if (isDev) {\n throw new Error(\n `The default value for options of type \"${config.type.name}\" must be returned by a function.`,\n );\n }\n return;\n }\n\n Object.defineProperty(that, name, {\n get: () => that.get(name, config),\n set: (value) => {\n that.set(name, value, config);\n },\n enumerable: true,\n });\n}\n\n/**\n * Class options to manage options as data attributes on an HTML element.\n *\n * @todo Use `MutationObserver` to update values? Might be more performant.\n */\nexport class OptionsManager extends AbstractManager {\n /**\n * An object to store Array and Object values for reference.\n *\n * @private\n */\n __values = {};\n\n /**\n * Default value for the name property.\n */\n name = 'Base';\n\n /**\n * Default value for the debug property.\n */\n debug = false;\n\n /**\n * Default value for the log property.\n */\n log = false;\n\n /**\n * Class constructor.\n */\n constructor(base: Base) {\n super(base);\n\n this.__hideProperties(['__values', '__defaultValues']);\n const schema: OptionsSchema = this.__config.options || {};\n this.name = this.__config.name;\n\n schema.debug = {\n type: Boolean,\n default: this.__config.debug ?? false,\n };\n\n schema.log = {\n type: Boolean,\n default: this.__config.log ?? false,\n };\n\n for (const [name, config] of Object.entries(schema)) {\n __register(\n this,\n name,\n types.has(config as OptionType)\n ? ({ type: config as OptionType } as OptionObject)\n : (config as OptionObject),\n );\n }\n }\n\n /**\n * Get an option value.\n */\n get(name: string, config: OptionObject) {\n const { type, default: defaultValue } = config;\n const propertyName = __getPropertyName(name);\n const hasProperty = isDefined(this.__element.dataset[propertyName]);\n\n if (type === Boolean) {\n if (defaultValue) {\n const negatedPropertyName = __getPropertyName(name, 'No');\n const hasNegatedProperty = isDefined(this.__element.dataset[negatedPropertyName]);\n\n return !hasNegatedProperty;\n }\n\n return hasProperty || defaultValue;\n }\n\n const value = this.__element.dataset[propertyName];\n\n if (type === Number) {\n return hasProperty ? Number(value) : defaultValue;\n }\n\n if (type === Array || type === Object) {\n // eslint-disable-next-line no-param-reassign\n config = type === Array ? (config as ArrayOption) : (config as ObjectOption);\n\n if (!this.__values[name]) {\n let val = hasProperty ? JSON.parse(value) : config.default();\n\n if (isDefined(config.merge)) {\n val = isBoolean(config.merge)\n ? deepmerge(config.default(), val)\n : deepmerge(config.default(), val, config.merge);\n }\n\n this.__values[name] = val;\n }\n\n return this.__values[name];\n }\n\n return hasProperty ? value : defaultValue;\n }\n\n /**\n * Set an option value.\n */\n set(name: string, value: unknown, config: OptionObject) {\n const { type, default: defaultValue } = config;\n const propertyName = __getPropertyName(name);\n\n if (value.constructor.name !== type.name) {\n if (isDev) {\n const val = isArray(value) || isObject(value) ? JSON.stringify(value) : value;\n throw new TypeError(\n `The \"${val}\" value for the \"${name}\" option must be of type \"${type.name}\"`,\n );\n }\n return;\n }\n\n switch (type) {\n case Boolean:\n if (defaultValue) {\n const negatedPropertyName = __getPropertyName(name, 'No');\n\n if (value) {\n delete this.__element.dataset[negatedPropertyName];\n } else {\n this.__element.dataset[negatedPropertyName] = '';\n }\n } else if (value) {\n this.__element.dataset[propertyName] = '';\n } else {\n delete this.__element.dataset[propertyName];\n }\n break;\n case Array:\n case Object:\n this.__values[name] = value;\n break;\n default:\n this.__element.dataset[propertyName] = value as string;\n }\n }\n}\n"],
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }
@@ -1,5 +1,12 @@
1
1
  import { AbstractManager } from "./AbstractManager.js";
2
- import { isDev, isArray, isDefined, getAncestorWhereUntil } from "../../utils/index.js";
2
+ import {
3
+ isDev,
4
+ isArray,
5
+ isDefined,
6
+ getAncestorWhereUntil,
7
+ endsWith,
8
+ startsWith
9
+ } from "../../utils/index.js";
3
10
  const NORMALIZE_REF_NAME_REGEX = /\[\]$/;
4
11
  const NAMESPACED_REF_REGEX = /^(.*\.)/;
5
12
  const normalizedRefNamesCache = /* @__PURE__ */ new Map();
@@ -8,7 +15,7 @@ function normalizeRefName(name) {
8
15
  return normalizedRefNamesCache.get(name);
9
16
  }
10
17
  let normalizedName = name;
11
- if (name.endsWith("[]")) {
18
+ if (endsWith(name, "[]")) {
12
19
  normalizedName = normalizedName.replace(NORMALIZE_REF_NAME_REGEX, "");
13
20
  }
14
21
  if (normalizedName.includes(".")) {
@@ -18,7 +25,7 @@ function normalizeRefName(name) {
18
25
  return normalizedName;
19
26
  }
20
27
  function refBelongToInstance(ref, rootElement, name) {
21
- const isPrefixed = ref.dataset.ref.startsWith(name);
28
+ const isPrefixed = startsWith(ref.dataset.ref, name);
22
29
  const firstComponentAncestor = getAncestorWhereUntil(
23
30
  ref,
24
31
  (el) => el && (isPrefixed ? el.dataset.component === name && el : isDefined(el.dataset.component)) && el !== rootElement,
@@ -27,7 +34,7 @@ function refBelongToInstance(ref, rootElement, name) {
27
34
  return firstComponentAncestor === rootElement;
28
35
  }
29
36
  function __register(that, refName) {
30
- const isMultiple = refName.endsWith("[]");
37
+ const isMultiple = endsWith(refName, "[]");
31
38
  const propName = normalizeRefName(refName);
32
39
  const { name } = that.__base.$options;
33
40
  const refs = Array.from(
@@ -37,6 +44,7 @@ function __register(that, refName) {
37
44
  ).filter((ref) => refBelongToInstance(ref, that.__element, name));
38
45
  if (isDev && !isMultiple && refs.length > 1) {
39
46
  console.warn(
47
+ // @ts-ignore
40
48
  `[${that.__base.$options.name}]`,
41
49
  `The "${refName}" ref has been found multiple times.`,
42
50
  "Did you forgot to add the `[]` suffix to its name?"
@@ -45,6 +53,7 @@ function __register(that, refName) {
45
53
  if (!isMultiple && refs.length <= 1 && !isDefined(refs[0])) {
46
54
  if (isDev) {
47
55
  console.warn(
56
+ // @ts-ignore
48
57
  `[${that.__base.$options.name}]`,
49
58
  `The "${refName}" ref is missing.`,
50
59
  `Is there an \`[data-ref="${refName}"]\` element in the component's scope?`
@@ -54,6 +63,7 @@ function __register(that, refName) {
54
63
  }
55
64
  that.__eventsManager.bindRef(refName, refs);
56
65
  Object.defineProperty(that, propName, {
66
+ // @todo remove usage of non-multiple refs as array
57
67
  value: isMultiple || refs.length > 1 ? refs : refs[0],
58
68
  enumerable: true,
59
69
  configurable: true
@@ -65,14 +75,25 @@ function __unregister(that, refName) {
65
75
  that.__eventsManager.unbindRef(refName, refs);
66
76
  }
67
77
  class RefsManager extends AbstractManager {
78
+ /**
79
+ * Get refs configuration.
80
+ */
68
81
  get __refs() {
69
82
  return this.__config.refs ?? [];
70
83
  }
84
+ /**
85
+ * Register all refs.
86
+ */
71
87
  registerAll() {
72
- this.__refs.forEach((refName) => __register(this, refName));
88
+ for (const refName of this.__refs)
89
+ __register(this, refName);
73
90
  }
91
+ /**
92
+ * Unregister all refs.
93
+ */
74
94
  unregisterAll() {
75
- this.__refs.forEach((refName) => __unregister(this, refName));
95
+ for (const refName of this.__refs)
96
+ __unregister(this, refName);
76
97
  }
77
98
  }
78
99
  export {