dt-toolbox 4.0.9 → 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.
Files changed (85) hide show
  1. package/Changelog.md +7 -12
  2. package/LICENSE +1 -1
  3. package/Migration.guide.md +14 -1
  4. package/README.md +976 -352
  5. package/README_v.2.x.x.md +0 -1
  6. package/README_v.4.x.x.md +532 -0
  7. package/package.json +24 -32
  8. package/src/convertors/index.js +44 -37
  9. package/src/convertors/midflat.js +77 -133
  10. package/src/convertors/standard.js +62 -87
  11. package/src/convertors/tuples.js +171 -0
  12. package/src/flatData/connect.js +50 -0
  13. package/src/flatData/export.js +46 -0
  14. package/src/flatData/filters/list.js +11 -0
  15. package/src/flatData/filters/listObject.js +13 -0
  16. package/src/flatData/filters/object.js +12 -0
  17. package/src/flatData/filters/root.js +12 -0
  18. package/src/flatData/find.js +20 -0
  19. package/src/flatData/from.js +33 -0
  20. package/src/flatData/get.js +29 -0
  21. package/src/flatData/index.js +101 -0
  22. package/src/flatData/insert.js +24 -0
  23. package/src/flatData/like.js +24 -0
  24. package/src/flatData/look.js +49 -0
  25. package/src/flatData/push.js +19 -0
  26. package/src/flatData/save.js +17 -0
  27. package/src/flatData/set.js +26 -0
  28. package/src/flatData/setupFilter.js +21 -0
  29. package/src/flatData/use.js +16 -0
  30. package/src/flatObject/copy.js +19 -0
  31. package/src/flatObject/export.js +13 -0
  32. package/src/flatObject/index.js +47 -0
  33. package/src/flatObject/insert.js +28 -0
  34. package/src/flatObject/model.js +32 -0
  35. package/src/flatObject/query.js +24 -0
  36. package/src/flatObject/setupFilter.js +12 -0
  37. package/src/main.js +21 -690
  38. package/src/mainLib.js +105 -0
  39. package/dist/dt-toolbox.min.js +0 -1
  40. package/dist/index.html +0 -65
  41. package/src/compareMethod/change.js +0 -21
  42. package/src/compareMethod/different.js +0 -18
  43. package/src/compareMethod/identical.js +0 -21
  44. package/src/compareMethod/index.js +0 -16
  45. package/src/compareMethod/missing.js +0 -18
  46. package/src/compareMethod/same.js +0 -18
  47. package/src/convertors/breadcrumbs.js +0 -148
  48. package/src/help/extractSelection.js +0 -12
  49. package/src/help/filterObject.js +0 -25
  50. package/src/help/hasNumbers.js +0 -14
  51. package/src/help/index.js +0 -37
  52. package/src/help/isItPrimitive.js +0 -10
  53. package/src/help/objectsByLevel.js +0 -16
  54. package/src/help/reduceTuples.js +0 -29
  55. package/src/help/sanitizeFlatKeys.js +0 -30
  56. package/src/help/toBreadcrumbsKeys.js +0 -28
  57. package/src/help/tuplesToBreadcrumbs.js +0 -25
  58. package/src/help/updateSelection.js +0 -14
  59. package/src/help/zipObject.js +0 -24
  60. package/src/lib/assemble.js +0 -45
  61. package/src/lib/attach.js +0 -20
  62. package/src/lib/block.js +0 -33
  63. package/src/lib/combine.js +0 -38
  64. package/src/lib/deep.js +0 -23
  65. package/src/lib/find.js +0 -36
  66. package/src/lib/folder.js +0 -42
  67. package/src/lib/index.js +0 -58
  68. package/src/lib/modify.js +0 -22
  69. package/src/lib/parent.js +0 -51
  70. package/src/lib/purify.js +0 -39
  71. package/src/lib/transform.js +0 -55
  72. package/src/modifiers/add.js +0 -18
  73. package/src/modifiers/append.js +0 -18
  74. package/src/modifiers/combineShallow.js +0 -119
  75. package/src/modifiers/flatten.js +0 -39
  76. package/src/modifiers/index.js +0 -34
  77. package/src/modifiers/insert.js +0 -21
  78. package/src/modifiers/keyPrefix.js +0 -27
  79. package/src/modifiers/mix.js +0 -25
  80. package/src/modifiers/overwrite.js +0 -18
  81. package/src/modifiers/prepend.js +0 -19
  82. package/src/modifiers/reverse.js +0 -23
  83. package/src/modifiers/update.js +0 -18
  84. package/src/simple.js +0 -49
  85. package/webpack.config.js +0 -28
