dt-toolbox 5.0.0 → 6.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/Changelog.md +7 -15
- package/LICENSE +1 -1
- package/Migration.guide.md +14 -1
- package/README.md +978 -347
- package/README_v.2.x.x.md +0 -1
- package/README_v.4.x.x.md +532 -0
- package/package.json +22 -25
- package/src/convertors/index.js +43 -34
- package/src/convertors/midflat.js +76 -132
- package/src/convertors/standard.js +61 -86
- package/src/convertors/tuples.js +171 -0
- package/src/flatData/connect.js +50 -0
- package/src/flatData/export.js +46 -0
- package/src/flatData/filters/list.js +11 -0
- package/src/flatData/filters/listObject.js +13 -0
- package/src/flatData/filters/object.js +12 -0
- package/src/flatData/filters/root.js +12 -0
- package/src/flatData/find.js +20 -0
- package/src/flatData/from.js +33 -0
- package/src/flatData/get.js +29 -0
- package/src/flatData/index.js +101 -0
- package/src/flatData/insert.js +24 -0
- package/src/flatData/like.js +24 -0
- package/src/flatData/look.js +49 -0
- package/src/flatData/push.js +19 -0
- package/src/flatData/save.js +17 -0
- package/src/flatData/set.js +26 -0
- package/src/flatData/setupFilter.js +21 -0
- package/src/flatData/use.js +16 -0
- package/src/flatObject/copy.js +19 -0
- package/src/flatObject/export.js +13 -0
- package/src/flatObject/index.js +47 -0
- package/src/flatObject/insert.js +28 -0
- package/src/flatObject/model.js +32 -0
- package/src/flatObject/query.js +24 -0
- package/src/flatObject/setupFilter.js +12 -0
- package/src/main.js +21 -689
- package/src/mainLib.js +105 -0
- package/src/compareMethod/change.js +0 -21
- package/src/compareMethod/different.js +0 -18
- package/src/compareMethod/identical.js +0 -21
- package/src/compareMethod/index.js +0 -13
- package/src/compareMethod/missing.js +0 -18
- package/src/compareMethod/same.js +0 -18
- package/src/convertors/breadcrumbs.js +0 -148
- package/src/help/extractSelection.js +0 -12
- package/src/help/filterObject.js +0 -25
- package/src/help/hasNumbers.js +0 -14
- package/src/help/index.js +0 -35
- package/src/help/isItPrimitive.js +0 -10
- package/src/help/objectsByLevel.js +0 -16
- package/src/help/reduceTuples.js +0 -29
- package/src/help/sanitizeFlatKeys.js +0 -30
- package/src/help/toBreadcrumbsKeys.js +0 -28
- package/src/help/tuplesToBreadcrumbs.js +0 -25
- package/src/help/updateSelection.js +0 -12
- package/src/help/zipObject.js +0 -24
- package/src/lib/assemble.js +0 -45
- package/src/lib/attach.js +0 -20
- package/src/lib/block.js +0 -33
- package/src/lib/combine.js +0 -38
- package/src/lib/deep.js +0 -23
- package/src/lib/find.js +0 -36
- package/src/lib/folder.js +0 -42
- package/src/lib/index.js +0 -56
- package/src/lib/modify.js +0 -22
- package/src/lib/parent.js +0 -51
- package/src/lib/purify.js +0 -37
- package/src/lib/transform.js +0 -55
- package/src/modifiers/add.js +0 -18
- package/src/modifiers/append.js +0 -18
- package/src/modifiers/combineShallow.js +0 -119
- package/src/modifiers/flatten.js +0 -38
- package/src/modifiers/index.js +0 -34
- package/src/modifiers/insert.js +0 -21
- package/src/modifiers/keyPrefix.js +0 -27
- package/src/modifiers/mix.js +0 -25
- package/src/modifiers/overwrite.js +0 -18
- package/src/modifiers/prepend.js +0 -19
- package/src/modifiers/reverse.js +0 -23
- package/src/modifiers/update.js +0 -18
- package/src/simple.js +0 -49
package/src/convertors/index.js
CHANGED
|
@@ -1,45 +1,34 @@
|
|
|
1
1
|
'use strict'
|
|
2
2
|
|
|
3
|
-
import
|
|
4
|
-
import
|
|
5
|
-
import
|
|
3
|
+
import std from './standard.js'
|
|
4
|
+
import midFlat from './midflat.js'
|
|
5
|
+
import tuples from './tuples.js'
|
|
6
6
|
|
|
7
7
|
|
|
8
8
|
|
|
9
9
|
const selectConvertorFrom =
|
|
10
10
|
( type ) =>
|
|
11
11
|
( dependencies, inData ) => {
|
|
12
|
-
let
|
|
13
|
-
{ help } = dependencies
|
|
14
|
-
, vBuffer = [] // keep values during key's sanitize procedure
|
|
15
|
-
, rawKeys
|
|
16
|
-
, keyList
|
|
17
|
-
, rawValue
|
|
18
|
-
;
|
|
19
12
|
switch ( type ) {
|
|
20
13
|
case 'std' :
|
|
21
14
|
case 'standard':
|
|
22
15
|
return std.toFlat ( dependencies, inData )
|
|
23
16
|
case 'tuple' :
|
|
24
17
|
case 'tuples' :
|
|
25
|
-
|
|
18
|
+
return tuples.toFlat ( dependencies, inData )
|
|
26
19
|
case 'breadcrumb' :
|
|
27
20
|
case 'breadcrumbs' :
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
keyList = help.sanitizeFlatKeys ( rawKeys )
|
|
31
|
-
rawValue = help.zipObject ( keyList, vBuffer )
|
|
32
|
-
return breadcrumbs.toFlat ( dependencies, rawValue )
|
|
21
|
+
const br = Object.entries ( inData );
|
|
22
|
+
return tuples.toFlat ( dependencies, br )
|
|
33
23
|
case 'file' :
|
|
34
24
|
case 'files' :
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
return breadcrumbs.toFlat ( dependencies, rawValue )
|
|
25
|
+
const tups = inData.map ( el => {
|
|
26
|
+
let ar = el.split ( '/' );
|
|
27
|
+
if ( ar.length === 1 ) ar = [ 'root'].concat(ar)
|
|
28
|
+
const v = ar.pop ()
|
|
29
|
+
return [ ar.join('/'), v ]
|
|
30
|
+
})
|
|
31
|
+
return tuples.toFlat ( dependencies, tups )
|
|
43
32
|
case 'midFlat' :
|
|
44
33
|
return midFlat.toFlat ( dependencies, inData )
|
|
45
34
|
}
|
|
@@ -59,29 +48,49 @@ function from ( type ) { // convert from something to flat...
|
|
|
59
48
|
|
|
60
49
|
|
|
61
50
|
function to ( type, dependencies, inData ) { // convert from flat to 'data-type'...
|
|
62
|
-
const
|
|
51
|
+
const
|
|
52
|
+
breadcrumbs = {}
|
|
53
|
+
, check = new Set()
|
|
54
|
+
, extend = new Set()
|
|
55
|
+
;
|
|
56
|
+
let tups, count = 0;
|
|
63
57
|
switch ( type ) {
|
|
64
58
|
case 'std' :
|
|
65
59
|
case 'standard':
|
|
66
|
-
return std.toType (
|
|
60
|
+
return std.toType ( inData )
|
|
67
61
|
case 'midFlat' :
|
|
68
|
-
return midFlat.toType (
|
|
62
|
+
return midFlat.toType ( inData )
|
|
69
63
|
case 'tuple':
|
|
70
64
|
case 'tuples':
|
|
71
|
-
|
|
72
|
-
|
|
65
|
+
return tuples.toType ( inData )
|
|
66
|
+
case 'files':
|
|
67
|
+
tups = tuples.toType ( inData );
|
|
68
|
+
return tups.map ( ([k,v]) => `${k}/${v}`)
|
|
73
69
|
case 'breadcrumb' :
|
|
74
70
|
case 'breadcrumbs':
|
|
75
|
-
|
|
71
|
+
let current;
|
|
72
|
+
tups = tuples.toType ( inData )
|
|
73
|
+
tups.forEach ( ([k,v]) => check.has(k) ? extend.add(k) : check.add(k) )
|
|
74
|
+
tups.forEach ( ([k,v]) => {
|
|
75
|
+
if ( extend.has(k) ) {
|
|
76
|
+
if ( current !== k ) {
|
|
77
|
+
current = k
|
|
78
|
+
count = 0
|
|
79
|
+
}
|
|
80
|
+
let key = `${k}/${count}`;
|
|
81
|
+
breadcrumbs[key] = v
|
|
82
|
+
count++
|
|
83
|
+
}
|
|
84
|
+
else {
|
|
85
|
+
breadcrumbs[k] = v
|
|
86
|
+
}
|
|
87
|
+
})
|
|
88
|
+
return breadcrumbs
|
|
76
89
|
} //switch type
|
|
77
90
|
} // to func.
|
|
78
91
|
|
|
79
92
|
|
|
80
93
|
|
|
81
|
-
|
|
82
|
-
|
|
83
94
|
export default { from, to }
|
|
84
95
|
|
|
85
96
|
|
|
86
|
-
|
|
87
|
-
|
|
@@ -2,146 +2,90 @@
|
|
|
2
2
|
|
|
3
3
|
|
|
4
4
|
|
|
5
|
-
function toFlat ( dependencies, d ) { // Converts data to
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
let
|
|
14
|
-
structure = []
|
|
15
|
-
, value = {}
|
|
16
|
-
, { help } = dependencies
|
|
17
|
-
, keyList = Object // Provides keys in order: from larger to shorter
|
|
18
|
-
.keys ( d )
|
|
19
|
-
.map ( x => x.trim().replace(/\/$/,'').split('/') )
|
|
20
|
-
.sort ( (a,b) => b.length - a.length )
|
|
21
|
-
, tProps = {} // { objectLocation<string> : childObjectNames<set> }
|
|
22
|
-
, structRaw = [ 'root' ] // objectLocation strings
|
|
23
|
-
, propDone = []
|
|
5
|
+
function toFlat ( dependencies, d ) { // Converts data to 'dt' model
|
|
6
|
+
const
|
|
7
|
+
entries = Object.entries ( d )
|
|
8
|
+
, { walk } = dependencies ()
|
|
9
|
+
, indexes = {}
|
|
10
|
+
, dt = []
|
|
11
|
+
, containers = {}
|
|
12
|
+
, buffer = {}
|
|
24
13
|
;
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
14
|
+
function findContainers ( br ) {
|
|
15
|
+
if ( !containers[br] ) containers[br] = 'object'
|
|
16
|
+
const arr = br.split ( '/' );
|
|
17
|
+
if ( arr.length == 1 ) return
|
|
18
|
+
arr.pop ()
|
|
19
|
+
if ( arr.length == 1 ) return
|
|
20
|
+
findContainers ( arr.join('/') )
|
|
21
|
+
} // findContainers func.
|
|
22
|
+
|
|
23
|
+
function checkData ( br, midData ) {
|
|
24
|
+
const k = Object.keys ( midData );
|
|
25
|
+
k.forEach ( key => {
|
|
26
|
+
if ( !isNaN(key) ) containers[br] = 'array'
|
|
27
|
+
})
|
|
28
|
+
} // checkData func.
|
|
29
|
+
|
|
30
|
+
entries.forEach ( ([br, midData]) => {
|
|
31
|
+
if ( !br.startsWith('root') ) br = `root/${br}`
|
|
32
|
+
findContainers ( br )
|
|
33
|
+
checkData ( br, midData )
|
|
34
|
+
buffer[br] = midData
|
|
36
35
|
})
|
|
37
36
|
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
)
|
|
48
|
-
.sort ()
|
|
49
|
-
.forEach ( (path,i) => { // Build the structure rows
|
|
50
|
-
let position;
|
|
51
|
-
if ( !structure[i] ) {
|
|
52
|
-
structure[i] = [ 'object', i ]
|
|
53
|
-
propDone [i] = path
|
|
54
|
-
}
|
|
55
|
-
if ( propDone[i] ) path = propDone[i]
|
|
56
|
-
if ( path == null ) return
|
|
57
|
-
|
|
58
|
-
const flatList = tProps[path];
|
|
59
|
-
if ( !flatList ) return
|
|
60
|
-
|
|
61
|
-
let
|
|
62
|
-
flat = Array.from(flatList)
|
|
63
|
-
, isArray = help.hasNumbers ( flat )
|
|
64
|
-
;
|
|
65
|
-
if ( isArray ) structure[i][0] = 'array'
|
|
66
|
-
|
|
67
|
-
flatList.forEach ( name => {
|
|
68
|
-
position = structure.length
|
|
69
|
-
propDone[position] = `${path}/${name}`
|
|
70
|
-
structure.push ( ['object' , position])
|
|
71
|
-
})
|
|
72
|
-
})
|
|
73
|
-
|
|
74
|
-
propDone.forEach ( (k,i) => { // Setup values
|
|
75
|
-
let
|
|
76
|
-
keyList = Object.keys ( d[k] ).map ( k => k.trim().replace (/\/$/,'') ) // Prevents key to end on empty-space or '/'
|
|
77
|
-
, isArray = help.hasNumbers ( keyList )
|
|
78
|
-
, kSplit = k.split ( '/' )
|
|
79
|
-
, kProp
|
|
80
|
-
, breadcrumbs
|
|
81
|
-
;
|
|
82
|
-
|
|
83
|
-
kProp = kSplit.pop()
|
|
84
|
-
breadcrumbs = kSplit.join('/')
|
|
85
|
-
|
|
86
|
-
let ix = propDone.indexOf (breadcrumbs);
|
|
87
|
-
if ( ix >= 0 ) structure[ix].push ( [i, kProp] )
|
|
88
|
-
if ( isArray ) structure[i][0] = 'array'
|
|
89
|
-
|
|
90
|
-
propDone [i] = k
|
|
91
|
-
for (let el in d[k] ) {
|
|
92
|
-
let val = d[k][el];
|
|
93
|
-
if ( val === '_fake$$$' ) return // Remove fake data generated from 'toType' function
|
|
94
|
-
value [`root/${i}/${el}` ] = val
|
|
37
|
+
// Add containers to other data in buffer. Modify the data according the container type
|
|
38
|
+
const containerEntries = Object.entries ( containers );
|
|
39
|
+
containerEntries.forEach ( ([ k, t]) => {
|
|
40
|
+
if ( buffer[k] === 'object' ) return
|
|
41
|
+
if ( buffer[k] ) {
|
|
42
|
+
const isArray = buffer[k] instanceof Array;
|
|
43
|
+
if ( t === 'array' && !isArray ) {
|
|
44
|
+
const list = Object.values ( buffer[k] )
|
|
45
|
+
buffer[k] = list
|
|
95
46
|
}
|
|
96
|
-
|
|
97
|
-
|
|
47
|
+
return
|
|
48
|
+
}
|
|
49
|
+
const structure = ( t === 'object' ) ? {} : [];
|
|
50
|
+
buffer[k] = structure
|
|
51
|
+
}) // containerEntries forEach
|
|
52
|
+
|
|
53
|
+
const bufferEntries = Object.entries ( buffer ).sort();
|
|
54
|
+
bufferEntries.forEach ( ([ breadcrumbs, flatData]) => {
|
|
55
|
+
const
|
|
56
|
+
name = breadcrumbs.split ( '/' ).pop ()
|
|
57
|
+
, parent = breadcrumbs.replace ( `/${name}`, '' )
|
|
58
|
+
, dcopy = flatData instanceof Array ? [...flatData] : {...flatData}
|
|
59
|
+
, line = [ name, dcopy, breadcrumbs, [] ]
|
|
60
|
+
;
|
|
61
|
+
|
|
62
|
+
indexes[breadcrumbs] = line
|
|
63
|
+
dt.push ( line )
|
|
64
|
+
if ( breadcrumbs === 'root' ) return
|
|
65
|
+
if ( !parent ) return
|
|
66
|
+
if ( indexes[parent] ) indexes[parent][3].push ( breadcrumbs )
|
|
67
|
+
}) // forEach entry
|
|
68
|
+
|
|
69
|
+
const copy = walk ({ data : d })
|
|
70
|
+
return [ copy, indexes, dt ]
|
|
98
71
|
} // toFlat func.
|
|
99
72
|
|
|
100
73
|
|
|
101
74
|
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
let
|
|
117
|
-
[ objNumber, objName ] = el
|
|
118
|
-
, midKey = `${activeKey}/${objName}`
|
|
119
|
-
;
|
|
120
|
-
result [ midKey ] = {}
|
|
121
|
-
keys [ objNumber ] = midKey
|
|
122
|
-
})
|
|
123
|
-
})
|
|
124
|
-
let
|
|
125
|
-
valueKeys = Object.keys ( value )
|
|
126
|
-
, valueCheck = new Set ()
|
|
127
|
-
;
|
|
128
|
-
for (let k of valueKeys ) { // Organize values per midFlat object
|
|
129
|
-
let
|
|
130
|
-
[ , n ,prop ] = k.split ( '/' )
|
|
131
|
-
, midKey = keys[n]
|
|
132
|
-
;
|
|
133
|
-
valueCheck.add(n)
|
|
134
|
-
result[midKey][prop] = value[k]
|
|
135
|
-
}
|
|
136
|
-
structure.forEach ( row => { // Set a fake value into array objects. Preserve 'array' during midflat operations
|
|
137
|
-
let
|
|
138
|
-
[ type, n, ...objects ] = row
|
|
139
|
-
, midKey = keys [ n ]
|
|
140
|
-
, noValue = !valueCheck.has(n.toString())
|
|
141
|
-
, hasNoObjects = !( objects.length > 0 )
|
|
142
|
-
;
|
|
143
|
-
if ( type === 'array' && noValue && hasNoObjects ) result[midKey]['-1'] = '_fake$$$'
|
|
144
|
-
})
|
|
75
|
+
function toType ( dt ) { // Converts data to midFlat
|
|
76
|
+
const result = {};
|
|
77
|
+
dt.forEach ( line => {
|
|
78
|
+
const
|
|
79
|
+
[ , flatData, breadcrumbs ] = line
|
|
80
|
+
, isEmpty = (Object.keys ( flatData ).length === 0)
|
|
81
|
+
;
|
|
82
|
+
if ( isEmpty ) return
|
|
83
|
+
const
|
|
84
|
+
br = breadcrumbs.replace ( 'root/', '' )
|
|
85
|
+
, d = flatData instanceof Array ? [...flatData] : {...flatData}
|
|
86
|
+
;
|
|
87
|
+
result [br] = d
|
|
88
|
+
}) // forEach line
|
|
145
89
|
return result
|
|
146
90
|
} // toType func.
|
|
147
91
|
|
|
@@ -2,59 +2,51 @@
|
|
|
2
2
|
|
|
3
3
|
|
|
4
4
|
|
|
5
|
-
function toFlat ( dependencies, d ) {
|
|
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
|
-
walk ({
|
|
52
|
-
data : d,
|
|
53
|
-
keyCallback : keyCalls,
|
|
54
|
-
objectCallback : objectCalls
|
|
55
|
-
})
|
|
56
|
-
|
|
57
|
-
return [ structure, value ]
|
|
5
|
+
function toFlat ( dependencies, d ) { // Convert data to 'dt' model
|
|
6
|
+
const dataType = d instanceof Array ? [] : {}
|
|
7
|
+
const
|
|
8
|
+
{ walk } = dependencies ()
|
|
9
|
+
, dt = [
|
|
10
|
+
// Store record line positions:
|
|
11
|
+
// 0 1 2 3
|
|
12
|
+
// [ name, data , breadcrumbs, edges ]
|
|
13
|
+
[ 'root', dataType, 'root', [] ]
|
|
14
|
+
]
|
|
15
|
+
, index = { 'root' : dt[0] }
|
|
16
|
+
, dtDATA = 1 // Const: Flat data object in store record line;
|
|
17
|
+
, dtEDGES = 3 // Const: Edges in store record line;
|
|
18
|
+
;
|
|
19
|
+
|
|
20
|
+
function objCallbackFn ({ value, key, breadcrumbs }) {
|
|
21
|
+
const
|
|
22
|
+
isArray = value instanceof Array ? true : false
|
|
23
|
+
, dataType = isArray ? [] : {}
|
|
24
|
+
, objectName = key
|
|
25
|
+
, search = new RegExp ( `\/${key}$` )
|
|
26
|
+
, parentName = breadcrumbs.replace ( search, '' )
|
|
27
|
+
, newObject = [ objectName, dataType, breadcrumbs, [] ]
|
|
28
|
+
;
|
|
29
|
+
index[ parentName][dtEDGES].push ( breadcrumbs )
|
|
30
|
+
dt.push ( newObject )
|
|
31
|
+
index [ breadcrumbs ] = dt.at(-1)
|
|
32
|
+
return value
|
|
33
|
+
} // objCallbackFn
|
|
34
|
+
|
|
35
|
+
function keyCallbackFn ({ value, key, breadcrumbs }) {
|
|
36
|
+
const
|
|
37
|
+
search = new RegExp ( `\/${key}$` )
|
|
38
|
+
, parentName = breadcrumbs.replace ( search, '' )
|
|
39
|
+
;
|
|
40
|
+
index [parentName][dtDATA][key] = value
|
|
41
|
+
return value
|
|
42
|
+
} // keyCallbackFn
|
|
43
|
+
|
|
44
|
+
const copy = walk ({
|
|
45
|
+
data : d
|
|
46
|
+
, keyCallback : keyCallbackFn
|
|
47
|
+
, objectCallback : objCallbackFn
|
|
48
|
+
})
|
|
49
|
+
return [ { root:copy }, index, dt ]
|
|
58
50
|
} // getFlat func.
|
|
59
51
|
|
|
60
52
|
|
|
@@ -66,39 +58,23 @@ function toFlat ( dependencies, d ) {
|
|
|
66
58
|
|
|
67
59
|
|
|
68
60
|
|
|
69
|
-
function toType (
|
|
61
|
+
function toType ( dt ) {
|
|
70
62
|
let
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
;
|
|
87
|
-
local [propName] = value[k]
|
|
88
|
-
})
|
|
89
|
-
resultMap [id] = resultObjects.length
|
|
90
|
-
resultObjects.push ( local )
|
|
91
|
-
})
|
|
92
|
-
|
|
93
|
-
structure.forEach ( ([ , id, ...items]) => { // Conect data-structures
|
|
94
|
-
items.forEach ( ([link, propName]) => {
|
|
95
|
-
link = Number(link) || link;
|
|
96
|
-
let location = resultMap[link];
|
|
97
|
-
resultObjects[id][propName] = resultObjects[ location ]
|
|
98
|
-
})
|
|
99
|
-
})
|
|
100
|
-
|
|
101
|
-
return resultObjects[0]
|
|
63
|
+
result = {}
|
|
64
|
+
, revDT = dt.reverse ()
|
|
65
|
+
;
|
|
66
|
+
revDT.forEach ( ([ name, d, breadcrumbs, edges ]) => {
|
|
67
|
+
const copy = d instanceof Array ? [...d] : {...d};
|
|
68
|
+
|
|
69
|
+
result[breadcrumbs] = copy
|
|
70
|
+
edges.forEach ( edge => {
|
|
71
|
+
if ( result[edge] ) {
|
|
72
|
+
const name = edge.replace (`${breadcrumbs}/`, '' );
|
|
73
|
+
result[breadcrumbs][name] = result[edge]
|
|
74
|
+
}
|
|
75
|
+
})
|
|
76
|
+
})
|
|
77
|
+
return result['root']
|
|
102
78
|
} // toType func.
|
|
103
79
|
|
|
104
80
|
|
|
@@ -115,4 +91,3 @@ function toType ( dependencies, [ structure, value ]) {
|
|
|
115
91
|
|
|
116
92
|
export default { toFlat, toType }
|
|
117
93
|
|
|
118
|
-
|