blob: 6c6dc604bffbfaf62830aface26f9657615fa08f (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
|
## Project Overview
cgithub is a lightweight GitHub alternative frontend that scrapes GitHub's server-rendered HTML instead of using the API. Data is usually extracted from embedded JSON data from `<script type="application/json">` tags that GitHub includes for hydration.
## Commands
```bash
# Local dev server (Cloudflare Workers runtime)
pnpm run dev
# Deploy to Cloudflare Workers
pnpm run deploy
# Run tests
pnpm test
```
## Architecture
**Stack:** Hono (web framework) + Eta (templating) + TypeScript, running on Cloudflare Workers
**Source files:**
- `src/app.ts` - Hono routes
- `src/worker.ts` - Cloudflare Workers entry (config in `wrangler.jsonc`)
- `src/scraper.ts` - GitHub HTML fetching and JSON extraction logic
**Templates:** `views/*.eta` - Eta templates with layout inheritance. `views/layouts/base.eta` is the HTML shell every page uses; `views/layouts/repo.eta` wraps it with the repository header, nav, and search box. Templates address each other from the views root (`/layouts/base.eta`) or as siblings (`./_tree`). On Workers, runtime code generation is disallowed, so `scripts/build.ts` precompiles templates to `src/views.generated.ts`. The same script records the build's `git describe` output in `src/build.generated.ts` for the page footer. Both are gitignored and regenerated by the `dev`/`deploy` scripts.
**Static files:** `public/static/*`, served by Workers Static Assets.
**Routes:**
- `GET /:owner` - User or organization profile with pinned repositories
- `GET /:owner/:repo` - Repository info with directory listing
- `GET /:owner/:repo/tree/:branch/:path*` - Directory listing
- `GET /:owner/:repo/blob/:branch/:path` - File content view
- `GET /:owner/:repo/commits/:branch/:path*` - Commit history of the repository, a directory, or a file
- `GET /:owner/:repo/wiki` - Wiki home page
- `GET /:owner/:repo/wiki/:page` - Wiki page (also `/:page/:oid` for a revision)
- `GET /:owner/:repo/wiki/_pages` - Wiki page index
## Instructions
- Use `for (const ... of ...)` instead of `.forEach()`
- Update `scraper.test.ts`
|