@schukai/monster 3.51.4 → 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 (451) hide show
  1. package/CHANGELOG.md +706 -0
  2. package/README.md +16 -13
  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 +226 -217
  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/constraint/abstractoperator.mjs +2 -2
  348. package/test/cases/constraint/andoperator.mjs +3 -3
  349. package/test/cases/constraint/invalid.mjs +1 -1
  350. package/test/cases/constraint/isarray.mjs +1 -1
  351. package/test/cases/constraint/isobject.mjs +1 -1
  352. package/test/cases/constraint/oroperator.mjs +3 -3
  353. package/test/cases/constraint/valid.mjs +1 -1
  354. package/test/cases/data/buildmap.mjs +1 -1
  355. package/test/cases/data/buildtree.mjs +2 -2
  356. package/test/cases/data/datasource/dom.mjs +1 -1
  357. package/test/cases/data/datasource/server/restapi.mjs +2 -2
  358. package/test/cases/data/datasource/server/websocket.mjs +1 -1
  359. package/test/cases/data/datasource/server.mjs +1 -1
  360. package/test/cases/data/datasource/storage/localstorage.mjs +1 -1
  361. package/test/cases/data/datasource/storage/sessionstorage.mjs +1 -1
  362. package/test/cases/data/datasource.mjs +1 -1
  363. package/test/cases/data/diff.mjs +2 -2
  364. package/test/cases/data/extend.mjs +1 -1
  365. package/test/cases/data/pathfinder.mjs +1 -1
  366. package/test/cases/data/pipe.mjs +2 -2
  367. package/test/cases/data/transformer.mjs +3 -4
  368. package/test/cases/dom/assembler.mjs +1 -1
  369. package/test/cases/dom/attributes.mjs +1 -1
  370. package/test/cases/dom/customcontrol.mjs +8 -7
  371. package/test/cases/dom/customelement-initfromscripthost.mjs +6 -6
  372. package/test/cases/dom/customelement.mjs +7 -7
  373. package/test/cases/dom/dimension.mjs +4 -4
  374. package/test/cases/dom/events.mjs +1 -1
  375. package/test/cases/dom/find.mjs +1 -1
  376. package/test/cases/dom/focusmanager.mjs +1 -1
  377. package/test/cases/dom/locale.mjs +2 -2
  378. package/test/cases/dom/ready.mjs +1 -1
  379. package/test/cases/dom/resource/data.mjs +3 -3
  380. package/test/cases/dom/resource/link/stylesheet.mjs +3 -3
  381. package/test/cases/dom/resource/link.mjs +3 -3
  382. package/test/cases/dom/resource/script.mjs +3 -3
  383. package/test/cases/dom/resource.mjs +1 -1
  384. package/test/cases/dom/resourcemanager.mjs +1 -1
  385. package/test/cases/dom/slotted-nodes.mjs +1 -1
  386. package/test/cases/dom/template.mjs +2 -2
  387. package/test/cases/dom/theme.mjs +2 -2
  388. package/test/cases/dom/updater.mjs +4 -4
  389. package/test/cases/dom/util/extract-keys.mjs +1 -1
  390. package/test/cases/dom/util/init-options-from-attributes.mjs +1 -1
  391. package/test/cases/dom/util.mjs +2 -2
  392. package/test/cases/dom/worker/factory.mjs +2 -2
  393. package/test/cases/i18n/formatter.mjs +2 -2
  394. package/test/cases/i18n/locale.mjs +1 -1
  395. package/test/cases/i18n/provider.mjs +4 -4
  396. package/test/cases/i18n/providers/embed.mjs +3 -3
  397. package/test/cases/i18n/providers/fetch.mjs +3 -3
  398. package/test/cases/i18n/translations.mjs +3 -3
  399. package/test/cases/logging/handler/console.mjs +3 -3
  400. package/test/cases/logging/handler.mjs +3 -3
  401. package/test/cases/logging/logentry.mjs +1 -1
  402. package/test/cases/logging/logger.mjs +1 -1
  403. package/test/cases/math/random.mjs +1 -2
  404. package/test/cases/monster.mjs +2 -2
  405. package/test/cases/net/webconnect/message.mjs +1 -2
  406. package/test/cases/net/webconnect.mjs +3 -3
  407. package/test/cases/text/bracketed-key-value-hash.mjs +1 -1
  408. package/test/cases/text/formatter.mjs +1 -1
  409. package/test/cases/text/util.mjs +1 -1
  410. package/test/cases/types/base.mjs +2 -2
  411. package/test/cases/types/basewithoptions.mjs +1 -1
  412. package/test/cases/types/binary.mjs +1 -1
  413. package/test/cases/types/dataurl.mjs +1 -1
  414. package/test/cases/types/global.mjs +1 -1
  415. package/test/cases/types/id.mjs +1 -1
  416. package/test/cases/types/internal.mjs +2 -2
  417. package/test/cases/types/is.mjs +2 -2
  418. package/test/cases/types/mediatype.mjs +1 -1
  419. package/test/cases/types/node.mjs +4 -4
  420. package/test/cases/types/nodelist.mjs +2 -2
  421. package/test/cases/types/noderecursiveiterator.mjs +3 -3
  422. package/test/cases/types/observablequeue.mjs +2 -2
  423. package/test/cases/types/observer.mjs +1 -1
  424. package/test/cases/types/observerlist.mjs +2 -2
  425. package/test/cases/types/proxyobserver.mjs +4 -4
  426. package/test/cases/types/queue.mjs +1 -1
  427. package/test/cases/types/randomid.mjs +1 -1
  428. package/test/cases/types/regex.mjs +1 -1
  429. package/test/cases/types/stack.mjs +1 -1
  430. package/test/cases/types/tokenlist.mjs +1 -1
  431. package/test/cases/types/typeof.mjs +2 -2
  432. package/test/cases/types/uniquequeue.mjs +1 -1
  433. package/test/cases/types/uuid.mjs +1 -1
  434. package/test/cases/types/validate.mjs +3 -3
  435. package/test/cases/types/version.mjs +1 -1
  436. package/test/cases/util/clone.mjs +1 -1
  437. package/test/cases/util/comparator.mjs +1 -1
  438. package/test/cases/util/deadmansswitch.mjs +1 -1
  439. package/test/cases/util/freeze.mjs +1 -1
  440. package/test/cases/util/processing.mjs +1 -1
  441. package/test/cases/util/trimspaces.mjs +1 -1
  442. package/test/util/chai-dom.mjs +2 -2
  443. package/test/util/intersection-mock.mjs +69 -0
  444. package/test/util/jsdom.mjs +43 -27
  445. package/test/util/localstorage.mjs +1 -0
  446. package/test/util/resize-observer.mjs +29 -0
  447. package/test/util/websocket.mjs +5 -2
  448. package/test/web/import.js +92 -73
  449. package/test/web/test.html +28 -5
  450. package/test/web/tests.js +29430 -15209
  451. package/CHANGELOG +0 -438
@@ -10,14 +10,14 @@ import { diff } from "../data/diff.mjs";
10
10
  import { Pathfinder } from "../data/pathfinder.mjs";
11
11
  import { Pipe } from "../data/pipe.mjs";
