@twobirds/microcomponents 0.0.84 → 0.0.85

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 (74) hide show
  1. package/README.md +22 -6
  2. package/assets/documentation/MC.md +60 -81
  3. package/assets/documentation/elements.md +6 -9
  4. package/assets/documentation/observables.md +97 -11
  5. package/dist/MC.d.ts +6 -9
  6. package/dist/MC.d.ts.map +1 -1
  7. package/dist/MC.js +33 -69
  8. package/dist/MC.min.js +33 -69
  9. package/dist/MC.ts +55 -102
  10. package/dist/elements.min.js +1 -1
  11. package/dist/formValues.min.js +1 -1
  12. package/dist/microcomponents.min.js +1 -1
  13. package/dist/observables.min.js +1 -1
  14. package/package.json +1 -1
  15. package/public/MC.d.ts +6 -9
  16. package/public/MC.d.ts.map +1 -1
  17. package/public/MC.js +33 -69
  18. package/public/MC.js.map +1 -1
  19. package/public/MC.min.js +33 -69
  20. package/public/MC.ts +55 -102
  21. package/public/documentation/MC.md +60 -81
  22. package/public/documentation/elements.md +6 -9
  23. package/public/documentation/observables.md +97 -11
  24. package/public/elements.min.js +1 -1
  25. package/public/formValues.min.js +1 -1
  26. package/public/microcomponents.min.js +1 -1
  27. package/public/observables.min.js +1 -1
  28. package/public/src/MC.d.ts +6 -9
  29. package/public/src/MC.d.ts.map +1 -1
  30. package/public/src/MC.js +33 -69
  31. package/public/src/MC.js.map +1 -1
  32. package/public/src/MC.ts +55 -102
  33. package/public/src/test/test/grandparent.js +1 -1
  34. package/public/src/test/test/testform.js +1 -1
  35. package/public/src/test/test.js +1 -1
  36. package/public/src/test/test.js.map +1 -1
  37. package/public/src/test/test.ts +2 -1
  38. package/public/test/MC.d.ts +6 -9
  39. package/public/test/MC.d.ts.map +1 -1
  40. package/public/test/MC.js +33 -69
  41. package/public/test/MC.min.js +33 -69
  42. package/public/test/MC.ts +55 -102
  43. package/public/test/elements.min.js +1 -1
  44. package/public/test/formValues.min.js +1 -1
  45. package/public/test/microcomponents.min.js +1 -1
  46. package/public/test/observables.min.js +1 -1
  47. package/public/test/test/grandparent.js +1 -1
  48. package/public/test/test/testform.js +1 -1
  49. package/public/test/test.js +1 -1
  50. package/public/test/test.js.map +1 -1
  51. package/public/test/test.ts +2 -1
  52. package/public/typedoc/assets/navigation.js +1 -1
  53. package/public/typedoc/assets/search.js +1 -1
  54. package/public/typedoc/classes/MC.DC.html +3 -4
  55. package/public/typedoc/classes/MC.MC.html +2 -4
  56. package/public/typedoc/classes/MC.McBase.html +2 -2
  57. package/public/typedoc/functions/MC.autoload.html +1 -1
  58. package/public/typedoc/functions/MC.off.html +1 -1
  59. package/public/typedoc/functions/MC.on.html +1 -1
  60. package/public/typedoc/functions/MC.one.html +1 -1
  61. package/public/typedoc/functions/MC.trigger.html +1 -0
  62. package/public/typedoc/functions/elements.defineCE.html +1 -1
  63. package/public/typedoc/functions/elements.getCE.html +1 -1
  64. package/public/typedoc/functions/formValues.formValues.html +1 -1
  65. package/public/typedoc/functions/observables.observe.html +1 -1
  66. package/public/typedoc/index.html +21 -10
  67. package/public/typedoc/interfaces/MC.HTMLMcElement.html +2 -2
  68. package/public/typedoc/modules/MC.html +3 -3
  69. package/public/typedoc/modules/elements.html +1 -1
  70. package/public/typedoc/modules/formValues.html +1 -1
  71. package/public/typedoc/modules/observables.html +1 -1
  72. package/public/typedoc/types/observables.Observable.html +1 -1
  73. package/src/MC.ts +55 -102
  74. package/src/test/test.ts +2 -1
package/public/MC.min.js CHANGED
@@ -56,7 +56,7 @@ __webpack_require__.r(__webpack_exports__);
56
56
  /* harmony export */ trigger: () => (/* binding */ trigger)
