Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
84 changes: 84 additions & 0 deletions .github/workflows/macos.yml
Original file line number Diff line number Diff line change
@@ -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 '<html'; then
echo "Response did not look like an HTML page" >&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
1 change: 1 addition & 0 deletions flake.nix
Original file line number Diff line number Diff line change
Expand Up @@ -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 = {
Expand Down
2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -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",
Expand Down
43 changes: 42 additions & 1 deletion packages/frontend/default.nix
Original file line number Diff line number Diff line change
Expand Up @@ -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;
}
Loading