/
child-nodes.js
60 lines (43 loc) · 1.45 KB
/
child-nodes.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
'use strict'
const predicates = require( './predicates' )
const nodeType = require( 'nodetype-enum' )
const NodeTypeIs = predicates => {
const nodeTypeIs = obj => Object.keys( predicates ).find( key => predicates[ key ]( obj ) )
return nodeTypeIs
}
const nodeTypeIs = NodeTypeIs( predicates )
const getElementChildNodeIndex = node =>
Array.isArray( node[ 2 ] ) ? 2 : Array.isArray( node[ 1 ] ) ? 1 : node.length
const getChildNodeIndex = {
element: getElementChildNodeIndex,
document: getElementChildNodeIndex,
documentFragment: node => 0
}
const getElementChildNodes = node => {
let index = getChildNodeIndex.element( node )
if( !Array.isArray( node[ index ] ) ){
node[ index ] = []
}
return node[ index ]
}
const getChildNodes = {
element: getElementChildNodes,
document: getElementChildNodes,
documentFragment: node => node[ 0 ]
}
const setElementChildNodes = ( node, children ) => node[ getChildNodeIndex.element( node ) ] = children
const setChildNodes = {
element: setElementChildNodes,
document: setElementChildNodes,
documentFragment: ( node, children ) => node[ 0 ] = children
}
const childNodes = ( parentNode, children ) => {
const nodeType = nodeTypeIs( parentNode )
if( Array.isArray( children ) ){
return setChildNodes[ nodeType ]( parentNode, children )
}
const getChildren = getChildNodes[ nodeType ]
if( getChildren instanceof Function )
return getChildren( parentNode )
}
module.exports = childNodes