@@ -1,47 +1,34 @@
1
1
  'use strict'
2
2
 
3
- const
4
- breadcrumbs = require ( './breadcrumbs' )
5
- , std = require ( './standard' )
6
- , midFlat = require ( './midflat' )
7
- ;
3
+ import std from './standard.js'
4
+ import midFlat from './midflat.js'
5
+ import tuples from './tuples.js'
8
6
 
9
7
 
10
8
 
11
9
  const selectConvertorFrom =
12
10
  ( type ) =>
13
11
  ( dependencies, inData ) => {
14
- let
15
- { help } = dependencies
16
- , vBuffer = [] // keep values during key's sanitize procedure
17
- , rawKeys
18
- , keyList
19
- , rawValue
20
- ;
21
12
  switch ( type ) {
22
13
  case 'std' :
23
14
  case 'standard':
24
15
  return std.toFlat ( dependencies, inData )
25
16
  case 'tuple' :
26
17
  case 'tuples' :
27
- inData = help.tuplesToBradcrumbs ( dependencies, inData )
18
+ return tuples.toFlat ( dependencies, inData )
28
19
  case 'breadcrumb' :
29
20
  case 'breadcrumbs' :
30
- rawKeys = Object.keys ( inData )
31
- vBuffer = rawKeys.map ( k => inData[k] )
32
- keyList = help.sanitizeFlatKeys ( rawKeys )
33
- rawValue = help.zipObject ( keyList, vBuffer )
34
- return breadcrumbs.toFlat ( dependencies, rawValue )
21
+ const br = Object.entries ( inData );
22
+ return tuples.toFlat ( dependencies, br )
35
23
  case 'file' :
36
24
  case 'files' :
37
- rawKeys = inData.map ( el => { // extract keys from files
38
- let arr = el.split('/');
39
- vBuffer.push ( arr.pop() )
40
- return arr.join ( '/' )
41
- })
42
- keyList = help.sanitizeFlatKeys ( rawKeys )
43
- rawValue = help.zipObject ( keyList, vBuffer )
44
- 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 )
45
32
  case 'midFlat' :
46
33
  return midFlat.toFlat ( dependencies, inData )
47
34
  }