12
12
  import {
13
- ATTRIBUTE_ERRORMESSAGE,
14
- ATTRIBUTE_UPDATER_ATTRIBUTES,
15
- ATTRIBUTE_UPDATER_BIND,
16
- ATTRIBUTE_UPDATER_INSERT,
17
- ATTRIBUTE_UPDATER_INSERT_REFERENCE,
18
- ATTRIBUTE_UPDATER_REMOVE,
19
- ATTRIBUTE_UPDATER_REPLACE,
20
- ATTRIBUTE_UPDATER_SELECT_THIS,
13
+ ATTRIBUTE_ERRORMESSAGE,
14
+ ATTRIBUTE_UPDATER_ATTRIBUTES,
15
+ ATTRIBUTE_UPDATER_BIND,
16
+ ATTRIBUTE_UPDATER_INSERT,
17
+ ATTRIBUTE_UPDATER_INSERT_REFERENCE,
18
+ ATTRIBUTE_UPDATER_REMOVE,
19
+ ATTRIBUTE_UPDATER_REPLACE,
20
+ ATTRIBUTE_UPDATER_SELECT_THIS,
21
21
  } from "./constants.mjs";
22
22
 
23
23
  import { Base } from "../types/base.mjs";
@@ -56,164 +56,174 @@ export { Updater, addObjectWithUpdaterToElement };
56
56
  * @summary The updater class connects an object with the dom
57
57
  */
58
58
  class Updater extends Base {
59
- /**
60
- * @since 1.8.0
61
- * @param {HTMLElement} element
62
- * @param {object|ProxyObserver|undefined} subject
63
- * @throws {TypeError} value is not a object
64
- * @throws {TypeError} value is not an instance of HTMLElement
65
- * @see {@link Monster.DOM.findDocumentTemplate}
66
- */
67
- constructor(element, subject) {
68
- super();
69
-
70
- /**
71
- * @type {HTMLElement}
72
- */
73
- if (subject === undefined) subject = {};
74
- if (!isInstance(subject, ProxyObserver)) {
75
- subject = new ProxyObserver(subject);
76
- }
77
-
78
- this[internalSymbol] = {
79
- element: validateInstance(element, HTMLElement),
80
- last: {},
81
- callbacks: new Map(),
82
- eventTypes: ["keyup", "click", "change", "drop", "touchend", "input"],
83
- subject: subject,
84
- };
85
-
86
- this[internalSymbol].callbacks.set("checkstate", getCheckStateCallback.call(this));
87
-
88
- this[internalSymbol].subject.attachObserver(
89
- new Observer(() => {
90
- const s = this[internalSymbol].subject.getRealSubject();
91
-
92
- const diffResult = diff(this[internalSymbol].last, s);
93
- this[internalSymbol].last = clone(s);
94
-
95
- for (const [, change] of Object.entries(diffResult)) {
96
- removeElement.call(this, change);
97
- insertElement.call(this, change);
98
- updateContent.call(this, change);
99
- updateAttributes.call(this, change);
100
- }
101
- }),
102
- );
103
- }
104
-
105
- /**
106
- * Defaults: 'keyup', 'click', 'change', 'drop', 'touchend'
107
- *
108
- * @see {@link https://developer.mozilla.org/de/docs/Web/Events}
109
- * @since 1.9.0
110
- * @param {Array} types
111
- * @return {Updater}
112
- */
113
- setEventTypes(types) {
114
- this[internalSymbol].eventTypes = validateArray(types);
115
- return this;
116
- }
117
-
118
- /**
119
- * With this method, the eventlisteners are hooked in and the magic begins.
120
- *
121
- * ```
122
- * updater.run().then(() => {
123
- * updater.enableEventProcessing();
124
- * });
125
- * ```
126
- *
127
- * @since 1.9.0
128
- * @return {Updater}
129
- * @throws {Error} the bind argument must start as a value with a path
130
- */
131
- enableEventProcessing() {
132
- this.disableEventProcessing();
133
-
134
- for (const type of this[internalSymbol].eventTypes) {
135
- // @see https://developer.mozilla.org/en-US/docs/Web/API/EventTarget/addEventListener
136
- this[internalSymbol].element.addEventListener(type, getControlEventHandler.call(this), {
137
- capture: true,
138
- passive: true,
139
- });
140
- }
141
-
142
- return this;
143
- }
144
-
145
- /**
146
- * This method turns off the magic or who loves it more profane it removes the eventListener.
147
- *
148
- * @since 1.9.0
149
- * @return {Updater}
150
- */
151
- disableEventProcessing() {
152
- for (const type of this[internalSymbol].eventTypes) {
153
- this[internalSymbol].element.removeEventListener(type, getControlEventHandler.call(this));
154
- }
155
-
156
- return this;
157
- }
158
-
159
- /**
160
- * The run method must be called for the update to start working.
161
- * The method ensures that changes are detected.
162
- *
163
- * ```
164
- * updater.run().then(() => {
165
- * updater.enableEventProcessing();
166
- * });
167
- * ```
168
- *
169
- * @summary Let the magic begin
170
- * @return {Promise}
171
- */
172
- run() {
173
- // the key __init__has no further meaning and is only
174
- // used to create the diff for empty objects.
175
- this[internalSymbol].last = { __init__: true };
176
- return this[internalSymbol].subject.notifyObservers();
177
- }
178
-
179
- /**
180
- * Gets the values of bound elements and changes them in subject
181
- *
182
- * @since 1.27.0
183
- * @return {Monster.DOM.Updater}
184
- */
185
- retrieve() {
186
- retrieveFromBindings.call(this);
187
- return this;
188
- }
189
-
190
- /**
191
- * If you have passed a ProxyObserver in the constructor, you will get the object that the ProxyObserver manages here.
192
- * However, if you passed a simple object, here you will get a proxy for that object.
193
- *
194
- * For changes the ProxyObserver must be used.
195
- *
196
- * @since 1.8.0
197
- * @return {Proxy}
198
- */
199
- getSubject() {
200
- return this[internalSymbol].subject.getSubject();
201
- }
202
-
203
- /**
204
- * This method can be used to register commands that can be called via call: instruction.
205
- * This can be used to provide a pipe with its own functionality.
206
- *
207
- * @param {string} name
208
- * @param {function} callback
209
- * @returns {Transformer}
210
- * @throws {TypeError} value is not a string
211
- * @throws {TypeError} value is not a function
212
- */
213
- setCallback(name, callback) {
214
- this[internalSymbol].callbacks.set(name, callback);
215
- return this;
216
- }
59
+ /**
60
+ * @since 1.8.0
61
+ * @param {HTMLElement} element
62
+ * @param {object|ProxyObserver|undefined} subject
63
+ * @throws {TypeError} value is not a object
64
+ * @throws {TypeError} value is not an instance of HTMLElement
65
+ * @see {@link Monster.DOM.findDocumentTemplate}
66
+ */
67
+ constructor(element, subject) {
68
+ super();
69
+
70
+ /**
71
+ * @type {HTMLElement}
72
+ */
73
+ if (subject === undefined) subject = {};
74
+ if (!isInstance(subject, ProxyObserver)) {
75
+ subject = new ProxyObserver(subject);
76
+ }
77
+
78
+ this[internalSymbol] = {
79
+ element: validateInstance(element, HTMLElement),
80
+ last: {},
81
+ callbacks: new Map(),
82
+ eventTypes: ["keyup", "click", "change", "drop", "touchend", "input"],
83
+ subject: subject,
84
+ };
85
+
86
+ this[internalSymbol].callbacks.set(
87
+ "checkstate",
88
+ getCheckStateCallback.call(this),
89
+ );
90
+
91
+ this[internalSymbol].subject.attachObserver(
92
+ new Observer(() => {
93
+ const s = this[internalSymbol].subject.getRealSubject();
94
+
95
+ const diffResult = diff(this[internalSymbol].last, s);
96
+ this[internalSymbol].last = clone(s);
97
+
98
+ for (const [, change] of Object.entries(diffResult)) {
99
+ removeElement.call(this, change);
100
+ insertElement.call(this, change);
101
+ updateContent.call(this, change);
102
+ updateAttributes.call(this, change);
103
+ }
104
+ }),
105
+ );
106
+ }
107
+
108
+ /**
109
+ * Defaults: 'keyup', 'click', 'change', 'drop', 'touchend'
110
+ *
111
+ * @see {@link https://developer.mozilla.org/de/docs/Web/Events}
112
+ * @since 1.9.0
113
+ * @param {Array} types
114
+ * @return {Updater}
115
+ */
116
+ setEventTypes(types) {
117
+ this[internalSymbol].eventTypes = validateArray(types);
118
+ return this;
119
+ }
120
+
121
+ /**
122
+ * With this method, the eventlisteners are hooked in and the magic begins.
123
+ *
124
+ * ```
125
+ * updater.run().then(() => {
126
+ * updater.enableEventProcessing();
127
+ * });
128
+ * ```
129
+ *
130
+ * @since 1.9.0
131
+ * @return {Updater}
132
+ * @throws {Error} the bind argument must start as a value with a path
133
+ */
134
+ enableEventProcessing() {
135
+ this.disableEventProcessing();
136
+
137
+ for (const type of this[internalSymbol].eventTypes) {
138
+ // @see https://developer.mozilla.org/en-US/docs/Web/API/EventTarget/addEventListener
139
+ this[internalSymbol].element.addEventListener(
140
+ type,
141
+ getControlEventHandler.call(this),
142
+ {
143
+ capture: true,
144
+ passive: true,
145
+ },
146
+ );
147
+ }
148
+
149
+ return this;
150
+ }
151
+
152
+ /**
153
+ * This method turns off the magic or who loves it more profane it removes the eventListener.
154
+ *
155
+ * @since 1.9.0
156
+ * @return {Updater}
157
+ */
158
+ disableEventProcessing() {
159
+ for (const type of this[internalSymbol].eventTypes) {
160
+ this[internalSymbol].element.removeEventListener(
161
+ type,
162
+ getControlEventHandler.call(this),
163
+ );
164
+ }
165
+
166
+ return this;
167
+ }
168
+
169
+ /**
170
+ * The run method must be called for the update to start working.
171
+ * The method ensures that changes are detected.
172
+ *
173
+ * ```
174
+ * updater.run().then(() => {
175
+ * updater.enableEventProcessing();
176
+ * });
177
+ * ```
178
+ *
179
+ * @summary Let the magic begin
180
+ * @return {Promise}
181
+ */
182
+ run() {
183
+ // the key __init__has no further meaning and is only
184
+ // used to create the diff for empty objects.
185
+ this[internalSymbol].last = { __init__: true };
186
+ return this[internalSymbol].subject.notifyObservers();
187
+ }
188
+
189
+ /**
190
+ * Gets the values of bound elements and changes them in subject
191
+ *
192
+ * @since 1.27.0
193
+ * @return {Monster.DOM.Updater}
194
+ */
195
+ retrieve() {
196
+ retrieveFromBindings.call(this);
197
+ return this;
198
+ }
199
+
200
+ /**
201
+ * If you have passed a ProxyObserver in the constructor, you will get the object that the ProxyObserver manages here.
202
+ * However, if you passed a simple object, here you will get a proxy for that object.
203
+ *
204
+ * For changes the ProxyObserver must be used.
205
+ *
206
+ * @since 1.8.0
207
+ * @return {Proxy}
208
+ */
209
+ getSubject() {
210
+ return this[internalSymbol].subject.getSubject();
211
+ }
212
+
213
+ /**
214
+ * This method can be used to register commands that can be called via call: instruction.
215
+ * This can be used to provide a pipe with its own functionality.
216
+ *
217
+ * @param {string} name
218
+ * @param {function} callback
219
+ * @returns {Transformer}
220
+ * @throws {TypeError} value is not a string
221
+ * @throws {TypeError} value is not a function
222
+ */
223
+ setCallback(name, callback) {
224
+ this[internalSymbol].callbacks.set(name, callback);
225
+ return this;
226
+ }
217
227
  }
