diff --git a/.github/workflows/macos.yml b/.github/workflows/macos.yml new file mode 100644 index 000000000..f8d958a29 --- /dev/null +++ b/.github/workflows/macos.yml @@ -0,0 +1,84 @@ +name: macos + +on: + workflow_dispatch: + push: + branches: + - kb/nix-dev + +jobs: + frontend_dev_macos: + name: frontend-dev on macOS + runs-on: macos-latest + timeout-minutes: 60 + + steps: + - name: Checkout repository + uses: actions/checkout@v4 + + - name: Install Nix + uses: cachix/install-nix-action@v25 + with: + install_url: https://releases.nixos.org/nix/nix-2.31.2/install + + - name: Configure Cachix + uses: cachix/cachix-action@v14 + with: + name: catcolab-jmoggr + authToken: '${{ secrets.CACHIX_AUTH_TOKEN }}' + + - name: Run frontend-dev and verify Vite serves content + run: | + set -euo pipefail + mkdir -p /tmp/frontend-dev-logs + + # Launch frontend-dev in the background. The script ends with + # `exec pnpm exec vite --host`, so the launched PID becomes vite + # once setup finishes. + nix run .#frontend-dev -- --port 5173 \ + > /tmp/frontend-dev-logs/stdout.log \ + 2> /tmp/frontend-dev-logs/stderr.log & + DEV_PID=$! + + cleanup() { + echo "--- stdout ---" + cat /tmp/frontend-dev-logs/stdout.log || true + echo "--- stderr ---" + cat /tmp/frontend-dev-logs/stderr.log || true + # Try killing the whole process group, then the PID directly. + kill -TERM -"$DEV_PID" 2>/dev/null || kill -TERM "$DEV_PID" 2>/dev/null || true + sleep 2 + kill -KILL -"$DEV_PID" 2>/dev/null || kill -KILL "$DEV_PID" 2>/dev/null || true + } + trap cleanup EXIT + + # Generous timeout: cold Nix evaluation on macOS may build + # catlog-wasm-browser, document-types-wasm, and catcolabApi from + # source if Cachix lacks aarch64-darwin artifacts. + deadline=$(( $(date +%s) + 3500 )) + until curl -fsS --max-time 5 http://localhost:5173/ > /dev/null; do + if [ "$(date +%s)" -ge "$deadline" ]; then + echo "Timed out waiting for Vite dev server" >&2 + exit 1 + fi + if ! kill -0 "$DEV_PID" 2>/dev/null; then + echo "frontend-dev process exited prematurely" >&2 + exit 1 + fi + sleep 5 + done + + echo "Vite dev server is responding." + + # Confirm Vite is actually serving an HTML page, not a placeholder. + if ! curl -fsS http://localhost:5173/ | grep -qi '&2 + exit 1 + fi + + - name: Upload dev server logs + if: failure() + uses: actions/upload-artifact@v4 + with: + name: frontend-dev-logs-macos + path: /tmp/frontend-dev-logs diff --git a/flake.nix b/flake.nix index 1619af6b4..6f8a859c2 100644 --- a/flake.nix +++ b/flake.nix @@ -246,6 +246,7 @@ document-types-wasm = pkgs.callPackage ./packages/document-types/default.nix craneArgs; frontend = frontendPackage.package; frontend-tests = frontendPackage.tests; + frontend-dev = frontendPackage.dev; }; linuxOnlyPackages = { diff --git a/package.json b/package.json index f0853878b..60f68743a 100644 --- a/package.json +++ b/package.json @@ -17,7 +17,7 @@ "scripts": { "test": "echo \"Error: no test specified\" && exit 1", "build:deps": "pnpm --filter ./packages/frontend run build:deps", - "dev": "pnpm --filter ./packages/frontend run dev" + "dev": "nix run .#frontend-dev -- " }, "devDependencies": { "depcheck": "^1.4.7", diff --git a/packages/frontend/default.nix b/packages/frontend/default.nix index 21d0fafaa..a81a32959 100644 --- a/packages/frontend/default.nix +++ b/packages/frontend/default.nix @@ -265,7 +265,48 @@ let meta.mainProgram = "${name}-tests"; } ); + + # `nix run .#frontend-dev` from the repository root: this drops the Nix-built + # wasm/API artifacts into the source tree and then launches `vite --host` + # against a regular pnpm install. + dev = pkgs.writeShellApplication { + name = "frontend-dev"; + runtimeInputs = with pkgs; [ + nodejs_24 + pnpm + ]; + text = '' + if [ ! -f flake.nix ]; then + echo "Error: must be run from the repository root" >&2 + exit 1 + fi + + echo "Setting up Nix-built dependencies..." + + mkdir -p packages/catlog-wasm/dist/pkg-browser + rm -rf packages/catlog-wasm/dist/pkg-browser/* + cp -r ${self.packages.${pkgs.stdenv.hostPlatform.system}.catlog-wasm-browser}/* packages/catlog-wasm/dist/pkg-browser/ + + mkdir -p packages/document-types/pkg + rm -rf packages/document-types/pkg/* + cp -r ${self.packages.${pkgs.stdenv.hostPlatform.system}.document-types-wasm}/* packages/document-types/pkg/ + + mkdir -p packages/backend/pkg/src + rm -rf packages/backend/pkg/src/* + cp -r ${self.packages.${pkgs.stdenv.hostPlatform.system}.catcolabApi}/src packages/backend/pkg/ + + echo "Installing npm dependencies..." + pnpm install + + cd packages/frontend + echo "Generating CSS module types..." + pnpm run build:tcm + + echo "Starting Vite dev server..." + exec pnpm exec vite --host "$@" + ''; + }; in { - inherit package tests; + inherit package tests dev; }