-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathengine_mod.go
65 lines (57 loc) · 1.28 KB
/
engine_mod.go
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
package engine
import (
"bytes"
_ "embed"
"github.com/ZenLiuCN/fn"
)
// Mod is a top level objects that not required to import
type Mod interface {
Name() string
}
type InitializeMod interface {
Mod
Initialize(e *Engine) Mod // create copy of module with new Engine
}
type TopMod interface {
Mod
Register(e *Engine)
}
var (
//go:embed global.d.ts
globalDefine []byte
registry = map[string]Mod{}
)
// RegisterMod a default global module , returns false if already exists
func RegisterMod(module Mod) bool {
if _, ok := registry[module.Name()]; ok {
return false
}
registry[module.Name()] = module
return true
}
// Mods of global registered
func Mods() []Mod {
return fn.MapValues(registry)
}
// RemoveMod preloaded module
func RemoveMod(mod string) {
delete(registry, mod)
}
// TypeDefined the element with typescript defines
type TypeDefined interface {
TypeDefine() []byte
}
// ModDefines dump all possible type define (d.ts format) in registry
func ModDefines() []byte {
var b bytes.Buffer
b.WriteString("declare global{\n")
b.Write(globalDefine)
for _, module := range registry {
if d, ok := module.(TypeDefined); ok {
b.WriteRune('\n')
b.Write(bytes.ReplaceAll(d.TypeDefine(), []byte("declare "), []byte("export ")))
}
}
b.WriteString("}\n")
return b.Bytes()
}