218
228
 
219
229
  /**
@@ -224,22 +234,20 @@ class Updater extends Base {
224
234
  * @this Updater
225
235
  */
226
236
  function getCheckStateCallback() {
227
- const self = this;
228
-
229
- return function (current) {
230
- // this is a reference to the current object (therefore no array function here)
231
- if (this instanceof HTMLInputElement) {
232
- if (["radio", "checkbox"].indexOf(this.type) !== -1) {
233
- return `${this.value}` === `${current}` ? "true" : undefined;
234
- }
235
- } else if (this instanceof HTMLOptionElement) {
236
- if (isArray(current) && current.indexOf(this.value) !== -1) {
237
- return "true";
238
- }
239
-
240
- return undefined;
241
- }
242
- };
237
+ return function (current) {
238
+ // this is a reference to the current object (therefore no array function here)
239
+ if (this instanceof HTMLInputElement) {
240
+ if (["radio", "checkbox"].indexOf(this.type) !== -1) {
241
+ return `${this.value}` === `${current}` ? "true" : undefined;
242
+ }
243
+ } else if (this instanceof HTMLOptionElement) {
244
+ if (isArray(current) && current.indexOf(this.value) !== -1) {
245
+ return "true";
246
+ }
247
+
248
+ return undefined;
249
+ }
250
+ };
243
251
  }
244
252
 
245
253
  /**
@@ -254,28 +262,26 @@ const symbol = Symbol("@schukai/monster/updater@@EventHandler");
254
262
  * @throws {Error} the bind argument must start as a value with a path
255
263
  */
256
264
  function getControlEventHandler() {
257
- const self = this;
258
-
259
- if (self[symbol]) {
260
- return self[symbol];
261
- }
262
-
263
- /**
264
- * @throws {Error} the bind argument must start as a value with a path.
265
- * @throws {Error} unsupported object
266
- * @param {Event} event
267
- */
268
- self[symbol] = (event) => {
269
- const element = findTargetElementFromEvent(event, ATTRIBUTE_UPDATER_BIND);
270
-
271
- if (element === undefined) {
272
- return;
273
- }
274
-
275
- retrieveAndSetValue.call(self, element);
276
- };
277
-
278
- return self[symbol];
265
+ if (this[symbol]) {
266
+ return this[symbol];
267
+ }
268
+
269
+ /**
270
+ * @throws {Error} the bind argument must start as a value with a path.
271
+ * @throws {Error} unsupported object
272
+ * @param {Event} event
273
+ */
274
+ this[symbol] = (event) => {
275
+ const element = findTargetElementFromEvent(event, ATTRIBUTE_UPDATER_BIND);
276
+
277
+ if (element === undefined) {
278
+ return;
279
+ }
280
+
281
+ retrieveAndSetValue.call(this, element);
282
+ };
283
+
284
+ return this[symbol];
279
285
  }
280
286
 
