@schukai/monster 3.51.5 → 3.52.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (360) hide show
  1. package/CHANGELOG.md +17 -0
  2. package/README.md +15 -12
  3. package/example/components/form/button.mjs +10 -0
  4. package/example/components/form/select.mjs +25 -0
  5. package/example/components/form/tree-select.mjs +27 -0
  6. package/example/components/host/host.mjs +0 -0
  7. package/example/components/notify/message.mjs +4 -0
  8. package/example/components/notify/notify.mjs +4 -0
  9. package/example/components/state/log.mjs +0 -0
  10. package/example/components/state/state.mjs +0 -0
  11. package/package.json +6 -2
  12. package/source/components/constants.mjs +132 -0
  13. package/source/components/datatable/columnbar.mjs +310 -0
  14. package/source/components/datatable/constants.mjs +121 -0
  15. package/source/components/datatable/dataset.mjs +219 -0
  16. package/source/components/datatable/datasource/dom.mjs +186 -0
  17. package/source/components/datatable/datasource/namespace.mjs +13 -0
  18. package/source/components/datatable/datasource/rest.mjs +400 -0
  19. package/source/components/datatable/datasource.mjs +102 -0
  20. package/source/components/datatable/datatable/header.mjs +268 -0
  21. package/source/components/datatable/datatable/namespace.mjs +13 -0
  22. package/source/components/datatable/datatable.mjs +789 -0
  23. package/source/components/datatable/embedded-pagination.mjs +113 -0
  24. package/source/components/datatable/filter/abstract-base.mjs +31 -0
  25. package/source/components/datatable/filter/date-range.mjs +1041 -0
  26. package/source/components/datatable/filter/input.mjs +175 -0
  27. package/source/components/datatable/filter/namespace.mjs +13 -0
  28. package/source/components/datatable/filter/range.mjs +671 -0
  29. package/source/components/datatable/filter/select.mjs +65 -0
  30. package/source/components/datatable/filter/settings.mjs +116 -0
  31. package/source/components/datatable/filter-button.mjs +98 -0
  32. package/source/components/datatable/filter.mjs +929 -0
  33. package/source/components/datatable/namespace.mjs +11 -0
  34. package/source/components/datatable/pagination.mjs +456 -0
  35. package/source/components/datatable/style/column-bar.pcss +123 -0
  36. package/source/components/datatable/style/dataset.pcss +13 -0
  37. package/source/components/datatable/style/datasource.pcss +16 -0
  38. package/source/components/datatable/style/datatable.pcss +239 -0
  39. package/source/components/datatable/style/embedded-pagination.pcss +101 -0
  40. package/source/components/datatable/style/filter-button.pcss +22 -0
  41. package/source/components/datatable/style/filter-controls-defaults.pcss +46 -0
  42. package/source/components/datatable/style/filter-date-range.pcss +9 -0
  43. package/source/components/datatable/style/filter-range.pcss +5 -0
  44. package/source/components/datatable/style/filter.pcss +156 -0
  45. package/source/components/datatable/style/pagination.pcss +59 -0
  46. package/source/components/datatable/style/select-filter.pcss +27 -0
  47. package/source/components/datatable/stylesheet/column-bar.mjs +33 -0
  48. package/source/components/datatable/stylesheet/dataset.mjs +33 -0
  49. package/source/components/datatable/stylesheet/datasource.mjs +33 -0
  50. package/source/components/datatable/stylesheet/datatable.mjs +33 -0
  51. package/source/components/datatable/stylesheet/embedded-pagination.mjs +33 -0
  52. package/source/components/datatable/stylesheet/filter-button.mjs +33 -0
  53. package/source/components/datatable/stylesheet/filter-controls-defaults.mjs +33 -0
  54. package/source/components/datatable/stylesheet/filter-date-range.mjs +33 -0
  55. package/source/components/datatable/stylesheet/filter-range.mjs +33 -0
  56. package/source/components/datatable/stylesheet/filter.mjs +33 -0
  57. package/source/components/datatable/stylesheet/namespace.mjs +13 -0
  58. package/source/components/datatable/stylesheet/pagination.mjs +33 -0
  59. package/source/components/datatable/stylesheet/select-filter.mjs +33 -0
  60. package/source/components/datatable/util.mjs +60 -0
  61. package/source/components/form/action-button.mjs +262 -0
  62. package/source/components/form/api-button.mjs +515 -0
  63. package/source/components/form/button-bar.mjs +739 -0
  64. package/source/components/form/button.mjs +350 -0
  65. package/source/components/form/confirm-button.mjs +330 -0
  66. package/source/components/form/constants.mjs +111 -0
  67. package/source/components/form/context-help.mjs +123 -0
  68. package/source/components/form/events.mjs +84 -0
  69. package/source/components/form/form.mjs +601 -0
  70. package/source/components/form/message-state-button.mjs +396 -0
  71. package/source/components/form/namespace.mjs +13 -0
  72. package/source/components/form/popper-button.mjs +435 -0
  73. package/source/components/form/popper.mjs +487 -0
  74. package/source/components/form/reload.mjs +360 -0
  75. package/source/components/form/select.mjs +2314 -0
  76. package/source/components/form/shadow-reload.mjs +137 -0
  77. package/source/components/form/state-button.mjs +182 -0
  78. package/source/components/form/style/action-button.pcss +41 -0
  79. package/source/components/form/style/api-button.pcss +0 -0
  80. package/source/components/form/style/button-bar.pcss +51 -0
  81. package/source/components/form/style/button.pcss +8 -0
  82. package/source/components/form/style/confirm-button.pcss +17 -0
  83. package/source/components/form/style/context-help.pcss +16 -0
  84. package/source/components/form/style/form.pcss +10 -0
  85. package/source/components/form/style/message-state-button.pcss +10 -0
  86. package/source/components/form/style/popper-button.pcss +16 -0
  87. package/source/components/form/style/popper.pcss +8 -0
  88. package/source/components/form/style/select.pcss +265 -0
  89. package/source/components/form/style/state-button.pcss +116 -0
  90. package/source/components/form/style/tabs.pcss +170 -0
  91. package/source/components/form/style/tree-select.pcss +81 -0
  92. package/source/components/form/stylesheet/action-button.mjs +33 -0
  93. package/source/components/form/stylesheet/api-button.mjs +33 -0
  94. package/source/components/form/stylesheet/button-bar.mjs +33 -0
  95. package/source/components/form/stylesheet/button.mjs +33 -0
  96. package/source/components/form/stylesheet/confirm-button.mjs +33 -0
  97. package/source/components/form/stylesheet/context-help.mjs +33 -0
  98. package/source/components/form/stylesheet/form.mjs +33 -0
  99. package/source/components/form/stylesheet/message-state-button.mjs +33 -0
  100. package/source/components/form/stylesheet/namespace.mjs +13 -0
  101. package/source/components/form/stylesheet/popper-button.mjs +33 -0
  102. package/source/components/form/stylesheet/popper.mjs +33 -0
  103. package/source/components/form/stylesheet/select.mjs +33 -0
  104. package/source/components/form/stylesheet/state-button.mjs +33 -0
  105. package/source/components/form/stylesheet/tabs.mjs +33 -0
  106. package/source/components/form/stylesheet/tree-select.mjs +33 -0
  107. package/source/components/form/tabs.mjs +1011 -0
  108. package/source/components/form/template.mjs +373 -0
  109. package/source/components/form/tree-select.mjs +527 -0
  110. package/source/components/form/types/namespace.mjs +13 -0
  111. package/source/components/form/types/state.mjs +93 -0
  112. package/source/components/form/util/fetch.mjs +133 -0
  113. package/source/components/form/util/floating-ui.mjs +245 -0
  114. package/source/components/form/util/namespace.mjs +13 -0
  115. package/source/components/form/util/popper.mjs +49 -0
  116. package/source/components/host/call-button.mjs +236 -0
  117. package/source/components/host/collapse.mjs +526 -0
  118. package/source/components/host/config-manager.mjs +304 -0
  119. package/source/components/host/constants.mjs +18 -0
  120. package/source/components/host/details.mjs +268 -0
  121. package/source/components/host/events.mjs +131 -0
  122. package/source/components/host/host.mjs +420 -0
  123. package/source/components/host/namespace.mjs +13 -0
  124. package/source/components/host/overlay.mjs +339 -0
  125. package/source/components/host/style/call-button.pcss +36 -0
  126. package/source/components/host/style/collapse.pcss +67 -0
  127. package/source/components/host/style/config-manager.pcss +5 -0
  128. package/source/components/host/style/details.pcss +68 -0
  129. package/source/components/host/style/host.pcss +43 -0
  130. package/source/components/host/style/overlay.pcss +73 -0
  131. package/source/components/host/style/toggle-button.pcss +36 -0
  132. package/source/components/host/style/viewer.pcss +13 -0
  133. package/source/components/host/stylesheet/call-button.mjs +33 -0
  134. package/source/components/host/stylesheet/collapse.mjs +33 -0
  135. package/source/components/host/stylesheet/config-manager.mjs +33 -0
  136. package/source/components/host/stylesheet/details.mjs +33 -0
  137. package/source/components/host/stylesheet/host.mjs +33 -0
  138. package/source/components/host/stylesheet/namespace.mjs +13 -0
  139. package/source/components/host/stylesheet/overlay.mjs +33 -0
  140. package/source/components/host/stylesheet/toggle-button.mjs +33 -0
  141. package/source/components/host/stylesheet/viewer.mjs +33 -0
  142. package/source/components/host/toggle-button.mjs +88 -0
  143. package/source/components/host/util.mjs +23 -0
  144. package/source/components/host/viewer.mjs +309 -0
  145. package/source/components/namespace.mjs +14 -0
  146. package/source/components/notify/constants.mjs +15 -0
  147. package/source/components/notify/events.mjs +15 -0
  148. package/source/components/notify/message.mjs +374 -0
  149. package/source/components/notify/namespace.mjs +15 -0
  150. package/source/components/notify/notify.mjs +236 -0
  151. package/source/components/notify/style/message.pcss +57 -0
  152. package/source/components/notify/style/notify.pcss +118 -0
  153. package/source/components/notify/stylesheet/message.mjs +33 -0
  154. package/source/components/notify/stylesheet/namespace.mjs +15 -0
  155. package/source/components/notify/stylesheet/notify.mjs +33 -0
  156. package/source/components/state/log/entry.mjs +126 -0
  157. package/source/components/state/log/namespace.mjs +13 -0
  158. package/source/components/state/log.mjs +275 -0
  159. package/source/components/state/namespace.mjs +13 -0
  160. package/source/components/state/state.mjs +131 -0
  161. package/source/components/state/style/log.pcss +111 -0
  162. package/source/components/state/style/state.pcss +113 -0
  163. package/source/components/state/stylesheet/log.mjs +33 -0
  164. package/source/components/state/stylesheet/state.mjs +33 -0
  165. package/source/components/style/badge.pcss +92 -0
  166. package/source/components/style/border.pcss +77 -0
  167. package/source/components/style/button.pcss +105 -0
  168. package/source/components/style/card.pcss +108 -0
  169. package/source/components/style/color.pcss +257 -0
  170. package/source/components/style/common.pcss +103 -0
  171. package/source/components/style/control.pcss +11 -0
  172. package/source/components/style/data-grid.pcss +43 -0
  173. package/source/components/style/display.pcss +42 -0
  174. package/source/components/style/floating-ui.pcss +33 -0
  175. package/source/components/style/form.pcss +5 -0
  176. package/source/components/style/host.pcss +15 -0
  177. package/source/components/style/link.pcss +63 -0
  178. package/source/components/style/mixin/badge.pcss +18 -0
  179. package/source/components/style/mixin/button.pcss +54 -0
  180. package/source/components/style/mixin/form.pcss +247 -0
  181. package/source/components/style/mixin/hover.pcss +8 -0
  182. package/source/components/style/mixin/media.pcss +107 -0
  183. package/source/components/style/mixin/property.pcss +288 -0
  184. package/source/components/style/mixin/skeleton.pcss +26 -0
  185. package/source/components/style/mixin/spinner.pcss +24 -0
  186. package/source/components/style/mixin/typography.pcss +52 -0
  187. package/source/components/style/normalize.pcss +14 -0
  188. package/source/components/style/popper.pcss +78 -0
  189. package/source/components/style/property.pcss +17 -0
  190. package/source/components/style/ripple.pcss +14 -0
  191. package/source/components/style/skeleton.pcss +28 -0
  192. package/source/components/style/space.pcss +47 -0
  193. package/source/components/style/spinner.pcss +6 -0
  194. package/source/components/style/table.pcss +46 -0
  195. package/source/components/style/theme.pcss +119 -0
  196. package/source/components/style/typography.pcss +131 -0
  197. package/source/components/stylesheet/badge.mjs +33 -0
  198. package/source/components/stylesheet/border.mjs +33 -0
  199. package/source/components/stylesheet/button.mjs +33 -0
  200. package/source/components/stylesheet/card.mjs +33 -0
  201. package/source/components/stylesheet/color.mjs +33 -0
  202. package/source/components/stylesheet/common.mjs +33 -0
  203. package/source/components/stylesheet/control.mjs +33 -0
  204. package/source/components/stylesheet/data-grid.mjs +33 -0
  205. package/source/components/stylesheet/display.mjs +33 -0
  206. package/source/components/stylesheet/floating-ui.mjs +33 -0
  207. package/source/components/stylesheet/form.mjs +33 -0
  208. package/source/components/stylesheet/host.mjs +33 -0
  209. package/source/components/stylesheet/link.mjs +33 -0
  210. package/source/components/stylesheet/namespace.mjs +13 -0
  211. package/source/components/stylesheet/normalize.mjs +33 -0
  212. package/source/components/stylesheet/popper.mjs +33 -0
  213. package/source/components/stylesheet/property.mjs +33 -0
  214. package/source/components/stylesheet/ripple.mjs +33 -0
  215. package/source/components/stylesheet/skeleton.mjs +33 -0
  216. package/source/components/stylesheet/space.mjs +33 -0
  217. package/source/components/stylesheet/spinner.mjs +33 -0
  218. package/source/components/stylesheet/table.mjs +33 -0
  219. package/source/components/stylesheet/theme.mjs +33 -0
  220. package/source/components/stylesheet/tree-menu.mjs +33 -0
  221. package/source/components/stylesheet/typography.mjs +33 -0
  222. package/source/components/tree-menu/namespace.mjs +13 -0
  223. package/source/components/tree-menu/style/tree-menu.pcss +107 -0
  224. package/source/components/tree-menu/stylesheet/namespace.mjs +13 -0
  225. package/source/components/tree-menu/stylesheet/tree-menu.mjs +33 -0
  226. package/source/components/tree-menu/tree-menu.mjs +660 -0
  227. package/source/constraints/abstract.mjs +17 -24
  228. package/source/constraints/abstractoperator.mjs +27 -22
  229. package/source/constraints/andoperator.mjs +20 -17
  230. package/source/constraints/invalid.mjs +17 -17
  231. package/source/constraints/isarray.mjs +20 -20
  232. package/source/constraints/isobject.mjs +20 -20
  233. package/source/constraints/oroperator.mjs +45 -45
  234. package/source/constraints/valid.mjs +17 -17
  235. package/source/data/buildmap.mjs +108 -103
  236. package/source/data/buildtree.mjs +59 -57
  237. package/source/data/datasource/dom.mjs +80 -84
  238. package/source/data/datasource/namespace.mjs +1 -1
  239. package/source/data/datasource/server/restapi/data-fetch-error.mjs +27 -25
  240. package/source/data/datasource/server/restapi/writeerror.mjs +34 -32
  241. package/source/data/datasource/server/restapi.mjs +176 -177
  242. package/source/data/datasource/server/webconnect.mjs +150 -156
  243. package/source/data/datasource/server.mjs +58 -59
  244. package/source/data/datasource/storage/localstorage.mjs +25 -24
  245. package/source/data/datasource/storage/sessionstorage.mjs +28 -25
  246. package/source/data/datasource/storage.mjs +74 -73
  247. package/source/data/datasource.mjs +176 -167
  248. package/source/data/diff.mjs +98 -97
  249. package/source/data/extend.mjs +42 -42
  250. package/source/data/pathfinder.mjs +301 -288
  251. package/source/data/pipe.mjs +36 -36
  252. package/source/data/transformer.mjs +742 -726
  253. package/source/dom/assembler.mjs +44 -44
  254. package/source/dom/attributes.mjs +142 -122
  255. package/source/dom/constants.mjs +62 -58
  256. package/source/dom/customcontrol.mjs +299 -299
  257. package/source/dom/customelement.mjs +843 -806
  258. package/source/dom/dimension.mjs +56 -46
  259. package/source/dom/events.mjs +74 -69
  260. package/source/dom/focusmanager.mjs +175 -175
  261. package/source/dom/locale.mjs +28 -28
  262. package/source/dom/ready.mjs +13 -13
  263. package/source/dom/resource/data.mjs +117 -111
  264. package/source/dom/resource/link/stylesheet.mjs +16 -16
  265. package/source/dom/resource/link.mjs +94 -96
  266. package/source/dom/resource/script.mjs +72 -74
  267. package/source/dom/resource.mjs +174 -172
  268. package/source/dom/resourcemanager.mjs +152 -156
  269. package/source/dom/slotted.mjs +78 -80
  270. package/source/dom/template.mjs +126 -112
  271. package/source/dom/theme.mjs +35 -35
  272. package/source/dom/updater.mjs +673 -651
  273. package/source/dom/util/extract-keys.mjs +34 -22
  274. package/source/dom/util/init-options-from-attributes.mjs +46 -38
  275. package/source/dom/util/namespace.mjs +13 -0
  276. package/source/dom/util/set-option-from-attribute.mjs +35 -29
  277. package/source/dom/util.mjs +112 -81
  278. package/source/dom/worker/factory.mjs +83 -83
  279. package/source/i18n/formatter.mjs +75 -73
  280. package/source/i18n/locale.mjs +146 -144
  281. package/source/i18n/provider.mjs +70 -64
  282. package/source/i18n/providers/embed.mjs +136 -127
  283. package/source/i18n/providers/fetch.mjs +84 -76
  284. package/source/i18n/translations.mjs +205 -195
  285. package/source/logging/handler/console.mjs +36 -36
  286. package/source/logging/handler.mjs +140 -140
  287. package/source/logging/logentry.mjs +25 -25
  288. package/source/logging/logger.mjs +177 -175
  289. package/source/math/random.mjs +63 -59
  290. package/source/monster.mjs +223 -103
  291. package/source/net/webconnect/message.mjs +31 -31
  292. package/source/net/webconnect.mjs +278 -271
  293. package/source/text/bracketed-key-value-hash.mjs +182 -179
  294. package/source/text/formatter.mjs +235 -210
  295. package/source/text/generate-range-comparison-expression.mjs +56 -34
  296. package/source/text/namespace.mjs +1 -1
  297. package/source/types/base.mjs +69 -61
  298. package/source/types/basewithoptions.mjs +46 -46
  299. package/source/types/binary.mjs +20 -20
  300. package/source/types/dataurl.mjs +96 -90
  301. package/source/types/global.mjs +45 -39
  302. package/source/types/id.mjs +25 -25
  303. package/source/types/internal.mjs +115 -114
  304. package/source/types/is.mjs +56 -40
  305. package/source/types/mediatype.mjs +119 -119
  306. package/source/types/namespace.mjs +1 -1
  307. package/source/types/node.mjs +160 -150
  308. package/source/types/nodelist.mjs +94 -96
  309. package/source/types/noderecursiveiterator.mjs +50 -50
  310. package/source/types/observablequeue.mjs +73 -73
  311. package/source/types/observer.mjs +104 -104
  312. package/source/types/observerlist.mjs +66 -66
  313. package/source/types/proxyobserver.mjs +210 -210
  314. package/source/types/queue.mjs +63 -63
  315. package/source/types/randomid.mjs +13 -13
  316. package/source/types/regex.mjs +3 -1
  317. package/source/types/stack.mjs +64 -64
  318. package/source/types/tokenlist.mjs +206 -205
  319. package/source/types/typeof.mjs +12 -10
  320. package/source/types/uniquequeue.mjs +48 -48
  321. package/source/types/uuid.mjs +32 -32
  322. package/source/types/validate.mjs +67 -67
  323. package/source/types/version.mjs +115 -105
  324. package/source/util/clone.mjs +103 -91
  325. package/source/util/comparator.mjs +97 -97
  326. package/source/util/deadmansswitch.mjs +40 -44
  327. package/source/util/freeze.mjs +10 -9
  328. package/source/util/namespace.mjs +1 -1
  329. package/source/util/processing.mjs +104 -105
  330. package/source/util/runtime.mjs +56 -44
  331. package/source/util/trimspaces.mjs +24 -24
  332. package/test/cases/components/form/button.mjs +122 -0
  333. package/test/cases/components/form/confirm-button.mjs +127 -0
  334. package/test/cases/components/form/form.mjs +317 -0
  335. package/test/cases/components/form/reload.mjs +188 -0
  336. package/test/cases/components/form/select.mjs +229 -0
  337. package/test/cases/components/form/state-button.mjs +130 -0
  338. package/test/cases/components/form/tabs.mjs +98 -0
  339. package/test/cases/components/form/template.mjs +189 -0
  340. package/test/cases/components/form/tree-select.mjs +216 -0
  341. package/test/cases/components/host/details.mjs +68 -0
  342. package/test/cases/components/host/host.mjs +70 -0
  343. package/test/cases/components/host/overlay.mjs +60 -0
  344. package/test/cases/components/host/util.mjs +79 -0
  345. package/test/cases/components/notify/message.mjs +39 -0
  346. package/test/cases/components/notify/notify.mjs +89 -0
  347. package/test/cases/dom/customcontrol.mjs +5 -4
  348. package/test/cases/math/random.mjs +0 -1
  349. package/test/cases/monster.mjs +1 -1
  350. package/test/cases/net/webconnect/message.mjs +0 -1
  351. package/test/cases/types/node.mjs +1 -1
  352. package/test/util/chai-dom.mjs +2 -2
  353. package/test/util/intersection-mock.mjs +69 -0
  354. package/test/util/jsdom.mjs +41 -25
  355. package/test/util/localstorage.mjs +1 -0
  356. package/test/util/resize-observer.mjs +29 -0
  357. package/test/util/websocket.mjs +4 -1
  358. package/test/web/import.js +16 -1
  359. package/test/web/test.html +28 -5
  360. package/test/web/tests.js +30398 -17879
