@studiometa/js-toolkit 2.12.1 → 3.0.0-alpha.10

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 (383) hide show
  1. package/Base/Base.d.ts +8 -8
  2. package/Base/Base.js +75 -78
  3. package/Base/Base.js.map +2 -2
  4. package/Base/features.d.ts +15 -2
  5. package/Base/features.js +31 -1
  6. package/Base/features.js.map +2 -2
  7. package/Base/index.d.ts +1 -0
  8. package/Base/index.js +4 -0
  9. package/Base/index.js.map +2 -2
  10. package/Base/managers/AbstractManager.d.ts +1 -1
  11. package/Base/managers/ChildrenManager.d.ts +6 -6
  12. package/Base/managers/ChildrenManager.js +34 -20
  13. package/Base/managers/ChildrenManager.js.map +2 -2
  14. package/Base/managers/EventsManager.d.ts +6 -28
  15. package/Base/managers/EventsManager.js +54 -64
  16. package/Base/managers/EventsManager.js.map +2 -2
  17. package/Base/managers/OptionsManager.d.ts +6 -6
  18. package/Base/managers/OptionsManager.js +29 -23
  19. package/Base/managers/OptionsManager.js.map +3 -3
  20. package/Base/managers/RefsManager.d.ts +1 -1
  21. package/Base/managers/RefsManager.js +23 -34
  22. package/Base/managers/RefsManager.js.map +3 -3
  23. package/Base/managers/ResponsiveOptionsManager.js +7 -4
  24. package/Base/managers/ResponsiveOptionsManager.js.map +2 -2
  25. package/Base/managers/ServicesManager.d.ts +2 -4
  26. package/Base/managers/ServicesManager.js +2 -3
  27. package/Base/managers/ServicesManager.js.map +2 -2
  28. package/Base/utils.d.ts +10 -5
  29. package/Base/utils.js +37 -23
  30. package/Base/utils.js.map +2 -2
  31. package/README.md +107 -6
  32. package/decorators/index.d.ts +1 -1
  33. package/decorators/index.js +1 -1
  34. package/decorators/index.js.map +1 -1
  35. package/decorators/withBreakpointManager.js +6 -4
  36. package/decorators/withBreakpointManager.js.map +2 -2
  37. package/decorators/withBreakpointObserver.d.ts +0 -1
  38. package/decorators/withBreakpointObserver.js +5 -3
  39. package/decorators/withBreakpointObserver.js.map +2 -2
  40. package/decorators/withIntersectionObserver.js +3 -5
  41. package/decorators/withIntersectionObserver.js.map +2 -2
  42. package/decorators/withMountOnMediaQuery.js +3 -3
  43. package/decorators/withMountOnMediaQuery.js.map +2 -2
  44. package/decorators/withMountWhenInView.js +3 -3
  45. package/decorators/withMountWhenInView.js.map +2 -2
  46. package/decorators/withName.d.ts +6 -0
  47. package/decorators/withName.js +12 -0
  48. package/decorators/withName.js.map +7 -0
  49. package/decorators/withScrolledInView/utils.d.ts +12 -1
  50. package/decorators/withScrolledInView/utils.js.map +2 -2
  51. package/decorators/withScrolledInView/withScrolledInView.js +7 -62
  52. package/decorators/withScrolledInView/withScrolledInView.js.map +2 -2
  53. package/helpers/createApp.d.ts +3 -4
  54. package/helpers/createApp.js +21 -11
  55. package/helpers/createApp.js.map +2 -2
  56. package/helpers/getDirectChildren.js +10 -5
  57. package/helpers/getDirectChildren.js.map +2 -2
  58. package/helpers/importWhenVisible.js +1 -2
  59. package/helpers/importWhenVisible.js.map +1 -1
  60. package/index.d.ts +2 -3
  61. package/index.js +2 -4
  62. package/index.js.map +2 -2
  63. package/package.json +2 -10
  64. package/services/index.d.ts +1 -1
  65. package/services/index.js.map +2 -2
  66. package/services/pointer.d.ts +1 -1
  67. package/services/pointer.js +3 -3
  68. package/services/pointer.js.map +2 -2
  69. package/services/raf.js +2 -4
  70. package/services/raf.js.map +2 -2
  71. package/services/resize.d.ts +7 -6
  72. package/services/resize.js +18 -26
  73. package/services/resize.js.map +2 -2
  74. package/services/scroll.d.ts +14 -0
  75. package/services/scroll.js +39 -21
  76. package/services/scroll.js.map +2 -2
  77. package/utils/SmartQueue.d.ts +1 -1
  78. package/utils/SmartQueue.js +1 -1
  79. package/utils/SmartQueue.js.map +2 -2
  80. package/utils/css/animate.d.ts +33 -15
  81. package/utils/css/animate.js +67 -26
  82. package/utils/css/animate.js.map +2 -2
  83. package/utils/css/getOffsetSizes.js +2 -2
  84. package/utils/css/getOffsetSizes.js.map +1 -1
  85. package/utils/css/index.d.ts +2 -1
  86. package/utils/css/index.js +4 -4
  87. package/utils/css/index.js.map +2 -2
  88. package/utils/css/matrix.d.ts +1 -1
  89. package/utils/css/matrix.js.map +2 -2
  90. package/utils/css/transform.d.ts +1 -1
  91. package/utils/css/transform.js +1 -1
  92. package/utils/css/transform.js.map +2 -2
  93. package/utils/css/utils.d.ts +1 -1
  94. package/utils/css/utils.js +1 -1
  95. package/utils/css/utils.js.map +2 -2
  96. package/utils/index.d.ts +6 -4
  97. package/utils/index.js +17 -16
  98. package/utils/index.js.map +2 -2
  99. package/utils/is.d.ts +12 -0
  100. package/utils/is.js +17 -0
  101. package/utils/is.js.map +2 -2
  102. package/utils/math/createRange.d.ts +4 -0
  103. package/utils/math/createRange.js +13 -0
  104. package/utils/math/createRange.js.map +7 -0
  105. package/utils/math/ease.d.ts +1 -0
  106. package/utils/math/ease.js +2 -0
  107. package/utils/math/ease.js.map +2 -2
  108. package/utils/math/index.d.ts +5 -3
  109. package/utils/math/index.js +7 -3
  110. package/utils/math/index.js.map +2 -2
  111. package/utils/math/mean.d.ts +1 -0
  112. package/utils/math/mean.js +17 -0
  113. package/utils/math/mean.js.map +7 -0
  114. package/utils/memo.d.ts +5 -0
  115. package/utils/memo.js +14 -0
  116. package/utils/memo.js.map +7 -0
  117. package/utils/nextFrame.d.ts +4 -22
  118. package/utils/nextFrame.js +3 -10
  119. package/utils/nextFrame.js.map +2 -2
  120. package/utils/nextMicrotask.d.ts +4 -1
  121. package/utils/nextMicrotask.js +3 -3
  122. package/utils/nextMicrotask.js.map +2 -2
  123. package/utils/nextTick.d.ts +4 -1
  124. package/utils/nextTick.js +3 -3
  125. package/utils/nextTick.js.map +2 -2
  126. package/utils/random.d.ts +15 -0
  127. package/utils/random.js +15 -0
  128. package/utils/random.js.map +7 -0
  129. package/utils/scrollTo.d.ts +30 -6
  130. package/utils/scrollTo.js +97 -43
  131. package/utils/scrollTo.js.map +2 -2
  132. package/utils/string/changeCase.d.ts +24 -0
  133. package/utils/string/changeCase.js +47 -0
  134. package/utils/string/changeCase.js.map +7 -0
  135. package/utils/string/index.d.ts +1 -0
  136. package/utils/string/index.js +1 -0
  137. package/utils/string/index.js.map +2 -2
  138. package/utils/{focusTrap.d.ts → trapFocus.d.ts} +2 -10
  139. package/utils/{focusTrap.js → trapFocus.js} +5 -9
  140. package/utils/trapFocus.js.map +7 -0
  141. package/utils/tween.d.ts +59 -10
  142. package/utils/tween.js +24 -18
  143. package/utils/tween.js.map +2 -2
  144. package/Base/Base.cjs +0 -420
  145. package/Base/Base.cjs.map +0 -7
  146. package/Base/features.cjs +0 -27
  147. package/Base/features.cjs.map +0 -7
  148. package/Base/index.cjs +0 -21
  149. package/Base/index.cjs.map +0 -7
  150. package/Base/managers/AbstractManager.cjs +0 -78
  151. package/Base/managers/AbstractManager.cjs.map +0 -7
  152. package/Base/managers/ChildrenManager.cjs +0 -156
  153. package/Base/managers/ChildrenManager.cjs.map +0 -7
  154. package/Base/managers/EventsManager.cjs +0 -305
  155. package/Base/managers/EventsManager.cjs.map +0 -7
  156. package/Base/managers/OptionsManager.cjs +0 -198
  157. package/Base/managers/OptionsManager.cjs.map +0 -7
  158. package/Base/managers/RefsManager.cjs +0 -118
  159. package/Base/managers/RefsManager.cjs.map +0 -7
  160. package/Base/managers/ResponsiveOptionsManager.cjs +0 -79
  161. package/Base/managers/ResponsiveOptionsManager.cjs.map +0 -7
  162. package/Base/managers/ServicesManager.cjs +0 -161
  163. package/Base/managers/ServicesManager.cjs.map +0 -7
  164. package/Base/managers/index.cjs +0 -39
  165. package/Base/managers/index.cjs.map +0 -7
  166. package/Base/types.cjs +0 -19
  167. package/Base/types.cjs.map +0 -7
  168. package/Base/utils.cjs +0 -95
  169. package/Base/utils.cjs.map +0 -7
  170. package/decorators/index.cjs +0 -33
  171. package/decorators/index.cjs.map +0 -7
  172. package/decorators/withBreakpointManager.cjs +0 -102
  173. package/decorators/withBreakpointManager.cjs.map +0 -7
  174. package/decorators/withBreakpointObserver.cjs +0 -128
  175. package/decorators/withBreakpointObserver.cjs.map +0 -7
  176. package/decorators/withDrag.cjs +0 -56
  177. package/decorators/withDrag.cjs.map +0 -7
  178. package/decorators/withExtraConfig.cjs +0 -50
  179. package/decorators/withExtraConfig.cjs.map +0 -7
  180. package/decorators/withFreezedOptions.cjs +0 -50
  181. package/decorators/withFreezedOptions.cjs.map +0 -7
  182. package/decorators/withIntersectionObserver.cjs +0 -71
  183. package/decorators/withIntersectionObserver.cjs.map +0 -7
  184. package/decorators/withMountOnMediaQuery.cjs +0 -86
  185. package/decorators/withMountOnMediaQuery.cjs.map +0 -7
  186. package/decorators/withMountWhenInView.cjs +0 -92
  187. package/decorators/withMountWhenInView.cjs.map +0 -7
  188. package/decorators/withMountWhenPrefersMotion.cjs +0 -30
  189. package/decorators/withMountWhenPrefersMotion.cjs.map +0 -7
  190. package/decorators/withRelativePointer.cjs +0 -56
  191. package/decorators/withRelativePointer.cjs.map +0 -7
  192. package/decorators/withResponsiveOptions.cjs +0 -41
  193. package/decorators/withResponsiveOptions.cjs.map +0 -7
  194. package/decorators/withScrolledInView/index.cjs +0 -22
  195. package/decorators/withScrolledInView/index.cjs.map +0 -7
  196. package/decorators/withScrolledInView/types.cjs +0 -19
  197. package/decorators/withScrolledInView/types.cjs.map +0 -7
  198. package/decorators/withScrolledInView/utils.cjs +0 -99
  199. package/decorators/withScrolledInView/utils.cjs.map +0 -7
  200. package/decorators/withScrolledInView/withScrolledInView.cjs +0 -249
  201. package/decorators/withScrolledInView/withScrolledInView.cjs.map +0 -7
  202. package/decorators/withVue2.cjs +0 -68
  203. package/decorators/withVue2.cjs.map +0 -7
  204. package/decorators/withVue2.d.ts +0 -16
  205. package/decorators/withVue2.js +0 -46
  206. package/decorators/withVue2.js.map +0 -7
  207. package/helpers/createApp.cjs +0 -58
  208. package/helpers/createApp.cjs.map +0 -7
  209. package/helpers/getClosestParent.cjs +0 -45
  210. package/helpers/getClosestParent.cjs.map +0 -7
  211. package/helpers/getDirectChildren.cjs +0 -47
  212. package/helpers/getDirectChildren.cjs.map +0 -7
  213. package/helpers/getInstanceFromElement.cjs +0 -32
  214. package/helpers/getInstanceFromElement.cjs.map +0 -7
  215. package/helpers/importOnInteraction.cjs +0 -48
  216. package/helpers/importOnInteraction.cjs.map +0 -7
  217. package/helpers/importOnMediaQuery.cjs +0 -44
  218. package/helpers/importOnMediaQuery.cjs.map +0 -7
  219. package/helpers/importWhenIdle.cjs +0 -46
  220. package/helpers/importWhenIdle.cjs.map +0 -7
  221. package/helpers/importWhenPrefersMotion.cjs +0 -40
  222. package/helpers/importWhenPrefersMotion.cjs.map +0 -7
  223. package/helpers/importWhenVisible.cjs +0 -44
  224. package/helpers/importWhenVisible.cjs.map +0 -7
  225. package/helpers/index.cjs +0 -53
  226. package/helpers/index.cjs.map +0 -7
  227. package/helpers/utils.cjs +0 -37
  228. package/helpers/utils.cjs.map +0 -7
  229. package/index.cjs +0 -31
  230. package/index.cjs.map +0 -7
  231. package/services/drag.cjs +0 -231
  232. package/services/drag.cjs.map +0 -7
  233. package/services/index.cjs +0 -51
  234. package/services/index.cjs.map +0 -7
  235. package/services/key.cjs +0 -97
  236. package/services/key.cjs.map +0 -7
  237. package/services/load.cjs +0 -60
  238. package/services/load.cjs.map +0 -7
  239. package/services/pointer.cjs +0 -145
  240. package/services/pointer.cjs.map +0 -7
  241. package/services/raf.cjs +0 -80
  242. package/services/raf.cjs.map +0 -7
  243. package/services/resize.cjs +0 -107
  244. package/services/resize.cjs.map +0 -7
  245. package/services/scroll.cjs +0 -119
  246. package/services/scroll.cjs.map +0 -7
  247. package/services/service.cjs +0 -69
  248. package/services/service.cjs.map +0 -7
  249. package/utils/Queue.cjs +0 -93
  250. package/utils/Queue.cjs.map +0 -7
  251. package/utils/SmartQueue.cjs +0 -73
  252. package/utils/SmartQueue.cjs.map +0 -7
  253. package/utils/collide/boundingRectToCircle.cjs +0 -36
  254. package/utils/collide/boundingRectToCircle.cjs.map +0 -7
  255. package/utils/collide/collideCircleCircle.cjs +0 -35
  256. package/utils/collide/collideCircleCircle.cjs.map +0 -7
  257. package/utils/collide/collideCircleRect.cjs +0 -47
  258. package/utils/collide/collideCircleRect.cjs.map +0 -7
  259. package/utils/collide/collidePointCircle.cjs +0 -32
  260. package/utils/collide/collidePointCircle.cjs.map +0 -7
  261. package/utils/collide/collidePointRect.cjs +0 -32
  262. package/utils/collide/collidePointRect.cjs.map +0 -7
  263. package/utils/collide/collideRectRect.cjs +0 -32
  264. package/utils/collide/collideRectRect.cjs.map +0 -7
  265. package/utils/collide/index.cjs +0 -47
  266. package/utils/collide/index.cjs.map +0 -7
  267. package/utils/css/animate.cjs +0 -202
  268. package/utils/css/animate.cjs.map +0 -7
  269. package/utils/css/classes.cjs +0 -51
  270. package/utils/css/classes.cjs.map +0 -7
  271. package/utils/css/getOffsetSizes.cjs +0 -48
  272. package/utils/css/getOffsetSizes.cjs.map +0 -7
  273. package/utils/css/index.cjs +0 -52
  274. package/utils/css/index.cjs.map +0 -7
  275. package/utils/css/matrix.cjs +0 -30
  276. package/utils/css/matrix.cjs.map +0 -7
  277. package/utils/css/styles.cjs +0 -45
  278. package/utils/css/styles.cjs.map +0 -7
  279. package/utils/css/transform.cjs +0 -91
  280. package/utils/css/transform.cjs.map +0 -7
  281. package/utils/css/transition.cjs +0 -145
  282. package/utils/css/transition.cjs.map +0 -7
  283. package/utils/css/utils.cjs +0 -32
  284. package/utils/css/utils.cjs.map +0 -7
  285. package/utils/debounce.cjs +0 -35
  286. package/utils/debounce.cjs.map +0 -7
  287. package/utils/dom/ancestors.cjs +0 -37
  288. package/utils/dom/ancestors.cjs.map +0 -7
  289. package/utils/dom/index.cjs +0 -21
  290. package/utils/dom/index.cjs.map +0 -7
  291. package/utils/focusTrap.cjs +0 -93
  292. package/utils/focusTrap.cjs.map +0 -7
  293. package/utils/focusTrap.js.map +0 -7
  294. package/utils/getComponentResolver.cjs +0 -38
  295. package/utils/getComponentResolver.cjs.map +0 -7
  296. package/utils/has.cjs +0 -29
  297. package/utils/has.cjs.map +0 -7
  298. package/utils/history.cjs +0 -92
  299. package/utils/history.cjs.map +0 -7
  300. package/utils/index.cjs +0 -76
  301. package/utils/index.cjs.map +0 -7
  302. package/utils/is.cjs +0 -41
  303. package/utils/is.cjs.map +0 -7
  304. package/utils/keyCodes.cjs +0 -36
  305. package/utils/keyCodes.cjs.map +0 -7
  306. package/utils/math/clamp.cjs +0 -29
  307. package/utils/math/clamp.cjs.map +0 -7
  308. package/utils/math/clamp01.cjs +0 -40
  309. package/utils/math/clamp01.cjs.map +0 -7
  310. package/utils/math/createEases.cjs +0 -33
  311. package/utils/math/createEases.cjs.map +0 -7
  312. package/utils/math/damp.cjs +0 -29
  313. package/utils/math/damp.cjs.map +0 -7
  314. package/utils/math/ease.cjs +0 -82
  315. package/utils/math/ease.cjs.map +0 -7
  316. package/utils/math/index.cjs +0 -54
  317. package/utils/math/index.cjs.map +0 -7
  318. package/utils/math/inertiaFinalValue.cjs +0 -47
  319. package/utils/math/inertiaFinalValue.cjs.map +0 -7
  320. package/utils/math/lerp.cjs +0 -29
  321. package/utils/math/lerp.cjs.map +0 -7
  322. package/utils/math/map.cjs +0 -29
  323. package/utils/math/map.cjs.map +0 -7
  324. package/utils/math/round.cjs +0 -29
  325. package/utils/math/round.cjs.map +0 -7
  326. package/utils/memoize.cjs +0 -48
  327. package/utils/memoize.cjs.map +0 -7
  328. package/utils/nextFrame.cjs +0 -41
  329. package/utils/nextFrame.cjs.map +0 -7
  330. package/utils/nextMicrotask.cjs +0 -30
  331. package/utils/nextMicrotask.cjs.map +0 -7
  332. package/utils/nextTick.cjs +0 -31
  333. package/utils/nextTick.cjs.map +0 -7
  334. package/utils/noop.cjs +0 -32
  335. package/utils/noop.cjs.map +0 -7
  336. package/utils/object/autoBind.cjs +0 -60
  337. package/utils/object/autoBind.cjs.map +0 -7
  338. package/utils/object/autoBind.d.ts +0 -14
  339. package/utils/object/autoBind.js +0 -28
  340. package/utils/object/autoBind.js.map +0 -7
  341. package/utils/object/getAllProperties.cjs +0 -39
  342. package/utils/object/getAllProperties.cjs.map +0 -7
  343. package/utils/object/index.cjs +0 -39
  344. package/utils/object/index.cjs.map +0 -7
  345. package/utils/object/index.d.ts +0 -2
  346. package/utils/object/index.js +0 -7
  347. package/utils/object/index.js.map +0 -7
  348. package/utils/scheduler.cjs +0 -75
  349. package/utils/scheduler.cjs.map +0 -7
  350. package/utils/scrollTo.cjs +0 -88
  351. package/utils/scrollTo.cjs.map +0 -7
  352. package/utils/string/endsWith.cjs +0 -35
  353. package/utils/string/endsWith.cjs.map +0 -7
  354. package/utils/string/index.cjs +0 -58
  355. package/utils/string/index.cjs.map +0 -7
  356. package/utils/string/startsWith.cjs +0 -35
  357. package/utils/string/startsWith.cjs.map +0 -7
  358. package/utils/string/withLeadingCharacters.cjs +0 -40
  359. package/utils/string/withLeadingCharacters.cjs.map +0 -7
  360. package/utils/string/withLeadingSlash.cjs +0 -40
  361. package/utils/string/withLeadingSlash.cjs.map +0 -7
  362. package/utils/string/withTrailingCharacters.cjs +0 -40
  363. package/utils/string/withTrailingCharacters.cjs.map +0 -7
  364. package/utils/string/withTrailingSlash.cjs +0 -40
  365. package/utils/string/withTrailingSlash.cjs.map +0 -7
  366. package/utils/string/withoutLeadingCharacters.cjs +0 -29
  367. package/utils/string/withoutLeadingCharacters.cjs.map +0 -7
  368. package/utils/string/withoutLeadingCharactersRecursive.cjs +0 -45
  369. package/utils/string/withoutLeadingCharactersRecursive.cjs.map +0 -7
  370. package/utils/string/withoutLeadingSlash.cjs +0 -40
  371. package/utils/string/withoutLeadingSlash.cjs.map +0 -7
  372. package/utils/string/withoutTrailingCharacters.cjs +0 -29
  373. package/utils/string/withoutTrailingCharacters.cjs.map +0 -7
  374. package/utils/string/withoutTrailingCharactersRecursive.cjs +0 -45
  375. package/utils/string/withoutTrailingCharactersRecursive.cjs.map +0 -7
  376. package/utils/string/withoutTrailingSlash.cjs +0 -40
  377. package/utils/string/withoutTrailingSlash.cjs.map +0 -7
  378. package/utils/throttle.cjs +0 -37
  379. package/utils/throttle.cjs.map +0 -7
  380. package/utils/tween.cjs +0 -122
  381. package/utils/tween.cjs.map +0 -7
  382. package/utils/wait.cjs +0 -31
  383. package/utils/wait.cjs.map +0 -7
