diff --git a/gojs.go b/gojs.go index 1378d77..c5cdafa 100644 --- a/gojs.go +++ b/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 diff --git a/ts.go b/ts.go index df63a1d..3f7b0a1 100644 --- a/ts.go +++ b/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) } - 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),