281
287
  /**
@@ -286,67 +292,70 @@ function getControlEventHandler() {
286
292
  * @private
287
293
  */
288
294
  function retrieveAndSetValue(element) {
289
- const self = this;
290
-
291
- const pathfinder = new Pathfinder(self[internalSymbol].subject.getSubject());
292
-
293
- let path = element.getAttribute(ATTRIBUTE_UPDATER_BIND);
294
- if (path === null) throw new Error("the bind argument must start as a value with a path");
295
-
296
- if (path.indexOf("path:") !== 0) {
297
- throw new Error("the bind argument must start as a value with a path");
298
- }
299
-
300
- path = path.substring(5);
301
-
302
- let value;
303
-
304
- if (element instanceof HTMLInputElement) {
305
- switch (element.type) {
306
- case "checkbox":
307
- value = element.checked ? element.value : undefined;
308
- break;
309
- default:
310
- value = element.value;
311
- break;
312
- }
313
- } else if (element instanceof HTMLTextAreaElement) {
314
- value = element.value;
315
- } else if (element instanceof HTMLSelectElement) {
316
- switch (element.type) {
317
- case "select-one":
318
- value = element.value;
319
- break;
320
- case "select-multiple":
321
- value = element.value;
322
-
323
- let options = element?.selectedOptions;
324
- if (options === undefined) options = element.querySelectorAll(":scope option:checked");
325
- value = Array.from(options).map(({ value }) => value);
326
-
327
- break;
328
- }
329
-
330
- // values from customelements
331
- } else if (
332
- (element?.constructor?.prototype &&
333
- !!Object.getOwnPropertyDescriptor(element.constructor.prototype, "value")?.["get"]) ||
334
- element.hasOwnProperty("value")
335
- ) {
336
- value = element?.["value"];
337
- } else {
338
- throw new Error("unsupported object");
339
- }
340
-
341
- const copy = clone(self[internalSymbol].subject.getRealSubject());
342
- const pf = new Pathfinder(copy);
343
- pf.setVia(path, value);
344
-
345
- const diffResult = diff(copy, self[internalSymbol].subject.getRealSubject());
346
-
347
- if (diffResult.length > 0) {
348
- pathfinder.setVia(path, value);
349
- }
295
+ const pathfinder = new Pathfinder(this[internalSymbol].subject.getSubject());
296
+
297
+ let path = element.getAttribute(ATTRIBUTE_UPDATER_BIND);
298
+ if (path === null)
299
+ throw new Error("the bind argument must start as a value with a path");
300
+
301
+ if (path.indexOf("path:") !== 0) {
302
+ throw new Error("the bind argument must start as a value with a path");
303
+ }
304
+
305
+ path = path.substring(5);
306
+
307
+ let value;
308
+
309
+ if (element instanceof HTMLInputElement) {
310
+ switch (element.type) {
311
+ case "checkbox":
312
+ value = element.checked ? element.value : undefined;
313
+ break;
314
+ default:
315
+ value = element.value;
316
+ break;
317
+ }
318
+ } else if (element instanceof HTMLTextAreaElement) {
319
+ value = element.value;
320
+ } else if (element instanceof HTMLSelectElement) {
321
+ switch (element.type) {
322
+ case "select-one":
323
+ value = element.value;
324
+ break;
325
+ case "select-multiple":
326
+ value = element.value;
327
+
328
+ let options = element?.selectedOptions;
329
+ if (options === undefined)
330
+ options = element.querySelectorAll(":scope option:checked");
331
+ value = Array.from(options).map(({ value }) => value);
332
+
333
+ break;
334
+ }
335
+
336
+ // values from customelements
337
+ } else if (
338
+ (element?.constructor?.prototype &&
339
+ !!Object.getOwnPropertyDescriptor(
340
+ element.constructor.prototype,
341
+ "value",
342
+ )?.["get"]) ||
343
+ element.hasOwnProperty("value")
344
+ ) {
345
+ value = element?.["value"];
346
+ } else {
347
+ throw new Error("unsupported object");
348
+ }
349
+
350
+ const copy = clone(this[internalSymbol].subject.getRealSubject());
351
+ const pf = new Pathfinder(copy);
352
+ pf.setVia(path, value);
353
+
354
+ const diffResult = diff(copy, this[internalSymbol].subject.getRealSubject());
355
+
356
+ if (diffResult.length > 0) {
357
+ pathfinder.setVia(path, value);
358
+ }
350
359
  }
351
360
 
352
361
  /**
@@ -356,15 +365,15 @@ function retrieveAndSetValue(element) {
356
365
  * @private
357
366
  */
358
367
  function retrieveFromBindings() {
359
- const self = this;
360
-
361
- if (self[internalSymbol].element.matches(`[${ATTRIBUTE_UPDATER_BIND}]`)) {
362
- retrieveAndSetValue.call(self, self[internalSymbol].element);
363
- }
364
-
365
- for (const [, element] of self[internalSymbol].element.querySelectorAll(`[${ATTRIBUTE_UPDATER_BIND}]`).entries()) {
366
- retrieveAndSetValue.call(self, element);
367
- }
368
+ if (this[internalSymbol].element.matches(`[${ATTRIBUTE_UPDATER_BIND}]`)) {
369
+ retrieveAndSetValue.call(this, this[internalSymbol].element);
370
+ }
371
+
372
+ for (const [, element] of this[internalSymbol].element
373
+ .querySelectorAll(`[${ATTRIBUTE_UPDATER_BIND}]`)
374
+ .entries()) {
375
+ retrieveAndSetValue.call(this, element);
376
+ }
368
377
  }
369
378
 
370
379
  /**
@@ -375,13 +384,11 @@ function retrieveFromBindings() {
375
384
  * @return {void}
376
385
  */
377
386
  function removeElement(change) {
378
- const self = this;
379
-
380
- for (const [, element] of self[internalSymbol].element
381
- .querySelectorAll(`:scope [${ATTRIBUTE_UPDATER_REMOVE}]`)
382
- .entries()) {
383
- element.parentNode.removeChild(element);
384
- }
387
+ for (const [, element] of this[internalSymbol].element
388
+ .querySelectorAll(`:scope [${ATTRIBUTE_UPDATER_REMOVE}]`)
389
+ .entries()) {
390
+ element.parentNode.removeChild(element);
391
+ }
385
392
  }
386
393
 
387
394
  /**
@@ -397,124 +404,133 @@ function removeElement(change) {
397
404
  * @this Updater
398
405
  */
