diff --git a/file.go b/file.go index c943d5b..6ca8730 100644 --- a/file.go +++ b/file.go @@ -43,9 +43,12 @@ func init() { "mkdir": func(argsIn goja.FunctionCall, vm *goja.Runtime) goja.Value { args := gojs.MakeArgs(&argsIn, vm).Check(1) if err := os.MkdirAll(args.Path(0), 0755); err != nil { - panic(vm.NewGoError(err)) + // panic(vm.NewGoError(err)) + vm.SetData("_lastError", err) + gojs.GetLogger(vm).Error(err.Error()) + return vm.ToValue(false) } - return nil + return vm.ToValue(true) }, "read": func(argsIn goja.FunctionCall, vm *goja.Runtime) goja.Value { args := gojs.MakeArgs(&argsIn, vm).Check(1) @@ -53,7 +56,10 @@ func init() { if r, err := u.ReadFile(filename); err == nil { return vm.ToValue(r) } else { - panic(vm.NewGoError(err)) + // panic(vm.NewGoError(err)) + vm.SetData("_lastError", err) + gojs.GetLogger(vm).Error(err.Error()) + return vm.ToValue("") } }, "readBytes": func(argsIn goja.FunctionCall, vm *goja.Runtime) goja.Value { @@ -61,30 +67,45 @@ func init() { if r, err := u.ReadFileBytes(args.Path(0)); err == nil { return vm.ToValue(r) } else { - panic(vm.NewGoError(err)) + // panic(vm.NewGoError(err)) + vm.SetData("_lastError", err) + gojs.GetLogger(vm).Error(err.Error()) + return vm.ToValue([]byte{}) } }, "write": func(argsIn goja.FunctionCall, vm *goja.Runtime) goja.Value { args := gojs.MakeArgs(&argsIn, vm).Check(2) filename := args.Path(0) if err := u.WriteFileBytes(filename, args.Bytes(1)); err == nil { - return nil + return vm.ToValue(true) } else { - panic(vm.NewGoError(err)) + // panic(vm.NewGoError(err)) + vm.SetData("_lastError", err) + gojs.GetLogger(vm).Error(err.Error()) + return vm.ToValue(false) } }, "dir": func(argsIn goja.FunctionCall, vm *goja.Runtime) goja.Value { args := gojs.MakeArgs(&argsIn, vm).Check(1) - if r, err := u.ReadDir(args.Path(0)); err == nil { - list := make([]map[string]any, len(r)) - for i, info := range r { - list[i] = makeFileInfo(&info) - } + if list, err := listFile(args.Path(0), []map[string]any{}, args.Bool(1)); err == nil { return vm.ToValue(list) } else { - panic(vm.NewGoError(err)) + // panic(vm.NewGoError(err)) + vm.SetData("_lastError", err) + gojs.GetLogger(vm).Error(err.Error()) + return vm.ToValue([]map[string]any{}) } }, + "join": func(argsIn goja.FunctionCall, vm *goja.Runtime) goja.Value { + args := gojs.MakeArgs(&argsIn, vm).Check(1) + parts := args.StrArray(0) + if os.PathSeparator != '/' { + for i := range parts { + parts[i] = strings.ReplaceAll(parts[i], "/", string(os.PathSeparator)) + } + } + return vm.ToValue(filepath.Join(parts...)) + }, "stat": func(argsIn goja.FunctionCall, vm *goja.Runtime) goja.Value { args := gojs.MakeArgs(&argsIn, vm).Check(1) return vm.ToValue(makeFileInfo(u.GetFileInfo(args.Path(0)))) @@ -96,25 +117,34 @@ func init() { "remove": func(argsIn goja.FunctionCall, vm *goja.Runtime) goja.Value { args := gojs.MakeArgs(&argsIn, vm).Check(1) if err := os.RemoveAll(args.Path(0)); err == nil { - return nil + return vm.ToValue(true) } else { - panic(vm.NewGoError(err)) + // panic(vm.NewGoError(err)) + vm.SetData("_lastError", err) + gojs.GetLogger(vm).Error(err.Error()) + return vm.ToValue(false) } }, "rename": func(argsIn goja.FunctionCall, vm *goja.Runtime) goja.Value { args := gojs.MakeArgs(&argsIn, vm).Check(2) if err := os.Rename(args.Path(0), args.Path(1)); err == nil { - return nil + return vm.ToValue(true) } else { - panic(vm.NewGoError(err)) + // panic(vm.NewGoError(err)) + vm.SetData("_lastError", err) + gojs.GetLogger(vm).Error(err.Error()) + return vm.ToValue(false) } }, "copy": func(argsIn goja.FunctionCall, vm *goja.Runtime) goja.Value { args := gojs.MakeArgs(&argsIn, vm).Check(2) if err := u.CopyFile(args.Path(0), args.Path(1)); err == nil { - return nil + return vm.ToValue(true) } else { - panic(vm.NewGoError(err)) + // panic(vm.NewGoError(err)) + vm.SetData("_lastError", err) + gojs.GetLogger(vm).Error(err.Error()) + return vm.ToValue(false) } }, "cache": func(argsIn goja.FunctionCall, vm *goja.Runtime) goja.Value { @@ -193,11 +223,17 @@ func init() { } if err == nil { if err = u.WriteFileBytes(gojs.FixPath(vm, filename), data); err != nil { - panic(vm.NewGoError(err)) + // panic(vm.NewGoError(err)) + vm.SetData("_lastError", err) + gojs.GetLogger(vm).Error(err.Error()) + return vm.ToValue(false) } - return nil + return vm.ToValue(true) } else { - panic(vm.NewGoError(err)) + // panic(vm.NewGoError(err)) + vm.SetData("_lastError", err) + gojs.GetLogger(vm).Error(err.Error()) + return nil } }, "load": func(argsIn goja.FunctionCall, vm *goja.Runtime) goja.Value { @@ -213,10 +249,16 @@ func init() { if err == nil { return vm.ToValue(r) } else { - panic(vm.NewGoError(err)) + // panic(vm.NewGoError(err)) + vm.SetData("_lastError", err) + gojs.GetLogger(vm).Error(err.Error()) + return nil } } else { - panic(vm.NewGoError(err)) + // panic(vm.NewGoError(err)) + vm.SetData("_lastError", err) + gojs.GetLogger(vm).Error(err.Error()) + return nil } }, } @@ -232,14 +274,32 @@ func init() { func makeFileInfo(info *u.FileInfo) map[string]any { return map[string]any{ - "name": info.Name, - "size": info.Size, - "fullName": info.FullName, - "isDir": info.IsDir, - "modTime": info.ModTime.UnixMilli(), + "name": info.Name, + "size": info.Size, + "path": info.FullName, + "isDir": info.IsDir, + "modTime": info.ModTime.UnixMilli(), } } +func listFile(rootPath string, list []map[string]any, recursive bool) ([]map[string]any, error) { + var outErr error + if r, err := u.ReadDir(rootPath); err == nil { + for _, info := range r { + list = append(list, makeFileInfo(&info)) + if recursive && info.IsDir { + list, err = listFile(info.FullName, list, recursive) + if err != nil { + outErr = err + } + } + } + } else { + outErr = err + } + return list, outErr +} + func searchFile(vm *goja.Runtime, searchPath, name string) string { searchPath = gojs.FixPath(vm, searchPath) diff --git a/file.ts b/file.ts index 745ba1a..f906665 100644 --- a/file.ts +++ b/file.ts @@ -1,22 +1,23 @@ // just for develop export default { - exists, - mkdir, - read, - readBytes, - write, - dir, - stat, - find, - remove, - rename, - copy, - cache, - load, - save, - searchFile, - loadConfig + exists, + mkdir, + read, + readBytes, + write, + dir, + join, + stat, + find, + remove, + rename, + copy, + cache, + load, + save, + searchFile, + loadConfig } function exists(filename: string): boolean { return false } @@ -24,7 +25,8 @@ function mkdir(filename: string): void { } function read(filename: string): string { return '' } function readBytes(filename: string): any { return null } function write(filename: string, data: any): void { } -function dir(filename: string): Array { return null as any } +function dir(filename: string, recursive?: boolean): Array { return null as any } +function join(...paths: string[]): string { return '' } function stat(filename: string): FileInfo { return null as any } function find(filename: string): string { return '' } function remove(filename: string): void { } @@ -36,10 +38,10 @@ function save(filename: string, data: any) { } function searchFile(filename: string, searchPath?: string): string { return '' } function loadConfig(name: string): any { return null } -interface FileInfo { - name: string - fullName: string - isDir: boolean - size: number - modTime: number +export interface FileInfo { + name: string + fullName: string + isDir: boolean + size: number + modTime: number } diff --git a/go.mod b/go.mod index 7ef9a34..1926464 100644 --- a/go.mod +++ b/go.mod @@ -3,7 +3,7 @@ module apigo.cc/gojs/file go 1.24.0 require ( - apigo.cc/gojs v0.0.30 + apigo.cc/gojs v0.0.32 apigo.cc/gojs/console v0.0.4 github.com/ssgo/u v1.7.23 gopkg.in/yaml.v3 v3.0.1 @@ -15,9 +15,9 @@ require ( github.com/go-sourcemap/sourcemap v2.1.4+incompatible // indirect github.com/google/pprof v0.0.0-20250903194437-c28834ac2320 // indirect github.com/ssgo/config v1.7.10 // indirect - github.com/ssgo/log v1.7.9 // indirect + github.com/ssgo/log v1.7.10 // indirect github.com/ssgo/standard v1.7.7 // indirect github.com/ssgo/tool v0.4.29 // indirect - golang.org/x/sys v0.38.0 // indirect - golang.org/x/text v0.31.0 // indirect + golang.org/x/sys v0.39.0 // indirect + golang.org/x/text v0.32.0 // indirect )