name: landing-page-ci on: pull_request: paths: - .github/workflows/landing-page-ci.yml - .github/workflows/landing-page.yml - apps/landing-page/** - package.json - pnpm-lock.yaml - pnpm-workspace.yaml push: branches: - main paths: - .github/workflows/landing-page-ci.yml - .github/workflows/landing-page.yml - apps/landing-page/** - package.json - pnpm-lock.yaml - pnpm-workspace.yaml workflow_dispatch: permissions: contents: read concurrency: group: landing-page-ci-${{ github.event.pull_request.number || github.ref }} cancel-in-progress: true jobs: validate: name: Validate landing page runs-on: ubuntu-latest timeout-minutes: 15 steps: - name: Checkout uses: actions/checkout@v6.0.2 - name: Setup pnpm uses: pnpm/action-setup@v5 with: version: 10.33.2 - name: Setup Node.js uses: actions/setup-node@v6 with: node-version: 24 cache: pnpm - name: Install dependencies run: pnpm install --frozen-lockfile - name: Typecheck landing page run: pnpm --filter @open-design/landing-page typecheck - name: Build landing page run: pnpm --filter @open-design/landing-page build - name: Verify zero external JavaScript run: | node <<'NODE' const { readFileSync } = require('node:fs'); const html = readFileSync('apps/landing-page/out/index.html', 'utf8'); const forbidden = [ /]*\bsrc=/i, /type=["']module["']/i, /\/_astro\/[^"'<>\s]+\.js/i, ]; for (const pattern of forbidden) { if (pattern.test(html)) { console.error(`Unexpected client JavaScript matched ${pattern}`); process.exit(1); } } NODE - name: Verify Cloudflare image resizing URLs run: | node <<'NODE' const { readFileSync } = require('node:fs'); const html = readFileSync('apps/landing-page/out/index.html', 'utf8'); const resizedUrls = html.match(/https:\/\/static\.open-design\.ai\/cdn-cgi\/image\//g) ?? []; if (resizedUrls.length < 16) { console.error(`Expected at least 16 Cloudflare resized image URLs, found ${resizedUrls.length}`); process.exit(1); } if (/(?:src|content)=["']\/assets\/[A-Za-z0-9_.-]+\.png/.test(html)) { console.error('Found local /assets/*.png image reference in generated landing HTML.'); process.exit(1); } NODE