support import plugin
add console.input
This commit is contained in:
parent
8179d73ae0
commit
fa8fa86074
34
gojs.go
34
gojs.go
@ -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
|
||||
|
11
ts.go
11
ts.go
@ -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)
|
||||
}
|
||||
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),
|
||||
|
Loading…
Reference in New Issue
Block a user