native-document 1.0.35 → 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.
@@ -1,22 +1,20 @@
1
1
  import {ElementCreator} from "./ElementCreator";
2
2
  import {createTextNode} from "./HtmlElementWrapper";
3
- import PluginsManager from "../utils/plugins-manager";
4
3
 
5
4
  const cloneBindingsDataCache = new WeakMap();
6
5
 
7
6
 
8
7
  const bindAttributes = (node, bindDingData, data) => {
9
- if(!bindDingData) {
10
- return null;
11
- }
12
- const attributes = { };
8
+ let attributes = null;
13
9
  if(bindDingData.attributes) {
10
+ attributes = attributes || {};
14
11
  for (const attr in bindDingData.attributes) {
15
12
  attributes[attr] = bindDingData.attributes[attr](...data);
16
13
  }
17
14
  }
18
15
 
19
16
  if(bindDingData.classes) {
17
+ attributes = attributes || {};
20
18
  attributes.class = {};
21
19
  for (const className in bindDingData.classes) {
22
20
  attributes.class[className] = bindDingData.classes[className](...data);
@@ -24,49 +22,48 @@ const bindAttributes = (node, bindDingData, data) => {
24
22
  }
25
23
 
26
24
  if(bindDingData.styles) {
25
+ attributes = attributes || {};
27
26
  attributes.style = {};
28
27
  for (const property in bindDingData.styles) {
29
28
  attributes.style[property] = bindDingData.styles[property](...data);
30
29
  }
31
30
  }
32
31
 
33
- if(Object.keys(attributes)) {
32
+ if(attributes) {
34
33
  ElementCreator.processAttributes(node, attributes);
35
- return attributes;
34
+ return true;
36
35
  }
37
36
 
38
37
  return null;
39
38
  };
40
39
 
41
40
 
42
- const bindAttachesMethods = function(node, bindDingData, data) {
43
- if(!bindDingData?.attaches) {
41
+ const bindAttachMethods = function(node, bindDingData, data) {
42
+ if(!bindDingData.attach) {
44
43
  return null;
45
44
  }
46
- for(const methodName in bindDingData.attaches) {
47
- node.nd[methodName](function(...args) {
48
- bindDingData.attaches[methodName].call(this, ...[...args, ...data]);
49
- });
50
- }
51
- }
45
+ bindDingData.attach(node, ...data);
46
+ };
52
47
 
53
48
  export function TemplateCloner($fn) {
54
49
  let $node = null;
55
50
 
56
51
  const clone = (node, data) => {
57
52
  const bindDingData = cloneBindingsDataCache.get(node);
58
- if(node instanceof Text) {
59
- if(bindDingData?.value) {
53
+ if(node.nodeType === 3) {
54
+ if(bindDingData && bindDingData.value) {
60
55
  return bindDingData.value(data);
61
56
  }
62
57
  return node.cloneNode(true);
63
58
  }
64
59
  const nodeCloned = node.cloneNode();
65
- bindAttributes(nodeCloned, bindDingData, data);
66
- bindAttachesMethods(nodeCloned, bindDingData, data);
67
-
68
- for(let i = 0, length = node.childNodes.length; i < length; i++) {
69
- 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];
70
67
  const childNodeCloned = clone(childNode, data);
71
68
  nodeCloned.appendChild(childNodeCloned);
72
69
  }
@@ -77,26 +74,30 @@ export function TemplateCloner($fn) {
77
74
  if(!$node) {
78
75
  $node = $fn(this);
79
76
  }
80
- const cloneNode = clone($node, data);
81
- PluginsManager.emit('NodeTemplateInstanceCreated', cloneNode);
82
- return cloneNode;
77
+ return clone($node, data);
83
78
  };
84
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
+
85
98
  const createBinding = (hydrateFunction, target) => {
86
99
  return {
87
- $hydrate : function(element, property) {
88
- if(!cloneBindingsDataCache.has(element)) {
89
- // { classes, styles, attributes, value, attaches }
90
- cloneBindingsDataCache.set(element, {});
91
- }
92
- const hydrationState = cloneBindingsDataCache.get(element);
93
- if(target === 'value') {
94
- hydrationState.value = hydrateFunction;
95
- return;
96
- }
97
- hydrationState[target] = hydrationState[target] || {};
98
- hydrationState[target][property] = hydrateFunction;
99
- }
100
+ $hydrate : (element, property) => $hydrateFn(hydrateFunction, target, element, property),
100
101
  }
101
102
  };
102
103
 
@@ -106,29 +107,44 @@ export function TemplateCloner($fn) {
106
107
  this.class = (fn) => {
107
108
  return createBinding(fn, 'classes');
108
109
  };
109
- 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
+ }
110
120
  return createBinding(function(data) {
111
- return createTextNode(fn(...data));
121
+ return createTextNode(callbackOrProperty(...data));
112
122
  }, 'value');
113
123
  };
114
124
  this.attr = (fn) => {
115
125
  return createBinding(fn, 'attributes');
116
126
  };
117
127
  this.attach = (fn) => {
118
- return createBinding(fn, 'attaches');
128
+ return createBinding(fn, 'attach');
119
129
  };
120
130
  }
121
131
 
122
132
  export function useCache(fn) {
123
133
  let $cache = null;
124
- PluginsManager.emit('NodeTemplateStored', fn);
125
134
 
126
- return function(...args) {
135
+ const wrapper = function(args) {
127
136
  if(!$cache) {
128
137
  $cache = new TemplateCloner(fn);
129
- PluginsManager.emit('NodeTemplateCreated', $cache);
130
138
  }
131
-
132
139
  return $cache.clone(args);
133
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
+ };
134
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
- }