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
|
import get from 'lodash/get'
import keyBy from 'lodash/keyBy'
import { getBehaviourParams } from '../../keymap'
export function makeIndex (tree) {
const index = []
;(function traverse(tree) {
const params = tree.params || []
index.push(tree)
params.forEach(traverse)
})(tree)
return index
}
export function isSimple(normalized) {
const [first] = normalized.params
const symbol = get(first, 'source.symbol', get(first, 'source.code', ''))
const shortSymbol = symbol.length === 1
const singleParam = normalized.params.length === 1
return singleParam && shortSymbol
}
export function isComplex(normalized, behaviourParams) {
const [first] = normalized.params
const symbol = get(first, 'source.symbol', get(first, 'value', ''))
const isLongSymbol = symbol.length > 4
const isMultiParam = behaviourParams.length > 1
const isNestedParam = get(first, 'params', []).length > 0
return isLongSymbol || isMultiParam || isNestedParam
}
export function createPromptMessage(param) {
const promptMapping = {
layer: 'Select layer',
mod: 'Select modifier',
behaviour: 'Select behaviour',
command: 'Select command',
keycode: 'Select key code'
}
if (param.name) {
return `Select ${param.name}`
}
return (
promptMapping[param] ||
promptMapping.keycode
)
}
export function hydrateTree(value, params, sources) {
const bind = value
const behaviour = get(sources.behaviours, bind)
const behaviourParams = getBehaviourParams(params, behaviour)
const commands = keyBy(behaviour.commands, 'code')
function getSourceValue(value, as) {
if (as === 'command') return commands[value]
if (as === 'raw' || as.enum) return { code: value }
return sources?.[as]?.[value]
}
function hydrateNode(node, as) {
if (!node) {
return { value: undefined, params: [] }
}
const { value, params } = node
const source = getSourceValue(value, as)
return {
value,
source,
params: get(source, 'params', []).map((as, i) => (
hydrateNode(params[i], as)
))
}
}
return {
value,
source: behaviour,
params: behaviourParams.map((as, i) => (
hydrateNode(params[i], as)
))
}
}
|