-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathapi.js
101 lines (84 loc) · 2.41 KB
/
api.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
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
// GET https://sheets.googleapis.com/v4/spreadsheets/18J84rwqwC9AuyabZAK9d4JM6cUZn8jBnhZoT0NHMTp8/values/Sheet1!A1:D5
const {camelCase} = require('change-case')
const flatMap = require('lodash.flatmap')
/*------------------------------------------------------------------------------
Utility functions
------------------------------------------------------------------------------*/
const {toPairs, fromPairs, pipe} = require('./utils')
/*------------------------------------------------------------------------------
objectFromMxGoogleDoc
------------------------------------------------------------------------------*/
function objectFromMxGoogleDoc({values}) {
let section
let expectColumnNames = false
let columnNames
return values.reduce((result, row) => {
if (row.length === 0) {
return result
}
if (row.length === 1) {
section = camelCase(row[0])
expectColumnNames = true
return {
...result,
[section]: []
}
}
if (section === 'diagramProperties') {
result[section].push({
[camelCase(row[1])]: row[2]
})
return result
}
if (expectColumnNames) {
expectColumnNames = false
columnNames = row.filter(col => col.length)
return result
}
result[section].push(
keysAndValuesToObject(columnNames, row)
)
return result
}, {})
}
const cleanupDiagramProperties = input => ({
...input,
diagramProperties: fromPairs(flatMap(input.diagramProperties, toPairs))
})
function keysAndValuesToObject(keys, values) {
return keys.reduce((result, key, index) => ({
...result,
[camelCase(key)]: values[index]
}), {})
}
function deepNumericValuesToIntegers(arg) {
if (Array.isArray(arg)) {
return arg.map(deepNumericValuesToIntegers)
}
if (typeof arg !== 'object') {
return /^-?\d+$/.test(arg) ? parseInt(arg, 10) : arg
}
return Object
.entries(arg)
.reduce((result, [key, value]) => ({
...result,
[key]: deepNumericValuesToIntegers(value)
}), {})
}
const mxToObject = (doc, toJson = false) => {
const fromJson = typeof doc === 'string'
? JSON.parse
: x => x
toJson = (typeof toJson === 'function' && toJson)
|| toJson
? arg => JSON.stringify(arg, null, 2)
: x => x
return pipe(
fromJson,
objectFromMxGoogleDoc,
cleanupDiagramProperties,
deepNumericValuesToIntegers,
toJson
)(doc)
}
module.exports = mxToObject