native-document 1.0.0

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 (47) hide show
  1. package/dist/native-document.dev.js +2346 -0
  2. package/dist/native-document.min.js +1 -0
  3. package/elements.js +2 -0
  4. package/index.js +11 -0
  5. package/package.json +16 -0
  6. package/readme.md +495 -0
  7. package/rollup.config.js +29 -0
  8. package/router.js +9 -0
  9. package/src/data/MemoryManager.js +60 -0
  10. package/src/data/Observable.js +162 -0
  11. package/src/data/ObservableChecker.js +24 -0
  12. package/src/data/ObservableItem.js +101 -0
  13. package/src/data/Store.js +74 -0
  14. package/src/elements/content-formatter.js +32 -0
  15. package/src/elements/control/for-each.js +110 -0
  16. package/src/elements/control/show-if.js +86 -0
  17. package/src/elements/control/switch.js +88 -0
  18. package/src/elements/description-list.js +5 -0
  19. package/src/elements/form.js +71 -0
  20. package/src/elements/html5-semantics.js +12 -0
  21. package/src/elements/img.js +45 -0
  22. package/src/elements/index.js +21 -0
  23. package/src/elements/interactive.js +7 -0
  24. package/src/elements/list.js +6 -0
  25. package/src/elements/medias.js +8 -0
  26. package/src/elements/meta-data.js +9 -0
  27. package/src/elements/table.js +14 -0
  28. package/src/errors/ArgTypesError.js +7 -0
  29. package/src/errors/NativeDocumentError.js +8 -0
  30. package/src/errors/RouterError.js +9 -0
  31. package/src/router/Route.js +102 -0
  32. package/src/router/RouteGroupHelper.js +52 -0
  33. package/src/router/Router.js +232 -0
  34. package/src/router/RouterComponent.js +37 -0
  35. package/src/router/link.js +27 -0
  36. package/src/router/modes/HashRouter.js +83 -0
  37. package/src/router/modes/HistoryRouter.js +66 -0
  38. package/src/router/modes/MemoryRouter.js +71 -0
  39. package/src/utils/args-types.js +100 -0
  40. package/src/utils/debug-manager.js +34 -0
  41. package/src/utils/helpers.js +37 -0
  42. package/src/utils/prototypes.js +16 -0
  43. package/src/utils/validator.js +96 -0
  44. package/src/wrappers/AttributesWrapper.js +94 -0
  45. package/src/wrappers/DocumentObserver.js +51 -0
  46. package/src/wrappers/HtmlElementEventsWrapper.js +77 -0
  47. package/src/wrappers/HtmlElementWrapper.js +174 -0