399
406
  function insertElement(change) {
400
- const self = this;
401
- const subject = self[internalSymbol].subject.getRealSubject();
407
+ const subject = this[internalSymbol].subject.getRealSubject();
402
408
 
403
- let mem = new WeakSet();
404
- let wd = 0;
409
+ const mem = new WeakSet();
410
+ let wd = 0;
405
411
 
406
- const container = self[internalSymbol].element;
407
-
408
- while (true) {
409
- let found = false;
410
- wd++;
411
-
412
- let p = clone(change?.["path"]);
413
- if (!isArray(p)) return self;
412
+ const container = this[internalSymbol].element;
414
413
 
415
- while (p.length > 0) {
416
- const current = p.join(".");
417
-
418
- let iterator = new Set();
419
- const query = `[${ATTRIBUTE_UPDATER_INSERT}*="path:${current}"]`;
420
-
421
- const e = container.querySelectorAll(query);
422
-
423
- if (e.length > 0) {
424
- iterator = new Set([...e]);
425
- }
426
-
427
- if (container.matches(query)) {
428
- iterator.add(container);
429
- }
430
-
431
- for (const [, containerElement] of iterator.entries()) {
432
- if (mem.has(containerElement)) continue;
433
- mem.add(containerElement);
434
-
435
- found = true;
436
-
437
- const attributes = containerElement.getAttribute(ATTRIBUTE_UPDATER_INSERT);
438
- if (attributes === null) continue;
439
-
440
- let def = trimSpaces(attributes);
441
- let i = def.indexOf(" ");
442
- let key = trimSpaces(def.substr(0, i));
443
- let refPrefix = `${key}-`;
444
- let cmd = trimSpaces(def.substr(i));
445
-
446
- // this case is actually excluded by the query but is nevertheless checked again here
447
- if (cmd.indexOf("|") > 0) {
448
- throw new Error("pipes are not allowed when cloning a node.");
449
- }
450
-
451
- let pipe = new Pipe(cmd);
452
- self[internalSymbol].callbacks.forEach((f, n) => {
453
- pipe.setCallback(n, f);
454
- });
455
-
456
- let value;
457
- try {
458
- containerElement.removeAttribute(ATTRIBUTE_ERRORMESSAGE);
459
- value = pipe.run(subject);
460
- } catch (e) {
461
- containerElement.setAttribute(ATTRIBUTE_ERRORMESSAGE, e.message);
462
- }
463
-
464
- let dataPath = cmd.split(":").pop();
465
-
466
- let insertPoint;
467
- if (containerElement.hasChildNodes()) {
468
- insertPoint = containerElement.lastChild;
469
- }
470
-
471
- if (!isIterable(value)) {
472
- throw new Error("the value is not iterable");
473
- }
474
-
475
- let available = new Set();
476
-
477
- for (const [i, obj] of Object.entries(value)) {
478
- let ref = refPrefix + i;
479
- let currentPath = `${dataPath}.${i}`;
480
-
481
- available.add(ref);
482
- let refElement = containerElement.querySelector(`[${ATTRIBUTE_UPDATER_INSERT_REFERENCE}="${ref}"]`);
483
-
484
- if (refElement instanceof HTMLElement) {
485
- insertPoint = refElement;
486
- continue;
487
- }
488
-
489
- appendNewDocumentFragment(containerElement, key, ref, currentPath);
490
- }
491
-
492
- let nodes = containerElement.querySelectorAll(
493
- `[${ATTRIBUTE_UPDATER_INSERT_REFERENCE}*="${refPrefix}"]`,
494
- );
495
-
496
- for (const [, node] of Object.entries(nodes)) {
497
- if (!available.has(node.getAttribute(ATTRIBUTE_UPDATER_INSERT_REFERENCE))) {
498
- try {
499
- containerElement.removeChild(node);
500
- } catch (e) {
501
- containerElement.setAttribute(
502
- ATTRIBUTE_ERRORMESSAGE,
503
- `${containerElement.getAttribute(ATTRIBUTE_ERRORMESSAGE)}, ${e.message}`.trim(),
504
- );
505
- }
506
- }
507
- }
508
- }
509
-
510
- p.pop();
511
- }
512
-
513
- if (found === false) break;
514
- if (wd++ > 200) {
515
- throw new Error("the maximum depth for the recursion is reached.");
516
- }
517
- }
414
+ while (true) {
415
+ let found = false;
416
+ wd++;
417
+
418
+ const p = clone(change?.["path"]);
419
+ if (!isArray(p)) return this;
420
+
421
+ while (p.length > 0) {
422
+ const current = p.join(".");
423
+
424
+ let iterator = new Set();
425
+ const query = `[${ATTRIBUTE_UPDATER_INSERT}*="path:${current}"]`;
426
+
427
+ const e = container.querySelectorAll(query);
428
+
429
+ if (e.length > 0) {
430
+ iterator = new Set([...e]);
431
+ }
432
+
433
+ if (container.matches(query)) {
434
+ iterator.add(container);
435
+ }
436
+
437
+ for (const [, containerElement] of iterator.entries()) {
438
+ if (mem.has(containerElement)) continue;
439
+ mem.add(containerElement);
440
+
441
+ found = true;
442
+
443
+ const attributes = containerElement.getAttribute(
444
+ ATTRIBUTE_UPDATER_INSERT,
445
+ );
446
+ if (attributes === null) continue;
447
+
448
+ const def = trimSpaces(attributes);
449
+ const i = def.indexOf(" ");
450
+ const key = trimSpaces(def.substr(0, i));
451
+ const refPrefix = `${key}-`;
452
+ const cmd = trimSpaces(def.substr(i));
453
+
454
+ // this case is actually excluded by the query but is nevertheless checked again here
455
+ if (cmd.indexOf("|") > 0) {
456
+ throw new Error("pipes are not allowed when cloning a node.");
457
+ }
458
+
459
+ const pipe = new Pipe(cmd);
460
+ this[internalSymbol].callbacks.forEach((f, n) => {
461
+ pipe.setCallback(n, f);
462
+ });
463
+
464
+ let value;
465
+ try {
466
+ containerElement.removeAttribute(ATTRIBUTE_ERRORMESSAGE);
467
+ value = pipe.run(subject);
468
+ } catch (e) {
469
+ containerElement.setAttribute(ATTRIBUTE_ERRORMESSAGE, e.message);
470
+ }
471
+
472
+ const dataPath = cmd.split(":").pop();
473
+
474
+ let insertPoint;
475
+ if (containerElement.hasChildNodes()) {
476
+ insertPoint = containerElement.lastChild;
477
+ }
478
+
479
+ if (!isIterable(value)) {
480
+ throw new Error("the value is not iterable");
481
+ }
482
+
483
+ const available = new Set();
484
+
485
+ for (const [i, obj] of Object.entries(value)) {
486
+ const ref = refPrefix + i;
487
+ const currentPath = `${dataPath}.${i}`;
488
+
489
+ available.add(ref);
490
+ const refElement = containerElement.querySelector(
491
+ `[${ATTRIBUTE_UPDATER_INSERT_REFERENCE}="${ref}"]`,
492
+ );
493
+
494
+ if (refElement instanceof HTMLElement) {
495
+ insertPoint = refElement;
496
+ continue;
497
+ }
498
+
499
+ appendNewDocumentFragment(containerElement, key, ref, currentPath);
500
+ }
501
+
502
+ const nodes = containerElement.querySelectorAll(
503
+ `[${ATTRIBUTE_UPDATER_INSERT_REFERENCE}*="${refPrefix}"]`,
504
+ );
505
+
506
+ for (const [, node] of Object.entries(nodes)) {
507
+ if (
508
+ !available.has(
509
+ node.getAttribute(ATTRIBUTE_UPDATER_INSERT_REFERENCE),
510
+ )
511
+ ) {
512
+ try {
513
+ containerElement.removeChild(node);
514
+ } catch (e) {
515
+ containerElement.setAttribute(
516
+ ATTRIBUTE_ERRORMESSAGE,
517
+ `${containerElement.getAttribute(ATTRIBUTE_ERRORMESSAGE)}, ${
518
+ e.message
519
+ }`.trim(),
520
+ );
521
+ }
522
+ }
523
+ }
524
+ }
525
+
526
+ p.pop();
527
+ }
528
+
529
+ if (found === false) break;
530
+ if (wd++ > 200) {
531
+ throw new Error("the maximum depth for the recursion is reached.");
532
+ }
533
+ }
518
534
  }