@@ -61,29 +48,49 @@ function from ( type ) { // convert from something to flat...
61
48
 
62
49
 
63
50
  function to ( type, dependencies, inData ) { // convert from flat to 'data-type'...
64
- const { help } = dependencies;
51
+ const
52
+ breadcrumbs = {}
53
+ , check = new Set()
54
+ , extend = new Set()
55
+ ;
56
+ let tups, count = 0;
65
57
  switch ( type ) {
66
58
  case 'std' :
67
59
  case 'standard':
68
- return std.toType ( dependencies, inData )
60
+ return std.toType ( inData )
69
61
  case 'midFlat' :
70
- return midFlat.toType ( dependencies, inData )
62
+ return midFlat.toType ( inData )
71
63
  case 'tuple':
72
64
  case 'tuples':
73
- let breadData = breadcrumbs.toType ( dependencies, inData )
74
- return help.reduceTuples ( dependencies, breadData )
65
+ return tuples.toType ( inData )
66
+ case 'files':
67
+ tups = tuples.toType ( inData );
68
+ return tups.map ( ([k,v]) => `${k}/${v}`)
75
69
  case 'breadcrumb' :
76
70
  case 'breadcrumbs':
77
- return breadcrumbs.toType ( dependencies,inData )
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
78
89
  } //switch type
79
90
  } // to func.
80
91
 
81
92
 
82
93
 
83
-
84
-
85
- module.exports = { from, to }
86
-
87
-
94
+ export default { from, to }
88
95
 
89
96
 
@@ -2,151 +2,95 @@
2
2
 
3
3
 
4
4
 
5
- function toFlat ( dependencies, d ) { // Converts data to shortFlat
6
- if ( Object.keys(d).length === 0 ) {
7
- let
8
- structure = [ [ 'object', 0 ] ]
9
- , value = {}
10
- ;
11
- return [ structure, value ]
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
- keyList.forEach ( keyArr => { // Setup our temp structures: tProps and structRaw
27
- keyArr.forEach ( (k,i) => {
28
- let parent = keyArr.slice( 0, i ).join ( '/' );
29
- if ( !parent ) return
30
- if ( !tProps[parent] ) {
31
- tProps[parent] = new Set()
32
- structRaw.push ( parent )
33
- }
34
- tProps[parent].add ( k )
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
- Array.from ( structRaw.reduce ((res,ls)=> { // Add flat objects paths
39
- res.add ( ls )
40
- let flatList;
41
- const spot = tProps[ls];
42
- if ( spot == null ) return res
43
- flatList = Array.from ( spot )
44
- flatList.forEach ( el => res.add ( `${ls}/${el}` ) )
45
- return res
46
- }, new Set() )
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
- }) // keys foreach
97
- return [ structure, value ]
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
- function toType ( dependencies, [structure, value] ) { // Converts data to midFlat
105
- let
106
- result = { 'root': {} }
107
- , keys = {'0':'root'}
108
- , activeKey
109
- ;
110
- structure.forEach ( (row,i) => { // Define relation between structure number and midkeys. Var 'keys'.
111
- if ( keys[i] != null ) activeKey = keys[i]
112
- else activeKey = 'root'
113
-
114
- row.forEach ( (el,j) => { // Collect all defined sub structures
115
- if ( j < 2 ) return
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
 
148
92
 
149
93
 
150
- module.exports = { toFlat, toType }
94
+ export default { toFlat, toType }
151
95
 
152
96
 
@@ -2,59 +2,51 @@
2
2
 
3
3
 
4
4
 
5
- function toFlat ( dependencies, d ) {
6
- let
7
- value = dependencies.empty ()
8
- , { help, walk } = dependencies
9
- , { findType } = help
10
- , structure = []
11
- , objectCounter = 0
12
- , currentObjectID = 0 // In use for values in keyCalls function
13
- , objectIndex = {} // Map breadcrumb -> structure row number
14
- ;
15
-
16
- function objectCalls ({value:obj, breadcrumbs }) {
17
- let
18
- location = breadcrumbs.split ( '/' )
19
- , objectName = location.pop()
20
- ;
21
-
22
- structure.push ( [findType(obj), objectCounter])
23
- objectIndex[breadcrumbs] = objectCounter
24
- currentObjectID = objectCounter
25
-
26
- let
27
- hostName = location.join ( '/' )
28
- , hostID = objectIndex[hostName]
29
- ;
30
-
31
- if ( hostID >= 0 ) structure[hostID].push ([objectCounter, objectName])
32
-
33
- objectCounter++
34
- return obj
35
- } // objectCalls func.
36
-
37
- function keyCalls ({ value:v, key:k, breadcrumbs }) {
38
- const location = breadcrumbs.split('/');
39
- location.pop ()
40
- const
41
- hostName = location.join ( '/' )
42
- , hostID = objectIndex [ hostName ]
43
- ;
44
- value[`root/${hostID}/${k}`] = v
45
- return v
46
- } // keyCalls func.
47
-
48
- structure.push ([ findType(d), objectCounter++ ])
49
- objectIndex["root"] = 0
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 ( dependencies, [ structure, value ]) {
61
+ function toType ( dt ) {
70
62
  let
71
- keys = Object.keys ( value )
72
- , resultObjects = []
73
- , resultMap = {}
74
- ;
75
-
76
- structure.forEach ( ([type, id, ...items]) => { // Create data-structures
77
- let local;
78
- if ( type == 'array' ) local = []
79
- else local = {}
80
-
81
- let selectedKeys = keys.filter ( k => k.includes(`root/${id}/`));
82
- selectedKeys.forEach ( k => { // Fill with primitive data
83
- let
84
- arr = k.split ( '/' )
85
- , propName = arr [arr.length-1]
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
 
@@ -113,6 +89,5 @@ function toType ( dependencies, [ structure, value ]) {
113
89
 
114
90
 
115
91
 
116
- module.exports = { toFlat, toType }
117
-
92
+ export default { toFlat, toType }
118
93