-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathelement.js
123 lines (103 loc) · 3.03 KB
/
element.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
import { createError } from './error.js';
import debug from './debug.js';
import setElementProperties from './properties.js';
import setElementAttributes from './attributes.js';
import setElementTextContent from './text.js';
import setElementEventHandlers from './events.js';
export const validProps = {
element: null,
el: null,
data: {},
classList: [],
classNames: [],
attributes: {},
attrs: {},
properties: {},
props: {},
children: [],
text: null,
events: {},
on: {},
hooks: {},
};
export function validateProps(props) {
for (const key in props) {
if (!Object.hasOwn(validProps, key)) {
return createError(
`${key} is not a valid property name. Try one of the following instead: ${Object.keys(
validProps
)}`
);
}
}
return true;
}
export function createComponentInstance(
vanillapodComponent,
vanillapodComponentProps
) {
if (typeof vanillapodComponent === 'function') {
debug() && console.log(`Registering ${vanillapodComponent}...`);
let props = vanillapodComponentProps
? vanillapodComponent(vanillapodComponentProps)
: vanillapodComponent();
if (typeof props !== 'object' || props === undefined) {
return createError(`${vanillapodComponent} must return an object`);
}
if (validateProps(props)) {
return {
vanillapodComponent,
...props,
};
}
}
return createError(`${vanillapodComponent} is not a function`);
}
export function createElement(element, ...args /* props = {} */) {
let props = {};
for (const arg of args) {
if (Array.isArray(arg)) {
props.children = arg;
break;
}
if (typeof arg === 'function') {
props = typeof arg() === 'object' && arg();
break;
}
props = arg;
}
// console.log(props);
if (!element) {
return createError(`element is ${element}`);
}
if (typeof element === 'string') {
// (debug() && console.log(`Creating ${element} for ${props.vanillapodComponent}`));
debug() && console.log('Creating element...');
element = document.createElement(element);
debug() && console.log('Created element: ', element);
}
// set element properties
setElementProperties(element, props);
// set attributes on elements
setElementAttributes(element, props);
// set textContent for element
setElementTextContent(element, props);
// register DOM event handlers
setElementEventHandlers(element, props);
debug() &&
console.log(
'createElement: props',
props,
'createElement: element',
element
);
return {
...props,
element,
el: element,
};
}
// aliases for createElement
export const h = createElement;
export const e = createElement;
export const html = createElement;