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.
- package/dist/native-document.dev.js +2346 -0
- package/dist/native-document.min.js +1 -0
- package/elements.js +2 -0
- package/index.js +11 -0
- package/package.json +16 -0
- package/readme.md +495 -0
- package/rollup.config.js +29 -0
- package/router.js +9 -0
- package/src/data/MemoryManager.js +60 -0
- package/src/data/Observable.js +162 -0
- package/src/data/ObservableChecker.js +24 -0
- package/src/data/ObservableItem.js +101 -0
- package/src/data/Store.js +74 -0
- package/src/elements/content-formatter.js +32 -0
- package/src/elements/control/for-each.js +110 -0
- package/src/elements/control/show-if.js +86 -0
- package/src/elements/control/switch.js +88 -0
- package/src/elements/description-list.js +5 -0
- package/src/elements/form.js +71 -0
- package/src/elements/html5-semantics.js +12 -0
- package/src/elements/img.js +45 -0
- package/src/elements/index.js +21 -0
- package/src/elements/interactive.js +7 -0
- package/src/elements/list.js +6 -0
- package/src/elements/medias.js +8 -0
- package/src/elements/meta-data.js +9 -0
- package/src/elements/table.js +14 -0
- package/src/errors/ArgTypesError.js +7 -0
- package/src/errors/NativeDocumentError.js +8 -0
- package/src/errors/RouterError.js +9 -0
- package/src/router/Route.js +102 -0
- package/src/router/RouteGroupHelper.js +52 -0
- package/src/router/Router.js +232 -0
- package/src/router/RouterComponent.js +37 -0
- package/src/router/link.js +27 -0
- package/src/router/modes/HashRouter.js +83 -0
- package/src/router/modes/HistoryRouter.js +66 -0
- package/src/router/modes/MemoryRouter.js +71 -0
- package/src/utils/args-types.js +100 -0
- package/src/utils/debug-manager.js +34 -0
- package/src/utils/helpers.js +37 -0
- package/src/utils/prototypes.js +16 -0
- package/src/utils/validator.js +96 -0
- package/src/wrappers/AttributesWrapper.js +94 -0
- package/src/wrappers/DocumentObserver.js +51 -0
- package/src/wrappers/HtmlElementEventsWrapper.js +77 -0
- 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
|
+
}
|