native-document 1.0.14 → 1.0.16

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 (39) hide show
  1. package/dist/native-document.dev.js +1262 -842
  2. package/dist/native-document.min.js +1 -1
  3. package/docs/anchor.md +216 -53
  4. package/docs/conditional-rendering.md +25 -24
  5. package/docs/core-concepts.md +20 -19
  6. package/docs/elements.md +21 -20
  7. package/docs/getting-started.md +28 -27
  8. package/docs/lifecycle-events.md +2 -2
  9. package/docs/list-rendering.md +607 -0
  10. package/docs/memory-management.md +1 -1
  11. package/docs/observables.md +15 -14
  12. package/docs/routing.md +22 -22
  13. package/docs/state-management.md +8 -8
  14. package/docs/validation.md +0 -2
  15. package/index.js +6 -1
  16. package/package.json +1 -1
  17. package/readme.md +5 -4
  18. package/src/data/MemoryManager.js +8 -20
  19. package/src/data/Observable.js +2 -180
  20. package/src/data/ObservableChecker.js +25 -24
  21. package/src/data/ObservableItem.js +158 -79
  22. package/src/data/observable-helpers/array.js +74 -0
  23. package/src/data/observable-helpers/batch.js +22 -0
  24. package/src/data/observable-helpers/computed.js +28 -0
  25. package/src/data/observable-helpers/object.js +111 -0
  26. package/src/elements/anchor.js +54 -9
  27. package/src/elements/control/for-each-array.js +280 -0
  28. package/src/elements/control/for-each.js +87 -110
  29. package/src/elements/form.js +1 -1
  30. package/src/elements/index.js +1 -0
  31. package/src/elements/list.js +4 -0
  32. package/src/router/link.js +2 -2
  33. package/src/utils/helpers.js +44 -21
  34. package/src/wrappers/AttributesWrapper.js +5 -18
  35. package/src/wrappers/DocumentObserver.js +58 -29
  36. package/src/wrappers/ElementCreator.js +114 -0
  37. package/src/wrappers/HtmlElementEventsWrapper.js +52 -65
  38. package/src/wrappers/HtmlElementWrapper.js +11 -167
  39. package/src/wrappers/NdPrototype.js +106 -0
@@ -0,0 +1,106 @@
1
+ import DocumentObserver from "./DocumentObserver";
2
+
3
+ Object.defineProperty(HTMLElement.prototype, 'nd', {
4
+ get() {
5
+ if(this.$ndProx) {
6
+ return this.$ndProx;
7
+ }
8
+ let element = this;
9
+ let lifecycle = null;
10
+
11
+ this.$ndProx = new Proxy({}, {
12
+ get(target, property) {
13
+ if(/^on[A-Z]/.test(property)) {
14
+ const event = property.replace(/^on/, '').toLowerCase();
15
+ const shouldPrevent = event.toLowerCase().startsWith('prevent');
16
+ let eventName = event.replace(/^prevent/i, '');
17
+ const shouldStop = event.toLowerCase().startsWith('stop');
18
+ eventName = eventName.replace(/^stop/i, '');
19
+
20
+ return function(callback) {
21
+ if(shouldPrevent && !shouldStop) {
22
+ element.addEventListener(eventName, function(event) {
23
+ event.preventDefault();
24
+ callback(event);
25
+ });
26
+ return element;
27
+ }
28
+ if(!shouldPrevent && shouldStop) {
29
+ element.addEventListener(eventName, function(event) {
30
+ event.stopPropagation();
31
+ callback(event);
32
+ });
33
+ return element;
34
+ }
35
+ if(shouldPrevent && shouldStop) {
36
+ element.addEventListener(eventName, function(event) {
37
+ event.preventDefault();
38
+ event.stopPropagation();
39
+ callback(event);
40
+ });
41
+ return element;
42
+ }
43
+ element.addEventListener(eventName, callback);
44
+ return element;
45
+ };
46
+ return fn;
47
+ }
48
+ if(property === 'ref') {
49
+ return function(target, name) {
50
+ target[name] = element;
51
+ return element;
52
+ };
53
+ }
54
+ if(property === 'unmountChildren') {
55
+ return () => {
56
+ for(let i = 0, length = element.children.length; i < length; i++) {
57
+ let elementchildren = element.children[i];
58
+ if(!elementchildren.$ndProx) {
59
+ elementchildren.nd?.remove();
60
+ }
61
+ elementchildren = null;
62
+ }
63
+ };
64
+ }
65
+ if(property === 'remove') {
66
+ return function() {
67
+ element.nd.unmountChildren();
68
+ lifecycle = null;
69
+ element.$ndProx = null;
70
+ delete element.nd?.on?.prevent;
71
+ delete element.nd?.on;
72
+ delete element.nd;
73
+ };
74
+ }
75
+ if(property === 'hasLifecycle') {
76
+ return lifecycle !== null;
77
+ }
78
+ if(property === 'lifecycle') {
79
+ if(lifecycle) {
80
+ return lifecycle;
81
+ }
82
+ let $observer = null;
83
+ lifecycle = function(states) {
84
+ $observer = $observer || DocumentObserver.watch(element);
85
+
86
+ states.mounted && $observer.mounted(states.mounted);
87
+ states.unmounted && $observer.unmounted(states.unmounted);
88
+ return element;
89
+ };
90
+ return lifecycle;
91
+ }
92
+ if(property === 'mounted' || property === 'unmounted') {
93
+ return function(callback) {
94
+ element.nd.lifecycle({ [property]: callback});
95
+ return element;
96
+ };
97
+ }
98
+ },
99
+ set(target, p, newValue, receiver) {
100
+
101
+ },
102
+ configurable: true
103
+ });
104
+ return this.$ndProx;
105
+ }
106
+ });