@@ -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';\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": "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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 * @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): 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);\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\nasync function __triggerHookForAll(that: ChildrenManager, hook: '$mount' | '$update' | '$destroy') {\n return addToQueue(() => {\n const promises = [];\n for (const name of that.registeredNames) {\n for (const instance of that[name]) {\n if (instance instanceof Promise) {\n promises.push(\n instance.then((resolvedInstance) =>\n addToQueue(() => that.__triggerHook(hook, resolvedInstance, name)),\n ),\n );\n } else {\n promises.push(addToQueue(() => that.__triggerHook(hook, instance, name)));\n }\n }\n }\n return Promise.all(promises);\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 async registerAll() {\n const promises = [];\n\n for (const [name, component] of Object.entries(this.__config.components)) {\n promises.push(this.__register(name, component));\n }\n\n await Promise.all(promises);\n }\n\n /**\n * Mount all child component instances.\n */\n async mountAll() {\n await __triggerHookForAll(this, '$mount');\n }\n\n /**\n * Update all child component instances.\n */\n async updateAll() {\n await __triggerHookForAll(this, '$update');\n }\n\n /**\n * Destroy all child component instances.\n */\n async destroyAll() {\n await __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 async __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 await 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\n const children = [];\n for (const element of elements) {\n const child = __getChild(this, element, component);\n if (child !== 'terminated') {\n children.push(child);\n }\n }\n\n return children;\n }\n}\n"],
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }
@@ -1,33 +1,11 @@
1
1
  import type { Base } from '../index.js';