57
57
  /* harmony export */ });
58
58
 
59
- var isBrowser = new Function('try {return this===window;}catch(e){ return false;}');
59
+ const isBrowser = new Function('try {return this===window;}catch(e){ return false;}');
60
60
  function getNativeEventNames(domNode) {
61
61
  let nativeEventNames = [];
62
62
  if (isBrowser()) {
@@ -66,51 +66,13 @@ function getNativeEventNames(domNode) {
66
66
  }
67
67
  return nativeEventNames;
68
68
  }
69
- function getMicroComponents(elements, search) {
70
- let mcValues = [];
71
- elements.forEach((e) => {
72
- if (e) {
73
- if (e instanceof HTMLElement) {
74
- const _mc = e?._mc;
75
- if (!search && _mc) {
76
- mcValues = mcValues.concat(Object.values(e._mc));
77
- }
78
- else if (search && _mc && _mc[search]) {
79
- mcValues.push(_mc[search]);
80
- }
81
- }
82
- }
83
- });
84
- return mcValues;
85
- }
86
- function traverseNodes(node, search, firstonly = true) {
87
- let mcValues = [];
88
- while (node) {
89
- if (node._mc) {
90
- if (!search) {
91
- mcValues = mcValues.concat(Object.values(node._mc));
92
- }
93
- else if (search && node._mc[search]) {
94
- mcValues.push(node._mc[search]);
95
- }
96
- if (firstonly)
97
- return mcValues;
98
- }
99
- node = node.parentNode;
100
- }
101
- return mcValues;
102
- }
103
69
  function isDOM(element) {
104
70
  return element && element instanceof HTMLElement;
105
71
  }
106
72
  function add(target, key, element = {}) {
107
73
  let node = target;
108
74
  if (!node._mc) {
109
- let debug = DC?.debug;
110
- DC.debug = false;
111
75
  node._mc = new DC(target);
112
- DC.debug = debug;
113
- delete node._mc._mc;
114
76
  }
115
77
  const _mc = node._mc;
116
78
  if (key.length && !_mc[key]) {
@@ -119,7 +81,7 @@ function add(target, key, element = {}) {
119
81
  target.setAttribute('data-mc', '');
120
82
  }
121
83
  }
122
- return element;
84
+ return node;
123
85
  }
124
86
  function remove(target, key) {
125
87
  if (!key)
@@ -136,9 +98,9 @@ function remove(target, key) {
136
98
  return;
137
99
  }
138
100
  function init(element) {
139
- if (element.constructor === DC)
140
- return;
141
101
  setTimeout(() => {
102
+ if (element.constructor === DC)
103
+ return;
142
104
  element.trigger('Init');
143
105
  }, 0);
144
106
  }
@@ -179,7 +141,7 @@ function bubbleEvent(domNode, ev) {
179
141
  .map((c) => c?.target));
180
142
  targets.forEach((target) => {
181
143
  if (target)
182
- DC.trigger(target, ev);
144
+ target._mc.trigger(target, ev);
183
145
  });
184
146
  }
185
147
  }, 0);
@@ -211,13 +173,15 @@ function getMcChildNodes(domNode) {
211
173
  const id = Math.random().toString().replace('.', '');
212
174
  const selector = '[data-mc]:not([temp_id="' + id + '"] [data-mc] [data-mc])';
213
175
  domNode.setAttribute('temp_id', id);
214
- const myDomElements = domNode.querySelectorAll(selector);
176
+ const mcArray = [...domNode.querySelectorAll(selector)]
177
+ .filter((e) => !!e._mc)
178
+ .map(e => e._mc);
215
179
  domNode.removeAttribute('temp_id');
216
- return myDomElements;
180
+ return mcArray.length ? mcArray : null;
217
181
  }
