@twobirds/microcomponents 0.1.1 → 0.1.3

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 (343) hide show
  1. package/dist/MC.d.ts +0 -1
  2. package/dist/MC.js +6 -5
  3. package/dist/MC.min.js +39 -56
  4. package/dist/MC.ts +6 -4
  5. package/dist/elements.d.ts +0 -1
  6. package/dist/elements.js +0 -1
  7. package/dist/elements.min.js +1 -1
  8. package/dist/formValues.d.ts +0 -1
  9. package/dist/formValues.js +0 -1
  10. package/dist/formValues.min.js +1 -1
  11. package/dist/helpers.d.ts +0 -1
  12. package/dist/helpers.js +0 -1
  13. package/dist/microcomponents.d.ts +0 -1
  14. package/dist/microcomponents.js +0 -1
  15. package/dist/microcomponents.min.js +1 -1
  16. package/dist/observables.d.ts +0 -1
  17. package/dist/observables.js +0 -1
  18. package/dist/observables.min.js +1 -1
  19. package/package.json +10 -2
  20. package/.gitlab-ci.yml +0 -18
  21. package/.vscode/settings.json +0 -3
  22. package/MicroComponents.svg +0 -15
  23. package/assets/documentation/MC.md +0 -547
  24. package/assets/documentation/MicroComponents.svg +0 -15
  25. package/assets/documentation/ajaxian-1.png +0 -0
  26. package/assets/documentation/ajaxian-2.png +0 -0
  27. package/assets/documentation/ajaxian-3.png +0 -0
  28. package/assets/documentation/elements.md +0 -277
  29. package/assets/documentation/formvalues.md +0 -25
  30. package/assets/documentation/functional_requirements.md +0 -8
  31. package/assets/documentation/history.md +0 -436
  32. package/assets/documentation/klemmstein.png +0 -0
  33. package/assets/documentation/magic.md +0 -29
  34. package/assets/documentation/observables.md +0 -187
  35. package/assets/documentation/rnd0023-1.jpg +0 -0
  36. package/assets/documentation/rnd0023-2.jpg +0 -0
  37. package/assets/documentation/rnd0023-3.jpg +0 -0
  38. package/assets/documentation/tB_react.md +0 -207
  39. package/assets/documentation/usage.md +0 -142
  40. package/assets/documentation/why.md +0 -25
  41. package/assets/fiddle/MicroComponents.svg +0 -15
  42. package/assets/fiddle/fiddle.css +0 -0
  43. package/assets/fiddle/fiddle.js +0 -0
  44. package/assets/fiddle/index.html +0 -0
  45. package/assets/test/MicroComponents.svg +0 -15
  46. package/assets/test/grandparent.css +0 -16
  47. package/assets/test/myButton.css +0 -19
  48. package/assets/test/style.css +0 -8
  49. package/assets/test/test.html +0 -29
  50. package/assets/test/testform.json +0 -27
  51. package/dist/MC.d.ts.map +0 -1
  52. package/dist/elements.d.ts.map +0 -1
  53. package/dist/formValues.d.ts.map +0 -1
  54. package/dist/helpers.d.ts.map +0 -1
  55. package/dist/microcomponents.d.ts.map +0 -1
  56. package/dist/observables.d.ts.map +0 -1
  57. package/public/.nojekyll +0 -1
  58. package/public/MC.d.ts +0 -39
  59. package/public/MC.d.ts.map +0 -1
  60. package/public/MC.js +0 -287
  61. package/public/MC.js.map +0 -1
  62. package/public/MC.min.js +0 -348
  63. package/public/MC.ts +0 -431
  64. package/public/MicroComponents.svg +0 -15
  65. package/public/documentation/MC.md +0 -547
  66. package/public/documentation/MicroComponents.svg +0 -15
  67. package/public/documentation/ajaxian-1.png +0 -0
  68. package/public/documentation/ajaxian-2.png +0 -0
  69. package/public/documentation/ajaxian-3.png +0 -0
  70. package/public/documentation/elements.md +0 -277
  71. package/public/documentation/formvalues.md +0 -25
  72. package/public/documentation/functional_requirements.md +0 -8
  73. package/public/documentation/history.md +0 -436
  74. package/public/documentation/klemmstein.png +0 -0
  75. package/public/documentation/magic.md +0 -29
  76. package/public/documentation/observables.md +0 -187
  77. package/public/documentation/rnd0023-1.jpg +0 -0
  78. package/public/documentation/rnd0023-2.jpg +0 -0
  79. package/public/documentation/rnd0023-3.jpg +0 -0
  80. package/public/documentation/tB_react.md +0 -207
  81. package/public/documentation/usage.md +0 -142
  82. package/public/documentation/why.md +0 -25
  83. package/public/elements.d.ts +0 -5
  84. package/public/elements.d.ts.map +0 -1
  85. package/public/elements.js +0 -68
  86. package/public/elements.js.map +0 -1
  87. package/public/elements.min.js +0 -1
  88. package/public/elements.ts +0 -119
  89. package/public/fiddle/MicroComponents.svg +0 -15
  90. package/public/fiddle/fiddle.css +0 -0
  91. package/public/fiddle/fiddle.js +0 -0
  92. package/public/fiddle/index.html +0 -0
  93. package/public/formValues.d.ts +0 -3
  94. package/public/formValues.d.ts.map +0 -1
  95. package/public/formValues.js +0 -162
  96. package/public/formValues.js.map +0 -1
  97. package/public/formValues.min.js +0 -1
  98. package/public/formValues.ts +0 -225
  99. package/public/helpers.d.ts +0 -14
  100. package/public/helpers.d.ts.map +0 -1
  101. package/public/helpers.js +0 -113
  102. package/public/helpers.js.map +0 -1
  103. package/public/helpers.ts +0 -149
  104. package/public/microcomponents.d.ts +0 -6
  105. package/public/microcomponents.d.ts.map +0 -1
  106. package/public/microcomponents.js +0 -7
  107. package/public/microcomponents.js.map +0 -1
  108. package/public/microcomponents.min.js +0 -1
  109. package/public/microcomponents.ts +0 -8
  110. package/public/observables.d.ts +0 -11
  111. package/public/observables.d.ts.map +0 -1
  112. package/public/observables.js +0 -244
  113. package/public/observables.js.map +0 -1
  114. package/public/observables.min.js +0 -1
  115. package/public/observables.ts +0 -416
  116. package/public/selectors._ts +0 -1269
  117. package/public/src/MC.d.ts +0 -39
  118. package/public/src/MC.d.ts.map +0 -1
  119. package/public/src/MC.js +0 -287
  120. package/public/src/MC.js.map +0 -1
  121. package/public/src/MC.ts +0 -431
  122. package/public/src/elements.d.ts +0 -5
  123. package/public/src/elements.d.ts.map +0 -1
  124. package/public/src/elements.js +0 -68
  125. package/public/src/elements.js.map +0 -1
  126. package/public/src/elements.ts +0 -119
  127. package/public/src/formValues.d.ts +0 -3
  128. package/public/src/formValues.d.ts.map +0 -1
  129. package/public/src/formValues.js +0 -162
  130. package/public/src/formValues.js.map +0 -1
  131. package/public/src/formValues.ts +0 -225
  132. package/public/src/helpers.d.ts +0 -14
  133. package/public/src/helpers.d.ts.map +0 -1
  134. package/public/src/helpers.js +0 -113
  135. package/public/src/helpers.js.map +0 -1
  136. package/public/src/helpers.ts +0 -149
  137. package/public/src/microcomponents.d.ts +0 -6
  138. package/public/src/microcomponents.d.ts.map +0 -1
  139. package/public/src/microcomponents.js +0 -7
  140. package/public/src/microcomponents.js.map +0 -1
  141. package/public/src/microcomponents.ts +0 -8
  142. package/public/src/observables.d.ts +0 -11
  143. package/public/src/observables.d.ts.map +0 -1
  144. package/public/src/observables.js +0 -244
  145. package/public/src/observables.js.map +0 -1
  146. package/public/src/observables.ts +0 -416
  147. package/public/src/selectors._ts +0 -1269
  148. package/public/src/test/grandparent.css +0 -14
  149. package/public/src/test/test/child.d.ts +0 -2
  150. package/public/src/test/test/child.d.ts.map +0 -1
  151. package/public/src/test/test/child.js +0 -26
  152. package/public/src/test/test/child.js.map +0 -1
  153. package/public/src/test/test/child.ts +0 -36
  154. package/public/src/test/test/grandchild.d.ts +0 -2
  155. package/public/src/test/test/grandchild.d.ts.map +0 -1
  156. package/public/src/test/test/grandchild.js +0 -22
  157. package/public/src/test/test/grandchild.js.map +0 -1
  158. package/public/src/test/test/grandchild.ts +0 -31
  159. package/public/src/test/test/grandparent.d.ts +0 -2
  160. package/public/src/test/test/grandparent.d.ts.map +0 -1
  161. package/public/src/test/test/grandparent.js +0 -1
  162. package/public/src/test/test/grandparent.js.map +0 -1
  163. package/public/src/test/test/grandparent.ts +0 -43
  164. package/public/src/test/test/greatgrandchild.d.ts +0 -2
  165. package/public/src/test/test/greatgrandchild.d.ts.map +0 -1
  166. package/public/src/test/test/greatgrandchild.js +0 -36
  167. package/public/src/test/test/greatgrandchild.js.map +0 -1
  168. package/public/src/test/test/greatgrandchild.ts +0 -51
  169. package/public/src/test/test/parent.d.ts +0 -2
  170. package/public/src/test/test/parent.d.ts.map +0 -1
  171. package/public/src/test/test/parent.js +0 -25
  172. package/public/src/test/test/parent.js.map +0 -1
  173. package/public/src/test/test/parent.ts +0 -35
  174. package/public/src/test/test/testform.d.ts +0 -2
  175. package/public/src/test/test/testform.d.ts.map +0 -1
  176. package/public/src/test/test/testform.js +0 -1
  177. package/public/src/test/test/testform.js.map +0 -1
  178. package/public/src/test/test/testform.ts +0 -153
  179. package/public/src/test/test/testfunction.d.ts +0 -3
  180. package/public/src/test/test/testfunction.d.ts.map +0 -1
  181. package/public/src/test/test/testfunction.js +0 -7
  182. package/public/src/test/test/testfunction.js.map +0 -1
  183. package/public/src/test/test/testfunction.ts +0 -12
  184. package/public/src/test/test/testmc.d.ts +0 -3
  185. package/public/src/test/test/testmc.d.ts.map +0 -1
  186. package/public/src/test/test/testmc.js +0 -10
  187. package/public/src/test/test/testmc.js.map +0 -1
  188. package/public/src/test/test/testmc.ts +0 -16
  189. package/public/src/test/test/testsimpleclass.d.ts +0 -3
  190. package/public/src/test/test/testsimpleclass.d.ts.map +0 -1
  191. package/public/src/test/test/testsimpleclass.js +0 -9
  192. package/public/src/test/test/testsimpleclass.js.map +0 -1
  193. package/public/src/test/test/testsimpleclass.ts +0 -15
  194. package/public/src/test/test.d.ts +0 -2
  195. package/public/src/test/test.d.ts.map +0 -1
  196. package/public/src/test/test.js +0 -72
  197. package/public/src/test/test.js.map +0 -1
  198. package/public/src/test/test.ts +0 -176
  199. package/public/src/test/testform.css +0 -47
  200. package/public/src/test/testform.html +0 -56
  201. package/public/src/test/testform.json +0 -27
  202. package/public/test/MC.d.ts +0 -39
  203. package/public/test/MC.d.ts.map +0 -1
  204. package/public/test/MC.js +0 -287
  205. package/public/test/MC.min.js +0 -348
  206. package/public/test/MC.ts +0 -431
  207. package/public/test/MicroComponents.svg +0 -15
  208. package/public/test/elements.d.ts +0 -5
  209. package/public/test/elements.d.ts.map +0 -1
  210. package/public/test/elements.js +0 -68
  211. package/public/test/elements.min.js +0 -1
  212. package/public/test/elements.ts +0 -119
  213. package/public/test/formValues.d.ts +0 -3
  214. package/public/test/formValues.d.ts.map +0 -1
  215. package/public/test/formValues.js +0 -162
  216. package/public/test/formValues.min.js +0 -1
  217. package/public/test/formValues.ts +0 -225
  218. package/public/test/grandparent.css +0 -14
  219. package/public/test/helpers.d.ts +0 -14
  220. package/public/test/helpers.d.ts.map +0 -1
  221. package/public/test/helpers.js +0 -113
  222. package/public/test/helpers.ts +0 -149
  223. package/public/test/microcomponents.d.ts +0 -6
  224. package/public/test/microcomponents.d.ts.map +0 -1
  225. package/public/test/microcomponents.js +0 -7
  226. package/public/test/microcomponents.min.js +0 -1
  227. package/public/test/microcomponents.ts +0 -8
  228. package/public/test/myButton.css +0 -19
  229. package/public/test/observables.d.ts +0 -11
  230. package/public/test/observables.d.ts.map +0 -1
  231. package/public/test/observables.js +0 -244
  232. package/public/test/observables.min.js +0 -1
  233. package/public/test/observables.ts +0 -416
  234. package/public/test/style.css +0 -8
  235. package/public/test/test/child.d.ts +0 -2
  236. package/public/test/test/child.d.ts.map +0 -1
  237. package/public/test/test/child.js +0 -26
  238. package/public/test/test/child.js.map +0 -1
  239. package/public/test/test/child.ts +0 -36
  240. package/public/test/test/grandchild.d.ts +0 -2
  241. package/public/test/test/grandchild.d.ts.map +0 -1
  242. package/public/test/test/grandchild.js +0 -22
  243. package/public/test/test/grandchild.js.map +0 -1
  244. package/public/test/test/grandchild.ts +0 -31
  245. package/public/test/test/grandparent.d.ts +0 -2
  246. package/public/test/test/grandparent.d.ts.map +0 -1
  247. package/public/test/test/grandparent.js +0 -1
  248. package/public/test/test/grandparent.js.map +0 -1
  249. package/public/test/test/grandparent.ts +0 -43
  250. package/public/test/test/greatgrandchild.d.ts +0 -2
  251. package/public/test/test/greatgrandchild.d.ts.map +0 -1
  252. package/public/test/test/greatgrandchild.js +0 -36
  253. package/public/test/test/greatgrandchild.js.map +0 -1
  254. package/public/test/test/greatgrandchild.ts +0 -51
  255. package/public/test/test/parent.d.ts +0 -2
  256. package/public/test/test/parent.d.ts.map +0 -1
  257. package/public/test/test/parent.js +0 -25
  258. package/public/test/test/parent.js.map +0 -1
  259. package/public/test/test/parent.ts +0 -35
  260. package/public/test/test/testform.d.ts +0 -2
  261. package/public/test/test/testform.d.ts.map +0 -1
  262. package/public/test/test/testform.js +0 -1
  263. package/public/test/test/testform.js.map +0 -1
  264. package/public/test/test/testform.ts +0 -153
  265. package/public/test/test/testfunction.d.ts +0 -3
  266. package/public/test/test/testfunction.d.ts.map +0 -1
  267. package/public/test/test/testfunction.js +0 -7
  268. package/public/test/test/testfunction.js.map +0 -1
  269. package/public/test/test/testfunction.ts +0 -12
  270. package/public/test/test/testmc.d.ts +0 -3
  271. package/public/test/test/testmc.d.ts.map +0 -1
  272. package/public/test/test/testmc.js +0 -10
  273. package/public/test/test/testmc.js.map +0 -1
  274. package/public/test/test/testmc.ts +0 -16
  275. package/public/test/test/testsimpleclass.d.ts +0 -3
  276. package/public/test/test/testsimpleclass.d.ts.map +0 -1
  277. package/public/test/test/testsimpleclass.js +0 -9
  278. package/public/test/test/testsimpleclass.js.map +0 -1
  279. package/public/test/test/testsimpleclass.ts +0 -15
  280. package/public/test/test.d.ts +0 -2
  281. package/public/test/test.d.ts.map +0 -1
  282. package/public/test/test.html +0 -29
  283. package/public/test/test.js +0 -72
  284. package/public/test/test.js.map +0 -1
  285. package/public/test/test.ts +0 -176
  286. package/public/test/testform.css +0 -47
  287. package/public/test/testform.html +0 -56
  288. package/public/test/testform.json +0 -27
  289. package/public/typedoc/.nojekyll +0 -1
  290. package/public/typedoc/assets/highlight.css +0 -106
  291. package/public/typedoc/assets/icons.js +0 -18
  292. package/public/typedoc/assets/icons.svg +0 -1
  293. package/public/typedoc/assets/main.js +0 -60
  294. package/public/typedoc/assets/navigation.js +0 -1
  295. package/public/typedoc/assets/search.js +0 -1
  296. package/public/typedoc/assets/style.css +0 -1493
  297. package/public/typedoc/classes/MC.DC.html +0 -13
  298. package/public/typedoc/classes/MC.MC.html +0 -3
  299. package/public/typedoc/classes/MC.McBase.html +0 -3
  300. package/public/typedoc/functions/MC.autoload.html +0 -1
  301. package/public/typedoc/functions/MC.off.html +0 -1
  302. package/public/typedoc/functions/MC.on.html +0 -1
  303. package/public/typedoc/functions/MC.one.html +0 -1
  304. package/public/typedoc/functions/MC.trigger.html +0 -1
  305. package/public/typedoc/functions/elements.defineCE.html +0 -1
  306. package/public/typedoc/functions/elements.getCE.html +0 -1
  307. package/public/typedoc/functions/formValues.formValues.html +0 -1
  308. package/public/typedoc/functions/observables.observe.html +0 -1
  309. package/public/typedoc/hierarchy.html +0 -1
  310. package/public/typedoc/index.html +0 -122
  311. package/public/typedoc/interfaces/MC.HTMLMcElement.html +0 -758
  312. package/public/typedoc/media/MicroComponents.svg +0 -15
  313. package/public/typedoc/modules/MC.html +0 -10
  314. package/public/typedoc/modules/elements.html +0 -3
  315. package/public/typedoc/modules/formValues.html +0 -2
  316. package/public/typedoc/modules/observables.html +0 -3
  317. package/public/typedoc/modules.html +0 -5
  318. package/public/typedoc/types/observables.Observable.html +0 -1
  319. package/src/MC.ts +0 -431
  320. package/src/elements.ts +0 -119
  321. package/src/formValues.ts +0 -225
  322. package/src/helpers.ts +0 -149
  323. package/src/microcomponents.ts +0 -8
  324. package/src/observables.ts +0 -416
  325. package/src/selectors._ts +0 -1269
  326. package/src/test/grandparent.css +0 -14
  327. package/src/test/test/child.ts +0 -36
  328. package/src/test/test/grandchild.ts +0 -31
  329. package/src/test/test/grandparent.ts +0 -43
  330. package/src/test/test/greatgrandchild.ts +0 -51
  331. package/src/test/test/parent.ts +0 -35
  332. package/src/test/test/testform.ts +0 -153
  333. package/src/test/test/testfunction.ts +0 -12
  334. package/src/test/test/testmc.ts +0 -16
  335. package/src/test/test/testsimpleclass.ts +0 -15
  336. package/src/test/test.ts +0 -176
  337. package/src/test/testform.css +0 -47
  338. package/src/test/testform.html +0 -56
  339. package/src/test/testform.json +0 -27
  340. package/tasks.md +0 -36
  341. package/tsconfig.json +0 -107
  342. package/typedoc.json +0 -7
  343. package/webpack.config.js +0 -346