@@ -0,0 +1,77 @@
1
+ function eventWrapper(element, name, callback) {
2
+ element.addEventListener(name, callback);
3
+ return element;
4
+ }
5
+
6
+ /**
7
+ *
8
+ * @param {HTMLElement} element
9
+ * @returns {HTMLElement}
10
+ */
11
+ export default function HtmlElementEventsWrapper(element) {
12
+
13
+ if(!element.nd) {
14
+ element.nd = {};
15
+ }
16
+
17
+ /**
18
+ * @param {Object<string,Function>} events
19
+ */
20
+ element.nd.on = function(events) {
21
+ for(const event in events) {
22
+ const callback = events[event];
23
+ eventWrapper(element, event, callback);
24
+ }
25
+ return element;
26
+ };
27
+ element.nd.on.prevent = function(events) {
28
+ for(const event in events) {
29
+ const callback = events[event];
30
+ eventWrapper(element, event, (event) => {
31
+ event.preventDefault();
32
+ callback && callback(event);
33
+ return element;
34
+ });
35
+ }
36
+ return element;
37
+ };
38
+ const events = {
39
+ click: (callback) => eventWrapper(element, 'click', callback),
40
+ focus: (callback) => eventWrapper(element, 'focus', callback),
41
+ blur: (callback) => eventWrapper(element, 'blur', callback),
42
+ input: (callback) => eventWrapper(element, 'input', callback),
43
+ change: (callback) => eventWrapper(element, 'change', callback),
44
+ keyup: (callback) => eventWrapper(element, 'keyup', callback),
45
+ keydown: (callback) => eventWrapper(element, 'keydown', callback),
46
+ beforeInput: (callback) => eventWrapper(element, 'beforeinput', callback),
47
+ mouseOver: (callback) => eventWrapper(element, 'mouseover', callback),
48
+ mouseOut: (callback) => eventWrapper(element, 'mouseout', callback),
49
+ mouseDown: (callback) => eventWrapper(element, 'mousedown', callback),
50
+ mouseUp: (callback) => eventWrapper(element, 'mouseup', callback),
51
+ mouseMove: (callback) => eventWrapper(element, 'mousemove', callback),
52
+ hover: (mouseInCallback, mouseOutCallback) => {
53
+ element.addEventListener('mouseover', mouseInCallback);
54
+ element.addEventListener('mouseout', mouseOutCallback);
55
+ },
56
+ dropped: (callback) => eventWrapper(element, 'drop', callback),
57
+ submit: (callback) => eventWrapper(element, 'submit', callback),
58
+ dragEnd: (callback) => eventWrapper(element, 'dragend', callback),
59
+ dragStart: (callback) => eventWrapper(element, 'dragstart', callback),
60
+ drop: (callback) => eventWrapper(element, 'drop', callback),
61
+ dragOver: (callback) => eventWrapper(element, 'dragover', callback),
62
+ dragEnter: (callback) => eventWrapper(element, 'dragenter', callback),
63
+ dragLeave: (callback) => eventWrapper(element, 'dragleave', callback),
64
+ };
65
+ for(let event in events) {
66
+ element.nd.on[event] = events[event];
67
+ element.nd.on.prevent[event] = function(callback) {
68
+ eventWrapper(element, event.toLowerCase(), (event) => {
69
+ event.preventDefault();
70
+ callback && callback(event);
71
+ });
72
+ return element;
73
+ };
74
+ }
75
+
76
+ return element;
77
+ }
@@ -0,0 +1,174 @@
1
+ import HtmlElementEventsWrapper from "./HtmlElementEventsWrapper";
2
+ import AttributesWrapper from "./AttributesWrapper";
3
+ import NativeDocumentError from "../errors/NativeDocumentError";
4
+ import DocumentObserver from "./DocumentObserver";
5
+ import Validator from "../utils/validator";
6
+ import DebugManager from "../utils/debug-manager";
7
+
8
+ /**
9
+ *
10
+ * @param {HTMLElement|DocumentFragment} parent
11
+ * @param {ObservableItem} observable
12
+ * @returns {Text}
13
+ */
14
+ const createObservableNode = function(parent, observable) {
15
+ const text = document.createTextNode('');
16
+ observable.subscribe(value => text.textContent = String(value));
17
+ text.textContent = observable.val();
18
+ parent && parent.appendChild(text);
19
+ return text;
20
+ }
21
+
22
+ /**
23
+ *
24
+ * @param {HTMLElement|DocumentFragment} parent
25
+ * @param {*} value
26
+ * @returns {Text}
27
+ */
28
+ const createStaticTextNode = function(parent, value) {
29
+ const text = document.createTextNode('');
30
+ text.textContent = String(value);
31
+ parent && parent.appendChild(text);
32
+ return text;
33
+ }
34
+
35
+ /**
36
+ *
37
+ * @param {HTMLElement} element
38
+ */
39
+ const addUtilsMethods = function(element) {
40
+ element.nd.wrap = (callback) => {
41
+ if(!Validator.isFunction(callback)) {
42
+ throw new NativeDocumentError('Callback must be a function');
43
+ }
44
+ callback && callback(element);
45
+ return element;
46
+ };
47
+ element.nd.ref = (target, name) => {
48
+ target[name] = element;
49
+ return element;
50
+ };
51
+
52
+ let $observer = null;
53
+
54
+ element.nd.lifecycle = function(states) {
55
+ $observer = $observer || DocumentObserver.watch(element);
56
+
57
+ states.mounted && $observer.mounted(states.mounted);
58
+ states.unmounted && $observer.unmounted(states.unmounted);
59
+ return element;
60
+ };
61
+
62
+ element.nd.mounted = (callback) => {
63
+ $observer = $observer || DocumentObserver.watch(element);
64
+ $observer.mounted(callback);
65
+ return element;
66
+ };
67
+ element.nd.unmounted = (callback) => {
68
+ $observer = $observer || DocumentObserver.watch(element);
69
+ $observer.unmounted(callback);
70
+ return element;
71
+ };
72
+ };
73
+
74
+ /**
75
+ *
76
+ * @param {*} value
77
+ * @returns {Text}
78
+ */
79
+ export const createTextNode = function(value) {
80
+ return (Validator.isObservable(value))
81
+ ? createObservableNode(null, value)
82
+ : createStaticTextNode(null, value);
83
+ };
84
+
85
+ export const ElementCreator = {
86
+ /**
87
+ *
88
+ * @param {string} name
89
+ * @returns {HTMLElement|DocumentFragment}
90
+ */
91
+ createElement(name) {
92
+ return name ? document.createElement(name) : document.createDocumentFragment();
93
+ },
94
+ /**
95
+ *
96
+ * @param {*} children
97
+ * @param {HTMLElement|DocumentFragment} parent
98
+ */
99
+ processChildren(children, parent) {
100
+ if(children === null) return;
101
+ const childrenArray = Array.isArray(children) ? children : [children];
102
+ childrenArray.forEach(child => {
103
+ if (child === null) return;
104
+ if (Validator.isElement(child)) {
105
+ parent.appendChild(child);
106
+ return;
107
+ }
108
+ if (Validator.isObservable(child)) {
109
+ createObservableNode(parent, child);
110
+ return;
111
+ }
112
+ if (child) {
113
+ createStaticTextNode(parent, child);
114
+ }
115
+ });
116
+ },
117
+ /**
118
+ *
119
+ * @param {HTMLElement} element
120
+ * @param {Object} attributes
121
+ */
122
+ processAttributes(element, attributes) {
123
+ if(Validator.isFragment(element)) return;
124
+ if (attributes) {
125
+ AttributesWrapper(element, attributes);
126
+ }
127
+ },
128
+ /**
129
+ *
130
+ * @param {HTMLElement} element
131
+ * @param {Object} attributes
132
+ * @param {?Function} customWrapper
133
+ * @returns {HTMLElement|DocumentFragment}
134
+ */
135
+ setup(element, attributes, customWrapper) {
136
+ element.nd = {};
137
+ HtmlElementEventsWrapper(element);
138
+ const item = (typeof customWrapper === 'function') ? customWrapper(element) : element;
139
+ addUtilsMethods(item);
140
+ return item;
141
+ }
142
+ };
143
+
144
+ /**
145
+ *
146
+ * @param {string} name
147
+ * @param {?Function} customWrapper
148
+ * @returns {Function}
149
+ */
150
+ export default function HtmlElementWrapper(name, customWrapper) {
151
+ const $tagName = name.toLowerCase().trim();
152
+
153
+ const builder = function(attributes, children = null) {
154
+ try {
155
+ if(Validator.isValidChildren(attributes)) {
156
+ const tempChildren = children;
157
+ children = attributes;
158
+ attributes = tempChildren;
159
+ }
160
+ const element = ElementCreator.createElement($tagName);
161
+
162
+ ElementCreator.processAttributes(element, attributes);
163
+ ElementCreator.processChildren(children, element);
164
+
165
+ return ElementCreator.setup(element, attributes, customWrapper);
166
+ } catch (error) {
167
+ DebugManager.error('ElementCreation', `Error creating ${$tagName}`, error);
168
+ }
169
+ }
170
+
171
+ builder.hold = (children, attributes) => (() => builder(children, attributes));
172
+
173
+ return builder;
174
+ }