519
535
 
520
536
  /**
@@ -529,17 +545,17 @@ function insertElement(change) {
529
545
  * @throws {Error} no template was found with the specified key.
530
546
  */
531
547
  function appendNewDocumentFragment(container, key, ref, path) {
532
- let template = findDocumentTemplate(key, container);
548
+ const template = findDocumentTemplate(key, container);
533
549
 
534
- let nodes = template.createDocumentFragment();
535
- for (const [, node] of Object.entries(nodes.childNodes)) {
536
- if (node instanceof HTMLElement) {
537
- applyRecursive(node, key, path);
538
- node.setAttribute(ATTRIBUTE_UPDATER_INSERT_REFERENCE, ref);
539
- }
550
+ const nodes = template.createDocumentFragment();
551
+ for (const [, node] of Object.entries(nodes.childNodes)) {
552
+ if (node instanceof HTMLElement) {
553
+ applyRecursive(node, key, path);
554
+ node.setAttribute(ATTRIBUTE_UPDATER_INSERT_REFERENCE, ref);
555
+ }
540
556
 
541
- container.appendChild(node);
542
- }
557
+ container.appendChild(node);
558
+ }
543
559
  }
544
560
 
545
561
  /**
@@ -552,21 +568,27 @@ function appendNewDocumentFragment(container, key, ref, path) {
552
568
  * @return {void}
553
569
  */
554
570
  function applyRecursive(node, key, path) {
555
- if (node instanceof HTMLElement) {
556
- if (node.hasAttribute(ATTRIBUTE_UPDATER_REPLACE)) {
557
- let value = node.getAttribute(ATTRIBUTE_UPDATER_REPLACE);
558
- node.setAttribute(ATTRIBUTE_UPDATER_REPLACE, value.replaceAll(`path:${key}`, `path:${path}`));
559
- }
560
-
561
- if (node.hasAttribute(ATTRIBUTE_UPDATER_ATTRIBUTES)) {
562
- let value = node.getAttribute(ATTRIBUTE_UPDATER_ATTRIBUTES);
563
- node.setAttribute(ATTRIBUTE_UPDATER_ATTRIBUTES, value.replaceAll(`path:${key}`, `path:${path}`));
564
- }
565
-
566
- for (const [, child] of Object.entries(node.childNodes)) {
567
- applyRecursive(child, key, path);
568
- }
569
- }
571
+ if (node instanceof HTMLElement) {
572
+ if (node.hasAttribute(ATTRIBUTE_UPDATER_REPLACE)) {
573
+ const value = node.getAttribute(ATTRIBUTE_UPDATER_REPLACE);
574
+ node.setAttribute(
575
+ ATTRIBUTE_UPDATER_REPLACE,
576
+ value.replaceAll(`path:${key}`, `path:${path}`),
577
+ );
578
+ }
579
+
580
+ if (node.hasAttribute(ATTRIBUTE_UPDATER_ATTRIBUTES)) {
581
+ const value = node.getAttribute(ATTRIBUTE_UPDATER_ATTRIBUTES);
582
+ node.setAttribute(
583
+ ATTRIBUTE_UPDATER_ATTRIBUTES,
584
+ value.replaceAll(`path:${key}`, `path:${path}`),
585
+ );
586
+ }
587
+
588
+ for (const [, child] of Object.entries(node.childNodes)) {
589
+ applyRecursive(child, key, path);
590
+ }
591
+ }
570
592
  }
571
593
 
572
594
  /**
@@ -578,20 +600,19 @@ function applyRecursive(node, key, path) {
578
600
  * @this Updater
579
601
  */
580
602
  function updateContent(change) {
581
- const self = this;
582
- const subject = self[internalSymbol].subject.getRealSubject();
583
-
584
- let p = clone(change?.["path"]);
585
- runUpdateContent.call(this, this[internalSymbol].element, p, subject);
586
-
587
- const slots = this[internalSymbol].element.querySelectorAll("slot");
588
- if (slots.length > 0) {
589
- for (const [, slot] of Object.entries(slots)) {
590
- for (const [, element] of Object.entries(slot.assignedNodes())) {
591
- runUpdateContent.call(this, element, p, subject);
592
- }
593
- }
594
- }
603
+ const subject = this[internalSymbol].subject.getRealSubject();
604
+
605
+ const p = clone(change?.["path"]);
606
+ runUpdateContent.call(this, this[internalSymbol].element, p, subject);
607
+
608
+ const slots = this[internalSymbol].element.querySelectorAll("slot");
609
+ if (slots.length > 0) {
610
+ for (const [, slot] of Object.entries(slots)) {
611
+ for (const [, element] of Object.entries(slot.assignedNodes())) {
612
+ runUpdateContent.call(this, element, p, subject);
613
+ }
614
+ }
615
+ }
595
616
  }
596
617
 
597
618
  /**
@@ -604,67 +625,69 @@ function updateContent(change) {
604
625
  * @return {void}
605
626
  */