@@ -17,28 +17,40 @@ export { extractKeys };
17
17
  * @param {string} valueSeparator
18
18
  * @returns {Map<any, any>}
19
19
  */
20
- function extractKeys(obj, keyPrefix = "", keySeparator = "-", valueSeparator = ".") {
21
- const resultMap = new Map();
20
+ function extractKeys(
21
+ obj,
22
+ keyPrefix = "",
23
+ keySeparator = "-",
24
+ valueSeparator = ".",
25
+ ) {
26
+ const resultMap = new Map();
22
27
 
23
- function helper(currentObj, currentKeyPrefix, currentValuePrefix) {
24
- for (const key in currentObj) {
25
- if (currentObj[key] !== null && typeof currentObj[key] === "object" && !Array.isArray(currentObj[key])) {
26
- const newKeyPrefix = currentKeyPrefix
27
- ? currentKeyPrefix + keySeparator + key.toLowerCase()
28
- : key.toLowerCase();
29
- const newValuePrefix = currentValuePrefix ? currentValuePrefix + valueSeparator + key : key;
30
- helper(currentObj[key], newKeyPrefix, newValuePrefix);
31
- } else {
32
- const finalKey = currentKeyPrefix
33
- ? currentKeyPrefix + keySeparator + key.toLowerCase()
34
- : key.toLowerCase();
35
- const finalValue = currentValuePrefix ? currentValuePrefix + valueSeparator + key : key;
36
- resultMap.set(finalKey, finalValue);
37
- }
38
- }
39
- }
28
+ function helper(currentObj, currentKeyPrefix, currentValuePrefix) {
29
+ for (const key in currentObj) {
30
+ if (
31
+ currentObj[key] !== null &&
32
+ typeof currentObj[key] === "object" &&
33
+ !Array.isArray(currentObj[key])
34
+ ) {
35
+ const newKeyPrefix = currentKeyPrefix
36
+ ? currentKeyPrefix + keySeparator + key.toLowerCase()
37
+ : key.toLowerCase();
38
+ const newValuePrefix = currentValuePrefix
39
+ ? currentValuePrefix + valueSeparator + key
40
+ : key;
41
+ helper(currentObj[key], newKeyPrefix, newValuePrefix);
42
+ } else {
43
+ const finalKey = currentKeyPrefix
44
+ ? currentKeyPrefix + keySeparator + key.toLowerCase()
45
+ : key.toLowerCase();
46
+ const finalValue = currentValuePrefix
47
+ ? currentValuePrefix + valueSeparator + key
48
+ : key;
49
+ resultMap.set(finalKey, finalValue);
50
+ }
51
+ }
52
+ }
40
53
 
41
- helper(obj, keyPrefix, keyPrefix);
42
- return resultMap;
54
+ helper(obj, keyPrefix, keyPrefix);
55
+ return resultMap;
43
56
  }
44
-
@@ -41,50 +41,58 @@ export { initOptionsFromAttributes };
41
41
  * @returns {Object} - The initialized options object.
42
42
  * @this HTMLElement - The context of the DOM element.
43
43
  */
44
- function initOptionsFromAttributes(element, options, mapping = {}, prefix = "data-monster-option-") {
45
- if (!(element instanceof HTMLElement)) return options;
46
- if (!element.hasAttributes()) return options;
44
+ function initOptionsFromAttributes(
45
+ element,
46
+ options,
47
+ mapping = {},
48
+ prefix = "data-monster-option-",
49
+ ) {
50
+ if (!(element instanceof HTMLElement)) return options;
51
+ if (!element.hasAttributes()) return options;
47
52
 
48
- const keyMap = extractKeys(options);
53
+ const keyMap = extractKeys(options);
49
54
 
50
- const finder = new Pathfinder(options);
55
+ const finder = new Pathfinder(options);
51
56
 
52
- element.getAttributeNames().forEach((name) => {
53
- if (!name.startsWith(prefix)) return;
57
+ element.getAttributeNames().forEach((name) => {
58
+ if (!name.startsWith(prefix)) return;
54
59
 
55
- // check if the attribute name is a valid option.
56
- // the mapping between the attribute is simple. The dash is replaced by a dot.
57
- // e.g. data-monster-url => url
58
- const optionName = keyMap.get(name.substring(prefix.length).toLowerCase());
59
- if (!finder.exists(optionName)) return;
60
+ // check if the attribute name is a valid option.
61
+ // the mapping between the attribute is simple. The dash is replaced by a dot.
62
+ // e.g. data-monster-url => url
63
+ const optionName = keyMap.get(name.substring(prefix.length).toLowerCase());
64
+ if (!finder.exists(optionName)) return;
60
65
 
61
- if (element.hasAttribute(name)) {
62
- let value = element.getAttribute(name);
63
- if (mapping.hasOwnProperty(optionName) && isFunction(mapping[optionName])) {
64
- value = mapping[optionName](value);
65
- }
66
+ if (element.hasAttribute(name)) {
67
+ let value = element.getAttribute(name);
68
+ if (
69
+ mapping.hasOwnProperty(optionName) &&
70
+ isFunction(mapping[optionName])
71
+ ) {
72
+ value = mapping[optionName](value);
73
+ }
66
74
 
67
- let optionValue = finder.getVia(optionName);
68
- if (optionValue === null || optionValue === undefined) {
69
- optionValue = value;
70
- }
71
-
72
- const typeOfOptionValue = typeof optionValue;
73
- if (optionValue === null || optionValue === undefined) {
74
- value = null;
75
- } else if (typeOfOptionValue === "boolean") {
76
- value = value === "true";
77
- } else if (typeOfOptionValue === "number") {
78
- value = Number(value);
79
- } else if (typeOfOptionValue === "string") {
80
- value = String(value);
81
- } else if (typeOfOptionValue === "object") {
82
- value = JSON.parse(value);
83
- }
75
+ let optionValue = finder.getVia(optionName);
76
+ if (optionValue === null || optionValue === undefined) {
77
+ optionValue = value;
78
+ }
84
79
 
85
- finder.setVia(optionName, value);
86
- }
87
- });
80
+ const typeOfOptionValue = typeof optionValue;
81
+ if (optionValue === null || optionValue === undefined) {
82
+ value = null;
83
+ } else if (typeOfOptionValue === "boolean") {
84
+ value = value === "true";
85
+ } else if (typeOfOptionValue === "number") {
86
+ value = Number(value);
87
+ } else if (typeOfOptionValue === "string") {
88
+ value = String(value);
89
+ } else if (typeOfOptionValue === "object") {
90
+ value = JSON.parse(value);
91
+ }
88
92
 
89
- return options;
93
+ finder.setVia(optionName, value);
94
+ }
95
+ });
96
+
97
+ return options;
90
98
  }
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Copyright 2023 schukai GmbH
3
+ * SPDX-License-Identifier: AGPL-3.0
4
+ */
5
+
6
+ /**
7
+ * In this namespace all DOM utility functions are stored.
8
+ *
9
+ * @namespace Monster.DOM.Util
10
+ * @memberOf Monster
11
+ * @author schukai GmbH
12
+ */
13
+ const ns = {};
@@ -42,40 +42,46 @@ export { setOptionFromAttribute };
42
42
  * @returns {Object} - The initialized options object.
43
43
  * @this HTMLElement - The context of the DOM element.
44
44
  */
45
- function setOptionFromAttribute(element, name, options, mapping = {}, prefix = "data-monster-option-") {
46
- if (!(element instanceof HTMLElement)) return options;
47
- if (!element.hasAttributes()) return options;
45
+ function setOptionFromAttribute(
46
+ element,
47
+ name,
48
+ options,
49
+ mapping = {},
50
+ prefix = "data-monster-option-",
51
+ ) {
52
+ if (!(element instanceof HTMLElement)) return options;
53
+ if (!element.hasAttributes()) return options;
48
54
 
49
- const keyMap = extractKeys(options);
50
- const finder = new Pathfinder(options);
55
+ const keyMap = extractKeys(options);
56
+ const finder = new Pathfinder(options);
51
57
 
52
- // check if the attribute name is a valid option.
53
- // the mapping between the attribute is simple. The dash is replaced by a dot.
54
- // e.g. data-monster-url => url
55
- const optionName = keyMap.get(name.substring(prefix.length).toLowerCase());
56
- if (!finder.exists(optionName)) return;
58
+ // check if the attribute name is a valid option.
59
+ // the mapping between the attribute is simple. The dash is replaced by a dot.
60
+ // e.g. data-monster-url => url
61
+ const optionName = keyMap.get(name.substring(prefix.length).toLowerCase());
62
+ if (!finder.exists(optionName)) return;
57
63
 
58
- if (!element.hasAttribute(name)) {
59
- return options;
60
- }
64
+ if (!element.hasAttribute(name)) {
65
+ return options;
66
+ }
61
67
 
62
- let value = element.getAttribute(name);
63
- if (mapping.hasOwnProperty(optionName) && isFunction(mapping[optionName])) {
64
- value = mapping[optionName](value);
65
- }
68
+ let value = element.getAttribute(name);
69
+ if (mapping.hasOwnProperty(optionName) && isFunction(mapping[optionName])) {
70
+ value = mapping[optionName](value);
71
+ }
66
72
 
67
- const typeOfOptionValue = typeof finder.getVia(optionName);
68
- if (typeOfOptionValue === "boolean") {
69
- value = value === "true";
70
- } else if (typeOfOptionValue === "number") {
71
- value = Number(value);
72
- } else if (typeOfOptionValue === "string") {
73
- value = String(value);
74
- } else if (typeOfOptionValue === "object") {
75
- value = JSON.parse(value);
76
- }
73
+ const typeOfOptionValue = typeof finder.getVia(optionName);
74
+ if (typeOfOptionValue === "boolean") {
75
+ value = value === "true";
76
+ } else if (typeOfOptionValue === "number") {
77
+ value = Number(value);
78
+ } else if (typeOfOptionValue === "string") {
79
+ value = String(value);
80
+ } else if (typeOfOptionValue === "object") {
81
+ value = JSON.parse(value);
82
+ }
77
83
 
78
- finder.setVia(optionName, value);
84
+ finder.setVia(optionName, value);
79
85
 
80
- return options;
86
+ return options;
81
87
  }
@@ -8,7 +8,14 @@
8
8
  import { getGlobal } from "../types/global.mjs";
9
9
  import { validateString } from "../types/validate.mjs";
10
10
 
11
- export { getDocument, getWindow, getDocumentFragmentFromString, findElementWithIdUpwards, getContainingDocument };
11
+ export {
12
+ getDocument,
13
+ getWindow,
14
+ getDocumentFragmentFromString,
15
+ findElementWithIdUpwards,
16
+ getContainingDocument,
17
+ getRegisteredCustomElements,
18
+ };
12
19
 
13
20
  /**
14
21
  * This method fetches the document object
@@ -48,12 +55,12 @@ export { getDocument, getWindow, getDocumentFragmentFromString, findElementWithI
48
55
  * @throws {Error} not supported environment
49
56
  */
50
57
  function getDocument() {
51
- let document = getGlobal()?.["document"];
52
- if (typeof document !== "object") {
53
- throw new Error("not supported environment");
54
- }
58
+ const document = getGlobal()?.["document"];
59
+ if (typeof document !== "object") {
60
+ throw new Error("not supported environment");
61
+ }
55
62
 
56
- return document;
63
+ return document;
57
64
  }
58
65
 
59
66
  /**
@@ -96,12 +103,12 @@ function getDocument() {
96
103
  * @throws {Error} not supported environment
97
104
  */
98
105
  function getWindow() {
99
- let window = getGlobal()?.["window"];
100
- if (typeof window !== "object") {
101
- throw new Error("not supported environment");
102
- }
106
+ const window = getGlobal()?.["window"];
107
+ if (typeof window !== "object") {
108
+ throw new Error("not supported environment");
109
+ }
103
110
 
104
- return window;
111
+ return window;
105
112
  }
106
113
 
107
114
  /**
@@ -143,13 +150,13 @@ function getWindow() {
143
150
  * @throws {TypeError} value is not a string
144
151
  */
145
152
  function getDocumentFragmentFromString(html) {
146
- validateString(html);
153
+ validateString(html);
147
154
 
148
- const document = getDocument();
149
- const template = document.createElement("template");
150
- template.innerHTML = html;
155
+ const document = getDocument();
156
+ const template = document.createElement("template");
157
+ template.innerHTML = html;
151
158
 
152
- return template.content;
159
+ return template.content;
153
160
  }
154
161
 
155
162
  /**
@@ -165,39 +172,39 @@ function getDocumentFragmentFromString(html) {
165
172
  * @copyright schukai GmbH
166
173
  */
167
174
  function findElementWithIdUpwards(element, targetId) {
168
- if (!element) {
169
- return null;
170
- }
171
-
172
- // Check if the current element has the target ID
173
- if (element.id === targetId) {
174
- return element;
175
- }
176
-
177
- // Search within the current element's shadow root, if it exists
178
- if (element.shadowRoot) {
179
- const target = element.shadowRoot.getElementById(targetId);
180
- if (target) {
181
- return target;
182
- }
183
- }
184
-
185
- // If the current element is the document.documentElement, search within the main document
186
- if (element === document.documentElement) {
187
- const target = document.getElementById(targetId);
188
- if (target) {
189
- return target;
190
- }
191
- }
192
-
193
- // If the current element is inside a shadow root, search its host's ancestors
194
- const rootNode = element.getRootNode();
195
- if (rootNode && rootNode instanceof ShadowRoot) {
196
- return findElementWithIdUpwards(rootNode.host, targetId);
197
- }
198
-
199
- // Otherwise, search the current element's parent
200
- return findElementWithIdUpwards(element.parentElement, targetId);
175
+ if (!element) {
176
+ return null;
177
+ }
178
+
179
+ // Check if the current element has the target ID
180
+ if (element.id === targetId) {
181
+ return element;
182
+ }
183
+
184
+ // Search within the current element's shadow root, if it exists
185
+ if (element.shadowRoot) {
186
+ const target = element.shadowRoot.getElementById(targetId);
187
+ if (target) {
188
+ return target;
189
+ }
190
+ }
191
+
192
+ // If the current element is the document.documentElement, search within the main document
193
+ if (element === document.documentElement) {
194
+ const target = document.getElementById(targetId);
195
+ if (target) {
196
+ return target;
197
+ }
198
+ }
199
+
200
+ // If the current element is inside a shadow root, search its host's ancestors
201
+ const rootNode = element.getRootNode();
202
+ if (rootNode && rootNode instanceof ShadowRoot) {
203
+ return findElementWithIdUpwards(rootNode.host, targetId);
204
+ }
205
+
206
+ // Otherwise, search the current element's parent
207
+ return findElementWithIdUpwards(element.parentElement, targetId);
201
208
  }
202
209
 
203
210
  /**
@@ -206,30 +213,34 @@ function findElementWithIdUpwards(element, targetId) {
206
213
  * @returns {HTMLElement|null}
207
214
  */
208
215
  function traverseShadowRoots(element) {
209
- let currentRoot = element.shadowRoot;
210
- let currentParent = element.parentNode;
211
-
212
- while (
213
- currentParent &&
214
- currentParent.nodeType !== Node.DOCUMENT_NODE &&
215
- currentParent.nodeType !== Node.DOCUMENT_FRAGMENT_NODE
216
- ) {
217
- if (currentRoot && currentRoot.parentNode) {
218
- currentParent = currentRoot.parentNode;
219
- currentRoot = currentParent.shadowRoot;
220
- } else if (currentParent.parentNode) {
221
- currentParent = currentParent.parentNode;
222
- currentRoot = null;
223
- } else if (currentRoot && currentRoot.host && currentRoot.host.nodeType === Node.DOCUMENT_NODE) {
224
- currentParent = currentRoot.host;
225
- currentRoot = null;
226
- } else {
227
- currentParent = null;
228
- currentRoot = null;
229
- }
230
- }
231
-
232
- return currentParent;
216
+ let currentRoot = element.shadowRoot;
217
+ let currentParent = element.parentNode;
218
+
219
+ while (
220
+ currentParent &&
221
+ currentParent.nodeType !== Node.DOCUMENT_NODE &&
222
+ currentParent.nodeType !== Node.DOCUMENT_FRAGMENT_NODE
223
+ ) {
224
+ if (currentRoot && currentRoot.parentNode) {
225
+ currentParent = currentRoot.parentNode;
226
+ currentRoot = currentParent.shadowRoot;
227
+ } else if (currentParent.parentNode) {
228
+ currentParent = currentParent.parentNode;
229
+ currentRoot = null;
230
+ } else if (
231
+ currentRoot &&
232
+ currentRoot.host &&
233
+ currentRoot.host.nodeType === Node.DOCUMENT_NODE
234
+ ) {
235
+ currentParent = currentRoot.host;
236
+ currentRoot = null;
237
+ } else {
238
+ currentParent = null;
239
+ currentRoot = null;
240
+ }
241
+ }
242
+
243
+ return currentParent;
233
244
  }
234
245
 
235
246
  /**
@@ -242,12 +253,32 @@ function traverseShadowRoots(element) {
242
253
  * @since 3.36.0
243
254
  */
244
255
  function getContainingDocument(element) {
245
- if (
246
- !element ||
247
- !(element instanceof HTMLElement || element instanceof element.ownerDocument.defaultView.HTMLElement)
248
- ) {
249
- throw new Error("Invalid argument. Expected an HTMLElement.");
250
- }
251
-
252
- return traverseShadowRoots(element) || null;
256
+ if (
257
+ !element ||
258
+ !(
259
+ element instanceof HTMLElement ||
260
+ element instanceof element.ownerDocument.defaultView.HTMLElement
261
+ )
262
+ ) {
263
+ throw new Error("Invalid argument. Expected an HTMLElement.");
264
+ }
265
+
266
+ return traverseShadowRoots(element) || null;
267
+ }
268
+
269
+
270
+ /**
271
+ * Returns a list of all registered custom elements in the current document.
272
+ *
273
+ * @returns {string[]}
274
+ * @since 4.0.0
275
+ * @memberOf Monster.DOM
276
+ * @returns {string[]}
277
+ */
278
+ function getRegisteredCustomElements() {
279
+ const customElementTags = Array.from(document.querySelectorAll('*'))
280
+ .map(tag => tag.tagName.toLowerCase())
281
+ .filter(tagName => tagName.includes('-') && customElements.get(tagName));
282
+
283
+ return Array.from(new Set(customElementTags));
253
284
  }
@@ -23,87 +23,87 @@ export { Factory };
23
23
  * @summary A small factory to create worker
24
24
  */
25
25
  class Factory extends Base {
26
- /**
27
- *
28
- */
29
- constructor() {
30
- super();
31
- this[internalSymbol] = {
32
- worker: new WeakMap(),
33
- };
34
- }
35
-
36
- /**
37
- * Creates a worker from a URL
38
- *
39
- * @param {string|URL} url
40
- * @param {function} messageHandler
41
- * @param {function} errorHandler
42
- * @return {Worker}
43
- */
44
- createFromURL = function (url, messageHandler, errorHandler) {
45
- if (url instanceof URL) {
46
- url = url.toString();
47
- }
48
-
49
- const workerClass = getGlobalFunction("Worker");
50
- var worker = new workerClass(validateString(url));
51
-
52
- if (isFunction(messageHandler)) {
53
- worker.onmessage = (event) => {
54
- messageHandler.call(worker, event);
55
- };
56
- }
57
-
58
- if (isFunction(errorHandler)) {
59
- worker.onerror = (event) => {
60
- errorHandler.call(worker, event);
61
- };
62
- }
63
-
64
- return worker;
65
- };
66
-
67
- /**
68
- * Creates a worker from a script
69
- *
70
- * @param {string} content
71
- * @param {function} messageHandler
72
- * @param {function} errorHandler
73
- * @return {Worker}
74
- * @see https://developer.mozilla.org/de/docs/Web/API/URL/createObjectURL
75
- */
76
- createFromScript = function (content, messageHandler, errorHandler) {
77
- const blobFunction = new getGlobalFunction("Blob");
78
- const blob = new blobFunction([validateString(content)], {
79
- type: "script/javascript",
80
- });
81
-
82
- const url = getGlobalFunction("URL").createObjectURL(blob);
83
- const worker = this.createFromURL(url, messageHandler, errorHandler);
84
-
85
- this[internalSymbol]["worker"].set(worker, url);
86
-
87
- return worker;
88
- };
89
-
90
- /**
91
- * Terminate the worker and call revokeObjectURL if necessary.
92
- *
93
- * @param worker
94
- * @return {Monster.DOM.Worker.Factory}
95
- */
96
- terminate(worker) {
97
- const workerClass = getGlobalFunction("Worker");
98
- validateInstance(worker, workerClass);
99
-
100
- worker.terminate();
101
-
102
- if (this[internalSymbol]["worker"].has(worker)) {
103
- const url = this[internalSymbol]["worker"].get(worker);
104
- URL.revokeObjectURL(url);
105
- }
106
-
107
- return this;
108
- }
26
+ /**
27
+ *
28
+ */
29
+ constructor() {
30
+ super();
31
+ this[internalSymbol] = {
32
+ worker: new WeakMap(),
33
+ };
34
+ }
35
+
36
+ /**
37
+ * Creates a worker from a URL
38
+ *
39
+ * @param {string|URL} url
40
+ * @param {function} messageHandler
41
+ * @param {function} errorHandler
42
+ * @return {Worker}
43
+ */
44
+ createFromURL = function (url, messageHandler, errorHandler) {
45
+ if (url instanceof URL) {
46
+ url = url.toString();
47
+ }
48
+
49
+ const workerClass = getGlobalFunction("Worker");
50
+ var worker = new workerClass(validateString(url));
51
+
52
+ if (isFunction(messageHandler)) {
53
+ worker.onmessage = (event) => {
54
+ messageHandler.call(worker, event);
55
+ };
56
+ }
57
+
58
+ if (isFunction(errorHandler)) {
59
+ worker.onerror = (event) => {
60
+ errorHandler.call(worker, event);
61
+ };
62
+ }
63
+
64
+ return worker;
65
+ };
66
+
67
+ /**
68
+ * Creates a worker from a script
69
+ *
70
+ * @param {string} content
71
+ * @param {function} messageHandler
72
+ * @param {function} errorHandler
73
+ * @return {Worker}
74
+ * @see https://developer.mozilla.org/de/docs/Web/API/URL/createObjectURL
75
+ */
76
+ createFromScript = function (content, messageHandler, errorHandler) {
77
+ const blobFunction = new getGlobalFunction("Blob");
78
+ const blob = new blobFunction([validateString(content)], {
79
+ type: "script/javascript",
80
+ });
81
+
82
+ const url = getGlobalFunction("URL").createObjectURL(blob);
83
+ const worker = this.createFromURL(url, messageHandler, errorHandler);
84
+
85
+ this[internalSymbol]["worker"].set(worker, url);
86
+
87
+ return worker;
88
+ };
89
+
90
+ /**
91
+ * Terminate the worker and call revokeObjectURL if necessary.
92
+ *
93
+ * @param worker
94
+ * @return {Monster.DOM.Worker.Factory}
95
+ */
96
+ terminate(worker) {
97
+ const workerClass = getGlobalFunction("Worker");
98
+ validateInstance(worker, workerClass);
99
+
100
+ worker.terminate();
101
+
102
+ if (this[internalSymbol]["worker"].has(worker)) {
103
+ const url = this[internalSymbol]["worker"].get(worker);
104
+ URL.revokeObjectURL(url);
105
+ }
106
+
107
+ return this;
108
+ }
109
109
  }