feat: proper windows support

This commit is contained in:
eric
2026-03-15 11:04:44 +01:00
parent 4f8e27cd74
commit 626a6640f8
70 changed files with 3410 additions and 1689 deletions

View File

@@ -3,17 +3,18 @@ load("@rules_shell//shell:sh_test.bzl", "sh_test")
test_suite(
name = "examples_test",
tests = [
":examples_basic_run_e2e_test",
":examples_basic_hot_restart_shape_test",
":examples_workspace_bundle_e2e_test",
":examples_workspace_catalog_shape_test",
":examples_basic_run_e2e_test",
":examples_vite_monorepo_catalog_shape_test",
":examples_vite_monorepo_e2e_test",
":examples_workspace_bundle_e2e_test",
":examples_workspace_catalog_shape_test",
],
)
sh_test(
name = "examples_basic_e2e_build_test",
size = "small",
srcs = ["examples_basic_e2e_build_test.sh"],
args = [
"$(location //examples/basic:BUILD.bazel)",
@@ -27,6 +28,7 @@ sh_test(
sh_test(
name = "examples_basic_run_e2e_test",
size = "small",
srcs = ["examples_basic_run_e2e_test.sh"],
args = ["$(location //examples/basic:web_dev)"],
data = ["//examples/basic:web_dev"],
@@ -34,6 +36,7 @@ sh_test(
sh_test(
name = "examples_basic_hot_restart_shape_test",
size = "small",
srcs = ["examples_basic_hot_restart_shape_test.sh"],
args = ["$(location //examples/basic:web_dev_hot_restart)"],
data = ["//examples/basic:web_dev_hot_restart"],
@@ -41,6 +44,7 @@ sh_test(
sh_test(
name = "examples_workspace_bundle_e2e_test",
size = "small",
srcs = ["examples_workspace_bundle_e2e_test.sh"],
args = ["$(location //examples/workspace:pkg_b_bundle)"],
data = ["//examples/workspace:pkg_b_bundle"],
@@ -48,6 +52,7 @@ sh_test(
sh_test(
name = "examples_workspace_catalog_shape_test",
size = "small",
srcs = ["examples_workspace_catalog_shape_test.sh"],
args = [
"$(location //examples/workspace:package.json)",
@@ -63,6 +68,7 @@ sh_test(
sh_test(
name = "examples_vite_monorepo_catalog_shape_test",
size = "small",
srcs = ["examples_vite_monorepo_catalog_shape_test.sh"],
args = [
"$(location //examples/vite_monorepo:package.json)",
@@ -70,14 +76,15 @@ sh_test(
"$(location //examples/vite_monorepo:apps/app-b/package.json)",
],
data = [
"//examples/vite_monorepo:package.json",
"//examples/vite_monorepo:apps/app-a/package.json",
"//examples/vite_monorepo:apps/app-b/package.json",
"//examples/vite_monorepo:package.json",
],
)
sh_test(
name = "examples_vite_monorepo_e2e_test",
size = "small",
srcs = ["examples_vite_monorepo_e2e_test.sh"],
args = [
"$(location //examples/vite_monorepo:app_a_dev)",
@@ -91,6 +98,7 @@ sh_test(
sh_test(
name = "repo_all_targets_test",
size = "small",
srcs = ["repo_all_targets_test.sh"],
args = ["$(location //.github/workflows:ci.yml)"],
data = ["//.github/workflows:ci.yml"],

View File

@@ -1,11 +1,21 @@
#!/usr/bin/env bash
set -euo pipefail
binary="$1"
launcher="$1"
grep -Fq -- 'watch_mode="hot"' "${binary}"
grep -Fq -- 'bun_args+=("--hot")' "${binary}"
grep -Fq -- '--no-clear-screen' "${binary}"
grep -Fq -- 'if [[ 1 -eq 0 ]]; then' "${binary}"
grep -Fq -- 'readarray -t restart_paths' "${binary}"
grep -Fq -- 'examples/basic/README.md' "${binary}"
python3 - "${launcher}" <<'PY'
import json
import pathlib
import sys
path = pathlib.Path(sys.argv[1])
if path.suffix.lower() == ".cmd":
path = pathlib.Path(str(path)[:-4])
spec = json.loads(pathlib.Path(f"{path}.launcher.json").read_text())
assert spec["kind"] == "bun_run", spec
assert spec["watch_mode"] == "hot", spec
assert "--no-clear-screen" in spec["argv"], spec
assert spec["restart_on"], spec
assert spec["restart_on"][0].endswith("examples/basic/README.md"), spec
PY

View File

@@ -14,8 +14,24 @@ cleanup() {
}
trap cleanup EXIT
"${binary}" >"${log_file}" 2>&1 &
server_pid=$!
start_launcher() {
local launcher="$1"
local log_target="$2"
shift 2
if [[ ${launcher} == *.cmd ]]; then
local command
printf -v command '"%s"' "${launcher}"
for arg in "$@"; do
printf -v command '%s "%s"' "${command}" "${arg}"
done
cmd.exe /c "${command}" >"${log_target}" 2>&1 &
else
"${launcher}" "$@" >"${log_target}" 2>&1 &
fi
server_pid=$!
}
start_launcher "${binary}" "${log_file}"
for _ in {1..20}; do
if grep -Fq "rules_bun bun_dev example" "${log_file}"; then

View File

@@ -17,6 +17,23 @@ cleanup() {
}
trap cleanup EXIT
start_launcher() {
local launcher="$1"
local log_target="$2"
shift 2
if [[ ${launcher} == *.cmd ]]; then
local command
printf -v command '"%s"' "${launcher}"
for arg in "$@"; do
printf -v command '%s "%s"' "${command}" "${arg}"
done
cmd.exe /c "${command}" >"${log_target}" 2>&1 &
else
"${launcher}" "$@" >"${log_target}" 2>&1 &
fi
server_pid=$!
}
pick_port() {
python3 - <<'PY'
import socket
@@ -37,8 +54,7 @@ verify_vite_app() {
port="$(pick_port)"
log_file="${workdir}/${log_name}.log"
"${binary}" --host 127.0.0.1 --port "${port}" --strictPort >"${log_file}" 2>&1 &
server_pid=$!
start_launcher "${binary}" "${log_file}" --host 127.0.0.1 --port "${port}" --strictPort
for _ in {1..60}; do
if ! kill -0 "${server_pid}" 2>/dev/null; then