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

@@ -1,32 +1,37 @@
load("//bun:defs.bzl", "bun_script")
load("@rules_shell//shell:sh_test.bzl", "sh_test")
load("//bun:defs.bzl", "bun_script")
bun_script(
name = "hello_script",
script = "hello",
package_json = "package.json",
data = ["hello.ts"],
package_json = "package.json",
script = "hello",
)
sh_test(
name = "bun_script_ts_test",
size = "small",
srcs = ["run_script.sh"],
args = ["$(location :hello_script)", "hello-script"],
args = [
"$(location :hello_script)",
"hello-script",
],
data = [":hello_script"],
)
bun_script(
name = "env_script",
script = "print-env",
package_json = "package.json",
data = [
".env",
"env.ts",
],
package_json = "package.json",
script = "print-env",
)
sh_test(
name = "bun_script_package_cwd_test",
size = "small",
srcs = ["run_env_script.sh"],
args = ["$(location :env_script)"],
data = [":env_script"],
@@ -34,17 +39,18 @@ sh_test(
bun_script(
name = "vite_dev_server",
script = "dev",
package_json = "vite_app/package.json",
node_modules = "@script_test_vite_node_modules//:node_modules",
data = [
"vite_app/index.html",
"vite_app/main.js",
],
node_modules = "@script_test_vite_node_modules//:node_modules",
package_json = "vite_app/package.json",
script = "dev",
)
sh_test(
name = "bun_script_vite_app_test",
size = "small",
srcs = ["run_vite_app.sh"],
args = ["$(location :vite_dev_server)"],
data = [":vite_dev_server"],
@@ -52,28 +58,29 @@ sh_test(
bun_script(
name = "vite_monorepo_app_a_dev_server",
script = "dev",
package_json = "vite_monorepo/apps/app-a/package.json",
node_modules = "@script_test_vite_monorepo_node_modules//:node_modules",
data = [
"vite_monorepo/apps/app-a/index.html",
"vite_monorepo/apps/app-a/main.js",
],
node_modules = "@script_test_vite_monorepo_node_modules//:node_modules",
package_json = "vite_monorepo/apps/app-a/package.json",
script = "dev",
)
bun_script(
name = "vite_monorepo_app_b_dev_server",
script = "dev",
package_json = "vite_monorepo/apps/app-b/package.json",
node_modules = "@script_test_vite_monorepo_node_modules//:node_modules",
data = [
"vite_monorepo/apps/app-b/index.html",
"vite_monorepo/apps/app-b/main.js",
],
node_modules = "@script_test_vite_monorepo_node_modules//:node_modules",
package_json = "vite_monorepo/apps/app-b/package.json",
script = "dev",
)
sh_test(
name = "bun_script_vite_monorepo_apps_test",
size = "small",
srcs = ["run_vite_monorepo_apps.sh"],
args = [
"$(location :vite_monorepo_app_a_dev_server)",
@@ -85,54 +92,69 @@ sh_test(
],
)
sh_test(
name = "bun_script_monorepo_launcher_shape_test",
size = "small",
srcs = ["verify_monorepo_launcher_shape.sh"],
args = [
"$(location :vite_monorepo_app_a_dev_server)",
"$(location :paraglide_monorepo_app_a_build)",
],
data = [
":paraglide_monorepo_app_a_build",
":vite_monorepo_app_a_dev_server",
],
)
bun_script(
name = "paraglide_monorepo_app_a_build",
script = "build:app-a",
package_json = "paraglide_monorepo/package.json",
node_modules = "@script_test_paraglide_monorepo_node_modules//:node_modules",
data = [
"paraglide_monorepo/scripts/build-app-a.mjs",
"paraglide_monorepo/scripts/build-app-b.mjs",
"paraglide_monorepo/packages/i18n/package.json",
"paraglide_monorepo/packages/i18n/project.inlang/settings.json",
"paraglide_monorepo/packages/i18n/messages/en.json",
"paraglide_monorepo/packages/i18n/messages/sv.json",
"paraglide_monorepo/packages/app-a/package.json",
"paraglide_monorepo/packages/app-a/index.html",
"paraglide_monorepo/packages/app-a/main.js",
"paraglide_monorepo/packages/app-a/package.json",
"paraglide_monorepo/packages/app-a/vite.config.js",
"paraglide_monorepo/packages/app-b/package.json",
"paraglide_monorepo/packages/app-b/index.html",
"paraglide_monorepo/packages/app-b/main.js",
"paraglide_monorepo/packages/app-b/package.json",
"paraglide_monorepo/packages/app-b/vite.config.js",
"paraglide_monorepo/packages/i18n/messages/en.json",
"paraglide_monorepo/packages/i18n/messages/sv.json",
"paraglide_monorepo/packages/i18n/package.json",
"paraglide_monorepo/packages/i18n/project.inlang/settings.json",
"paraglide_monorepo/scripts/build-app-a.mjs",
"paraglide_monorepo/scripts/build-app-b.mjs",
],
node_modules = "@script_test_paraglide_monorepo_node_modules//:node_modules",
package_json = "paraglide_monorepo/package.json",
script = "build:app-a",
)
bun_script(
name = "paraglide_monorepo_app_b_build",
script = "build:app-b",
package_json = "paraglide_monorepo/package.json",
node_modules = "@script_test_paraglide_monorepo_node_modules//:node_modules",
data = [
"paraglide_monorepo/scripts/build-app-a.mjs",
"paraglide_monorepo/scripts/build-app-b.mjs",
"paraglide_monorepo/packages/i18n/package.json",
"paraglide_monorepo/packages/i18n/project.inlang/settings.json",
"paraglide_monorepo/packages/i18n/messages/en.json",
"paraglide_monorepo/packages/i18n/messages/sv.json",
"paraglide_monorepo/packages/app-a/package.json",
"paraglide_monorepo/packages/app-a/index.html",
"paraglide_monorepo/packages/app-a/main.js",
"paraglide_monorepo/packages/app-a/package.json",
"paraglide_monorepo/packages/app-a/vite.config.js",
"paraglide_monorepo/packages/app-b/package.json",
"paraglide_monorepo/packages/app-b/index.html",
"paraglide_monorepo/packages/app-b/main.js",
"paraglide_monorepo/packages/app-b/package.json",
"paraglide_monorepo/packages/app-b/vite.config.js",
"paraglide_monorepo/packages/i18n/messages/en.json",
"paraglide_monorepo/packages/i18n/messages/sv.json",
"paraglide_monorepo/packages/i18n/package.json",
"paraglide_monorepo/packages/i18n/project.inlang/settings.json",
"paraglide_monorepo/scripts/build-app-a.mjs",
"paraglide_monorepo/scripts/build-app-b.mjs",
],
node_modules = "@script_test_paraglide_monorepo_node_modules//:node_modules",
package_json = "paraglide_monorepo/package.json",
script = "build:app-b",
)
sh_test(
name = "bun_script_paraglide_monorepo_build_test",
size = "small",
srcs = ["run_paraglide_monorepo_builds.sh"],
args = [
"$(location :paraglide_monorepo_app_a_build)",
@@ -146,21 +168,22 @@ sh_test(
bun_script(
name = "workspace_filtered_script",
script = "say",
package_json = "workspace_run/package.json",
data = [
"workspace_run/packages/pkg-a/package.json",
"workspace_run/packages/pkg-a/say.ts",
"workspace_run/packages/pkg-b/package.json",
"workspace_run/packages/pkg-b/say.ts",
],
filters = ["./packages/pkg-a"],
execution_mode = "sequential",
filters = ["./packages/pkg-a"],
package_json = "workspace_run/package.json",
script = "say",
silent = True,
)
sh_test(
name = "bun_script_workspace_filter_test",
size = "small",
srcs = ["run_workspace_script.sh"],
args = ["$(location :workspace_filtered_script)"],
data = [":workspace_filtered_script"],
@@ -168,20 +191,21 @@ sh_test(
bun_script(
name = "workspace_parallel_script",
script = "say",
package_json = "workspace_run/package.json",
data = [
"workspace_run/packages/pkg-a/package.json",
"workspace_run/packages/pkg-a/say.ts",
"workspace_run/packages/pkg-b/package.json",
"workspace_run/packages/pkg-b/say.ts",
],
workspaces = True,
execution_mode = "parallel",
package_json = "workspace_run/package.json",
script = "say",
workspaces = True,
)
sh_test(
name = "bun_script_workspace_parallel_test",
size = "small",
srcs = ["run_workspace_parallel.sh"],
args = ["$(location :workspace_parallel_script)"],
data = [":workspace_parallel_script"],
@@ -189,22 +213,24 @@ sh_test(
bun_script(
name = "workspace_flagged_script",
script = "say",
package_json = "workspace_run/package.json",
data = [
"workspace_run/packages/pkg-a/package.json",
"workspace_run/packages/pkg-a/say.ts",
"workspace_run/packages/pkg-b/package.json",
"workspace_run/packages/pkg-b/say.ts",
],
workspaces = True,
execution_mode = "parallel",
no_exit_on_error = True,
package_json = "workspace_run/package.json",
script = "say",
shell = "system",
visibility = ["//tests/ci_test:__pkg__"],
workspaces = True,
)
sh_test(
name = "bun_script_workspace_flag_shape_test",
size = "small",
srcs = ["verify_launcher_flags.sh"],
args = [
"$(location :workspace_flagged_script)",

View File

@@ -2,7 +2,23 @@
set -euo pipefail
binary="$1"
output="$(${binary})"
run_launcher() {
local launcher="$1"
shift
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}" | tr -d '\r'
return 0
fi
"${launcher}" "$@"
}
output="$(run_launcher "${binary}")"
if [[ ${output} != "from-dotenv" ]]; then
echo "Expected .env value from package directory, got: ${output}" >&2

View File

@@ -10,13 +10,28 @@ cleanup() {
}
trap cleanup EXIT
run_launcher() {
local launcher="$1"
shift
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}" | tr -d '\r'
return 0
fi
"${launcher}" "$@"
}
verify_build() {
local binary="$1"
local out_dir="$2"
local expected_title="$3"
local expected_text="$4"
"${binary}" --outDir "${out_dir}" >/dev/null
run_launcher "${binary}" --outDir "${out_dir}" >/dev/null
if [[ ! -f "${out_dir}/index.html" ]]; then
echo "missing build output index.html for ${binary}" >&2

View File

@@ -3,7 +3,23 @@ set -euo pipefail
binary="$1"
expected="$2"
output="$(${binary})"
run_launcher() {
local launcher="$1"
shift
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}" | tr -d '\r'
return 0
fi
"${launcher}" "$@"
}
output="$(run_launcher "${binary}")"
if [[ ${output} != "${expected}" ]]; then
echo "Unexpected output from ${binary}: ${output}" >&2

View File

@@ -14,6 +14,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=$!
}
port="$(
python3 - <<'PY'
import socket
@@ -24,8 +41,7 @@ sock.close()
PY
)"
"${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

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

View File

@@ -2,7 +2,23 @@
set -euo pipefail
script_bin="$1"
output="$(${script_bin})"
run_launcher() {
local launcher="$1"
shift
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}" | tr -d '\r'
return 0
fi
"${launcher}" "$@"
}
output="$(run_launcher "${script_bin}")"
if [[ ${output} != *"pkg-a"* ]]; then
echo "Expected workspace parallel run output to include pkg-a: ${output}" >&2

View File

@@ -2,7 +2,23 @@
set -euo pipefail
script_bin="$1"
output="$(${script_bin})"
run_launcher() {
local launcher="$1"
shift
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}" | tr -d '\r'
return 0
fi
"${launcher}" "$@"
}
output="$(run_launcher "${script_bin}")"
if [[ ${output} != *"pkg-a"* ]]; then
echo "Expected workspace run output to include pkg-a: ${output}" >&2

View File

@@ -1,12 +1,21 @@
#!/usr/bin/env bash
set -euo pipefail
binary="$1"
launcher="$1"
shift
for expected in "$@"; do
if ! grep -Fq -- "${expected}" "${binary}"; then
echo "Expected ${binary} to contain ${expected}" >&2
exit 1
fi
done
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())
argv = spec["argv"]
for value in sys.argv[2:]:
if value not in argv:
raise SystemExit(f"missing {value!r} in argv {argv!r}")
PY

View File

@@ -0,0 +1,27 @@
#!/usr/bin/env bash
set -euo pipefail
vite_launcher="$1"
paraglide_launcher="$2"
python3 - "${vite_launcher}" "${paraglide_launcher}" <<'PY'
import json
import pathlib
import sys
def read_spec(launcher: str):
path = pathlib.Path(launcher)
if path.suffix.lower() == ".cmd":
path = pathlib.Path(str(path)[:-4])
return json.loads(pathlib.Path(f"{path}.launcher.json").read_text())
vite_spec = read_spec(sys.argv[1])
paraglide_spec = read_spec(sys.argv[2])
assert all(not root.startswith("../") for root in vite_spec["node_modules_roots"]), vite_spec
assert "node_modules" in vite_spec["node_modules_roots"], vite_spec
assert all(not root.startswith("../") for root in paraglide_spec["node_modules_roots"]), paraglide_spec
assert "node_modules" in paraglide_spec["node_modules_roots"], paraglide_spec
assert "packages/i18n/node_modules" in paraglide_spec["node_modules_roots"], paraglide_spec
PY