606
627
  function runUpdateContent(container, parts, subject) {
607
- if (!isArray(parts)) return;
608
- if (!(container instanceof HTMLElement)) return;
609
- parts = clone(parts);
610
-
611
- let mem = new WeakSet();
612
-
613
- while (parts.length > 0) {
614
- const current = parts.join(".");
615
- parts.pop();
616
-
617
- // Unfortunately, static data is always changed as well, since it is not possible to react to changes here.
618
- const query = `[${ATTRIBUTE_UPDATER_REPLACE}^="path:${current}"], [${ATTRIBUTE_UPDATER_REPLACE}^="static:"], [${ATTRIBUTE_UPDATER_REPLACE}^="i18n:"]`;
619
- const e = container.querySelectorAll(`${query}`);
620
-
621
- const iterator = new Set([...e]);
622
-
623
- if (container.matches(query)) {
624
- iterator.add(container);
625
- }
626
-
627
- /**
628
- * @type {HTMLElement}
629
- */
630
- for (const [element] of iterator.entries()) {
631
- if (mem.has(element)) return;
632
- mem.add(element);
633
-
634
- const attributes = element.getAttribute(ATTRIBUTE_UPDATER_REPLACE);
635
- let cmd = trimSpaces(attributes);
636
-
637
- let pipe = new Pipe(cmd);
638
- this[internalSymbol].callbacks.forEach((f, n) => {
639
- pipe.setCallback(n, f);
640
- });
641
-
642
- let value;
643
- try {
644
- element.removeAttribute(ATTRIBUTE_ERRORMESSAGE);
645
- value = pipe.run(subject);
646
- } catch (e) {
647
- element.setAttribute(ATTRIBUTE_ERRORMESSAGE, e.message);
648
- }
649
-
650
- if (value instanceof HTMLElement) {
651
- while (element.firstChild) {
652
- element.removeChild(element.firstChild);
653
- }
654
-
655
- try {
656
- element.appendChild(value);
657
- } catch (e) {
658
- element.setAttribute(
659
- ATTRIBUTE_ERRORMESSAGE,
660
- `${element.getAttribute(ATTRIBUTE_ERRORMESSAGE)}, ${e.message}`.trim(),
661
- );
662
- }
663
- } else {
664
- element.innerHTML = value;
665
- }
666
- }
667
- }
628
+ if (!isArray(parts)) return;
629
+ if (!(container instanceof HTMLElement)) return;
630
+ parts = clone(parts);
631
+
632
+ const mem = new WeakSet();
633
+
634
+ while (parts.length > 0) {
635
+ const current = parts.join(".");
636
+ parts.pop();
637
+
638
+ // Unfortunately, static data is always changed as well, since it is not possible to react to changes here.
639
+ const query = `[${ATTRIBUTE_UPDATER_REPLACE}^="path:${current}"], [${ATTRIBUTE_UPDATER_REPLACE}^="static:"], [${ATTRIBUTE_UPDATER_REPLACE}^="i18n:"]`;
640
+ const e = container.querySelectorAll(`${query}`);
641
+
642
+ const iterator = new Set([...e]);
643
+
644
+ if (container.matches(query)) {
645
+ iterator.add(container);
646
+ }
647
+
648
+ /**
649
+ * @type {HTMLElement}
650
+ */
651
+ for (const [element] of iterator.entries()) {
652
+ if (mem.has(element)) return;
653
+ mem.add(element);
654
+
655
+ const attributes = element.getAttribute(ATTRIBUTE_UPDATER_REPLACE);
656
+ const cmd = trimSpaces(attributes);
657
+
658
+ const pipe = new Pipe(cmd);
659
+ this[internalSymbol].callbacks.forEach((f, n) => {
660
+ pipe.setCallback(n, f);
661
+ });
662
+
663
+ let value;
664
+ try {
665
+ element.removeAttribute(ATTRIBUTE_ERRORMESSAGE);
666
+ value = pipe.run(subject);
667
+ } catch (e) {
668
+ element.setAttribute(ATTRIBUTE_ERRORMESSAGE, e.message);
669
+ }
670
+
671
+ if (value instanceof HTMLElement) {
672
+ while (element.firstChild) {
673
+ element.removeChild(element.firstChild);
674
+ }
675
+
676
+ try {
677
+ element.appendChild(value);
678
+ } catch (e) {
679
+ element.setAttribute(
680
+ ATTRIBUTE_ERRORMESSAGE,
681
+ `${element.getAttribute(ATTRIBUTE_ERRORMESSAGE)}, ${
682
+ e.message
683
+ }`.trim(),
684
+ );
685
+ }
686
+ } else {
687
+ element.innerHTML = value;
688
+ }
689
+ }
690
+ }
668
691
  }
669
692
 
670
693
  /**
@@ -676,9 +699,9 @@ function runUpdateContent(container, parts, subject) {
676
699
  * @return {void}
677
700
  */
678
701
  function updateAttributes(change) {
679
- const subject = this[internalSymbol].subject.getRealSubject();
680
- let p = clone(change?.["path"]);
681
- runUpdateAttributes.call(this, this[internalSymbol].element, p, subject);
702
+ const subject = this[internalSymbol].subject.getRealSubject();
703
+ const p = clone(change?.["path"]);
704
+ runUpdateAttributes.call(this, this[internalSymbol].element, p, subject);
682
705
  }
683
706
 
684
707
  /**
@@ -690,72 +713,70 @@ function updateAttributes(change) {
690
713
  * @this Updater
691
714
  */
692
715
  function runUpdateAttributes(container, parts, subject) {
693
- const self = this;
694
-
695
- if (!isArray(parts)) return;
696
- parts = clone(parts);
716
+ if (!isArray(parts)) return;
717
+ parts = clone(parts);
697
718
 
698
- let mem = new WeakSet();
719
+ const mem = new WeakSet();
699
720
 
700
- while (parts.length > 0) {
701
- const current = parts.join(".");
702
- parts.pop();
721
+ while (parts.length > 0) {
722
+ const current = parts.join(".");
723
+ parts.pop();
703
724
 
704
- let iterator = new Set();
725
+ let iterator = new Set();
705
726
 
706
- const query = `[${ATTRIBUTE_UPDATER_SELECT_THIS}][${ATTRIBUTE_UPDATER_ATTRIBUTES}], [${ATTRIBUTE_UPDATER_ATTRIBUTES}*="path:${current}"], [${ATTRIBUTE_UPDATER_ATTRIBUTES}^="static:"], [${ATTRIBUTE_UPDATER_ATTRIBUTES}^="i18n:"]`;
727
+ const query = `[${ATTRIBUTE_UPDATER_SELECT_THIS}][${ATTRIBUTE_UPDATER_ATTRIBUTES}], [${ATTRIBUTE_UPDATER_ATTRIBUTES}*="path:${current}"], [${ATTRIBUTE_UPDATER_ATTRIBUTES}^="static:"], [${ATTRIBUTE_UPDATER_ATTRIBUTES}^="i18n:"]`;
707
728
 
708
- const e = container.querySelectorAll(query);
729
+ const e = container.querySelectorAll(query);
709
730
 
710
- if (e.length > 0) {
711
- iterator = new Set([...e]);
712
- }
731
+ if (e.length > 0) {
732
+ iterator = new Set([...e]);
733
+ }
713
734
 
714
- if (container.matches(query)) {
715
- iterator.add(container);
716
- }
735
+ if (container.matches(query)) {
736
+ iterator.add(container);
737
+ }
717
738
 
718
- for (const [element] of iterator.entries()) {
719
- if (mem.has(element)) return;
720
- mem.add(element);
739
+ for (const [element] of iterator.entries()) {
740
+ if (mem.has(element)) return;
741
+ mem.add(element);
721
742
 
722
- // this case occurs when the ATTRIBUTE_UPDATER_SELECT_THIS attribute is set
723
- if (!element.hasAttribute(ATTRIBUTE_UPDATER_ATTRIBUTES)) {
724
- continue;
725
- }
743
+ // this case occurs when the ATTRIBUTE_UPDATER_SELECT_THIS attribute is set
744
+ if (!element.hasAttribute(ATTRIBUTE_UPDATER_ATTRIBUTES)) {
745
+ continue;
746
+ }
726
747
 
727
- const attributes = element.getAttribute(ATTRIBUTE_UPDATER_ATTRIBUTES);
748
+ const attributes = element.getAttribute(ATTRIBUTE_UPDATER_ATTRIBUTES);
728
749
 
729
- for (let [, def] of Object.entries(attributes.split(","))) {
730
- def = trimSpaces(def);
731
- let i = def.indexOf(" ");
732
- let name = trimSpaces(def.substr(0, i));
733
- let cmd = trimSpaces(def.substr(i));
750
+ for (let [, def] of Object.entries(attributes.split(","))) {
751
+ def = trimSpaces(def);
752
+ const i = def.indexOf(" ");
753
+ const name = trimSpaces(def.substr(0, i));
754
+ const cmd = trimSpaces(def.substr(i));
734
755
 
735
- let pipe = new Pipe(cmd);
756
+ const pipe = new Pipe(cmd);
736
757
 
737
- self[internalSymbol].callbacks.forEach((f, n) => {
738
- pipe.setCallback(n, f, element);
739
- });
758
+ this[internalSymbol].callbacks.forEach((f, n) => {
759
+ pipe.setCallback(n, f, element);
760
+ });
740
761
 
741
- let value;
742
- try {
743
- element.removeAttribute(ATTRIBUTE_ERRORMESSAGE);
744
- value = pipe.run(subject);
745
- } catch (e) {
746
- element.setAttribute(ATTRIBUTE_ERRORMESSAGE, e.message);
747
- }
762
+ let value;
763
+ try {
764
+ element.removeAttribute(ATTRIBUTE_ERRORMESSAGE);
765
+ value = pipe.run(subject);
766
+ } catch (e) {
767
+ element.setAttribute(ATTRIBUTE_ERRORMESSAGE, e.message);
768
+ }
748
769
 
749
- if (value === undefined) {
750
- element.removeAttribute(name);
751
- } else if (element.getAttribute(name) !== value) {
752
- element.setAttribute(name, value);
753
- }
770
+ if (value === undefined) {
771
+ element.removeAttribute(name);
772
+ } else if (element.getAttribute(name) !== value) {
773
+ element.setAttribute(name, value);
774
+ }
754
775
 
755
- handleInputControlAttributeUpdate.call(this, element, name, value);
756
- }
757
- }
758
- }
776
+ handleInputControlAttributeUpdate.call(this, element, name, value);
777
+ }
778
+ }
779
+ }
759
780
  }
