diff --git a/main.go b/main.go index 9b2d6eb..094620e 100644 --- a/main.go +++ b/main.go @@ -87,8 +87,11 @@ func main() { } fileName = path.Base(filePath) src = f - } else { + } else if !stdinIsTty && len(args) == 0 { src = os.Stdin + } else { + reduce(args) + return } data, err := io.ReadAll(src) diff --git a/reduce.go b/reduce.go new file mode 100644 index 0000000..97b360b --- /dev/null +++ b/reduce.go @@ -0,0 +1,59 @@ +package main + +import ( + _ "embed" + "fmt" + "os" + "os/exec" + "path" +) + +//go:embed npm/index.js +var src []byte + +func reduce(fns []string) { + script := path.Join(os.TempDir(), fmt.Sprintf("fx-%v.js", version)) + _, err := os.Stat(script) + if os.IsNotExist(err) { + err := os.WriteFile(script, src, 0644) + if err != nil { + panic(err) + } + } + + deno := false + bin, err := exec.LookPath("node") + if err != nil { + if err != nil { + bin, err = exec.LookPath("deno") + if err != nil { + _, _ = fmt.Fprintf(os.Stderr, "Node.js or Deno is required to run fx with reducers.\n") + os.Exit(1) + } + deno = true + } + } + + var args []string + if deno { + args = []string{"run", "-A", script} + } else { + args = []string{script} + } + args = append(args, fns...) + + cmd := exec.Command(bin, args...) + cmd.Stdin = os.Stdin + cmd.Stdout = os.Stdout + cmd.Stderr = os.Stderr + err = cmd.Run() + + switch err := err.(type) { + case nil: + os.Exit(0) + case *exec.ExitError: + os.Exit(err.ExitCode()) + default: + panic(err) + } +} diff --git a/version.go b/version.go index 89a7551..9cfa293 100644 --- a/version.go +++ b/version.go @@ -1,3 +1,3 @@ package main -const version = "30" +const version = "30.0.0"