native-document 1.0.34 → 1.0.36

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.
@@ -5,17 +5,16 @@ const cloneBindingsDataCache = new WeakMap();
5
5
 
6
6
 
7
7
  const bindAttributes = (node, bindDingData, data) => {
8
- if(!bindDingData) {
9
- return null;
10
- }
11
- const attributes = { };
8
+ let attributes = null;
12
9
  if(bindDingData.attributes) {
10
+ attributes = attributes || {};
13
11
  for (const attr in bindDingData.attributes) {
14
12
  attributes[attr] = bindDingData.attributes[attr](...data);
15
13
  }
16
14
  }
17
15
 
18
16
  if(bindDingData.classes) {
17
+ attributes = attributes || {};
19
18
  attributes.class = {};
20
19
  for (const className in bindDingData.classes) {
21
20
  attributes.class[className] = bindDingData.classes[className](...data);
@@ -23,49 +22,48 @@ const bindAttributes = (node, bindDingData, data) => {
23
22
  }
24
23
 
25
24
  if(bindDingData.styles) {
25
+ attributes = attributes || {};
26
26
  attributes.style = {};
27
27
  for (const property in bindDingData.styles) {
28
28
  attributes.style[property] = bindDingData.styles[property](...data);
29
29
  }
30
30
  }
31
31
 
32
- if(Object.keys(attributes)) {
32
+ if(attributes) {
33
33
  ElementCreator.processAttributes(node, attributes);
34
- return attributes;
34
+ return true;
35
35
  }
36
36
 
37
37
  return null;
38
38
  };
39
39
 
40
40
 
41
- const bindAttachesMethods = function(node, bindDingData, data) {
42
- if(!bindDingData?.attaches) {
41
+ const bindAttachMethods = function(node, bindDingData, data) {
42
+ if(!bindDingData.attach) {
43
43
  return null;
44
44
  }
45
- for(const methodName in bindDingData.attaches) {
46
- node.nd[methodName](function(...args) {
47
- bindDingData.attaches[methodName].call(this, ...[...args, ...data]);
48
- });
49
- }
50
- }
45
+ bindDingData.attach(node, ...data);
46
+ };
51
47
 
52
48
  export function TemplateCloner($fn) {
53
49
  let $node = null;
54
50
 
55
51
  const clone = (node, data) => {
56
52
  const bindDingData = cloneBindingsDataCache.get(node);
57
- if(node instanceof Text) {
58
- if(bindDingData?.value) {
53
+ if(node.nodeType === 3) {
54
+ if(bindDingData && bindDingData.value) {
59
55
  return bindDingData.value(data);
60
56
  }
61
57
  return node.cloneNode(true);
62
58
  }
63
59
  const nodeCloned = node.cloneNode();
64
- bindAttributes(nodeCloned, bindDingData, data);
65
- bindAttachesMethods(nodeCloned, bindDingData, data);
66
-
67
- for(let i = 0, length = node.childNodes.length; i < length; i++) {
68
- const childNode = node.childNodes[i];
60
+ if(bindDingData) {
61
+ bindAttributes(nodeCloned, bindDingData, data);
62
+ bindAttachMethods(nodeCloned, bindDingData, data);
63
+ }
64
+ const childNodes = node.childNodes;
65
+ for(let i = 0, length = childNodes.length; i < length; i++) {
66
+ const childNode = childNodes[i];
69
67
  const childNodeCloned = clone(childNode, data);
70
68
  nodeCloned.appendChild(childNodeCloned);
71
69
  }
@@ -79,21 +77,27 @@ export function TemplateCloner($fn) {
79
77
  return clone($node, data);
80
78
  };
81
79
 
80
+ const $hydrateFn = function(hydrateFunction, target, element, property) {
81
+ if(!cloneBindingsDataCache.has(element)) {
82
+ // { classes, styles, attributes, value, attach }
83
+ cloneBindingsDataCache.set(element, {});
84
+ }
85
+ const hydrationState = cloneBindingsDataCache.get(element);
86
+ if(target === 'value') {
87
+ hydrationState.value = hydrateFunction;
88
+ return;
89
+ }
90
+ if(target === 'attach') {
91
+ hydrationState.attach = hydrateFunction;
92
+ return;
93
+ }
94
+ hydrationState[target] = hydrationState[target] || {};
95
+ hydrationState[target][property] = hydrateFunction;
96
+ }
97
+
82
98
  const createBinding = (hydrateFunction, target) => {
83
99
  return {
84
- $hydrate : function(element, property) {
85
- if(!cloneBindingsDataCache.has(element)) {
86
- // { classes, styles, attributes, value, attaches }
87
- cloneBindingsDataCache.set(element, {});
88
- }
89
- const hydrationState = cloneBindingsDataCache.get(element);
90
- if(target === 'value') {
91
- hydrationState.value = hydrateFunction;
92
- return;
93
- }
94
- hydrationState[target] = hydrationState[target] || {};
95
- hydrationState[target][property] = hydrateFunction;
96
- }
100
+ $hydrate : (element, property) => $hydrateFn(hydrateFunction, target, element, property),
97
101
  }
98
102
  };
99
103
 
@@ -103,27 +107,44 @@ export function TemplateCloner($fn) {
103
107
  this.class = (fn) => {
104
108
  return createBinding(fn, 'classes');
105
109
  };
106
- this.value = (fn) => {
110
+ this.property = (propertyName) => {
111
+ return this.value(propertyName);
112
+ }
113
+ this.value = (callbackOrProperty) => {
114
+ if(typeof callbackOrProperty !== 'function') {
115
+ return createBinding(function(data) {
116
+ const firstArgument = data[0];
117
+ return createTextNode(firstArgument[callbackOrProperty]);
118
+ }, 'value');
119
+ }
107
120
  return createBinding(function(data) {
108
- return createTextNode(fn(...data));
121
+ return createTextNode(callbackOrProperty(...data));
109
122
  }, 'value');
110
123
  };
111
124
  this.attr = (fn) => {
112
125
  return createBinding(fn, 'attributes');
113
126
  };
114
127
  this.attach = (fn) => {
115
- return createBinding(fn, 'attaches');
128
+ return createBinding(fn, 'attach');
116
129
  };
117
130
  }
118
131
 
119
132
  export function useCache(fn) {
120
133
  let $cache = null;
121
134
 
122
- return function(...args) {
135
+ const wrapper = function(args) {
123
136
  if(!$cache) {
124
137
  $cache = new TemplateCloner(fn);
125
138
  }
126
-
127
139
  return $cache.clone(args);
128
140
  };
141
+
142
+ if(fn.length < 2) {
143
+ return function(...args) {
144
+ return wrapper(args);
145
+ };
146
+ }
147
+ return function(_, __, ...args) {
148
+ return wrapper([_, __, ...args]);
149
+ };
129
150
  }
@@ -30,14 +30,15 @@ export interface WhenFunction {
30
30
  export interface ForEachFunction {
31
31
  <T>(data: T[] | Record<string, T> | ObservableItem<T[]> | ObservableItem<Record<string, T>>,
32
32
  callback: (item: T, index?: ObservableItem<number>) => ValidChild,
33
- key?: string | ((item: T, defaultKey: string | number) => string)): DocumentFragment;
33
+ key?: string | ((item: T, defaultKey: string | number) => string),
34
+ configs?: { shouldKeepItemsInCache: boolean, isParentUniqueChild: boolean }): DocumentFragment,
34
35
  }
35
36
 
36
37
  export interface ForEachArrayFunction {
37
38
  <T>(data: ObservableArray<T>,
38
39
  callback: (item: T, index?: ObservableItem<number>) => ValidChild,
39
40
  key?: string | ((item: T, defaultKey: number) => string),
40
- configs?: { pushDelay?: (items: T[]) => number }): DocumentFragment;
41
+ configs?: { pushDelay?: (items: T[]) => number, isParentUniqueChild: boolean }): DocumentFragment;
41
42
  }
42
43
 
43
44
  // Control Flow Components
@@ -412,6 +412,204 @@ export interface NDElement {
412
412
  onPreventStopCopy(callback: (event: ClipboardEvent) => void): this;
413
413
  onPreventStopCut(callback: (event: ClipboardEvent) => void): this;
414
414
  onPreventStopPaste(callback: (event: ClipboardEvent) => void): this;
415
+
416
+ // DELEGATION METHODS - WHEN (for children)
417
+
418
+ // When versions for Mouse Events
419
+ whenClick(callback: (event: MouseEvent) => void): this;
420
+ whenDblClick(callback: (event: MouseEvent) => void): this;
421
+ whenMouseDown(callback: (event: MouseEvent) => void): this;
422
+ whenMouseEnter(callback: (event: MouseEvent) => void): this;
423
+ whenMouseLeave(callback: (event: MouseEvent) => void): this;
424
+ whenMouseMove(callback: (event: MouseEvent) => void): this;
425
+ whenMouseOut(callback: (event: MouseEvent) => void): this;
426
+ whenMouseOver(callback: (event: MouseEvent) => void): this;
427
+ whenMouseUp(callback: (event: MouseEvent) => void): this;
428
+ whenWheel(callback: (event: WheelEvent) => void): this;
429
+ whenContextMenu(callback: (event: MouseEvent) => void): this;
430
+
431
+ // When versions for Keyboard Events
432
+ whenKeyDown(callback: (event: KeyboardEvent) => void): this;
433
+ whenKeyPress(callback: (event: KeyboardEvent) => void): this;
434
+ whenKeyUp(callback: (event: KeyboardEvent) => void): this;
435
+
436
+ // When versions for Form Events
437
+ whenBlur(callback: (event: FocusEvent) => void): this;
438
+ whenChange(callback: (event: Event) => void): this;
439
+ whenFocus(callback: (event: FocusEvent) => void): this;
440
+ whenFocusIn(callback: (event: FocusEvent) => void): this;
441
+ whenFocusOut(callback: (event: FocusEvent) => void): this;
442
+ whenInput(callback: (event: Event) => void): this;
443
+ whenInvalid(callback: (event: Event) => void): this;
444
+ whenReset(callback: (event: Event) => void): this;
445
+ whenSearch(callback: (event: Event) => void): this;
446
+ whenSelect(callback: (event: Event) => void): this;
447
+ whenSubmit(callback: (event: Event) => void): this;
448
+
449
+ // When versions for Drag Events
450
+ whenDrag(callback: (event: DragEvent) => void): this;
451
+ whenDragEnd(callback: (event: DragEvent) => void): this;
452
+ whenDragEnter(callback: (event: DragEvent) => void): this;
453
+ whenDragLeave(callback: (event: DragEvent) => void): this;
454
+ whenDragOver(callback: (event: DragEvent) => void): this;
455
+ whenDragStart(callback: (event: DragEvent) => void): this;
456
+ whenDrop(callback: (event: DragEvent) => void): this;
457
+
458
+ // When versions for Window/Page Events
459
+ whenAfterPrint(callback: (event: Event) => void): this;
460
+ whenBeforePrint(callback: (event: Event) => void): this;
461
+ whenBeforeUnload(callback: (event: BeforeUnloadEvent) => void): this;
462
+ whenError(callback: (event: Event) => void): this;
463
+ whenHashChange(callback: (event: HashChangeEvent) => void): this;
464
+ whenLoad(callback: (event: Event) => void): this;
465
+ whenOffline(callback: (event: Event) => void): this;
466
+ whenOnline(callback: (event: Event) => void): this;
467
+ whenPageHide(callback: (event: PageTransitionEvent) => void): this;
468
+ whenPageShow(callback: (event: PageTransitionEvent) => void): this;
469
+ whenResize(callback: (event: UIEvent) => void): this;
470
+ whenScroll(callback: (event: Event) => void): this;
471
+ whenUnload(callback: (event: Event) => void): this;
472
+
473
+ // When versions for Media Events
474
+ whenAbort(callback: (event: Event) => void): this;
475
+ whenCanPlay(callback: (event: Event) => void): this;
476
+ whenCanPlayThrough(callback: (event: Event) => void): this;
477
+ whenDurationChange(callback: (event: Event) => void): this;
478
+ whenEmptied(callback: (event: Event) => void): this;
479
+ whenEnded(callback: (event: Event) => void): this;
480
+ whenLoadedData(callback: (event: Event) => void): this;
481
+ whenLoadedMetadata(callback: (event: Event) => void): this;
482
+ whenLoadStart(callback: (event: Event) => void): this;
483
+ whenPause(callback: (event: Event) => void): this;
484
+ whenPlay(callback: (event: Event) => void): this;
485
+ whenPlaying(callback: (event: Event) => void): this;
486
+ whenProgress(callback: (event: ProgressEvent) => void): this;
487
+ whenRateChange(callback: (event: Event) => void): this;
488
+ whenSeeked(callback: (event: Event) => void): this;
489
+ whenSeeking(callback: (event: Event) => void): this;
490
+ whenStalled(callback: (event: Event) => void): this;
491
+ whenSuspend(callback: (event: Event) => void): this;
492
+ whenTimeUpdate(callback: (event: Event) => void): this;
493
+ whenVolumeChange(callback: (event: Event) => void): this;
494
+ whenWaiting(callback: (event: Event) => void): this;
495
+
496
+ // When versions for Touch Events
497
+ whenTouchCancel(callback: (event: TouchEvent) => void): this;
498
+ whenTouchEnd(callback: (event: TouchEvent) => void): this;
499
+ whenTouchMove(callback: (event: TouchEvent) => void): this;
500
+ whenTouchStart(callback: (event: TouchEvent) => void): this;
501
+
502
+ // When versions for Animation Events
503
+ whenAnimationEnd(callback: (event: AnimationEvent) => void): this;
504
+ whenAnimationIteration(callback: (event: AnimationEvent) => void): this;
505
+ whenAnimationStart(callback: (event: AnimationEvent) => void): this;
506
+
507
+ // When versions for Transition Events
508
+ whenTransitionEnd(callback: (event: TransitionEvent) => void): this;
509
+
510
+ // When versions for Clipboard Events
511
+ whenCopy(callback: (event: ClipboardEvent) => void): this;
512
+ whenCut(callback: (event: ClipboardEvent) => void): this;
513
+ whenPaste(callback: (event: ClipboardEvent) => void): this;
514
+
515
+ // CAPTURE METHODS (for parents)
516
+
517
+ // Capture versions for Mouse Events
518
+ captureClick(directHandler?: (event: MouseEvent) => void): this;
519
+ captureDblClick(directHandler?: (event: MouseEvent) => void): this;
520
+ captureMouseDown(directHandler?: (event: MouseEvent) => void): this;
521
+ captureMouseEnter(directHandler?: (event: MouseEvent) => void): this;
522
+ captureMouseLeave(directHandler?: (event: MouseEvent) => void): this;
523
+ captureMouseMove(directHandler?: (event: MouseEvent) => void): this;
524
+ captureMouseOut(directHandler?: (event: MouseEvent) => void): this;
525
+ captureMouseOver(directHandler?: (event: MouseEvent) => void): this;
526
+ captureMouseUp(directHandler?: (event: MouseEvent) => void): this;
527
+ captureWheel(directHandler?: (event: WheelEvent) => void): this;
528
+ captureContextMenu(directHandler?: (event: MouseEvent) => void): this;
529
+
530
+ // Capture versions for Keyboard Events
531
+ captureKeyDown(directHandler?: (event: KeyboardEvent) => void): this;
532
+ captureKeyPress(directHandler?: (event: KeyboardEvent) => void): this;
533
+ captureKeyUp(directHandler?: (event: KeyboardEvent) => void): this;
534
+
535
+ // Capture versions for Form Events
536
+ captureBlur(directHandler?: (event: FocusEvent) => void): this;
537
+ captureChange(directHandler?: (event: Event) => void): this;
538
+ captureFocus(directHandler?: (event: FocusEvent) => void): this;
539
+ captureFocusIn(directHandler?: (event: FocusEvent) => void): this;
540
+ captureFocusOut(directHandler?: (event: FocusEvent) => void): this;
541
+ captureInput(directHandler?: (event: Event) => void): this;
542
+ captureInvalid(directHandler?: (event: Event) => void): this;
543
+ captureReset(directHandler?: (event: Event) => void): this;
544
+ captureSearch(directHandler?: (event: Event) => void): this;
545
+ captureSelect(directHandler?: (event: Event) => void): this;
546
+ captureSubmit(directHandler?: (event: Event) => void): this;
547
+
548
+ // Capture versions for Drag Events
549
+ captureDrag(directHandler?: (event: DragEvent) => void): this;
550
+ captureDragEnd(directHandler?: (event: DragEvent) => void): this;
551
+ captureDragEnter(directHandler?: (event: DragEvent) => void): this;
552
+ captureDragLeave(directHandler?: (event: DragEvent) => void): this;
553
+ captureDragOver(directHandler?: (event: DragEvent) => void): this;
554
+ captureDragStart(directHandler?: (event: DragEvent) => void): this;
555
+ captureDrop(directHandler?: (event: DragEvent) => void): this;
556
+
557
+ // Capture versions for Window/Page Events
558
+ captureAfterPrint(directHandler?: (event: Event) => void): this;
559
+ captureBeforePrint(directHandler?: (event: Event) => void): this;
560
+ captureBeforeUnload(directHandler?: (event: BeforeUnloadEvent) => void): this;
561
+ captureError(directHandler?: (event: Event) => void): this;
562
+ captureHashChange(directHandler?: (event: HashChangeEvent) => void): this;
563
+ captureLoad(directHandler?: (event: Event) => void): this;
564
+ captureOffline(directHandler?: (event: Event) => void): this;
565
+ captureOnline(directHandler?: (event: Event) => void): this;
566
+ capturePageHide(directHandler?: (event: PageTransitionEvent) => void): this;
567
+ capturePageShow(directHandler?: (event: PageTransitionEvent) => void): this;
568
+ captureResize(directHandler?: (event: UIEvent) => void): this;
569
+ captureScroll(directHandler?: (event: Event) => void): this;
570
+ captureUnload(directHandler?: (event: Event) => void): this;
571
+
572
+ // Capture versions for Media Events
573
+ captureAbort(directHandler?: (event: Event) => void): this;
574
+ captureCanPlay(directHandler?: (event: Event) => void): this;
575
+ captureCanPlayThrough(directHandler?: (event: Event) => void): this;
576
+ captureDurationChange(directHandler?: (event: Event) => void): this;
577
+ captureEmptied(directHandler?: (event: Event) => void): this;
578
+ captureEnded(directHandler?: (event: Event) => void): this;
579
+ captureLoadedData(directHandler?: (event: Event) => void): this;
580
+ captureLoadedMetadata(directHandler?: (event: Event) => void): this;
581
+ captureLoadStart(directHandler?: (event: Event) => void): this;
582
+ capturePause(directHandler?: (event: Event) => void): this;
583
+ capturePlay(directHandler?: (event: Event) => void): this;
584
+ capturePlaying(directHandler?: (event: Event) => void): this;
585
+ captureProgress(directHandler?: (event: ProgressEvent) => void): this;
586
+ captureRateChange(directHandler?: (event: Event) => void): this;
587
+ captureSeeked(directHandler?: (event: Event) => void): this;
588
+ captureSeeking(directHandler?: (event: Event) => void): this;
589
+ captureStalled(directHandler?: (event: Event) => void): this;
590
+ captureSuspend(directHandler?: (event: Event) => void): this;
591
+ captureTimeUpdate(directHandler?: (event: Event) => void): this;
592
+ captureVolumeChange(directHandler?: (event: Event) => void): this;
593
+ captureWaiting(directHandler?: (event: Event) => void): this;
594
+
595
+ // Capture versions for Touch Events
596
+ captureTouchCancel(directHandler?: (event: TouchEvent) => void): this;
597
+ captureTouchEnd(directHandler?: (event: TouchEvent) => void): this;
598
+ captureTouchMove(directHandler?: (event: TouchEvent) => void): this;
599
+ captureTouchStart(directHandler?: (event: TouchEvent) => void): this;
600
+
601
+ // Capture versions for Animation Events
602
+ captureAnimationEnd(directHandler?: (event: AnimationEvent) => void): this;
603
+ captureAnimationIteration(directHandler?: (event: AnimationEvent) => void): this;
604
+ captureAnimationStart(directHandler?: (event: AnimationEvent) => void): this;
605
+
606
+ // Capture versions for Transition Events
607
+ captureTransitionEnd(directHandler?: (event: TransitionEvent) => void): this;
608
+
609
+ // Capture versions for Clipboard Events
610
+ captureCopy(directHandler?: (event: ClipboardEvent) => void): this;
611
+ captureCut(directHandler?: (event: ClipboardEvent) => void): this;
612
+ capturePaste(directHandler?: (event: ClipboardEvent) => void): this;
415
613
  }
416
614
 
417
615
  export type ValidChild =
@@ -424,7 +622,9 @@ export type ValidChild =
424
622
  | Text
425
623
  | ObservableItem
426
624
  | NDElement
427
- | ValidChild[];
625
+ | BindingHydrator
626
+ | ValidChild[]
627
+ | ((...args: any[]) => ValidChild);
428
628
 
429
629
  export type Attributes = Record<string, any> & {
430
630
  class?: string | Record<string, boolean | ObservableItem<boolean>>;
@@ -81,6 +81,7 @@ export interface BatchFunction<TArgs extends any[] = any[], TReturn = any> {
81
81
  readonly $observer: ObservableItem<number>;
82
82
  }
83
83
 
84
+ export type ValidComputedDependencies = Array<ObservableItem | ObservableArray<any> | ObservableChecker | ObservableProxy<any>>;
84
85
  export interface ObservableStatic {
85
86
  <T>(value: T): ObservableItem<T>;
86
87
  array<T>(target: T[]): ObservableArray<T>;
@@ -88,7 +89,7 @@ export interface ObservableStatic {
88
89
  object<T extends Record<string, any>>(value: T): ObservableProxy<T>;
89
90
  json<T extends Record<string, any>>(value: T): ObservableProxy<T>;
90
91
 
91
- computed<T>(callback: () => T, dependencies?: ObservableItem[]): ObservableItem<T>;
92
+ computed<T>(callback: () => T, dependencies?: ValidComputedDependencies): ObservableItem<T>;
92
93
  computed<T>(callback: () => T, batchFunction?: BatchFunction): ObservableItem<T>;
93
94
 
94
95
  batch(callback: Function): BatchFunction;
@@ -1,64 +0,0 @@
1
-
2
-
3
- /**
4
- *
5
- * @param {HTMLElement} element
6
- * @returns {HTMLElement}
7
- */
8
- function HtmlElementPreventEventsWrapper(element) {
9
- const events = {};
10
- return new Proxy(events, {
11
- get(target, property) {
12
- if(events[property]) {
13
- return events[property];
14
- }
15
- events[property] = function(callback) {
16
- element.addEventListener(property.toLowerCase(), function(event) {
17
- event.preventDefault();
18
- callback.apply(this, [event]);
19
- });
20
- return element
21
- };
22
- return events[property];
23
- },
24
- set(target, property, newValue, receiver) {
25
- //...
26
- this.get(target, property)(newValue);
27
- return element;
28
- }
29
- });
30
- }
31
-
32
- /**
33
- *
34
- * @param {HTMLElement} element
35
- * @returns {HTMLElement}
36
- */
37
- export default function HtmlElementEventsWrapper(element) {
38
- const events = {};
39
- return new Proxy(events, {
40
- get(target, property) {
41
- if(events[property]) {
42
- return events[property];
43
- }
44
- if(property === 'prevent') {
45
- events[property] = HtmlElementPreventEventsWrapper(element);
46
- return events[property];
47
- }
48
- if(property === 'removeAll') {
49
-
50
- return;
51
- }
52
- events[property] = function(callback) {
53
- element.addEventListener(property.toLowerCase(), callback);
54
- return element
55
- };
56
- return events[property];
57
- },
58
- set(target, property, newValue, receiver) {
59
- //...
60
- this.get(target, property)(newValue);
61
- return element;
62
- }
63
- });
64
- }