2
2
  import { AbstractManager } from './AbstractManager.js';
3
- /**
4
- * Normalize the given name to PascalCase, such as:
5
- *
6
- * ```
7
- * sentence case => SentenceCase
8
- * lowercase => Lowercase
9
- * UPPERCASE => Uppercase
10
- * kebab-case => KebabCase
11
- * snake_case => SnakeCase
12
- * camelCase => CamelCase
13
- * PascalCase => PascalCase
14
- * .class-selector => ClassSelector
15
- * .bem__selector => BemSelector
16
- * __id-selector => IdSelector
17
- * .complex[class^ ="__"] => ComplexClass
18
- * ```
19
- *
20
- * @param {string} name
21
- * @returns {string}
22
- */
23
- export declare function normalizeName(name: string): string;
24
- /**
25
- * Normalize the event names from PascalCase to kebab-case.
26
- *
27
- * @param {string} name
28
- * @returns {string}
29
- */
30
- export declare function normalizeEventName(name: string): string;
3
+ export type EventManagerCallbackParams = {
4
+ event: Event | null;
5
+ args: Array<any>;
6
+ index: number;
7
+ target: Element | Base | Promise<Base> | typeof window | typeof document | null;
8
+ };
31
9
  /**
32
10
  * Event management class.
33
11
  *
@@ -1,33 +1,9 @@
1
1
  import getAllProperties from "../../utils/object/getAllProperties.js";
2
- import { isArray } from "../../utils/index.js";
2
+ import { dashCase, isArray, pascalCase } from "../../utils/index.js";
3
3
  import { getEventTarget, eventIsNative, eventIsDefinedInConfig } from "../utils.js";
4
4
  import { AbstractManager } from "./AbstractManager.js";
5
5
  import { normalizeRefName } from "./RefsManager.js";
6
- const names = /* @__PURE__ */ new Map();
7
- const normalizeRegex1 = /[A-Z]([A-Z].*)/g;
8
- const normalizeRegex2 = /[^a-zA-Z\d\s:]/g;
9
- const normalizeRegex3 = /(^\w|\s+\w)/g;
10
- function normalizeName(name) {
11
- if (!names.has(name)) {
12
- names.set(
13
- name,
14
- name.replaceAll(normalizeRegex1, (c) => c.toLowerCase()).replaceAll(normalizeRegex2, " ").replaceAll(normalizeRegex3, (c) => c.trim().toUpperCase()).trim()
15
- );
16
- }
17
- return names.get(name);
18
- }
19
- const eventNames = /* @__PURE__ */ new Map();
20
- const normalizeEventRegex1 = /[A-Z]/g;
21
- const normalizeEventRegex2 = /^-/;
22
- function normalizeEventName(name) {
23
- if (!eventNames.has(name)) {
24
- eventNames.set(
25
- name,
26
- name.replaceAll(normalizeEventRegex1, (c) => `-${c.toLowerCase()}`).replace(normalizeEventRegex2, "")
27
- );
28
- }
29
- return eventNames.get(name);
30
- }
6
+ import { features } from "../features.js";
31
7
  const regexes = /* @__PURE__ */ new Map();