@@ -1,416 +0,0 @@
1
- 'use strict';
2
-
3
- import {
4
- LooseObject,
5
- debounce,
6
- deepEqual,
7
- flattenObject,
8
- copyGettersSetters,
9
- } from './helpers.js';
10
-
11
- import { DC, HTMLMcElement, trigger } from './MC.js';
12
-
13
- function isObservableObject(value: any): boolean {
14
- return value != null && typeof value === 'object';
15
- }
16
-
17
- type Callback = (value: any) => void;
18
-
19
- function getPlaceholders(target: HTMLElement): string[] {
20
- let placeholders: Set<string> = new Set(),
21
- regEx = /\{[^\{\}]*\}/g;
22
-
23
- // scan attributes
24
- ( !!target.getAttributeNames ? target.getAttributeNames() : [] )
25
- .filter((attr) => target.getAttribute(attr)?.match(regEx)) // extract placeholder(s)
26
- .forEach((attr) => {
27
- let placeholders: Set<string> = new Set(target.getAttribute(attr)?.match(regEx));
28
- placeholders.forEach((placeholder) =>
29
- placeholders.add(placeholder.replace(/[\{\}]/g, ''))
30
- );
31
- });
32
-
33
- // scan children text nodes
34
- [...target.childNodes]
35
- .filter((childNode) => {
36
- return (
37
- // is text node and has placeholders
38
- childNode.nodeType === 3 &&
39
- ((childNode as any).nodeValue || '').match(regEx)
40
- );
41
- })
42
- .forEach((childNode) => {
43
- ((childNode as any).nodeValue || '')
44
- .match(regEx)
45
- .forEach((placeholder: string) => {
46
- placeholders.add(placeholder.replace(/[\{\}]/g, ''));
47
- });
48
- });
49
-
50
- // extract {} and return result
51
- return [...placeholders].map((placeholder) =>
52
- placeholder.replace(/[\{\}]/g, '')
53
- );
54
- }
55
-
56
- const inputs = [HTMLInputElement, HTMLSelectElement, HTMLTextAreaElement];
57
-
58
- class Placeholders extends DC {
59
- data: LooseObject = {};
60
- oldDisplay?: string = '';
61
-
62
- constructor(target: HTMLElement) {
63
- super(target);
64
- getPlaceholders(target).forEach((property) => (this.data[property] = ''));
65
- observe(this);
66
- this.#attachCallbacks();
67
- }
68
-
69
- #attachCallbacks() {
70
- let target = this.target,
71
- hide: boolean = false;
72
-
73
- //console.log('attachCallbacks', this.target);
74
-
75
- // scan attributes
76
- ( !!target.getAttributeNames ? target.getAttributeNames() : [] )
77
- .filter((attr: string) =>
78
- target.getAttribute(attr)?.match(/\{[^\{\}]*\}/g)
79
- ) // extract placeholder(s)
80
- .forEach((attr: string) => {
81
- let placeholders: Set<string> = new Set(
82
- target.getAttribute(attr)?.match(/\{[^\{\}]*\}/g)
83
- );
84
- // attach callback
85
- this.data.observe(
86
- ((template: string) => (data: LooseObject) => {
87
- let result: string = template;
88
- placeholders.forEach((placeholder) => {
89
- result = result.replace(
90
- placeholder,
91
- data[placeholder.replace(/[\{\}]/g, '')]
92
- );
93
- });
94
- target.setAttribute(attr, result);
95
- //console.log('cb setAttribute()', data, template, attr, result);
96
- })(target.getAttribute(attr))
97
- );
98
- });
99
-
100
- // scan children text nodes
101
- [...target.childNodes]
102
- .filter((childNode) => {
103
- return (
104
- // is text node and has placeholders
105
- childNode.nodeType === 3 &&
106
- ((childNode as Node).nodeValue || '').match(/\{[^\{\}]*\}/g)
107
- );
108
- })
109
- .forEach((childNode) => {
110
- hide = true;
111
- let placeholders: Set<string> = new Set(
112
- childNode.nodeValue.match(/\{[^\{\}]*\}/g)
113
- );
114
-
115
- // attach callback
116
- this.data.observe(
117
- ((template: string) => (data: LooseObject) => {
118
- let result: string = template;
119
- //console.log('text node "', template, '" callback data:', data);
120
- placeholders.forEach((placeholder) => {
121
- result = result.replace(
122
- placeholder,
123
- data[placeholder.replace(/[\{\}]/g, '')]
124
- );
125
- });
126
-
127
- if (!!this.oldDisplay) {
128
- target.style = this.oldDisplay;
129
- } else {
130
- target.removeAttribute('style');
131
- }
132
- delete this.oldDisplay;
133
-
134
- childNode.nodeValue = result;
135
- })(childNode.nodeValue)
136
- );
137
-
138
- // hide for now
139
- this.oldDisplay = target.getAttribute('style') || ''; // TBD allow null to indicate there was no old style attribute
140
-
141
- if (
142
- hide &&
143
- !inputs.includes((target as any).constructor) &&
144
- target.tagName !== 'FIELDSET'
145
- ) {
146
- target.style.display = 'none';
147
- }
148
- });
149
- }
150
-
151
- onData(ev: CustomEvent) {
152
- let data: LooseObject = {};
153
- Object.keys(ev.detail.data).forEach((key) => {
154
- if (this.data.hasOwnProperty(key)) data[key] = ev.detail.data[key];
155
- });
156
- //console.log( 'Placeholder onData', ev, data );
157
- if (JSON.stringify(data) !== JSON.stringify(this.data))
158
- Object.assign(this.data, data); // will trigger callbacks
159
- }
160
- }
161
-
162
- function getPlaceholderElements(
163
- target: HTMLElement | DocumentFragment | ShadowRoot
164
- ): HTMLElement[] {
165
- let elements: Array<Node> = [target]
166
- .concat([...(target.querySelectorAll('*') as unknown as HTMLElement[])])
167
- .filter((e) => !!getPlaceholders(e as HTMLElement).length)
168
- .filter((e) => (e as HTMLElement)?.tagName !== 'STYLE')
169
- .reverse(); // to start with inner elements
170
- //console.log('getPlaceholderElements', elements);
171
- return elements as HTMLElement[];
172
- }
173
-
174
- function makePlaceholders(
175
- element: HTMLElement | DocumentFragment | ShadowRoot
176
- ): void {
177
- //console.log('makePlaceholders', element);
178
- getPlaceholderElements(element).forEach((e: HTMLElement) => {
179
- if ((e as HTMLMcElement)?._mc?._placeholders) return;
180
- DC.add(e, '_placeholders', new Placeholders(e));
181
- });
182
- }
183
-
184
- export type Observable = {
185
- observe: (cb: Callback) => void;
186
- notify: () => void;
187
- bind: (target: HTMLElement | DocumentFragment | ShadowRoot ) => void;
188
- callbacks: Array<Function>;
189
- };
190
-
191
- type Class<T> = new (...args: any[]) => T;
192
-
193
- // repository for observable class wrappers
194
- const classRepo: LooseObject = {};
195
-
196
- // creates a new observable class wrapper
197
- function makeObservable(val: any): Class<typeof val>{
198
-
199
- const Constructor = val.constructor,
200
- ConstructorName: string = Constructor.name;
201
-
202
- let ObservableClass = class extends Constructor {
203
- #notify: boolean = true;
204
- #callbacks: Array<Function> = [];
205
-
206
- constructor(val: any) {
207
- super(val);
208
- (this.constructor as LooseObject).callbacks = [];
209
- if (isObservableObject(val)) {
210
- // you cannot bind native values to the dom
211
- Object.getOwnPropertyNames(val).forEach((key) => {
212
- this[key] = val[key];
213
- });
214
- }
215
- }
216
-
217
- get callbacks(): Array<Function> {
218
- return this.#callbacks
219
- }
220
-
221
- set callbacks( callbacks: Array<Function> ){
222
- this.#callbacks = callbacks
223
- }
224
-
225
- observe( callback: Function ) {
226
- //console.log('observe');
227
- this.#callbacks.push( callback );
228
- return this;
229
- }
230
-
231
- bind(target: HTMLElement | DocumentFragment | ShadowRoot) {
232
- const iso = isObservableObject(this.valueOf());
233
- //console.log('bind', iso, target);
234
-
235
- if (iso) {
236
- makePlaceholders(target);
237
- const placeholders: unknown =
238
- [
239
- target,
240
- ...target.querySelectorAll('[data-mc]'),
241
- ]
242
- .filter(
243
- (e) => !!(e as LooseObject)?._mc?._placeholders
244
- );
245
-
246
- //console.log('placeholders:', target, placeholders);
247
-
248
- const func = function callback(data: LooseObject) {
249
- // avoid bubbling for speed
250
- let flattenedData = flattenObject(data);
251
- //console.log('inside placeholder callback', target, flattenedData);
252
- (placeholders as Node[]).forEach((node) => {
253
- // console.log('trigger callback', e);
254
- if (!node) return;
255
- trigger(node as HTMLMcElement, 'data', flattenedData);
256
- });
257
- };
258
- (this as any).#callbacks.push(func);
259
- this.notify();
260
- } else {
261
- console.warn(
262
- 'IGNORED - cannot bind a non-Object to the dom, IS:',
263
- typeof this.valueOf(),
264
- this
265
- );
266
- }
267
-
268
- return this;
269
- }
270
-
271
- notify(notify?: boolean) {
272
- let data =
273
- isObservableObject(this.valueOf()) &&
274
- this.valueOf() instanceof Array === false
275
- ? structuredClone(Object.assign({}, this))
276
- : this.valueOf();
277
-
278
- if (notify !== undefined) {
279
- this.#notify = notify;
280
- // return;
281
- }
282
-
283
- //if (this.#notify) console.log('notify', this, data);
284
- (this as any).#callbacks.forEach((f: Function) => {
285
- // console.log(
286
- // (this.constructor as any).callbacks,
287
- // 'notify: exec callback',
288
- // f,
289
- // data
290
- // );
291
- f(data);
292
- });
293
-
294
- return this;
295
- }
296
- };
297
-
298
- (classRepo as any)[ConstructorName] = ObservableClass;
299
-
300
- // console.log( 'classRepo:', classRepo );
301
-
302
- return ObservableClass;
303
- }
304
-
305
- function getConstructor( val: any ): Class<typeof val> {
306
- let key: string = val.constructor.name;
307
- return classRepo[key] || makeObservable( val );
308
- }
309
-
310
- export const observe = (
311
- target: LooseObject,
312
- propertyName?: string
313
- ): LooseObject => {
314
- let keys = !propertyName
315
- ? [...Object.getOwnPropertyNames(target)]
316
- : [propertyName];
317
-
318
- keys.forEach((key) => {
319
- if (
320
- target.hasOwnProperty(key)
321
- && typeof target[key] !== 'function'
322
- && !target?.[key]?.constructor?.prototype?.observe
323
- ) {
324
-
325
- // console.log( 'co propname', key, typeof target[key], target[key] );
326
- if (key[0] === '_' || target?.[key] === undefined) return target;
327
- let val: any = target[key];
328
-
329
- let o = new ( getConstructor(val) as Class<typeof val> )( val );
330
-
331
- Object.defineProperty(target, key, {
332
- enumerable: true,
333
- get() {
334
- if (isObservableObject(o.valueOf())) {
335
- let check = structuredClone(Object.assign({}, o));
336
- setTimeout(
337
- debounce(function checkChanges() {
338
- let state = structuredClone(Object.assign({}, o));
339
- //console.log( 'check changes', state, check );
340
- if (!deepEqual(state, check)) {
341
- //console.log( '-> not equal!' );
342
- o.notify();
343
- }
344
- }, 0),
345
- 0
346
- );
347
- }
348
- return o;
349
- },
350
- set(val: any) {
351
- //console.log( 'SET:', isObservableObject( val.valueOf() ), 'set:', val, 'to', isObservableObject( o.valueOf() ), o, );
352
- if (typeof val === typeof o.valueOf()) {
353
- let iso =
354
- isObservableObject(o.valueOf()) &&
355
- o.valueOf() instanceof Array === false;
356
- //console.log('target iso:', iso);
357
- if (iso) {
358
- let old = structuredClone(Object.assign({}, o));
359
- //val = structuredClone(Object.assign({}, val));
360
-
361
- //let callbacks = (o.constructor as LooseObject).callbacks;
362
- if (o?.constructor?.prototype?.observe === undefined ) {
363
- o = new ( getConstructor(val) as Class<typeof val> )( structuredClone(Object.assign({}, val)) );
364
- copyGettersSetters(val, o);
365
- o.seal();
366
- }
367
- Object.assign(o, val);
368
-
369
- // console.log('after set o=', o, 'check', old);
370
- // (o.constructor as LooseObject).callbacks = callbacks;
371
-
372
- setTimeout(
373
- // check for changes
374
- debounce(function checkChanges() {
375
- let state = structuredClone(Object.assign({}, o));
376
- //console.log( 'check changes', state, check );
377
- if (!deepEqual(state, old)) {
378
- //console.log( '-> not equal!' );
379
- o.notify();
380
- }
381
- }, 0),
382
- 0
383
- );
384
- } else {
385
- // simple native var
386
- let old = o.valueOf(),
387
- callbacks = (o as Observable).callbacks;
388
-
389
- // console.log( 'sO', o, o.valueOf(), 'val', val );
390
- if (val !== old) {
391
- // console.log( '-> sO new val', val );
392
- o = new ( getConstructor(val) as Class<typeof val> )( val );
393
- (o as Observable).callbacks = callbacks;
394
- o.notify();
395
- }
396
- }
397
- } else {
398
- console.warn(
399
- 'IGNORED - cannot change observable types, IS:',
400
- typeof o.valueOf(),
401
- o,
402
- '- CANNOT BECOME:',
403
- typeof val
404
- );
405
- }
406
- },
407
- });
408
-
409
- // replace old property with proxy (observable)
410
- target[key] = val;
411
- };
412
-
413
- });
414
-
415
- return target;
416
- };