feat(flake): add rtw package definition with asset pipeline
1 files changed,  +115, -1
M flake.nix
+115, -1
  1@@ -41,6 +41,119 @@
  2             mainProgram = "y-sweet";
  3           };
  4         };
  5+
  6+      rtw-package = { pkgs, lib, buildGoModule, stdenvNoCC, ... }:
  7+        let
  8+          rtw-pnpm-deps = stdenvNoCC.mkDerivation {
  9+            pname = "rtw-pnpm-deps";
 10+            version = "0.1.0";
 11+            src = ./client;
 12+
 13+            nativeBuildInputs = [
 14+              pkgs.nodejs
 15+              pkgs.pnpm
 16+            ];
 17+
 18+            dontConfigure = true;
 19+            dontFixup = true;
 20+
 21+            buildPhase = ''
 22+              export HOME=$TMPDIR
 23+              pnpm install --frozen-lockfile --ignore-scripts
 24+            '';
 25+
 26+            installPhase = ''
 27+              mkdir -p $out
 28+              cp -r node_modules $out/
 29+              find $out/node_modules -name ".modules.yaml" -delete
 30+              find $out/node_modules -name "*.log" -delete
 31+            '';
 32+
 33+            outputHashAlgo = "sha256";
 34+            outputHashMode = "recursive";
 35+            outputHash = lib.fakeHash;
 36+          };
 37+        in
 38+        buildGoModule {
 39+          pname = "rtw";
 40+          version = "0.1.0";
 41+
 42+          src = ./.;
 43+
 44+          nativeBuildInputs = [
 45+            pkgs.nodejs
 46+            pkgs.pnpm
 47+            pkgs.esbuild
 48+            pkgs.templ
 49+            pkgs.tailwindcss_4
 50+          ];
 51+
 52+          buildInputs = [
 53+            pkgs.brotli
 54+          ];
 55+
 56+          # Go module lives in server/
 57+          modRoot = "server";
 58+
 59+          # Build only the server command
 60+          subPackages = [ "cmd/server" ];
 61+
 62+          # Disable workspace so ygo is fetched from proxy, not ../ygo
 63+          GOWORK = "off";
 64+          env.CGO_ENABLED = "1";
 65+
 66+          # Placeholder — compute in Task 3
 67+          vendorHash = lib.fakeHash;
 68+
 69+          doCheck = false;
 70+
 71+          # Generate all assets before Go compilation
 72+          preBuild = ''
 73+            export HOME=$TMPDIR
 74+
 75+            mkdir -p server/pages/static/js server/pages/static/css
 76+
 77+            # Copy pre-installed client dependencies
 78+            rm -rf client/node_modules
 79+            cp -r ${rtw-pnpm-deps}/node_modules client/
 80+            chmod -R +w client/node_modules
 81+
 82+            # Build client assets (vite outputs to ../server/pages/static/)
 83+            pushd client
 84+            pnpm run build
 85+            popd
 86+
 87+            # Bundle service worker
 88+            esbuild ./client/src/sw.js \\
 89+              --bundle \\
 90+              --outfile=./server/pages/static/js/sw.js \\
 91+              --minify \\
 92+              --format=iife \\
 93+              --platform=browser \\
 94+              --target=es2015
 95+
 96+            # Generate server-rendered CSS
 97+            pushd server
 98+            tailwindcss -m --cwd pages/ -i index.css -o static/css/style.css
 99+            popd
100+
101+            # Generate templ Go files
102+            pushd server
103+            templ generate
104+            popd
105+          '';
106+
107+          # Rename binary from "server" to "rtw"
108+          postInstall = ''
109+            mv $out/bin/server $out/bin/rtw
110+          '';
111+
112+          meta = {
113+            description = "RTW adventure motorcycle trip planning server";
114+            license = lib.licenses.mit;
115+            mainProgram = "rtw";
116+          };
117+        };
118     in
119     {
120       packages = forEachSystem (system:
121@@ -49,7 +162,8 @@
122         in
123         {
124           y-sweet = pkgs.callPackage y-sweet-package {};
125-          default = self.packages.${system}.y-sweet;
126+          rtw = pkgs.callPackage rtw-package {};
127+          default = self.packages.${system}.rtw;
128         }
129       );
130