@domql/element 2.0.2 → 2.0.3

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 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
+ // })
@@ -1,6 +1,5 @@
1
1
  'use strict'
2
2
 
3
- export * from './assign'
4
3
  export * from './iterate'
5
4
  export * from './methods'
6
5
  export * from './update'
File without changes
@@ -1,7 +1,7 @@
1
1
  'use strict'
2
2
 
3
3
  import { isObject, isObjectLike } from '@domql/utils'
4
- import { registry } from '@domql/mixins'
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(registry[param])) {
43
+ if (!isObject(DEFAULT_METHODS[param])) {
44
44
  keys.push(param)
45
45
  }
46
46
  }
package/package.json CHANGED
@@ -1,21 +1,19 @@
1
1
  {
2
2
  "name": "@domql/element",
3
- "version": "2.0.2",
4
- "main": "src/index.js",
3
+ "version": "2.0.3",
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/proto": "latest",
12
+ "@domql/registry": "latest",
15
13
  "@domql/state": "latest",
16
14
  "@domql/tree": "latest",
17
15
  "@domql/utils": "latest"
18
16
  },
19
- "gitHead": "0aa5932cb9ae5f1bb55bfaf792a4d009233385f6",
20
- "source": "src/index.js"
17
+ "gitHead": "feba8b60eccc9ed2caed62555e7083779c67044a",
18
+ "source": "index.js"
21
19
  }
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 { registry } from '@domql/mixins'
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(registry[param]) || prop === undefined) continue
68
+ if (isMethod(param) || isObject(defaultMethods[param]) || prop === undefined) continue
82
69
 
83
70
  const hasDefined = define && define[param]
84
- const ourParam = registry[param]
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,26 +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
- export const insertNodeAfter = (node, siblingNode) => {
13
- siblingNode.parentNode.insertBefore(node, siblingNode.nextSibling)
14
- }
15
-
16
- /**
17
- * Receives elements and assigns the first
18
- * parameter as a child of the second one
19
- */
20
- export const assignNode = (element, parent, key, insertAfter) => {
21
- parent[key || element.key] = element
22
- if (element.tag !== 'shadow') {
23
- (insertAfter ? insertNodeAfter : appendNode)(element.node, parent.node)
24
- }
25
- return element
26
- }
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, options.insertAfter)
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
- }