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()
|
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) {
|
func (rt *JSRuntime) run(code string) (out interface{}, err error, stack string) {
|
||||||
// support import
|
// support import
|
||||||
|
tryPlugins := map[string]bool{}
|
||||||
code = importMatcher.ReplaceAllStringFunc(code, func(importStr string) string {
|
code = importMatcher.ReplaceAllStringFunc(code, func(importStr string) string {
|
||||||
m := importMatcher.FindStringSubmatch(importStr)
|
m := importMatcher.FindStringSubmatch(importStr)
|
||||||
importVar := rt.imported[m[2]]
|
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()
|
importVar = "import_" + u.UniqueId()
|
||||||
rt.imported[m[2]] = importVar
|
rt.imported[m[2]] = importVar
|
||||||
importedCode := exportMatcher.ReplaceAllStringFunc(importCode, func(exportStr string) string {
|
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 + "})()")
|
err, stack := rt.Exec("let " + importVar + " = (function(){" + importedCode + "})()")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@ -80,7 +91,10 @@ func (rt *JSRuntime) run(code string) (out interface{}, err error, stack string)
|
|||||||
}
|
}
|
||||||
return "let " + m[1] + " = " + importVar
|
return "let " + m[1] + " = " + importVar
|
||||||
} else {
|
} 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 ""
|
return ""
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
@ -88,15 +102,16 @@ func (rt *JSRuntime) run(code string) (out interface{}, err error, stack string)
|
|||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
tryPlugins := map[string]bool{}
|
//tryPlugins := map[string]bool{}
|
||||||
for _, m := range pluginNameMatcher.FindAllStringSubmatch(code, 1024) {
|
//for _, m := range pluginNameMatcher.FindAllStringSubmatch(code, 1024) {
|
||||||
tryPlugins[m[1]] = true
|
// tryPlugins[m[1]] = true
|
||||||
}
|
//}
|
||||||
|
|
||||||
for _, plg := range plugin.List() {
|
for _, plg := range plugin.List() {
|
||||||
if tryPlugins[plg.Id] && rt.plugins[plg.Id] == nil {
|
if tryPlugins[plg.Id] && rt.plugins[plg.Id] == nil {
|
||||||
|
//if rt.plugins[plg.Id] == nil {
|
||||||
rt.plugins[plg.Id] = &plg
|
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 plg.JsCode != "" {
|
||||||
if result, err := rt.JsCtx.Eval(plg.JsCode); err != nil {
|
if result, err := rt.JsCtx.Eval(plg.JsCode); err != nil {
|
||||||
stack := GetJSError(err, plg.JsCode)
|
stack := GetJSError(err, plg.JsCode)
|
||||||
@ -207,6 +222,11 @@ func New(option *RuntimeOption) *JSRuntime {
|
|||||||
"error": func(args ...interface{}) {
|
"error": func(args ...interface{}) {
|
||||||
fmt.Println(makeStringArray(args, u.TextWhite, u.BgRed)...)
|
fmt.Println(makeStringArray(args, u.TextWhite, u.BgRed)...)
|
||||||
},
|
},
|
||||||
|
"input": func() string {
|
||||||
|
line := ""
|
||||||
|
_, _ = fmt.Scanln(&line)
|
||||||
|
return line
|
||||||
|
},
|
||||||
}, false))
|
}, false))
|
||||||
|
|
||||||
// 注入 logger
|
// 注入 logger
|
||||||
|
11
ts.go
11
ts.go
@ -16,6 +16,7 @@ type ArgInfo struct {
|
|||||||
isOutArg bool
|
isOutArg bool
|
||||||
isFunc bool
|
isFunc bool
|
||||||
isSkip bool
|
isSkip bool
|
||||||
|
isOptional bool
|
||||||
funcInArgs []ArgInfo
|
funcInArgs []ArgInfo
|
||||||
funcOutArgs []ArgInfo
|
funcOutArgs []ArgInfo
|
||||||
Name string
|
Name string
|
||||||
@ -70,7 +71,7 @@ func (argInfo *ArgInfo) String() string {
|
|||||||
if argInfo.isVariadic {
|
if argInfo.isVariadic {
|
||||||
argName = "..." + argName
|
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 {
|
if t.Elem().Kind() == reflect.Struct && !isSkip {
|
||||||
makeClass(t.Elem(), existsClasses, classes)
|
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 "Map<" + makeArgTypeString(t.Key().String()) + ", " + makeFieldElemType(t.Elem(), existsClasses, classes, isSkip) + ">"
|
||||||
|
}
|
||||||
|
return "Object"
|
||||||
} else if t.Kind() == reflect.Slice && t.Elem().Kind() != reflect.Uint8 {
|
} else if t.Kind() == reflect.Slice && t.Elem().Kind() != reflect.Uint8 {
|
||||||
if t.Elem().Kind() == reflect.Struct && !isSkip {
|
if t.Elem().Kind() == reflect.Struct && !isSkip {
|
||||||
makeClass(t.Elem(), existsClasses, classes)
|
makeClass(t.Elem(), existsClasses, classes)
|
||||||
@ -258,6 +266,7 @@ func makeFuncInOutArgs(t reflect.Type, existsClasses *map[string]bool, classes *
|
|||||||
isOutArg: false,
|
isOutArg: false,
|
||||||
isFunc: false,
|
isFunc: false,
|
||||||
isSkip: false,
|
isSkip: false,
|
||||||
|
isOptional: arg.Kind() == reflect.Pointer,
|
||||||
isVariadic: t.IsVariadic() && i == t.NumIn()-1,
|
isVariadic: t.IsVariadic() && i == t.NumIn()-1,
|
||||||
Name: "",
|
Name: "",
|
||||||
Type: makeFieldElemType(arg, existsClasses, classes, true),
|
Type: makeFieldElemType(arg, existsClasses, classes, true),
|
||||||
|
Loading…
Reference in New Issue
Block a user