32
8
  function getRegex(regex) {
33
9
  if (!regexes.has(regex)) {
@@ -36,12 +12,12 @@ function getRegex(regex) {
36
12
  return regexes.get(regex);
37
13
  }
38
14
  function getEventNameByMethod(method, name = "") {
39
- const regex = getRegex(`^on${normalizeName(name)}([A-Z].*)$`);
15
+ const regex = getRegex(`^on${pascalCase(name)}([A-Z].*)$`);
40
16
  const [, event] = method.match(regex);
41
- return normalizeEventName(event);
17
+ return dashCase(event);
42
18
  }
43
19
  function getEventMethodsByName(that, name = "") {
44
- const regex = getRegex(`^on${normalizeName(name)}[A-Z].*$`);
20
+ const regex = getRegex(`^on${pascalCase(name)}[A-Z].*$`);
45
21
  const key = regex.toString();
46
22
  let methods = that.__methodsCache.get(key);
47
23
  if (!methods) {
@@ -70,9 +46,12 @@ function manageRef(that, name, elements, mode = "add") {
70
46
  function manageChild(that, name, instance, mode = "add") {
71
47
  const action = mode === "add" ? "$on" : "$off";
72
48
  const methods = getEventMethodsByName(that, name);
49
+ const config = instance.__config;
73
50
  for (const method of methods) {
74
51
  const event = getEventNameByMethod(method, name);
75
- instance[action](event, that.__childrenHandler);
52
+ if (getEventTarget(instance, event, config)) {
53
+ instance[action](event, that.__childrenHandler);
54
+ }
76
55
  }
77
56
  }
78
57
  const isDocumentRegex = /^onDocument[A-Z][a-z]+/;
@@ -87,19 +66,28 @@ function manageRootElement(that, mode = "add") {
87
66
  const { __base: base, __config: config } = that;
88
67
  for (const method of methods) {
89
68
  let event = getEventNameByMethod(method);
90
- if (eventIsDefinedInConfig(event, config) || eventIsNative(event, base.$el)) {
91
- const target = getEventTarget(base, event, config);
92
- target[modeMethod](event, that.__rootElementHandler);
93
- } else if (methodIsGlobal(method)) {
69
+ if (methodIsGlobal(method)) {
94
70
  event = getEventNameByMethod(method, methodIsDocument(method) ? "document" : "window");
95
71
  const target = getGlobalEventTarget(method);
96
72
  target[modeMethod](
97
73
  event,
98
74
  methodIsDocument(method) ? that.__documentHandler : that.__windowHandler
99
75
  );
76
+ } else {
77
+ const target = getEventTarget(base, event, config);
78
+ target?.[modeMethod](event, that.__rootElementHandler);
100
79
  }
101
80
  }
102
81
  }
82
+ function normalizeParams(params = {}) {
83
+ return {
84
+ event: null,
85
+ args: [],
86
+ index: 0,
87
+ target: null,
88
+ ...params
89
+ };
90
+ }
103
91
  class EventsManager extends AbstractManager {
104
92
  __methodsCache = /* @__PURE__ */ new Map();
105
93
  /**
@@ -107,13 +95,16 @@ class EventsManager extends AbstractManager {
107
95
  */
108
96
  __rootElementHandler = {
109
97
  handleEvent: (event) => {
110
- const normalizedEventName = normalizeName(event.type);
98
+ const normalizedEventName = pascalCase(event.type);
111
99
  const method = `on${normalizedEventName}`;
112
- if (event instanceof CustomEvent && isArray(event.detail) && event.detail.length) {
113
- this.__base[method](...event.detail, event);
114
- } else {
115
- this.__base[method](event);
116
- }
100
+ const isCustomEvent = event instanceof CustomEvent;
101
+ this.__base[method](
102
+ normalizeParams({
103
+ event,
104
+ args: isCustomEvent ? event.detail ?? [] : [],
105
+ target: isCustomEvent ? this.__base : this.__element
106
+ })
107
+ );
117
108
  }
118
109
  };
119
110
  /**
@@ -127,9 +118,9 @@ class EventsManager extends AbstractManager {
127
118
  * @returns {void}
128
119
  */
129
120
  handleEvent: (event) => {
130
- const normalizedEventName = normalizeName(event.type);
121
+ const normalizedEventName = pascalCase(event.type);
131
122
  const method = `onDocument${normalizedEventName}`;
132
- this.__base[method](event);
123
+ this.__base[method](normalizeParams({ event, target: document }));
133
124
  }
134
125
  };
135
126
  /**
@@ -143,9 +134,9 @@ class EventsManager extends AbstractManager {
143
134
  * @returns {void}
144
135
  */
145
136
  handleEvent: (event) => {
146
- const normalizedEventName = normalizeName(event.type);
137
+ const normalizedEventName = pascalCase(event.type);
147
138
  const method = `onWindow${normalizedEventName}`;
148
- this.__base[method](event);
139
+ this.__base[method](normalizeParams({ event, target: window }));
149
140
  }
150
141
  };
151
142
  /**
@@ -154,15 +145,16 @@ class EventsManager extends AbstractManager {
154
145
  __refsHandler = {
155
146
  handleEvent: (event) => {
156
147
  const ref = event.currentTarget;
157
- const refName = normalizeRefName(ref.dataset.ref);
158
- const normalizedRefName = normalizeName(refName);
159
- const normalizedEventName = normalizeName(event.type);
148
+ const attributes = features.get("attributes");
149
+ const refName = normalizeRefName(ref.getAttribute(attributes.ref));
150
+ const normalizedRefName = pascalCase(refName);
151
+ const normalizedEventName = pascalCase(event.type);
160
152
  const method = `on${normalizedRefName}${normalizedEventName}`;
161
153
  let index = 0;
162
154
  if (isArray(this.__base.$refs[refName])) {
163
155
  index = this.__base.$refs[refName].indexOf(ref);
164
156
  }
165
- this.__base[method](event, index);
157
+ this.__base[method](normalizeParams({ event, index, target: ref }));
166
158
  }
167
159
  };
168
160
  /**
@@ -171,19 +163,19 @@ class EventsManager extends AbstractManager {
171
163
  __childrenHandler = {
172
164
  handleEvent: (event) => {
173
165
  const childrenManager = this.__base.$children;
174
- const { name, child: resolvedChild } = childrenManager.registeredNames.map((childName) => ({
175
- name: childName,
176
- child: [...childrenManager[childName]].find(
177
- // @ts-ignore
178
- (instance) => instance === event.currentTarget || instance.$el === event.currentTarget
179
- )
180
- })).find(({ child }) => child);
181
- const normalizedChildName = normalizeName(name);
182
- const normalizedEventName = normalizeName(event.type);
183
- const method = `on${normalizedChildName}${normalizedEventName}`;
184
- const index = [...childrenManager[name]].indexOf(resolvedChild);
185
- const args = isArray(event.detail) ? event.detail : [];
186
- this.__base[method](...args, index, event);
166
+ for (const childName of childrenManager.registeredNames) {
167
+ let index = -1;
168
+ for (const child of childrenManager[childName]) {
169
+ index++;
170
+ if (child.$el === event.currentTarget && (eventIsNative(event.type, child.$el) || eventIsDefinedInConfig(event.type, child.__config))) {
171
+ const normalizedEventName = pascalCase(event.type);
172
+ const normalizedChildName = pascalCase(childName);
173
+ const method = `on${normalizedChildName}${normalizedEventName}`;
174
+ const args = isArray(event.detail) ? event.detail : [];
175
+ this.__base[method](normalizeParams({ event, index, args, target: child }));
176
+ }
177
+ }
178
+ }
187
179
  }
188
180
  };
189
181
  /**
@@ -266,8 +258,6 @@ class EventsManager extends AbstractManager {
266
258
  }
267
259
  }
268
260
  export {
269
- EventsManager,
270
- normalizeEventName,
271
- normalizeName
261
+ EventsManager
272
262
  };
273
263
  //# sourceMappingURL=EventsManager.js.map
@@ -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 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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",
4
+ "sourcesContent": ["import type { Base, BaseProps } from '../index.js';\nimport getAllProperties from '../../utils/object/getAllProperties.js';\nimport { dashCase, isArray, pascalCase } from '../../utils/index.js';\nimport { getEventTarget, eventIsNative, eventIsDefinedInConfig } from '../utils.js';\nimport { AbstractManager } from './AbstractManager.js';\nimport { normalizeRefName } from './RefsManager.js';\nimport { features } from '../features.js';\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${pascalCase(name)}([A-Z].*)$`);\n const [, event] = method.match(regex);\n return dashCase(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${pascalCase(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 const config = instance.__config;\n for (const method of methods) {\n const event = getEventNameByMethod(method, name);\n if (getEventTarget(instance, event, config)) {\n instance[action](event, that.__childrenHandler);\n }\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 (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 } else {\n const target = getEventTarget(base, event, config);\n target?.[modeMethod](event, that.__rootElementHandler);\n }\n }\n}\n\nexport type EventManagerCallbackParams = {\n event: Event | null;\n args: Array<any>;\n index: number;\n target: Element | Base | Promise<Base> | typeof window | typeof document | null;\n};\n\n/**\n * Normalize `on...` method params.\n */\nfunction normalizeParams(\n params: Partial<EventManagerCallbackParams> = {},\n): EventManagerCallbackParams {\n return {\n event: null,\n args: [],\n index: 0,\n target: null,\n ...params,\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 = pascalCase(event.type);\n const method = `on${normalizedEventName}`;\n const isCustomEvent = event instanceof CustomEvent;\n\n this.__base[method](\n normalizeParams({\n event,\n args: isCustomEvent ? (event.detail ?? []) : [],\n target: isCustomEvent ? this.__base : this.__element,\n }),\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 = pascalCase(event.type);\n const method = `onDocument${normalizedEventName}`;\n\n this.__base[method](normalizeParams({ event, target: document }));\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 = pascalCase(event.type);\n const method = `onWindow${normalizedEventName}`;\n\n this.__base[method](normalizeParams({ event, target: window }));\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 attributes = features.get('attributes');\n const refName = normalizeRefName(ref.getAttribute(attributes.ref));\n\n const normalizedRefName = pascalCase(refName);\n const normalizedEventName = pascalCase(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](normalizeParams({ event, index, target: ref }));\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 for (const childName of childrenManager.registeredNames) {\n let index = -1;\n\n for (const child of childrenManager[childName] as Base<BaseProps>[]) {\n index++;\n\n if (\n child.$el === event.currentTarget &&\n (eventIsNative(event.type, child.$el) ||\n eventIsDefinedInConfig(event.type, child.__config))\n ) {\n const normalizedEventName = pascalCase(event.type);\n const normalizedChildName = pascalCase(childName);\n const method = `on${normalizedChildName}${normalizedEventName}`;\n const args = isArray(event.detail) ? event.detail : [];\n this.__base[method](normalizeParams({ event, index, args, target: child }));\n }\n }\n }\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": "AACA,OAAO,sBAAsB;AAC7B,SAAS,UAAU,SAAS,kBAAkB;AAC9C,SAAS,gBAAgB,eAAe,8BAA8B;AACtE,SAAS,uBAAuB;AAChC,SAAS,wBAAwB;AACjC,SAAS,gBAAgB;AAEzB,MAAM,UAAU,oBAAI,IAAI;AAQxB,SAAS,SAAS,OAAuB;AACvC,MAAI,CAAC,QAAQ,IAAI,KAAK,GAAG;AACvB,YAAQ,IAAI,OAAO,IAAI,OAAO,KAAK,CAAC;AAAA,EACtC;AAEA,SAAO,QAAQ,IAAI,KAAK;AAC1B;AAUA,SAAS,qBAAqB,QAAgB,OAAO,IAAY;AAC/D,QAAM,QAAQ,SAAS,MAAM,WAAW,IAAI,CAAC,YAAY;AACzD,QAAM,CAAC,EAAE,KAAK,IAAI,OAAO,MAAM,KAAK;AACpC,SAAO,SAAS,KAAK;AACvB;AAWA,SAAS,sBAAsB,MAAqB,OAAO,IAAc;AACvE,QAAM,QAAQ,SAAS,MAAM,WAAW,IAAI,CAAC,UAAU;AACvD,QAAM,MAAM,MAAM,SAAS;AAE3B,MAAI,UAAU,KAAK,eAAe,IAAI,GAAG;AAEzC,MAAI,CAAC,SAAS;AACZ,cAAU,MAAM;AAAA,MACd,iBAAiB,KAAK,QAAQ,CAAC,GAAG,CAAC,WAAW,MAAM,KAAK,MAAM,CAAC,EAAE;AAAA,QAChE,CAAC,KAAK,CAAC,MAAM,MAAM,IAAI,IAAI,MAAM;AAAA,QACjC,oBAAI,IAAI;AAAA,MACV;AAAA,IACF;AACA,SAAK,eAAe,IAAI,KAAK,OAAO;AAAA,EACtC;AAEA,SAAO;AACT;AAeA,SAAS,UAEP,MACA,MACA,UACA,OAAyB,OACzB;AACA,QAAM,SAAS,GAAG,IAAI;AACtB,QAAM,UAAU,sBAAsB,MAAM,IAAI;AAChD,aAAW,UAAU,SAAS;AAC5B,UAAM,QAAQ,qBAAqB,QAAQ,IAAI;AAC/C,eAAW,WAAW,UAAU;AAC9B,UAAI,mBAAmB,aAAa;AAClC,gBAAQ,MAAM,EAAE,OAAO,KAAK,aAAa;AAAA,MAC3C;AAAA,IACF;AAAA,EACF;AACF;AAcA,SAAS,YAEP,MACA,MACA,UACA,OAAyB,OACzB;AACA,QAAM,SAAS,SAAS,QAAQ,QAAQ;AACxC,QAAM,UAAU,sBAAsB,MAAM,IAAI;AAChD,QAAM,SAAS,SAAS;AACxB,aAAW,UAAU,SAAS;AAC5B,UAAM,QAAQ,qBAAqB,QAAQ,IAAI;AAC/C,QAAI,eAAe,UAAU,OAAO,MAAM,GAAG;AAC3C,eAAS,MAAM,EAAE,OAAO,KAAK,iBAAiB;AAAA,IAChD;AAAA,EACF;AACF;AAEA,MAAM,kBAAkB;AACxB,MAAM,gBAAgB;AACtB,MAAM,mBAAmB,CAAC,WAAW,gBAAgB,KAAK,MAAM;AAChE,MAAM,iBAAiB,CAAC,WAAW,cAAc,KAAK,MAAM;AAC5D,MAAM,iBAAiB,CAAC,WAAW,eAAe,MAAM,KAAK,iBAAiB,MAAM;AACpF,MAAM,uBAAuB,CAAC,WAAY,iBAAiB,MAAM,IAAI,WAAW;AAYhF,SAAS,kBAAkB,MAAqB,OAAyB,OAAO;AAC9E,QAAM,aAAa,GAAG,IAAI;AAC1B,QAAM,UAAU,sBAAsB,IAAI;AAE1C,QAAM,EAAE,QAAQ,MAAM,UAAU,OAAO,IAAI;AAE3C,aAAW,UAAU,SAAS;AAC5B,QAAI,QAAQ,qBAAqB,MAAM;AAEvC,QAAI,eAAe,MAAM,GAAG;AAC1B,cAAQ,qBAAqB,QAAQ,iBAAiB,MAAM,IAAI,aAAa,QAAQ;AACrF,YAAM,SAAS,qBAAqB,MAAM;AAC1C,aAAO,UAAU;AAAA,QACf;AAAA,QACA,iBAAiB,MAAM,IAAI,KAAK,oBAAoB,KAAK;AAAA,MAC3D;AAAA,IACF,OAAO;AACL,YAAM,SAAS,eAAe,MAAM,OAAO,MAAM;AACjD,eAAS,UAAU,EAAE,OAAO,KAAK,oBAAoB;AAAA,IACvD;AAAA,EACF;AACF;AAYA,SAAS,gBACP,SAA8C,CAAC,GACnB;AAC5B,SAAO;AAAA,IACL,OAAO;AAAA,IACP,MAAM,CAAC;AAAA,IACP,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,GAAG;AAAA,EACL;AACF;AAQO,MAAM,sBAAsB,gBAAgB;AAAA,EACjD,iBAAwC,oBAAI,IAAI;AAAA;AAAA;AAAA;AAAA,EAKhD,uBAA4C;AAAA,IAC1C,aAAa,CAAC,UAA+B;AAC3C,YAAM,sBAAsB,WAAW,MAAM,IAAI;AACjD,YAAM,SAAS,KAAK,mBAAmB;AACvC,YAAM,gBAAgB,iBAAiB;AAEvC,WAAK,OAAO,MAAM;AAAA,QAChB,gBAAgB;AAAA,UACd;AAAA,UACA,MAAM,gBAAiB,MAAM,UAAU,CAAC,IAAK,CAAC;AAAA,UAC9C,QAAQ,gBAAgB,KAAK,SAAS,KAAK;AAAA,QAC7C,CAAC;AAAA,MACH;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,oBAAoB;AAAA;AAAA;AAAA;AAAA;AAAA,IAKlB,aAAa,CAAC,UAAU;AACtB,YAAM,sBAAsB,WAAW,MAAM,IAAI;AACjD,YAAM,SAAS,aAAa,mBAAmB;AAE/C,WAAK,OAAO,MAAM,EAAE,gBAAgB,EAAE,OAAO,QAAQ,SAAS,CAAC,CAAC;AAAA,IAClE;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,kBAAkB;AAAA;AAAA;AAAA;AAAA;AAAA,IAKhB,aAAa,CAAC,UAAU;AACtB,YAAM,sBAAsB,WAAW,MAAM,IAAI;AACjD,YAAM,SAAS,WAAW,mBAAmB;AAE7C,WAAK,OAAO,MAAM,EAAE,gBAAgB,EAAE,OAAO,QAAQ,OAAO,CAAC,CAAC;AAAA,IAChE;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,gBAAqC;AAAA,IACnC,aAAa,CAAC,UAAU;AACtB,YAAM,MAAM,MAAM;AAClB,YAAM,aAAa,SAAS,IAAI,YAAY;AAC5C,YAAM,UAAU,iBAAiB,IAAI,aAAa,WAAW,GAAG,CAAC;AAEjE,YAAM,oBAAoB,WAAW,OAAO;AAC5C,YAAM,sBAAsB,WAAW,MAAM,IAAI;AACjD,YAAM,SAAS,KAAK,iBAAiB,GAAG,mBAAmB;AAE3D,UAAI,QAAQ;AACZ,UAAI,QAAQ,KAAK,OAAO,MAAM,OAAO,CAAC,GAAG;AACvC,gBAAS,KAAK,OAAO,MAAM,OAAO,EAAoB,QAAQ,GAAG;AAAA,MACnE;AAEA,WAAK,OAAO,MAAM,EAAE,gBAAgB,EAAE,OAAO,OAAO,QAAQ,IAAI,CAAC,CAAC;AAAA,IACpE;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,oBAAyC;AAAA,IACvC,aAAa,CAAC,UAAuB;AACnC,YAAM,kBAAkB,KAAK,OAAO;AAEpC,iBAAW,aAAa,gBAAgB,iBAAiB;AACvD,YAAI,QAAQ;AAEZ,mBAAW,SAAS,gBAAgB,SAAS,GAAwB;AACnE;AAEA,cACE,MAAM,QAAQ,MAAM,kBACnB,cAAc,MAAM,MAAM,MAAM,GAAG,KAClC,uBAAuB,MAAM,MAAM,MAAM,QAAQ,IACnD;AACA,kBAAM,sBAAsB,WAAW,MAAM,IAAI;AACjD,kBAAM,sBAAsB,WAAW,SAAS;AAChD,kBAAM,SAAS,KAAK,mBAAmB,GAAG,mBAAmB;AAC7D,kBAAM,OAAO,QAAQ,MAAM,MAAM,IAAI,MAAM,SAAS,CAAC;AACrD,iBAAK,OAAO,MAAM,EAAE,gBAAgB,EAAE,OAAO,OAAO,MAAM,QAAQ,MAAM,CAAC,CAAC;AAAA,UAC5E;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,YAAY,MAAY;AACtB,UAAM,IAAI;AAEV,SAAK,iBAAiB;AAAA,MACpB;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF,CAAC;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWA,QAAQ,MAAc,UAAyB;AAC7C,cAAU,MAAM,MAAM,QAAQ;AAAA,EAChC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWA,UAAU,MAAc,UAAyB;AAC/C,cAAU,MAAM,MAAM,UAAU,QAAQ;AAAA,EAC1C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWA,UAAU,MAAc,UAAgB;AACtC,gBAAY,MAAM,MAAM,QAAQ;AAAA,EAClC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWA,YAAY,MAAc,UAAgB;AACxC,gBAAY,MAAM,MAAM,UAAU,QAAQ;AAAA,EAC5C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,kBAAkB;AAChB,sBAAkB,IAAI;AAAA,EACxB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,oBAAoB;AAClB,sBAAkB,MAAM,QAAQ;AAAA,EAClC;AACF;",
6
6
  "names": []
7
7
  }
@@ -4,25 +4,25 @@ import type { Base } from '../index.js';
4
4
  type OptionType = StringConstructor | NumberConstructor | BooleanConstructor | ArrayConstructor | ObjectConstructor;
5
5
  type ArrayOption = {
6
6
  type: ArrayConstructor;
7
- default?: () => unknown[];
7
+ default?: (instance: Base) => unknown[];
8
8
  merge?: boolean | DeepmergeOptions;
9
9
  };
10
10
  type ObjectOption = {
11
11
  type: ObjectConstructor;
12
- default?: () => unknown;
12
+ default?: (instance: Base) => unknown;
13
13
  merge?: boolean | DeepmergeOptions;
14
14
  };
15
15
  type StringOption = {
16
16
  type: StringConstructor;
17
- default?: string;
17
+ default?: string | ((instance: Base) => string);
18
18
  };
19
19
  type NumberOption = {
20
20
  type: NumberConstructor;
21
- default?: number;
21
+ default?: number | ((instance: Base) => number);
22
22
  };
23
23
  type BooleanOption = {
24
24
  type: BooleanConstructor;
25
- default?: boolean;
25
+ default?: boolean | ((instance: Base) => boolean);
26
26
  };
27
27
  export type OptionObject = ArrayOption | ObjectOption | StringOption | NumberOption | BooleanOption;
28
28
  export type OptionsSchema = {
@@ -34,7 +34,7 @@ export type OptionsInterface = {
34
34
  /**
35
35
  * Get a property name.
36
36
  */
37
- export declare function __getPropertyName(name: string, prefix?: string): string;
37
+ export declare const __getPropertyName: (name: string, prefix?: unknown) => string;
38
38
  /**
39
39
  * Class options to manage options as data attributes on an HTML element.
40
40
  *
@@ -1,6 +1,15 @@
1
1
  import deepmerge from "deepmerge";
2
2
  import { AbstractManager } from "./AbstractManager.js";
3
- import { isDev, isFunction, isDefined, isBoolean, isArray, isObject } from "../../utils/index.js";
3
+ import {
4
+ isDev,
5
+ isFunction,
6
+ isDefined,
7
+ isBoolean,
8
+ isArray,
9
+ isObject,
10
+ memo
11
+ } from "../../utils/index.js";
12
+ import { features } from "../features.js";
4
13
  const types = /* @__PURE__ */ new Set([String, Number, Boolean, Array, Object]);
5
14
  const __defaultValues = {
6
15
  String: "",
@@ -9,16 +18,12 @@ const __defaultValues = {
9
18
  Array: () => [],
10
19
  Object: () => ({})
11
20
  };
12
- const __propertyNameCache = /* @__PURE__ */ new Map();
13
- function __getPropertyName(name, prefix = "") {
14
- const key = name + prefix;
15
- if (__propertyNameCache.has(key)) {
16
- return __propertyNameCache.get(key);
17
- }
18
- const propertyName = `option${prefix}${name.replace(/^\w/, (c) => c.toUpperCase())}`;
19
- __propertyNameCache.set(key, propertyName);
21
+ const UPPERCASE_REGEX = /([A-Z])/g;
22
+ const __getPropertyName = memo(function __getPropertyName2(name, prefix = "") {
23
+ const attributes = features.get("attributes");
24
+ const propertyName = `${attributes.option}${prefix ? `-${prefix}` : ""}-${name.replaceAll(UPPERCASE_REGEX, "-$1")}`;
20
25
  return propertyName;
21
- }
26
+ });
22
27
  function __register(that, name, config) {
23
28
  if (!types.has(config.type)) {
24
29
  if (isDev) {
@@ -92,27 +97,28 @@ class OptionsManager extends AbstractManager {
92
97
  * Get an option value.
93
98
  */
94
99
  get(name, config) {
95
- const { type, default: defaultValue } = config;
100
+ const { type } = config;
101
+ const defaultValue = isFunction(config.default) ? config.default(this.__base) : config.default;
96
102
  const propertyName = __getPropertyName(name);
97
- const hasProperty = isDefined(this.__element.dataset[propertyName]);
103
+ const hasProperty = this.__element.hasAttribute(propertyName);
98
104
  if (type === Boolean) {
99
105
  if (defaultValue) {
100
- const negatedPropertyName = __getPropertyName(name, "No");
101
- const hasNegatedProperty = isDefined(this.__element.dataset[negatedPropertyName]);
106
+ const negatedPropertyName = __getPropertyName(name, "no");
107
+ const hasNegatedProperty = this.__element.hasAttribute(negatedPropertyName);
102
108
  return !hasNegatedProperty;
103
109
  }
104
110
  return hasProperty || defaultValue;
105
111
  }
106
- const value = this.__element.dataset[propertyName];
112
+ const value = this.__element.getAttribute(propertyName);
107
113
  if (type === Number) {
108
114
  return hasProperty ? Number(value) : defaultValue;
109
115
  }
110
116
  if (type === Array || type === Object) {
111
117
  config = type === Array ? config : config;
112
118
  if (!this.__values[name]) {
113
- let val = hasProperty ? JSON.parse(value) : config.default();
119
+ let val = hasProperty ? JSON.parse(value) : defaultValue;
114
120
  if (isDefined(config.merge)) {
115
- val = isBoolean(config.merge) ? deepmerge(config.default(), val) : deepmerge(config.default(), val, config.merge);
121
+ val = isBoolean(config.merge) ? deepmerge(defaultValue, val) : deepmerge(defaultValue, val, config.merge);
116
122
  }
117
123
  this.__values[name] = val;
118
124
  }
@@ -138,16 +144,16 @@ class OptionsManager extends AbstractManager {
138
144
  switch (type) {
139
145
  case Boolean:
140
146
  if (defaultValue) {
141
- const negatedPropertyName = __getPropertyName(name, "No");
147
+ const negatedPropertyName = __getPropertyName(name, "no");
142
148
  if (value) {
143
- delete this.__element.dataset[negatedPropertyName];
149
+ this.__element.removeAttribute(negatedPropertyName);
144
150
  } else {
145
- this.__element.dataset[negatedPropertyName] = "";
151
+ this.__element.setAttribute(negatedPropertyName, "");
146
152
  }
147
153
  } else if (value) {
148
- this.__element.dataset[propertyName] = "";
154
+ this.__element.setAttribute(propertyName, "");
149
155
  } else {
150
- delete this.__element.dataset[propertyName];
156
+ this.__element.removeAttribute(propertyName);
151
157
  }
152
158
  break;
153
159
  case Array:
@@ -155,7 +161,7 @@ class OptionsManager extends AbstractManager {
155
161
  this.__values[name] = value;
156
162
  break;
157
163
  default:
158
- this.__element.dataset[propertyName] = value;
164
+ this.__element.setAttribute(propertyName, value);
159
165
  }
160
166
  }
161
167
  }
@@ -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 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
- "names": []
4
+ "sourcesContent": ["import deepmerge from 'deepmerge';\nimport type { Options as DeepmergeOptions } from 'deepmerge';\nimport { AbstractManager } from './AbstractManager.js';\nimport {\n isDev,\n isFunction,\n isDefined,\n isBoolean,\n isArray,\n isObject,\n memo,\n} from '../../utils/index.js';\nimport type { Base } from '../index.js';\nimport { features } from '../features.js';\n\ntype OptionType =\n | StringConstructor\n | NumberConstructor\n | BooleanConstructor\n | ArrayConstructor\n | ObjectConstructor;\n\ntype ArrayOption = {\n type: ArrayConstructor;\n default?: (instance: Base) => unknown[];\n merge?: boolean | DeepmergeOptions;\n};\n\ntype ObjectOption = {\n type: ObjectConstructor;\n default?: (instance: Base) => unknown;\n merge?: boolean | DeepmergeOptions;\n};\n\ntype StringOption = {\n type: StringConstructor;\n default?: string | ((instance: Base) => string);\n};\n\ntype NumberOption = {\n type: NumberConstructor;\n default?: number | ((instance: Base) => number);\n};\n\ntype BooleanOption = {\n type: BooleanConstructor;\n default?: boolean | ((instance: Base) => 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\nconst UPPERCASE_REGEX = /([A-Z])/g;\n\n/**\n * Get a property name.\n */\nexport const __getPropertyName = memo(function __getPropertyName(name: string, prefix = '') {\n const attributes = features.get('attributes');\n const propertyName = `${attributes.option}${prefix ? `-${prefix}` : ''}-${name.replaceAll(UPPERCASE_REGEX, '-$1')}`;\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 } = config;\n const defaultValue = isFunction(config.default) ? config.default(this.__base) : config.default;\n const propertyName = __getPropertyName(name);\n const hasProperty = this.__element.hasAttribute(propertyName);\n\n if (type === Boolean) {\n if (defaultValue) {\n const negatedPropertyName = __getPropertyName(name, 'no');\n const hasNegatedProperty = this.__element.hasAttribute(negatedPropertyName);\n\n return !hasNegatedProperty;\n }\n\n return hasProperty || defaultValue;\n }\n\n const value = this.__element.getAttribute(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) : defaultValue;\n\n if (isDefined(config.merge)) {\n val = isBoolean(config.merge)\n ? deepmerge(defaultValue, val)\n : deepmerge(defaultValue, 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 this.__element.removeAttribute(negatedPropertyName);\n } else {\n this.__element.setAttribute(negatedPropertyName, '');\n }\n } else if (value) {\n this.__element.setAttribute(propertyName, '');\n } else {\n this.__element.removeAttribute(propertyName);\n }\n break;\n case Array:\n case Object:\n this.__values[name] = value;\n break;\n default:\n this.__element.setAttribute(propertyName, value as string);\n }\n }\n}\n"],
5
+ "mappings": "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",
6
+ "names": ["__getPropertyName"]
7
7
  }
@@ -2,7 +2,7 @@ import { AbstractManager } from './AbstractManager.js';
2
2
  /**
3
3
  * Normalize the name of ref.
4
4
  */
5
- export declare function normalizeRefName(name: string): any;
5
+ export declare const normalizeRefName: (name: string) => string;
6
6
  /**
7
7
  * Refs Manager
8
8
  *