218
182
  class McBase {
219
183
  _target;
220
- constructor(target, debug = false) {
184
+ constructor(target) {
221
185
  let element = this;
222
186
  this._target = new WeakRef(target || {});
223
187
  init(element);
@@ -231,9 +195,6 @@ class MC extends McBase {
231
195
  constructor(target) {
232
196
  super(target);
233
197
  }
234
- static trigger = trigger;
235
- trigger(ev, data = {}, bubble = 'l') {
236
- }
237
198
  }
238
199
  class DC extends McBase {
239
200
  constructor(target, debug = false) {
@@ -241,7 +202,6 @@ class DC extends McBase {
241
202
  }
242
203
  static add = add;
243
204
  static remove = remove;
244
- static trigger = trigger;
245
205
  off(eventName, handler) {
246
206
  off(this.target, eventName, handler);
247
207
  }
@@ -251,36 +211,40 @@ class DC extends McBase {
251
211
  one(eventName, handler) {
252
212
  one(this.target, eventName, handler);
253
213
  }
254
- trigger(ev, data = {}, bubble = 'l') {
255
- if (typeof ev === 'string') {
256
- }
214
+ trigger(eventName, data = {}, bubble = 'l') {
215
+ trigger(this.target, eventName, data, bubble);
257
216
  }
258
- parent(search = '') {
217
+ parent() {
259
218
  let target = this.target;
260
219
  if (!isDOM(target))
261
- return [];
262
- return traverseNodes(target.parentNode, search, true);
220
+ return null;
221
+ return target.closest('[data-mc]')?._mc || null;
263
222
  }
264
- ancestors(search = '') {
265
- let target = this?.target;
266
- if (!isDOM(target))
223
+ ancestors() {
224
+ let currentNode = this?.target, result = [];
225
+ if (!isDOM(currentNode))
267
226
  return [];
268
- return traverseNodes(this.target.parentNode, search, false);
227
+ while (currentNode = (currentNode.closest('[data-mc]'))) {
228
+ if (currentNode?._mc) {
229
+ result.push(currentNode?._mc);
230
+ }
231
+ }
232
+ return result.length ? result : null;
269
233
  }
270
- children(search = '') {
234
+ children() {
271
235
  let target = this?.target;
272
236
  if (!isDOM(target))
273
- return [];
274
- const myDomElements = getMcChildNodes(target);
275
- const mcValues = getMicroComponents([...myDomElements], search);
276
- return mcValues;
237
+ return null;
238
+ return getMcChildNodes(target);
277
239
  }
278
- descendants(search = '') {
279
- let target = this?.target;
240
+ descendants() {
241
+ const target = this?.target;
280
242
  if (!isDOM(target))
281
243
  return [];
282
- const myDomElements = target.querySelectorAll('*[data-mc]');
283
- return getMicroComponents([...myDomElements], search);
244
+ const mcArray = [...target.querySelectorAll('[data-mc]')]
245
+ .filter((e) => !!e._mc)
246
+ .map(e => e._mc);
247
+ return mcArray.length ? mcArray : null;
284
248
  }
285
249
  }
286
250
  const loadingDCs = new Set();
package/public/MC.ts CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
  import { LooseObject } from './helpers.js';
4
4
 
5
- var isBrowser = new Function(
5
+ const isBrowser = new Function(
6
6
  'try {return this===window;}catch(e){ return false;}'
7
7
  );
8
8
 
@@ -21,61 +21,17 @@ export interface HTMLMcElement extends HTMLElement {
21
21
  _mc: LooseObject;
22
22
  }
23
23
 
24
- // get all microcomponents from a list of HTMLElements
25
- function getMicroComponents(elements: any[], search: string): any[] {
26
- let mcValues: any[] = [];
27
-
28
- elements.forEach((e) => {
29
- if (e) {
30
- if (e instanceof HTMLElement) {
31
- const _mc = (e as any)?._mc;
32
- if (!search && _mc) {
33
- mcValues = mcValues.concat(Object.values((e as any)._mc));
34
- } else if (search && _mc && _mc[search]) {
35
- mcValues.push(_mc[search]);
36
- }
37
- }
38
- }
39
- });
40
- return mcValues;
41
- }
42
-
43
- // get all ancestor DOM nodes up to the document root
44
- function traverseNodes(
45
- node: { [key: string]: any },
46
- search: string,
47
- firstonly = true
48
- ): any[] {
49
- let mcValues: any[] = [];
50
- while (node) {
51
- if (node._mc) {
52
- if (!search) {
53
- mcValues = mcValues.concat(Object.values(node._mc));
54
- } else if (search && node._mc[search]) {
55
- mcValues.push(node._mc[search]);
56
- }
57
- if (firstonly) return mcValues;
58
- }
59
- node = node.parentNode;
60
- }
61
- return mcValues;
62
- }
63
-
64
24
  function isDOM(element: { [key: string]: any }) {
65
25
  return element && element instanceof HTMLElement;
66
26
  }
67
27
 
68
28
  // add a microcomponent to a target DOM node
69
- function add(target: HTMLElement, key: string, element = {}): any {
29
+ function add( target: HTMLElement, key: string, element: any = {} ): HTMLMcElement {
70
30
  let node = target as HTMLMcElement;
71
31
 
72
32
  // create the _mc property if necessary
73
33
  if (!node._mc) {
74
- let debug = (DC as any)?.debug;
75
- (DC as any).debug = false;
76
34
  node._mc = new (DC as any)(target);
77
- (DC as any).debug = debug;
78
- delete node._mc._mc; // NOT NEEDED on the top level _mc property of a DOM HTMLElement
79
35
  }
80
36
 
81
37
  const _mc = node._mc;
@@ -88,7 +44,8 @@ function add(target: HTMLElement, key: string, element = {}): any {
88
44
  target.setAttribute('data-mc', '');
89
45
  }
90
46
  }
91
- return element;
47
+
48
+ return node;
92
49
  }
93
50
 
94
51
  // remove a micro component from the DOM
@@ -114,27 +71,14 @@ function remove(target: HTMLMcElement, key: string) {
114
71
  }
115
72
 
116
73
  // run the "init" lifecycle event on the complete _mc structure
117
- function init(element: MC | DC) {
118
- if (element.constructor === DC) return;
119
-
74
+ function init(element: DC) {
120
75
  setTimeout(() => {
76
+ if (element.constructor === DC) return;
121
77
  element.trigger('Init');
122
- /*
123
- let keys = Object.keys( ( element as any)?._mc );
124
- if ( keys.length ){
125
- //console.log( 'inner Inits on [', mc.constructor.name, ']', keys );
126
- keys?.forEach( (key: string) => {
127
- let mc = ( element as any)?._mc?.[key];
128
- //console.log( key, typeof mc?.oneInit, mc );
129
- if ( ( mc as any )['oneInit'] && typeof ( mc as any ).oneInit == 'function' ){
130
- ( mc as any ).oneInit( new McEvent('Init') );
131
- }
132
- });
133
- };
134
- */
135
78
  }, 0);
136
79
  }
137
80
 
81
+ // 'eventName' => '_mcEventName'
138
82
  function getMcEventName( eventName: string ): string {
139
83
  return '_mc' + eventName[0].toUpperCase() + eventName.substring(1);
140
84
  }
@@ -156,8 +100,8 @@ function one( domNode: Node, eventName: string, handler: EventListenerOrEventLis
156
100
 
157
101
  // create and dispatch custom event
158
102
  function trigger(
159
- domNode: HTMLElement,
160
- event: CustomEvent | string,
103
+ domNode: HTMLElement,
104
+ event: CustomEvent | string,
161
105
  data: any = {},
162
106
  bubble: string = 'l'
163
107
  ){
@@ -199,7 +143,7 @@ function bubbleEvent( domNode: HTMLElement, ev: CustomEvent) {
199
143
  .map((c: unknown) => (c as any)?.target)
200
144
  );
201
145
  targets.forEach((target: HTMLMcElement) => {
202
- if (target) DC.trigger(target, ev);
146
+ if (target) target._mc.trigger(target, ev);
203
147
  });
204
148
  }
205
149
 
@@ -241,24 +185,27 @@ function autoAttachListeners(element: MC | DC) {
241
185
  }
242
186
  }
243
187
 
244
- function getMcChildNodes(domNode: HTMLElement): NodeListOf<Element> {
188
+ function getMcChildNodes(domNode: HTMLElement): DC[] | null {
245
189
  const id = Math.random().toString().replace('.', '');
246
190
  const selector = '[data-mc]:not([temp_id="' + id + '"] [data-mc] [data-mc])';
247
191
  domNode.setAttribute('temp_id', id);
248
- const myDomElements = domNode.querySelectorAll(selector);
192
+ const mcArray: unknown[] =
193
+ ( [ ...domNode.querySelectorAll(selector) ] as HTMLMcElement[])
194
+ .filter( (e) => !!e._mc )
195
+ .map( e => e._mc );
249
196
  domNode.removeAttribute('temp_id');
250
- return myDomElements;
197
+ return mcArray.length ? mcArray as DC[] : null;
251
198
  }
252
199
 
253
200
  class McBase {
254
201
  private _target: WeakRef<any>; // avoid circular reference
255
202
 
256
- constructor(target?: { [key: string]: any }, debug: boolean = false) {
203
+ constructor(target?: { [key: string]: any } ) {
257
204
  let element = this as unknown as MC | DC;
258
205
 
259
206
  this._target = new WeakRef(target || {});
260
207
 
261
- init(element); // async lifecycle event
208
+ init(element as DC); // async lifecycle event
262
209
 
263
210
  autoAttachListeners(element);
264
211
  }
@@ -273,12 +220,6 @@ class MC extends McBase {
273
220
  constructor(target?: any) {
274
221
  super(target);
275
222
  }
276
-
277
- static trigger = trigger;
278
-
279
- trigger(ev: string, data: any = {}, bubble: string = 'l') {
280
- // TBD
281
- }
282
223
  }
283
224
 
284
225
  class DC extends McBase {
@@ -288,8 +229,8 @@ class DC extends McBase {
288
229
 
289
230
  static add: Function = add;
290
231
  static remove: Function = remove;
291
- static trigger: Function = trigger;
292
232
 
233
+ /* event handling */
293
234
  off( eventName: string, handler: EventListenerOrEventListenerObject ) {
294
235
  off( this.target, eventName, handler );
295
236
  }
@@ -302,45 +243,57 @@ class DC extends McBase {
302
243
  one( this.target, eventName, handler );
303
244
  }
304
245
 
305
- trigger(ev: CustomEvent | string, data: any = {}, bubble: string = 'l') {
306
- if ( typeof ev === 'string' ){
307
-
308
- }
309
- //trigger( this.target, ev, data, bubble);
246
+ trigger( eventName: string, data: any = {}, bubble: string = 'l') {
247
+ trigger( this.target, eventName, data, bubble);
310
248
  }
311
249
 
312
- parent(search: string = ''): any[] {
313
- let target: HTMLElement = (this as any).target;
314
- if (!isDOM(target)) return [];
315
- return traverseNodes((target as any).parentNode, search, true);
250
+ /* DOM traversal */
251
+ parent(): DC | null {
252
+ let
253
+ target: HTMLElement = (this as DC).target;
254
+ if (!isDOM(target)) return null;
255
+ return (target.closest('[data-mc]') as HTMLMcElement)?._mc as DC || null;
316
256
  }
317
257
 
318
- ancestors(search: string = ''): any[] {
319
- let target: any = (this as any)?.target;
320
- if (!isDOM(target)) return [];
321
- return traverseNodes((this as any).target.parentNode, search, false);
258
+ ancestors(): DC[] | null {
259
+ let
260
+ currentNode: HTMLElement | null = (this as DC)?.target as HTMLMcElement,
261
+ result: DC[] = [];
262
+
263
+ if (!isDOM( currentNode )) return [];
264
+
265
+ while ( currentNode = (currentNode.closest('[data-mc]') ) ){
266
+ if ( (currentNode as HTMLMcElement)?._mc ){
267
+ result.push( (currentNode as HTMLMcElement)?._mc as DC );
268
+ }
269
+ }
270
+
271
+ return result.length ? result : null;
322
272
  }
323
273
 
324
- children(search: string = ''): any[] {
274
+ children(): DC[] | null {
325
275
  let target: any = (this as any)?.target;
326
- if (!isDOM(target)) return [];
327
- const myDomElements = getMcChildNodes(target);
328
- const mcValues = getMicroComponents([...myDomElements], search);
329
- return mcValues;
276
+ if (!isDOM(target)) return null;
277
+ return getMcChildNodes(target);
330
278
  }
331
279
 
332
- descendants(search: string = ''): any[] {
333
- let target: any = (this as any)?.target;
280
+ descendants(): DC[] | null {
281
+ const target: any = (this as DC)?.target;
334
282
  if (!isDOM(target)) return [];
335
- const myDomElements = target.querySelectorAll('*[data-mc]');
336
- return getMicroComponents([...myDomElements], search);
283
+ const mcArray: unknown[] =
284
+ ( [ ...target.querySelectorAll( '[data-mc]' ) ] as HTMLMcElement[])
285
+ .filter( (e) => !!e._mc )
286
+ .map( e => e._mc );
287
+ return mcArray.length ? mcArray as DC[] : null;
337
288
  }
338
289
  }
339
290
 
291
+ /*
292
+ Autoload Section...
293
+ */
294
+
340
295
  const loadingDCs = new Set<string>();
341
296
 
342
- // this only applies to DCs defined in the data-mc attribute,
343
- // since they need to be attached manually
344
297
  function attachDC(element: string): Function {
345
298
 
346
299
  //@ts-ignore