From 000b95ccb7b0322e20a6b41153749b4fa175dc89 Mon Sep 17 00:00:00 2001 From: Kenneth Date: Fri, 12 Jun 2026 16:24:04 +0100 Subject: [PATCH] chore: move services to package scripts --- .ona/automations.yaml | 45 --------------------- apps/admin-dashboard/vite.config.ts | 1 + apps/aelis-backend/src/server.ts | 1 + apps/aelis-client/scripts/dev-proxy.ts | 45 ++++++++++++++++----- apps/aelis-client/scripts/open-debugger.ts | 28 ++++++++++++- apps/aelis-client/scripts/run-dev-server.sh | 5 ++- package.json | 4 ++ 7 files changed, 71 insertions(+), 58 deletions(-) delete mode 100644 .ona/automations.yaml diff --git a/.ona/automations.yaml b/.ona/automations.yaml deleted file mode 100644 index be2986e..0000000 --- a/.ona/automations.yaml +++ /dev/null @@ -1,45 +0,0 @@ -services: - expo: - name: Expo Dev Server - description: Expo development server for aelis-client - triggeredBy: - - postDevcontainerStart - commands: - start: cd apps/aelis-client && ./scripts/run-dev-server.sh - - drizzle-studio: - name: Drizzle Studio - description: Drizzle Studio database browser for aelis-backend - triggeredBy: - - manual - commands: - start: | - FORWARD_URL=$(gitpod environment port open 4983 --name drizzle-studio-server | sed 's|https://||') - echo "Drizzle Studio: https://local.drizzle.studio/?host=${FORWARD_URL}&port=443" - cd apps/aelis-backend && bunx drizzle-kit studio --host 0.0.0.0 --port 4983 - - aelis-backend: - name: Aelis Backend - description: Hono API server for aelis-backend (port 3000) - triggeredBy: - - manual - commands: - start: | - gitpod --context environment environment port open 3000 --name "Aelis Backend" --protocol http - TS_IP=$(tailscale ip -4) - echo "" - echo "------------------ Bun Debugger ------------------" - echo "https://debug.bun.sh/#${TS_IP}:6499" - echo "------------------ Bun Debugger ------------------" - echo "" - cd apps/aelis-backend && bun run dev - - admin-dashboard: - name: Admin Dashboard - description: Vite dev server for admin-dashboard (port 5174) - triggeredBy: - - manual - commands: - start: | - gitpod --context environment environment port open 5174 --name "Admin Dashboard" --protocol http - cd apps/admin-dashboard && bun run dev --host diff --git a/apps/admin-dashboard/vite.config.ts b/apps/admin-dashboard/vite.config.ts index 5c13684..f1b4d8e 100644 --- a/apps/admin-dashboard/vite.config.ts +++ b/apps/admin-dashboard/vite.config.ts @@ -12,6 +12,7 @@ export default defineConfig({ }, }, server: { + host: "0.0.0.0", port: 5174, allowedHosts: true, }, diff --git a/apps/aelis-backend/src/server.ts b/apps/aelis-backend/src/server.ts index 5b6de23..b9b9147 100644 --- a/apps/aelis-backend/src/server.ts +++ b/apps/aelis-backend/src/server.ts @@ -122,5 +122,6 @@ const app = main() export default { port: 3000, + hostname: "0.0.0.0", fetch: app.fetch, } diff --git a/apps/aelis-client/scripts/dev-proxy.ts b/apps/aelis-client/scripts/dev-proxy.ts index c1fd88e..11dd447 100644 --- a/apps/aelis-client/scripts/dev-proxy.ts +++ b/apps/aelis-client/scripts/dev-proxy.ts @@ -7,6 +7,7 @@ import type { ServerWebSocket } from "bun" const PROXY_PORT = parseInt(process.env.PROXY_PORT || "8080", 10) +const PROXY_HOST = process.env.PROXY_HOST || "0.0.0.0" const METRO_PORT = parseInt(process.env.METRO_PORT || "8081", 10) const METRO_BASE = `http://127.0.0.1:${METRO_PORT}` @@ -23,7 +24,15 @@ interface WsData { isDevice: boolean } +interface DebugTarget { + webSocketDebuggerUrl: string + reactNative?: { + capabilities?: { prefersFuseboxFrontend?: boolean } + } +} + Bun.serve({ + hostname: PROXY_HOST, port: PROXY_PORT, async fetch(req, server) { @@ -55,10 +64,11 @@ Bun.serve({ // HTTP proxy const upstream = `${METRO_BASE}${url.pathname}${url.search}` + const body = req.body ? await req.arrayBuffer() : undefined const res = await fetch(upstream, { method: req.method, headers: forwardHeaders(req.headers), - body: req.body, + body, redirect: "manual", }) @@ -104,14 +114,10 @@ async function printDebuggerUrl() { const res = await fetch(`${METRO_BASE}/json`) if (!res.ok) return - interface DebugTarget { - webSocketDebuggerUrl: string - reactNative?: { - capabilities?: { prefersFuseboxFrontend?: boolean } - } - } + const parsedTargets: unknown = await res.json() + if (!Array.isArray(parsedTargets)) return - const targets: DebugTarget[] = await res.json() + const targets = parsedTargets.filter(isDebugTarget) const target = targets.find((t) => t.reactNative?.capabilities?.prefersFuseboxFrontend) if (!target) return @@ -124,4 +130,25 @@ async function printDebuggerUrl() { ) } -console.log(`[proxy] listening on :${PROXY_PORT}, forwarding to 127.0.0.1:${METRO_PORT}`) +console.log( + `[proxy] listening on ${PROXY_HOST}:${PROXY_PORT}, forwarding to 127.0.0.1:${METRO_PORT}`, +) + +function isDebugTarget(value: unknown): value is DebugTarget { + if (!isRecord(value) || typeof value.webSocketDebuggerUrl !== "string") return false + + const reactNative = value.reactNative + if (reactNative === undefined) return true + if (!isRecord(reactNative)) return false + + const capabilities = reactNative.capabilities + if (capabilities === undefined) return true + if (!isRecord(capabilities)) return false + + const prefersFuseboxFrontend = capabilities.prefersFuseboxFrontend + return prefersFuseboxFrontend === undefined || typeof prefersFuseboxFrontend === "boolean" +} + +function isRecord(value: unknown): value is Record { + return typeof value === "object" && value !== null +} diff --git a/apps/aelis-client/scripts/open-debugger.ts b/apps/aelis-client/scripts/open-debugger.ts index b11dfc7..210d124 100644 --- a/apps/aelis-client/scripts/open-debugger.ts +++ b/apps/aelis-client/scripts/open-debugger.ts @@ -9,7 +9,6 @@ const tsIp = (await $`tailscale ip -4`.text()).trim() const base = `http://${tsIp}:${PROXY_PORT}` interface DebugTarget { - devtoolsFrontendUrl: string webSocketDebuggerUrl: string reactNative?: { capabilities?: { @@ -24,7 +23,13 @@ if (!res.ok) { process.exit(1) } -const targets: DebugTarget[] = await res.json() +const parsedTargets: unknown = await res.json() +if (!Array.isArray(parsedTargets)) { + console.error("Invalid /json response from Metro.") + process.exit(1) +} + +const targets = parsedTargets.filter(isDebugTarget) const target = targets.find((t) => t.reactNative?.capabilities?.prefersFuseboxFrontend) if (!target) { @@ -50,3 +55,22 @@ try { console.log("Open the URL above in Chrome.") } } + +function isDebugTarget(value: unknown): value is DebugTarget { + if (!isRecord(value) || typeof value.webSocketDebuggerUrl !== "string") return false + + const reactNative = value.reactNative + if (reactNative === undefined) return true + if (!isRecord(reactNative)) return false + + const capabilities = reactNative.capabilities + if (capabilities === undefined) return true + if (!isRecord(capabilities)) return false + + const prefersFuseboxFrontend = capabilities.prefersFuseboxFrontend + return prefersFuseboxFrontend === undefined || typeof prefersFuseboxFrontend === "boolean" +} + +function isRecord(value: unknown): value is Record { + return typeof value === "object" && value !== null +} diff --git a/apps/aelis-client/scripts/run-dev-server.sh b/apps/aelis-client/scripts/run-dev-server.sh index 443fe34..3a89418 100755 --- a/apps/aelis-client/scripts/run-dev-server.sh +++ b/apps/aelis-client/scripts/run-dev-server.sh @@ -3,6 +3,7 @@ set -euo pipefail PROXY_PORT=8080 METRO_PORT=8081 +TS_IP=$(tailscale ip -4) # Start a reverse proxy so Metro sees all requests as loopback. # This makes debugger endpoints (/debugger-frontend, /json, /open-debugger) @@ -11,5 +12,5 @@ PROXY_PORT=$PROXY_PORT METRO_PORT=$METRO_PORT bun run scripts/dev-proxy.ts & PROXY_PID=$! trap "kill $PROXY_PID 2>/dev/null" EXIT -EXPO_PACKAGER_PROXY_URL=http://$(tailscale ip -4):$PROXY_PORT bunx expo start --localhost -p $METRO_PORT - +echo "Expo proxy: http://${TS_IP}:${PROXY_PORT}" +EXPO_PACKAGER_PROXY_URL=http://${TS_IP}:$PROXY_PORT bunx expo start --localhost -p $METRO_PORT diff --git a/package.json b/package.json index b6a502c..f709723 100644 --- a/package.json +++ b/package.json @@ -7,6 +7,10 @@ ], "type": "module", "scripts": { + "expo": "cd apps/aelis-client && bun run start", + "drizzle-studio": "TS_IP=$(tailscale ip -4); echo \"Drizzle Studio: https://local.drizzle.studio/?host=${TS_IP}&port=4983\"; cd apps/aelis-backend && bunx drizzle-kit studio --host 0.0.0.0 --port 4983", + "aelis-backend": "TS_IP=$(tailscale ip -4); echo \"Aelis Backend: http://${TS_IP}:3000\"; echo \"\"; echo \"------------------ Bun Debugger ------------------\"; echo \"https://debug.bun.sh/#${TS_IP}:6499\"; echo \"------------------ Bun Debugger ------------------\"; echo \"\"; cd apps/aelis-backend && bun run dev", + "admin-dashboard": "TS_IP=$(tailscale ip -4); echo \"Admin Dashboard: http://${TS_IP}:5174\"; cd apps/admin-dashboard && bun run dev --host 0.0.0.0", "test": "bun run --filter '*' test", "lint": "oxlint .", "lint:fix": "oxlint --fix .",