@domql/element 2.0.0 → 2.0.4
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/create.js +167 -0
- package/{src/index.js → index.js} +0 -1
- package/{src/iterate.js → iterate.js} +0 -0
- package/{src/methods.js → methods.js} +2 -2
- package/package.json +7 -8
- package/{src/set.js → set.js} +0 -0
- package/test/create.test.js +136 -0
- package/{src/update.js → update.js} +7 -22
- package/src/assign.js +0 -22
- package/src/create.js +0 -125
package/create.js
ADDED
|
@@ -0,0 +1,167 @@
|
|
|
1
|
+
'use strict'
|
|
2
|
+
|
|
3
|
+
import { DEFAULT_METHODS, TAGS } from '@domql/registry'
|
|
4
|
+
|
|
5
|
+
import { root } from '@domql/tree'
|
|
6
|
+
import { createKey } from '@domql/key'
|
|
7
|
+
import { isNumber, isString, isObject, isNode, isFunction, isArray, exec } from '@domql/utils'
|
|
8
|
+
import { createState } from '@domql/state'
|
|
9
|
+
import { createProps } from '@domql/props'
|
|
10
|
+
import { extendElement } from '@domql/extends'
|
|
11
|
+
|
|
12
|
+
const OPTIONS = {}
|
|
13
|
+
|
|
14
|
+
const init = (element, key, options, parent) => {
|
|
15
|
+
const ref = {}
|
|
16
|
+
if (isString(element) || isNumber(element)) {
|
|
17
|
+
return {
|
|
18
|
+
key,
|
|
19
|
+
ref,
|
|
20
|
+
text: element
|
|
21
|
+
}
|
|
22
|
+
} else if (isArray(element)) return Object.assign({}, element)
|
|
23
|
+
else if (isObject(element)) {
|
|
24
|
+
if (!element.ref) element.ref = ref
|
|
25
|
+
if (element.on && element.on.init) element.on.init(element, element.state)
|
|
26
|
+
return element
|
|
27
|
+
} else if (isFunction(element)) return exec(parent, parent.ref.state)
|
|
28
|
+
else if (!element) return { ref }
|
|
29
|
+
return element
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
const assignKey = (element, key) => {
|
|
33
|
+
if (element.key) return element
|
|
34
|
+
element.key = key || createKey.next().value
|
|
35
|
+
return element
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
const applyParent = (element, key) => {
|
|
39
|
+
const { ref } = element
|
|
40
|
+
const { parent } = ref
|
|
41
|
+
if (isNode(parent)) {
|
|
42
|
+
ref.parent = root.ref.parent = { node: parent }
|
|
43
|
+
}
|
|
44
|
+
if (!parent) ref.parent = root
|
|
45
|
+
return element
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
const applyState = (element, key) => {
|
|
49
|
+
const { ref } = element
|
|
50
|
+
ref.state = createState(element, element.ref.parent)
|
|
51
|
+
return element
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
const applyExtends = (element, key) => {
|
|
55
|
+
extendElement(element, element.ref.parent)
|
|
56
|
+
return element
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
const applyTag = (element, key) => {
|
|
60
|
+
if (element.tag) {
|
|
61
|
+
element.ref.tag = element.tag
|
|
62
|
+
return element
|
|
63
|
+
}
|
|
64
|
+
const keyIsTag = TAGS.body.indexOf(key) > -1
|
|
65
|
+
element.tag = element.ref.tag = keyIsTag ? key : 'div'
|
|
66
|
+
return element
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
const applyProps = (element, key) => {
|
|
70
|
+
const { ref } = element
|
|
71
|
+
ref.props = createProps(element, element.ref.parent)
|
|
72
|
+
return element
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
const onEachAvailable = (element, key, options) => {
|
|
76
|
+
const { ref } = element
|
|
77
|
+
const value = element[key]
|
|
78
|
+
let { children, childrenKeys } = ref
|
|
79
|
+
if (!children) children = ref.children = []
|
|
80
|
+
if (!childrenKeys) childrenKeys = ref.childrenKeys = []
|
|
81
|
+
|
|
82
|
+
// add to ref.children
|
|
83
|
+
const useOption = options[onEachAvailable]
|
|
84
|
+
if (useOption) useOption(element, key)
|
|
85
|
+
|
|
86
|
+
// move value to ref.children
|
|
87
|
+
children.push(value)
|
|
88
|
+
childrenKeys.push(key)
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
const onEach = (element, key, options) => {
|
|
92
|
+
for (const key in element) {
|
|
93
|
+
const isMethod = DEFAULT_METHODS[key]
|
|
94
|
+
if (isMethod && isFunction(isMethod)) isMethod(element, element.ref.state)
|
|
95
|
+
const hasDefine = element.define && element.define[key]
|
|
96
|
+
if (hasDefine && isFunction(hasDefine)) element.ref[key] = hasDefine(element, element.ref.state)
|
|
97
|
+
if (!isMethod && !hasDefine) onEachAvailable(element, key, options)
|
|
98
|
+
}
|
|
99
|
+
return element
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
const applyTransform = (element, key, options) => {
|
|
103
|
+
const { ref, transform } = element
|
|
104
|
+
if (!transform) return element
|
|
105
|
+
if (!ref.transform) ref.transform = {}
|
|
106
|
+
const keys = Object.keys(transform || {})
|
|
107
|
+
keys.map(key => {
|
|
108
|
+
const transformer = transform[key]
|
|
109
|
+
ref.transform[key] = transformer(element, key)
|
|
110
|
+
return key
|
|
111
|
+
})
|
|
112
|
+
return element
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
const addChildren = (element, key, options) => {
|
|
116
|
+
const { ref } = element
|
|
117
|
+
const { children } = ref
|
|
118
|
+
|
|
119
|
+
if (children && children.length) {
|
|
120
|
+
ref.children = children.map(child => {
|
|
121
|
+
return create(child, element, key, options)
|
|
122
|
+
})
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
return element
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
const applyGlobalTransform = (element, key, options) => {
|
|
129
|
+
const { ref } = element
|
|
130
|
+
const { transform } = options
|
|
131
|
+
if (!transform) return element
|
|
132
|
+
if (!ref.transform) ref.transform = {}
|
|
133
|
+
const keys = Object.keys(transform || {})
|
|
134
|
+
keys.map(key => {
|
|
135
|
+
const transformer = transform[key]
|
|
136
|
+
ref.transform[key] = transformer(element, key)
|
|
137
|
+
return key
|
|
138
|
+
})
|
|
139
|
+
return element
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
/**
|
|
143
|
+
* Creating a DOMQL element
|
|
144
|
+
*/
|
|
145
|
+
export const create = (element, parent, key, options = OPTIONS) => [
|
|
146
|
+
init,
|
|
147
|
+
assignKey,
|
|
148
|
+
applyParent,
|
|
149
|
+
applyState,
|
|
150
|
+
applyExtends,
|
|
151
|
+
applyTag,
|
|
152
|
+
applyProps,
|
|
153
|
+
onEach,
|
|
154
|
+
applyTransform,
|
|
155
|
+
addChildren,
|
|
156
|
+
applyGlobalTransform
|
|
157
|
+
].reduce((prev, current) => current(prev, key, options, parent), element)
|
|
158
|
+
|
|
159
|
+
// create({
|
|
160
|
+
// test: {
|
|
161
|
+
// test2: {}
|
|
162
|
+
// }
|
|
163
|
+
// }, null, null, {
|
|
164
|
+
// transform: {
|
|
165
|
+
// react: transformReact
|
|
166
|
+
// }
|
|
167
|
+
// })
|
|
File without changes
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
'use strict'
|
|
2
2
|
|
|
3
3
|
import { isObject, isObjectLike } from '@domql/utils'
|
|
4
|
-
import {
|
|
4
|
+
import { DEFAULT_METHODS } from '@domql/registry'
|
|
5
5
|
|
|
6
6
|
// TODO: update these files
|
|
7
7
|
export const lookup = function (key) {
|
|
@@ -40,7 +40,7 @@ export const keys = function () {
|
|
|
40
40
|
const element = this
|
|
41
41
|
const keys = []
|
|
42
42
|
for (const param in element) {
|
|
43
|
-
if (!isObject(
|
|
43
|
+
if (!isObject(DEFAULT_METHODS[param])) {
|
|
44
44
|
keys.push(param)
|
|
45
45
|
}
|
|
46
46
|
}
|
package/package.json
CHANGED
|
@@ -1,20 +1,19 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@domql/element",
|
|
3
|
-
"version": "2.0.
|
|
4
|
-
"main": "
|
|
3
|
+
"version": "2.0.4",
|
|
4
|
+
"main": "index.js",
|
|
5
5
|
"license": "MIT",
|
|
6
|
-
"scripts": {
|
|
7
|
-
"vpatch": "npm version patch && npm publish --access public"
|
|
8
|
-
},
|
|
9
6
|
"dependencies": {
|
|
10
7
|
"@domql/event": "latest",
|
|
8
|
+
"@domql/extends": "latest",
|
|
9
|
+
"@domql/key": "latest",
|
|
11
10
|
"@domql/mixins": "latest",
|
|
12
|
-
"@domql/node": "latest",
|
|
13
11
|
"@domql/props": "latest",
|
|
14
|
-
"@domql/
|
|
12
|
+
"@domql/registry": "latest",
|
|
15
13
|
"@domql/state": "latest",
|
|
16
14
|
"@domql/tree": "latest",
|
|
17
15
|
"@domql/utils": "latest"
|
|
18
16
|
},
|
|
19
|
-
"gitHead": "
|
|
17
|
+
"gitHead": "14358979a28566f2ab3994caa7112c05db29828e",
|
|
18
|
+
"source": "index.js"
|
|
20
19
|
}
|
package/{src/set.js → set.js}
RENAMED
|
File without changes
|
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
'use strict'
|
|
2
|
+
|
|
3
|
+
import { tree } from '@domql/tree'
|
|
4
|
+
import { create } from '../create'
|
|
5
|
+
|
|
6
|
+
describe('Should create DOMQL element', () => {
|
|
7
|
+
const dom = create({})
|
|
8
|
+
|
|
9
|
+
test('should create EMPTY element', () => {
|
|
10
|
+
expect(dom.key).toBe(1)
|
|
11
|
+
expect(dom.tag).toBe('div')
|
|
12
|
+
})
|
|
13
|
+
|
|
14
|
+
test('should create REF', () => {
|
|
15
|
+
const { ref } = dom
|
|
16
|
+
expect(ref.tag).toBe('div')
|
|
17
|
+
expect(ref.parent).toEqual(tree)
|
|
18
|
+
expect(ref.state).toEqual({})
|
|
19
|
+
expect(ref.props).toEqual({})
|
|
20
|
+
})
|
|
21
|
+
})
|
|
22
|
+
|
|
23
|
+
describe('Should create DOMQL element from PRIMITIVES', () => {
|
|
24
|
+
const ref = {
|
|
25
|
+
tag: 'div',
|
|
26
|
+
parent: tree,
|
|
27
|
+
state: {},
|
|
28
|
+
props: {}
|
|
29
|
+
}
|
|
30
|
+
test('should create element from Int', () => {
|
|
31
|
+
const number = create(123)
|
|
32
|
+
expect(number).toEqual({
|
|
33
|
+
key: 6,
|
|
34
|
+
tag: 'div',
|
|
35
|
+
text: 123,
|
|
36
|
+
ref
|
|
37
|
+
})
|
|
38
|
+
})
|
|
39
|
+
test('should create element from String', () => {
|
|
40
|
+
const string = create('test')
|
|
41
|
+
expect(string).toEqual({
|
|
42
|
+
key: 7,
|
|
43
|
+
tag: 'div',
|
|
44
|
+
text: 'test',
|
|
45
|
+
ref
|
|
46
|
+
})
|
|
47
|
+
})
|
|
48
|
+
})
|
|
49
|
+
|
|
50
|
+
describe('Should create NESTED DOMQL element', () => {
|
|
51
|
+
const dom = create({
|
|
52
|
+
test: 123,
|
|
53
|
+
test2: 'test2',
|
|
54
|
+
test3: { text: 'test3' }
|
|
55
|
+
})
|
|
56
|
+
const ref = {
|
|
57
|
+
tag: 'div',
|
|
58
|
+
parent: tree,
|
|
59
|
+
state: {},
|
|
60
|
+
props: {}
|
|
61
|
+
}
|
|
62
|
+
test('element must have children', () => {
|
|
63
|
+
const { children, childrenKeys } = dom.ref
|
|
64
|
+
expect(children).toEqual(expect.any(Array))
|
|
65
|
+
expect(childrenKeys).toEqual(expect.any(Array))
|
|
66
|
+
expect(childrenKeys).toHaveLength(3)
|
|
67
|
+
expect(childrenKeys).toEqual(['test', 'test2', 'test3'])
|
|
68
|
+
})
|
|
69
|
+
test('should structure proper children', () => {
|
|
70
|
+
const { children } = dom.ref
|
|
71
|
+
expect(children[0]).toEqual({
|
|
72
|
+
key: 3,
|
|
73
|
+
tag: 'div',
|
|
74
|
+
text: 123,
|
|
75
|
+
ref
|
|
76
|
+
})
|
|
77
|
+
expect(children[1]).toEqual({
|
|
78
|
+
key: 4,
|
|
79
|
+
tag: 'div',
|
|
80
|
+
text: 'test2',
|
|
81
|
+
ref
|
|
82
|
+
})
|
|
83
|
+
expect(children[2]).toEqual({
|
|
84
|
+
key: 5,
|
|
85
|
+
tag: 'div',
|
|
86
|
+
text: 'test3',
|
|
87
|
+
ref
|
|
88
|
+
})
|
|
89
|
+
})
|
|
90
|
+
})
|
|
91
|
+
|
|
92
|
+
// test('should create valid DOM node', () => {
|
|
93
|
+
// expect(dom.node).toBeInstanceOf(window.HTMLDivElement)
|
|
94
|
+
// })
|
|
95
|
+
|
|
96
|
+
// test('must be able to create valid PATH', () => {
|
|
97
|
+
// expect(dom.path).toStrictEqual([dom.key])
|
|
98
|
+
// })
|
|
99
|
+
|
|
100
|
+
// test('if it HAS a NODE, don\'t recreate', () => {
|
|
101
|
+
// const node = document.createElement('div')
|
|
102
|
+
// const dom2 = create({ node })
|
|
103
|
+
// expect(dom2.node.parentElement).toBe(document.body)
|
|
104
|
+
// })
|
|
105
|
+
|
|
106
|
+
// test('create with number', () => {
|
|
107
|
+
// const numb = create(0)
|
|
108
|
+
// expect(numb.text).toBe(0)
|
|
109
|
+
// expect(numb.tag).toBe('string')
|
|
110
|
+
// expect(numb.node.nodeType).toBe(3) // #text
|
|
111
|
+
// })
|
|
112
|
+
|
|
113
|
+
// test('create with string', () => {
|
|
114
|
+
// const str = create('hello')
|
|
115
|
+
// expect(str.text).toBe('hello')
|
|
116
|
+
// expect(str.tag).toBe('string')
|
|
117
|
+
// expect(str.node.nodeType).toBe(3) // #text
|
|
118
|
+
// })
|
|
119
|
+
|
|
120
|
+
// test('creating conditions', () => {
|
|
121
|
+
// const element = create({
|
|
122
|
+
// data: { visible: true },
|
|
123
|
+
// if: element => element.data.visible
|
|
124
|
+
// })
|
|
125
|
+
// expect(element.tag).toBe('div')
|
|
126
|
+
// })
|
|
127
|
+
|
|
128
|
+
// test('creating nesting', () => {
|
|
129
|
+
// const element = create({
|
|
130
|
+
// header: {
|
|
131
|
+
// h1: {}
|
|
132
|
+
// }
|
|
133
|
+
// })
|
|
134
|
+
// expect(element.header.tag).toBe('header')
|
|
135
|
+
// expect(element.header.h1.tag).toBe('h1')
|
|
136
|
+
// })
|
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
'use strict'
|
|
2
2
|
|
|
3
3
|
import { overwrite, isFunction, isObject, isString, isNumber, merge } from '@domql/utils'
|
|
4
|
-
import {
|
|
4
|
+
import { defaultMethods } from '@domql/mixins'
|
|
5
5
|
import { updateProps } from '@domql/props'
|
|
6
|
-
import { createNode } from '@domql/node'
|
|
6
|
+
// import { createNode } from '@domql/node'
|
|
7
7
|
import { on } from '@domql/event'
|
|
8
8
|
|
|
9
9
|
import { isMethod } from './methods'
|
|
10
10
|
import { throughUpdatedDefine, throughUpdatedExec } from './iterate'
|
|
11
|
-
import { appendNode } from './assign'
|
|
11
|
+
// import { appendNode } from './assign'
|
|
12
12
|
|
|
13
13
|
const UPDATE_DEFAULT_OPTIONS = {
|
|
14
14
|
stackChanges: false,
|
|
@@ -21,14 +21,6 @@ export const update = function (params = {}, options = UPDATE_DEFAULT_OPTIONS) {
|
|
|
21
21
|
const { define, parent, node } = element
|
|
22
22
|
|
|
23
23
|
// console.groupCollapsed('Update:', element.path)
|
|
24
|
-
// console.log('params:')
|
|
25
|
-
// console.log(params)
|
|
26
|
-
// console.log('props:')
|
|
27
|
-
// console.log(element.props)
|
|
28
|
-
// console.log('element:')
|
|
29
|
-
// console.log(element)
|
|
30
|
-
// console.log('PARAMS.PROPS:')
|
|
31
|
-
// console.log(params.props)
|
|
32
24
|
// console.groupEnd('Update:')
|
|
33
25
|
// if params is string
|
|
34
26
|
if (isString(params) || isNumber(params)) {
|
|
@@ -39,13 +31,9 @@ export const update = function (params = {}, options = UPDATE_DEFAULT_OPTIONS) {
|
|
|
39
31
|
on.initUpdate(element.on.initUpdate, element, element.state)
|
|
40
32
|
}
|
|
41
33
|
|
|
42
|
-
// console.log(element, parent)
|
|
43
34
|
updateProps(params.props, element, parent)
|
|
44
|
-
// // console.log(element.path)
|
|
45
|
-
// // console.log(element)
|
|
46
35
|
|
|
47
36
|
// console.groupCollapsed('UPDATE:')
|
|
48
|
-
// console.log(element)
|
|
49
37
|
// console.groupEnd('UPDATE:')
|
|
50
38
|
|
|
51
39
|
const overwriteChanges = overwrite(element, params, UPDATE_DEFAULT_OPTIONS)
|
|
@@ -61,8 +49,8 @@ export const update = function (params = {}, options = UPDATE_DEFAULT_OPTIONS) {
|
|
|
61
49
|
// TODO: move as fragment
|
|
62
50
|
const ifPassed = element.if(element, element.state)
|
|
63
51
|
if (element.__ifFalsy && ifPassed) {
|
|
64
|
-
createNode(element)
|
|
65
|
-
appendNode(element.node, element.__ifFragment)
|
|
52
|
+
// createNode(element)
|
|
53
|
+
// appendNode(element.node, element.__ifFragment)
|
|
66
54
|
delete element.__ifFalsy
|
|
67
55
|
} else if (element.node && !ifPassed) {
|
|
68
56
|
element.node.remove()
|
|
@@ -70,7 +58,6 @@ export const update = function (params = {}, options = UPDATE_DEFAULT_OPTIONS) {
|
|
|
70
58
|
}
|
|
71
59
|
}
|
|
72
60
|
|
|
73
|
-
// console.log(node)
|
|
74
61
|
// console.groupEnd('Update:')
|
|
75
62
|
|
|
76
63
|
if (!node || options.preventRecursive) return
|
|
@@ -78,12 +65,10 @@ export const update = function (params = {}, options = UPDATE_DEFAULT_OPTIONS) {
|
|
|
78
65
|
for (const param in element) {
|
|
79
66
|
const prop = element[param]
|
|
80
67
|
|
|
81
|
-
if (isMethod(param) || isObject(
|
|
68
|
+
if (isMethod(param) || isObject(defaultMethods[param]) || prop === undefined) continue
|
|
82
69
|
|
|
83
70
|
const hasDefined = define && define[param]
|
|
84
|
-
const ourParam =
|
|
85
|
-
|
|
86
|
-
// // console.log(prop)
|
|
71
|
+
const ourParam = defaultMethods[param]
|
|
87
72
|
|
|
88
73
|
if (ourParam) {
|
|
89
74
|
if (isFunction(ourParam)) ourParam(prop, element, node)
|
package/src/assign.js
DELETED
|
@@ -1,22 +0,0 @@
|
|
|
1
|
-
'use strict'
|
|
2
|
-
|
|
3
|
-
/**
|
|
4
|
-
* Receives child and parent nodes as parametes
|
|
5
|
-
* and assigns them into real DOM tree
|
|
6
|
-
*/
|
|
7
|
-
export const appendNode = (node, parentNode) => {
|
|
8
|
-
parentNode.appendChild(node)
|
|
9
|
-
return node
|
|
10
|
-
}
|
|
11
|
-
|
|
12
|
-
/**
|
|
13
|
-
* Receives elements and assigns the first
|
|
14
|
-
* parameter as a child of the second one
|
|
15
|
-
*/
|
|
16
|
-
export const assignNode = (element, parent, key) => {
|
|
17
|
-
parent[key || element.key] = element
|
|
18
|
-
if (element.tag !== 'shadow') {
|
|
19
|
-
appendNode(element.node, parent.node)
|
|
20
|
-
}
|
|
21
|
-
return element
|
|
22
|
-
}
|
package/src/create.js
DELETED
|
@@ -1,125 +0,0 @@
|
|
|
1
|
-
'use strict'
|
|
2
|
-
|
|
3
|
-
import { root } from '@domql/tree'
|
|
4
|
-
import { applyPrototype } from '@domql/proto'
|
|
5
|
-
import { createNode, NODE_REGISTRY, cacheNode } from '@domql/node'
|
|
6
|
-
import { createState } from '@domql/state'
|
|
7
|
-
import { createProps } from '@domql/props'
|
|
8
|
-
import { assignClass } from '@domql/mixins'
|
|
9
|
-
import { on } from '@domql/event'
|
|
10
|
-
import { isFunction, isNumber, isString, createID, isNode } from '@domql/utils'
|
|
11
|
-
|
|
12
|
-
import { appendNode, assignNode } from './assign'
|
|
13
|
-
import { set } from './set'
|
|
14
|
-
import { update } from './update'
|
|
15
|
-
import { remove, lookup, log, keys, parse, parseDeep } from './methods'
|
|
16
|
-
|
|
17
|
-
const ENV = process.env.NODE_ENV
|
|
18
|
-
|
|
19
|
-
/**
|
|
20
|
-
* Creating a domQL element using passed parameters
|
|
21
|
-
*/
|
|
22
|
-
export const create = (element, parent, key, options = {}) => {
|
|
23
|
-
// if ELEMENT is not given
|
|
24
|
-
if (element === undefined) element = {}
|
|
25
|
-
if (element === null) return
|
|
26
|
-
|
|
27
|
-
// define KEY
|
|
28
|
-
const assignedKey = element.key || key || createID.next().value
|
|
29
|
-
|
|
30
|
-
// if PARENT is not given
|
|
31
|
-
// if (parent === null) parent = root
|
|
32
|
-
// if (parent === undefined) parent = root
|
|
33
|
-
if (!parent) parent = root
|
|
34
|
-
if (isNode(parent)) parent = root[`${key}_parent`] = { node: parent }
|
|
35
|
-
|
|
36
|
-
// if element is STRING
|
|
37
|
-
if (isString(element) || isNumber(element)) {
|
|
38
|
-
element = {
|
|
39
|
-
text: element,
|
|
40
|
-
tag: (!element.proto && parent.childProto && parent.childProto.tag) ||
|
|
41
|
-
((NODE_REGISTRY.body.indexOf(key) > -1) && key) || 'string'
|
|
42
|
-
}
|
|
43
|
-
}
|
|
44
|
-
|
|
45
|
-
// enable STATE
|
|
46
|
-
element.state = createState(element, parent)
|
|
47
|
-
|
|
48
|
-
// create PROTOtypal inheritance
|
|
49
|
-
applyPrototype(element, parent, options)
|
|
50
|
-
|
|
51
|
-
// create and assign a KEY
|
|
52
|
-
element.key = assignedKey
|
|
53
|
-
|
|
54
|
-
// set the PATH
|
|
55
|
-
if (ENV === 'test' || ENV === 'development') {
|
|
56
|
-
if (!parent.path) parent.path = []
|
|
57
|
-
element.path = parent.path.concat(assignedKey)
|
|
58
|
-
}
|
|
59
|
-
|
|
60
|
-
// if it already HAS A NODE
|
|
61
|
-
if (element.node) {
|
|
62
|
-
return assignNode(element, parent, assignedKey)
|
|
63
|
-
}
|
|
64
|
-
|
|
65
|
-
// generate a CLASS name
|
|
66
|
-
assignClass(element)
|
|
67
|
-
|
|
68
|
-
// assign METHODS
|
|
69
|
-
element.set = set
|
|
70
|
-
element.update = update
|
|
71
|
-
element.remove = remove
|
|
72
|
-
element.lookup = lookup
|
|
73
|
-
if (ENV === 'test' || ENV === 'development') {
|
|
74
|
-
element.keys = keys
|
|
75
|
-
element.parse = parse
|
|
76
|
-
element.parseDeep = parseDeep
|
|
77
|
-
element.log = log
|
|
78
|
-
}
|
|
79
|
-
|
|
80
|
-
// run `on.init`
|
|
81
|
-
if (element.on && isFunction(element.on.init)) {
|
|
82
|
-
on.init(element.on.init, element, element.state)
|
|
83
|
-
}
|
|
84
|
-
|
|
85
|
-
// enable TRANSFORM in data
|
|
86
|
-
if (!element.transform) element.transform = {}
|
|
87
|
-
|
|
88
|
-
// enable CACHING
|
|
89
|
-
if (!element.__cached) element.__cached = {}
|
|
90
|
-
|
|
91
|
-
// enable EXEC
|
|
92
|
-
if (!element.__exec) element.__exec = {}
|
|
93
|
-
|
|
94
|
-
// enable CHANGES storing
|
|
95
|
-
if (!element.__changes) element.__changes = []
|
|
96
|
-
|
|
97
|
-
// enable CHANGES storing
|
|
98
|
-
const hasRoot = parent.parent && parent.parent.key === ':root'
|
|
99
|
-
if (!element.__root) element.__root = hasRoot ? parent : parent.__root
|
|
100
|
-
|
|
101
|
-
// apply props settings
|
|
102
|
-
createProps(element, parent)
|
|
103
|
-
|
|
104
|
-
// don't render IF in condition
|
|
105
|
-
if (isFunction(element.if) && !element.if(element, element.state)) {
|
|
106
|
-
// TODO: move as fragment
|
|
107
|
-
const ifFragment = cacheNode({ tag: 'fragment' })
|
|
108
|
-
element.__ifFragment = appendNode(ifFragment, parent.node)
|
|
109
|
-
element.__ifFalsy = true
|
|
110
|
-
return
|
|
111
|
-
}
|
|
112
|
-
|
|
113
|
-
// CREATE a real NODE
|
|
114
|
-
createNode(element)
|
|
115
|
-
|
|
116
|
-
// assign NODE
|
|
117
|
-
assignNode(element, parent, key)
|
|
118
|
-
|
|
119
|
-
// run `on.render`
|
|
120
|
-
if (element.on && isFunction(element.on.render)) {
|
|
121
|
-
on.render(element.on.render, element, element.state)
|
|
122
|
-
}
|
|
123
|
-
|
|
124
|
-
return element
|
|
125
|
-
}
|