startDevServer starts the JS dev server that does on-demand rebuilding and serving of web client JS and CSS resources.
()
| 74 | // startDevServer starts the JS dev server that does on-demand rebuilding |
| 75 | // and serving of web client JS and CSS resources. |
| 76 | func startDevServer() (cleanup func()) { |
| 77 | root := gitRootDir() |
| 78 | webClientPath := filepath.Join(root, "client", "web") |
| 79 | |
| 80 | yarn := filepath.Join(root, "tool", "yarn") |
| 81 | node := filepath.Join(root, "tool", "node") |
| 82 | vite := filepath.Join(webClientPath, "node_modules", ".bin", "vite") |
| 83 | |
| 84 | log.Printf("installing JavaScript deps using %s...", yarn) |
| 85 | out, err := exec.Command(yarn, "--non-interactive", "-s", "--cwd", webClientPath, "install").CombinedOutput() |
| 86 | if err != nil { |
| 87 | log.Fatalf("error running tailscale web's yarn install: %v, %s", err, out) |
| 88 | } |
| 89 | log.Printf("starting JavaScript dev server...") |
| 90 | cmd := exec.Command(node, vite) |
| 91 | cmd.Dir = webClientPath |
| 92 | cmd.Stdout = os.Stdout |
| 93 | cmd.Stderr = os.Stderr |
| 94 | if err := cmd.Start(); err != nil { |
| 95 | log.Fatalf("Starting JS dev server: %v", err) |
| 96 | } |
| 97 | log.Printf("JavaScript dev server running as pid %d", cmd.Process.Pid) |
| 98 | return func() { |
| 99 | cmd.Process.Signal(os.Interrupt) |
| 100 | err := cmd.Wait() |
| 101 | log.Printf("JavaScript dev server exited: %v", err) |
| 102 | } |
| 103 | } |
| 104 | |
| 105 | // devServerProxy returns a reverse proxy to the vite dev server. |
| 106 | func devServerProxy() *httputil.ReverseProxy { |
no test coverage detected
searching dependent graphs…