commit 056d8c6f6ade415ea0e055e7a4917dbd1f383d88 Author: AI Engineer Date: Sat May 30 14:11:56 2026 +0800 feat: init jsmod registry (by AI) diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..b5c7525 --- /dev/null +++ b/.gitignore @@ -0,0 +1,7 @@ +.geminiignore +.gemini +.ai/ +env.json +env.yml +env.yaml +.log.meta.json diff --git a/go.mod b/go.mod new file mode 100644 index 0000000..7fbe0c1 --- /dev/null +++ b/go.mod @@ -0,0 +1,3 @@ +module apigo.cc/go/jsmod + +go 1.25.0 diff --git a/jsmod.go b/jsmod.go new file mode 100644 index 0000000..c7a4612 --- /dev/null +++ b/jsmod.go @@ -0,0 +1,35 @@ +package jsmod + +import "sync" + +var ( + modules = make(map[string]map[string]any) + mu sync.RWMutex +) + +// Register registers a Go module with its exported functions and properties. +// These modules will be accessible within the JS environment. +func Register(name string, exports map[string]any) { + mu.Lock() + defer mu.Unlock() + + if modules[name] == nil { + modules[name] = make(map[string]any, len(exports)) + } + + for k, v := range exports { + modules[name][k] = v + } +} + +// GetModules returns all registered modules for the JS engine to inject. +func GetModules() map[string]map[string]any { + mu.RLock() + defer mu.RUnlock() + + res := make(map[string]map[string]any, len(modules)) + for name, exports := range modules { + res[name] = exports + } + return res +} diff --git a/jsmod_test.go b/jsmod_test.go new file mode 100644 index 0000000..6b5bb25 --- /dev/null +++ b/jsmod_test.go @@ -0,0 +1,14 @@ +package jsmod_test + +import ( + "apigo.cc/go/jsmod" + "testing" +) + +func TestRegister(t *testing.T) { + jsmod.Register("test", map[string]any{"foo": "bar"}) + mods := jsmod.GetModules() + if mods["test"]["foo"] != "bar" { + t.Error("Register failed") + } +}