-
Notifications
You must be signed in to change notification settings - Fork 57
Expand file tree
/
Copy pathregistry.js
More file actions
49 lines (47 loc) · 1.45 KB
/
registry.js
File metadata and controls
49 lines (47 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
47
48
49
const registry = {}
export default registry
import { getCurrentContext } from "./context"
import Nullstack from '.'
import { load } from "./lazy"
export function register(klass, functionName) {
if (functionName) {
registry[`${klass.hash}.${functionName}`] = klass[functionName]
} else {
registry[klass.hash] = klass
bindStaticProps(klass)
}
}
function bindStaticProps(klass) {
let parent = klass
while (parent !== Nullstack) {
const props = Object.getOwnPropertyNames(parent)
for (const prop of props) {
if (prop === 'caller' || prop === 'callee' || prop === 'arguments') continue
const underscored = prop.startsWith('_')
if (typeof klass[prop] === 'function') {
if (!underscored && !registry[`${parent.hash}.${prop}`]) {
return
}
const propName = `__NULLSTACK_${prop}`
if (!klass[propName]) {
klass[propName] = klass[prop]
}
async function _invoke(...args) {
if (underscored) {
return klass[propName].call(klass, ...args)
}
const params = args[0] || {}
const currentContext = getCurrentContext(params)
await load(klass.hash)
return klass[propName].call(klass, currentContext)
}
if (module.hot) {
_invoke.hash = klass[prop].hash
}
klass[prop] = _invoke
klass.prototype[prop] = _invoke
}
}
parent = Object.getPrototypeOf(parent)
}
}