support import plugin

add console.input
This commit is contained in:
Star 2024-03-16 22:50:05 +08:00
parent 8179d73ae0
commit fa8fa86074
2 changed files with 38 additions and 9 deletions

34
gojs.go
View File

@ -42,8 +42,15 @@ func (rt *JSRuntime) Close() {
rt.rt.Close()
}
var pluginIdFixer = regexp.MustCompile("[^a-zA-Z0-9_]")
func fixPluginId(id string) string {
return "_" + pluginIdFixer.ReplaceAllString(id, "_")
}
func (rt *JSRuntime) run(code string) (out interface{}, err error, stack string) {
// support import
tryPlugins := map[string]bool{}
code = importMatcher.ReplaceAllStringFunc(code, func(importStr string) string {
m := importMatcher.FindStringSubmatch(importStr)
importVar := rt.imported[m[2]]
@ -69,7 +76,11 @@ func (rt *JSRuntime) run(code string) (out interface{}, err error, stack string)
importVar = "import_" + u.UniqueId()
rt.imported[m[2]] = importVar
importedCode := exportMatcher.ReplaceAllStringFunc(importCode, func(exportStr string) string {
return strings.Replace(exportStr, "export", "return", 1)
if strings.Contains(exportStr, "export default") {
exportStr = strings.Replace(exportStr, "export default", "return", 1)
}
exportStr = strings.Replace(exportStr, "export", "return", 1)
return exportStr
})
err, stack := rt.Exec("let " + importVar + " = (function(){" + importedCode + "})()")
if err != nil {
@ -80,7 +91,10 @@ func (rt *JSRuntime) run(code string) (out interface{}, err error, stack string)
}
return "let " + m[1] + " = " + importVar
} else {
// ignore ts and plugin
if plg := plugin.Get(m[2]); plg != nil {
tryPlugins[m[2]] = true
return "let " + m[1] + " = " + fixPluginId(m[2])
}
return ""
}
} else {
@ -88,15 +102,16 @@ func (rt *JSRuntime) run(code string) (out interface{}, err error, stack string)
}
})
tryPlugins := map[string]bool{}
for _, m := range pluginNameMatcher.FindAllStringSubmatch(code, 1024) {
tryPlugins[m[1]] = true
}
//tryPlugins := map[string]bool{}
//for _, m := range pluginNameMatcher.FindAllStringSubmatch(code, 1024) {
// tryPlugins[m[1]] = true
//}
for _, plg := range plugin.List() {
if tryPlugins[plg.Id] && rt.plugins[plg.Id] == nil {
//if rt.plugins[plg.Id] == nil {
rt.plugins[plg.Id] = &plg
rt.JsCtx.Globals().Set(plg.Id, MakeJsValueForPlugin(rt.GoCtx, plg.Objects, plg.Id, false))
rt.JsCtx.Globals().Set(fixPluginId(plg.Id), MakeJsValueForPlugin(rt.GoCtx, plg.Objects, plg.Id, false))
if plg.JsCode != "" {
if result, err := rt.JsCtx.Eval(plg.JsCode); err != nil {
stack := GetJSError(err, plg.JsCode)
@ -207,6 +222,11 @@ func New(option *RuntimeOption) *JSRuntime {
"error": func(args ...interface{}) {
fmt.Println(makeStringArray(args, u.TextWhite, u.BgRed)...)
},
"input": func() string {
line := ""
_, _ = fmt.Scanln(&line)
return line
},
}, false))
// 注入 logger

13
ts.go
View File

@ -16,6 +16,7 @@ type ArgInfo struct {
isOutArg bool
isFunc bool
isSkip bool
isOptional bool
funcInArgs []ArgInfo
funcOutArgs []ArgInfo
Name string
@ -70,7 +71,7 @@ func (argInfo *ArgInfo) String() string {
if argInfo.isVariadic {
argName = "..." + argName
}
return argName + ": " + argType
return argName + u.StringIf(argInfo.isOptional, "?: ", ": ") + argType
}
}
@ -185,7 +186,14 @@ func makeFieldElemType(t reflect.Type, existsClasses *map[string]bool, classes *
if t.Elem().Kind() == reflect.Struct && !isSkip {
makeClass(t.Elem(), existsClasses, classes)
}
return "Map<" + makeArgTypeString(t.Key().String()) + ", " + makeFieldElemType(t.Elem(), existsClasses, classes, isSkip) + ">"
et := t.Elem()
if et.Kind() == reflect.Pointer {
et = et.Elem()
}
if et.Kind() == reflect.Struct || et.Kind() == reflect.Map || (et.Kind() == reflect.Slice && et.Elem().Kind() != reflect.Uint8) {
return "Map<" + makeArgTypeString(t.Key().String()) + ", " + makeFieldElemType(t.Elem(), existsClasses, classes, isSkip) + ">"
}
return "Object"
} else if t.Kind() == reflect.Slice && t.Elem().Kind() != reflect.Uint8 {
if t.Elem().Kind() == reflect.Struct && !isSkip {
makeClass(t.Elem(), existsClasses, classes)
@ -258,6 +266,7 @@ func makeFuncInOutArgs(t reflect.Type, existsClasses *map[string]bool, classes *
isOutArg: false,
isFunc: false,
isSkip: false,
isOptional: arg.Kind() == reflect.Pointer,
isVariadic: t.IsVariadic() && i == t.NumIn()-1,
Name: "",
Type: makeFieldElemType(arg, existsClasses, classes, true),