-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathastToConfig.js
More file actions
46 lines (43 loc) · 1.45 KB
/
astToConfig.js
File metadata and controls
46 lines (43 loc) · 1.45 KB
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
export const astToConfig = (ast) => {
const {subvalues, suffix} = ast
if (Array.isArray(subvalues) === false) throw Error('expected subvalues array')
if (typeof suffix !== 'string') throw Error('expected string suffix')
if (subvalues.length === 0) return suffixToJs(suffix)
const first = subvalues[0]
const key = first.prefix.trim()
if (key === '') return astToArray(ast)
return astToObject(ast)
}
const suffixToJs = (suffix) => {
if (suffix === 'true') return true
if (suffix === 'false') return false
if (suffix === 'null') return null
if (suffix === 'undefined') return undefined
const num = +suffix
if (Number.isNaN(num) === false) return num
return suffix
}
const astToArray = (ast) => {
const {subvalues, suffix} = ast
if (suffix.trim() !== '') throw Error('expected empty suffix')
const ret = []
for (const item of subvalues) {
if (item.prefix.trim() !== '') throw Error('expected empty padding')
ret.push(astToConfig(item.value))
}
return ret
}
const astToObject = (ast) => {
const {subvalues, suffix} = ast
if (suffix.trim() !== '') throw Error('expected empty suffix')
const ret = {}
for (const item of subvalues) {
const trimmed = item.prefix.trim()
if (trimmed === '') throw Error('expected nonempty key')
if (trimmed.startsWith('-')) continue
const i = trimmed.indexOf('\n')
const key = i === -1? trimmed: trimmed.slice(0, i).trim()
ret[key] = astToConfig(item.value)
}
return ret
}