name: Web Frontend on: push: branches: [master, main] paths: - 'web/**' - '.github/workflows/web.yml' pull_request: branches: [master, main] paths: - 'web/**' - '.github/workflows/web.yml' workflow_dispatch: permissions: contents: read jobs: lint: name: Lint & Type Check runs-on: ubuntu-latest defaults: run: working-directory: web steps: - uses: actions/checkout@v7 - uses: actions/setup-node@v6 with: node-version: 22 cache: 'npm' cache-dependency-path: web/package-lock.json - name: Install dependencies run: npm ci - name: Check facts drift # facts.generated.ts is TRACKED (committed), so verify the committed # copy matches the workspace BEFORE regenerating. Running prebuild first # would self-heal the working tree and let a stale committed file pass # (#3771). check:facts ignores the volatile generatedAt/latestRelease # fields by design, so it is safe to run against the committed copy that # exists at checkout. run: npm run check:facts - name: Generate derived facts # Regenerate after the drift gate so tsc --noEmit (TS2307 without it) and # the build use a current facts.generated.ts. When the gate passes this # only refreshes the generatedAt timestamp. run: npm run prebuild - name: Check docs parity # Fails CI when docs-map.ts references non-existent repo files or # when website version / command snippets are stale. run: npm run check:docs - name: Run ESLint run: npm run lint - name: TypeScript type check run: npx tsc --noEmit deploy: name: Deploy to Cloudflare runs-on: ubuntu-latest needs: lint if: github.event_name == 'workflow_dispatch' && github.ref == 'refs/heads/main' defaults: run: working-directory: web env: CLOUDFLARE_ACCOUNT_ID: ${{ vars.CLOUDFLARE_ACCOUNT_ID }} CLOUDFLARE_API_TOKEN: ${{ secrets.CLOUDFLARE_API_TOKEN }} steps: - uses: actions/checkout@v7 - uses: actions/setup-node@v6 with: node-version: 22 cache: 'npm' cache-dependency-path: web/package-lock.json - name: Install dependencies run: npm ci - name: Check Cloudflare deploy environment run: npm run check:deploy-env - name: Build OpenNext bundle run: npm run build && npx opennextjs-cloudflare build - name: Deploy run: npm run deploy