-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathreferences.mjs
More file actions
59 lines (48 loc) · 1.28 KB
/
references.mjs
File metadata and controls
59 lines (48 loc) · 1.28 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
47
48
49
50
51
52
53
54
55
56
57
58
59
import { awaitSymbol, call, ref } from './symbol.mjs'
function instrument (path) {
function reference (...args) {
const called = instrument(path)
called.toJSON = () => ({
[call]: call,
call: true,
ref: reference,
args
})
return called
}
reference.then = (resolve) => {
const awaited = instrument(path)
delete awaited.then
awaited.toJSON = () => ({
[awaitSymbol]: awaitSymbol,
await: true,
ref: reference
})
return resolve(awaited)
}
reference.toJSON = () => ({
[ref]: ref,
reference: true,
path
})
return reference
}
export default function module (schema, parentPath = []) {
return schema.reduce((acc, item) => {
if (typeof item === 'string') {
// leaf function
acc[item] = instrument([...parentPath, item])
} else if (Array.isArray(item)) {
const [name, children] = item
if (Array.isArray(children)) {
// recurse: children can be strings or [name, children] arrays
acc[name] = module(children, [...parentPath, name])
} else {
throw new Error(`Expected children array for namespace "${name}"`)
}
} else {
throw new Error('Schema items must be strings or [name, children] arrays')
}
return acc
}, {})
}