760
781
 
761
782
  /**
@@ -768,68 +789,66 @@ function runUpdateAttributes(container, parts, subject) {
768
789
  */
769
790
 
770
791
  function handleInputControlAttributeUpdate(element, name, value) {
771
- const self = this;
772
-
773
- if (element instanceof HTMLSelectElement) {
774
- switch (element.type) {
775
- case "select-multiple":
776
- for (const [index, opt] of Object.entries(element.options)) {
777
- if (value.indexOf(opt.value) !== -1) {
778
- opt.selected = true;
779
- } else {
780
- opt.selected = false;
781
- }
782
- }
783
-
784
- break;
785
- case "select-one":
786
- // Only one value may be selected
787
-
788
- for (const [index, opt] of Object.entries(element.options)) {
789
- if (opt.value === value) {
790
- element.selectedIndex = index;
791
- break;
792
- }
793
- }
794
-
795
- break;
796
- }
797
- } else if (element instanceof HTMLInputElement) {
798
- switch (element.type) {
799
- case "radio":
800
- if (name === "checked") {
801
- if (value !== undefined) {
802
- element.checked = true;
803
- } else {
804
- element.checked = false;
805
- }
806
- }
807
-
808
- break;
809
-
810
- case "checkbox":
811
- if (name === "checked") {
812
- if (value !== undefined) {
813
- element.checked = true;
814
- } else {
815
- element.checked = false;
816
- }
817
- }
818
-
819
- break;
820
- case "text":
821
- default:
822
- if (name === "value") {
823
- element.value = value === undefined ? "" : value;
824
- }
825
-
826
- break;
827
- }
828
- } else if (element instanceof HTMLTextAreaElement) {
829
- if (name === "value") {
830
- element.value = value === undefined ? "" : value;
831
- }
832
- }
792
+ if (element instanceof HTMLSelectElement) {
793
+ switch (element.type) {
794
+ case "select-multiple":
795
+ for (const [index, opt] of Object.entries(element.options)) {
796
+ if (value.indexOf(opt.value) !== -1) {
797
+ opt.selected = true;
798
+ } else {
799
+ opt.selected = false;
800
+ }
801
+ }
802
+
803
+ break;
804
+ case "select-one":
805
+ // Only one value may be selected
806
+
807
+ for (const [index, opt] of Object.entries(element.options)) {
808
+ if (opt.value === value) {
809
+ element.selectedIndex = index;
810
+ break;
811
+ }
812
+ }
813
+
814
+ break;
815
+ }
816
+ } else if (element instanceof HTMLInputElement) {
817
+ switch (element.type) {
818
+ case "radio":
819
+ if (name === "checked") {
820
+ if (value !== undefined) {
821
+ element.checked = true;
822
+ } else {
823
+ element.checked = false;
824
+ }
825
+ }
826
+
827
+ break;
828
+
829
+ case "checkbox":
830
+ if (name === "checked") {
831
+ if (value !== undefined) {
832
+ element.checked = true;
833
+ } else {
834
+ element.checked = false;
835
+ }
836
+ }
837
+
838
+ break;
839
+ case "text":
840
+ default:
841
+ if (name === "value") {
842
+ element.value = value === undefined ? "" : value;
843
+ }
844
+
845
+ break;
846
+ }
847
+ } else if (element instanceof HTMLTextAreaElement) {
848
+ if (name === "value") {
849
+ element.value = value === undefined ? "" : value;
850
+ }
851
+ }
833
852
  }
834
853
 
835
854
  /**
@@ -845,45 +864,48 @@ function handleInputControlAttributeUpdate(element, name, value) {
845
864
  * @throws {TypeError} symbol must be an instance of Symbol
846
865
  */
847
866
  function addObjectWithUpdaterToElement(elements, symbol, object) {
848
- const self = this;
849
- if (!(self instanceof HTMLElement)) {
850
- throw new TypeError("the context of this function must be an instance of HTMLElement");
851
- }
852
-
853
- if (!(typeof symbol === "symbol")) {
854
- throw new TypeError("symbol must be an instance of Symbol");
855
- }
856
-
857
- const updaters = new Set();
858
-
859
- if (elements instanceof NodeList) {
860
- elements = new Set([...elements]);
861
- } else if (elements instanceof HTMLElement) {
862
- elements = new Set([elements]);
863
- } else if (elements instanceof Set) {
864
- } else {
865
- throw new TypeError(`elements is not a valid type. (actual: ${typeof elements})`);
866
- }
867
-
868
- let result = [];
869
-
870
- elements.forEach((element) => {
871
- if (!(element instanceof HTMLElement)) return;
872
- if (element instanceof HTMLTemplateElement) return;
873
-
874
- const u = new Updater(element, object);
875
- updaters.add(u);
876
-
877
- result.push(
878
- u.run().then(() => {
879
- return u.enableEventProcessing();
880
- }),
881
- );
882
- });
883
-
884
- if (updaters.size > 0) {
885
- addToObjectLink(self, symbol, updaters);
886
- }
887
-
888
- return result;
867
+ if (!(this instanceof HTMLElement)) {
868
+ throw new TypeError(
869
+ "the context of this function must be an instance of HTMLElement",
870
+ );
871
+ }
872
+
873
+ if (!(typeof symbol === "symbol")) {
874
+ throw new TypeError("symbol must be an instance of Symbol");
875
+ }
876
+
877
+ const updaters = new Set();
878
+
879
+ if (elements instanceof NodeList) {
880
+ elements = new Set([...elements]);
881
+ } else if (elements instanceof HTMLElement) {
882
+ elements = new Set([elements]);
883
+ } else if (elements instanceof Set) {
884
+ } else {
885
+ throw new TypeError(
886
+ `elements is not a valid type. (actual: ${typeof elements})`,
887
+ );
888
+ }
889
+
890
+ const result = [];
891
+
892
+ elements.forEach((element) => {
893
+ if (!(element instanceof HTMLElement)) return;
894
+ if (element instanceof HTMLTemplateElement) return;
895
+
896
+ const u = new Updater(element, object);
897
+ updaters.add(u);
898
+
899
+ result.push(
900
+ u.run().then(() => {
901
+ return u.enableEventProcessing();
902
+ }),
903
+ );
904
+ });
905
+
906
+ if (updaters.size > 0) {
907
+ addToObjectLink(this, symbol, updaters);
908
+ }
909
+
910
+ return result;
889
911
  }