emulate 0.5.0 → 0.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +141 -19
- package/dist/api.js +460 -24
- package/dist/api.js.map +1 -1
- package/dist/{dist-PWGOAQC6.js → dist-2ZZGNPJI.js} +1 -1
- package/dist/dist-2ZZGNPJI.js.map +1 -0
- package/dist/{dist-4X2KPMAJ.js → dist-CXRPM6BK.js} +1 -3
- package/dist/dist-CXRPM6BK.js.map +1 -0
- package/dist/{dist-LDUHEJAN.js → dist-DSJSF3GY.js} +1 -3
- package/dist/dist-DSJSF3GY.js.map +1 -0
- package/dist/{dist-ETHHYBGF.js → dist-IFULY5LE.js} +1 -2
- package/dist/dist-IFULY5LE.js.map +1 -0
- package/dist/{dist-J6LHUR52.js → dist-IRUBHCZU.js} +1 -2
- package/dist/dist-IRUBHCZU.js.map +1 -0
- package/dist/{dist-ENKE2S7V.js → dist-NJJLJT2N.js} +1 -3
- package/dist/dist-NJJLJT2N.js.map +1 -0
- package/dist/dist-OGSAVJ25.js +4874 -0
- package/dist/dist-OGSAVJ25.js.map +1 -0
- package/dist/{dist-REDHDZ3V.js → dist-PO4CL5SJ.js} +1 -3
- package/dist/dist-PO4CL5SJ.js.map +1 -0
- package/dist/{dist-IBXD3O6A.js → dist-R3TNKUIE.js} +1 -3
- package/dist/dist-R3TNKUIE.js.map +1 -0
- package/dist/{dist-CFST4X4K.js → dist-WACHAAVU.js} +1 -2
- package/dist/dist-WACHAAVU.js.map +1 -0
- package/dist/{dist-5JVGPOL3.js → dist-XWWZVLQQ.js} +1 -2
- package/dist/dist-XWWZVLQQ.js.map +1 -0
- package/dist/{dist-KKTYBE5S.js → dist-ZY5SZSJ2.js} +8 -3
- package/dist/dist-ZY5SZSJ2.js.map +1 -0
- package/dist/index.js +464 -26
- package/dist/index.js.map +1 -1
- package/package.json +14 -15
- package/dist/chunk-AQ2CLRU3.js +0 -2146
- package/dist/chunk-AQ2CLRU3.js.map +0 -1
- package/dist/dist-4X2KPMAJ.js.map +0 -1
- package/dist/dist-5JVGPOL3.js.map +0 -1
- package/dist/dist-CE6BUCWQ.js +0 -1438
- package/dist/dist-CE6BUCWQ.js.map +0 -1
- package/dist/dist-CFST4X4K.js.map +0 -1
- package/dist/dist-ENKE2S7V.js.map +0 -1
- package/dist/dist-ETHHYBGF.js.map +0 -1
- package/dist/dist-IBXD3O6A.js.map +0 -1
- package/dist/dist-J6LHUR52.js.map +0 -1
- package/dist/dist-KKTYBE5S.js.map +0 -1
- package/dist/dist-LDUHEJAN.js.map +0 -1
- package/dist/dist-PWGOAQC6.js.map +0 -1
- package/dist/dist-REDHDZ3V.js.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../@emulators/github/src/index.ts","../../@emulators/github/src/store.ts","../../@emulators/github/src/helpers.ts","../../@emulators/core/src/store.ts","../../@emulators/core/src/http.ts","../../@emulators/core/src/webhooks.ts","../../@emulators/core/src/middleware/error-handler.ts","../../@emulators/core/src/middleware/auth.ts","../../@emulators/core/src/debug.ts","../../@emulators/core/src/fonts.ts","../../@emulators/core/src/server.ts","../../@emulators/core/src/middleware/pagination.ts","../../@emulators/core/src/ui.ts","../../@emulators/core/src/oauth-helpers.ts","../../@emulators/core/src/persistence.ts","../../@emulators/github/src/route-helpers.ts","../../@emulators/github/src/routes/users.ts","../../@emulators/github/src/routes/repos.ts","../../@emulators/github/src/routes/issues.ts","../../@emulators/github/src/routes/pulls.ts","../../@emulators/github/src/routes/comments.ts","../../@emulators/github/src/routes/reviews.ts","../../@emulators/github/src/routes/labels.ts","../../@emulators/github/src/routes/branches.ts","../../@emulators/github/src/routes/orgs.ts","../../@emulators/github/src/routes/releases.ts","../../@emulators/github/src/routes/webhooks.ts","../../@emulators/github/src/routes/search.ts","../../@emulators/github/src/routes/actions.ts","../../@emulators/github/src/routes/checks.ts","../../@emulators/github/src/routes/rate-limit.ts","../../@emulators/github/src/routes/meta.ts","../../@emulators/github/src/routes/oauth.ts","../../@emulators/github/src/routes/apps.ts"],"sourcesContent":["import { createHmac } from \"crypto\";\nimport type { Hono } from \"@emulators/core\";\nimport type { ServicePlugin, Store, WebhookDispatcher, TokenMap, AppEnv, RouteContext } from \"@emulators/core\";\nimport { getGitHubStore } from \"./store.js\";\nimport type { GitHubStore } from \"./store.js\";\nimport type { GitHubAppInstallation } from \"./entities.js\";\nimport { generateNodeId, generateSha } from \"./helpers.js\";\nimport { usersRoutes } from \"./routes/users.js\";\nimport { reposRoutes } from \"./routes/repos.js\";\nimport { issuesRoutes } from \"./routes/issues.js\";\nimport { pullsRoutes } from \"./routes/pulls.js\";\nimport { commentsRoutes } from \"./routes/comments.js\";\nimport { reviewsRoutes } from \"./routes/reviews.js\";\nimport { labelsAndMilestonesRoutes } from \"./routes/labels.js\";\nimport { branchesAndGitRoutes } from \"./routes/branches.js\";\nimport { orgsAndTeamsRoutes } from \"./routes/orgs.js\";\nimport { releasesRoutes } from \"./routes/releases.js\";\nimport { webhooksRoutes } from \"./routes/webhooks.js\";\nimport { searchRoutes } from \"./routes/search.js\";\nimport { actionsRoutes } from \"./routes/actions.js\";\nimport { checksRoutes } from \"./routes/checks.js\";\nimport { rateLimitRoutes } from \"./routes/rate-limit.js\";\nimport { metaRoutes } from \"./routes/meta.js\";\nimport { oauthRoutes } from \"./routes/oauth.js\";\nimport { appsRoutes } from \"./routes/apps.js\";\n\nexport { getGitHubStore, type GitHubStore } from \"./store.js\";\nexport * from \"./entities.js\";\n\nexport interface GitHubSeedConfig {\n port?: number;\n users?: Array<{\n login: string;\n name?: string;\n email?: string;\n bio?: string;\n company?: string;\n location?: string;\n blog?: string;\n twitter_username?: string;\n site_admin?: boolean;\n }>;\n orgs?: Array<{\n login: string;\n name?: string;\n description?: string;\n email?: string;\n }>;\n tokens?: Record<string, { login: string; scopes?: string[] }>;\n repos?: Array<{\n owner: string;\n name: string;\n description?: string;\n private?: boolean;\n language?: string;\n topics?: string[];\n default_branch?: string;\n auto_init?: boolean;\n }>;\n oauth_apps?: Array<{\n client_id: string;\n client_secret: string;\n name: string;\n redirect_uris: string[];\n }>;\n apps?: Array<{\n app_id: number;\n slug: string;\n name: string;\n private_key: string;\n permissions?: Record<string, string>;\n events?: string[];\n webhook_url?: string;\n webhook_secret?: string;\n description?: string;\n installations?: Array<{\n installation_id: number;\n account: string;\n repository_selection?: \"all\" | \"selected\";\n repositories?: string[];\n permissions?: Record<string, string>;\n events?: string[];\n }>;\n }>;\n}\n\nfunction seedDefaults(store: Store, baseUrl: string): void {\n const gh = getGitHubStore(store);\n\n const ghost = gh.users.insert({\n login: \"ghost\",\n node_id: \"\",\n avatar_url: `${baseUrl}/avatars/u/ghost`,\n gravatar_id: \"\",\n type: \"User\",\n site_admin: false,\n name: \"Ghost\",\n company: null,\n blog: \"\",\n location: null,\n email: null,\n hireable: null,\n bio: null,\n twitter_username: null,\n public_repos: 0,\n public_gists: 0,\n followers: 0,\n following: 0,\n });\n gh.users.update(ghost.id, { node_id: generateNodeId(\"User\", ghost.id) });\n\n const admin = gh.users.insert({\n login: \"admin\",\n node_id: \"\",\n avatar_url: `${baseUrl}/avatars/u/admin`,\n gravatar_id: \"\",\n type: \"User\",\n site_admin: true,\n name: \"Admin\",\n company: null,\n blog: \"\",\n location: null,\n email: \"admin@localhost\",\n hireable: null,\n bio: \"Default admin user\",\n twitter_username: null,\n public_repos: 0,\n public_gists: 0,\n followers: 0,\n following: 0,\n });\n gh.users.update(admin.id, { node_id: generateNodeId(\"User\", admin.id) });\n}\n\nexport function seedFromConfig(store: Store, baseUrl: string, config: GitHubSeedConfig): void {\n const gh = getGitHubStore(store);\n\n if (config.users) {\n for (const u of config.users) {\n const existing = gh.users.findOneBy(\"login\", u.login);\n if (existing) continue;\n const user = gh.users.insert({\n login: u.login,\n node_id: \"\",\n avatar_url: `${baseUrl}/avatars/u/${u.login}`,\n gravatar_id: \"\",\n type: \"User\",\n site_admin: u.site_admin ?? false,\n name: u.name ?? null,\n company: u.company ?? null,\n blog: u.blog ?? \"\",\n location: u.location ?? null,\n email: u.email ?? null,\n hireable: null,\n bio: u.bio ?? null,\n twitter_username: u.twitter_username ?? null,\n public_repos: 0,\n public_gists: 0,\n followers: 0,\n following: 0,\n });\n gh.users.update(user.id, { node_id: generateNodeId(\"User\", user.id) });\n }\n }\n\n if (config.orgs) {\n for (const o of config.orgs) {\n const existing = gh.orgs.findOneBy(\"login\", o.login);\n if (existing) continue;\n const org = gh.orgs.insert({\n login: o.login,\n node_id: \"\",\n description: o.description ?? null,\n name: o.name ?? null,\n company: null,\n blog: \"\",\n location: null,\n email: o.email ?? null,\n twitter_username: null,\n is_verified: false,\n has_organization_projects: true,\n has_repository_projects: true,\n public_repos: 0,\n public_gists: 0,\n followers: 0,\n following: 0,\n members_can_create_repositories: true,\n default_repository_permission: \"read\",\n billing_email: null,\n });\n gh.orgs.update(org.id, { node_id: generateNodeId(\"Org\", org.id) });\n }\n }\n\n if (config.repos) {\n for (const r of config.repos) {\n const ownerUser = gh.users.findOneBy(\"login\", r.owner);\n const owner = ownerUser ?? gh.orgs.findOneBy(\"login\", r.owner);\n if (!owner) continue;\n\n const fullName = `${r.owner}/${r.name}`;\n const existing = gh.repos.findOneBy(\"full_name\", fullName);\n if (existing) continue;\n\n const ownerType = ownerUser ? \"User\" : \"Organization\";\n const defaultBranch = r.default_branch ?? \"main\";\n\n const repo = gh.repos.insert({\n node_id: \"\",\n name: r.name,\n full_name: fullName,\n owner_id: owner.id,\n owner_type: ownerType,\n private: r.private ?? false,\n description: r.description ?? null,\n fork: false,\n forked_from_id: null,\n homepage: null,\n language: r.language ?? null,\n languages: r.language ? { [r.language]: 10000 } : {},\n forks_count: 0,\n stargazers_count: 0,\n watchers_count: 0,\n size: 0,\n default_branch: defaultBranch,\n open_issues_count: 0,\n topics: r.topics ?? [],\n has_issues: true,\n has_projects: true,\n has_wiki: true,\n has_pages: false,\n has_downloads: true,\n has_discussions: false,\n archived: false,\n disabled: false,\n visibility: r.private ? \"private\" : \"public\",\n pushed_at: null,\n allow_rebase_merge: true,\n allow_squash_merge: true,\n allow_merge_commit: true,\n allow_auto_merge: false,\n delete_branch_on_merge: false,\n allow_forking: true,\n is_template: false,\n license: null,\n });\n gh.repos.update(repo.id, { node_id: generateNodeId(\"Repository\", repo.id) });\n\n if (r.auto_init !== false) {\n const sha = generateSha();\n const treeSha = generateSha();\n\n const commit = gh.commits.insert({\n repo_id: repo.id,\n sha,\n node_id: \"\",\n message: \"Initial commit\",\n author_name: r.owner,\n author_email: `${r.owner}@localhost`,\n author_date: repo.created_at,\n committer_name: r.owner,\n committer_email: `${r.owner}@localhost`,\n committer_date: repo.created_at,\n tree_sha: treeSha,\n parent_shas: [],\n user_id: owner.id,\n });\n gh.commits.update(commit.id, { node_id: generateNodeId(\"Commit\", commit.id) });\n\n const tree = gh.trees.insert({\n repo_id: repo.id,\n sha: treeSha,\n node_id: \"\",\n tree: [{ path: \"README.md\", mode: \"100644\", type: \"blob\", sha: generateSha(), size: 20 }],\n truncated: false,\n });\n gh.trees.update(tree.id, { node_id: generateNodeId(\"Tree\", tree.id) });\n\n gh.branches.insert({\n repo_id: repo.id,\n name: defaultBranch,\n sha,\n protected: false,\n });\n\n const refRow = gh.refs.insert({\n repo_id: repo.id,\n ref: `refs/heads/${defaultBranch}`,\n sha,\n node_id: \"\",\n });\n gh.refs.update(refRow.id, { node_id: generateNodeId(\"Ref\", refRow.id) });\n\n gh.repos.update(repo.id, { pushed_at: repo.created_at, size: 1 });\n }\n\n if (ownerType === \"User\") {\n const user = gh.users.findOneBy(\"login\", r.owner);\n if (user && !r.private) {\n gh.users.update(user.id, { public_repos: user.public_repos + 1 });\n }\n } else {\n const org = gh.orgs.findOneBy(\"login\", r.owner);\n if (org && !r.private) {\n gh.orgs.update(org.id, { public_repos: org.public_repos + 1 });\n }\n }\n }\n }\n\n if (config.oauth_apps) {\n for (const oa of config.oauth_apps) {\n const existing = gh.oauthApps.findOneBy(\"client_id\", oa.client_id);\n if (existing) continue;\n gh.oauthApps.insert({\n client_id: oa.client_id,\n client_secret: oa.client_secret,\n name: oa.name,\n redirect_uris: oa.redirect_uris,\n });\n }\n }\n\n if (config.apps) {\n for (const a of config.apps) {\n const existingApp = gh.apps.findOneBy(\"slug\", a.slug);\n if (existingApp) continue;\n\n gh.apps.insert({\n app_id: a.app_id,\n slug: a.slug,\n name: a.name,\n private_key: a.private_key,\n permissions: a.permissions ?? {},\n events: a.events ?? [],\n webhook_url: a.webhook_url ?? null,\n webhook_secret: a.webhook_secret ?? null,\n description: a.description ?? null,\n });\n\n if (a.installations) {\n for (const inst of a.installations) {\n const account = gh.users.findOneBy(\"login\", inst.account) ?? gh.orgs.findOneBy(\"login\", inst.account);\n if (!account) continue;\n\n const accountType = gh.users.findOneBy(\"login\", inst.account) ? (\"User\" as const) : (\"Organization\" as const);\n\n const repoIds: number[] = [];\n if (inst.repositories) {\n for (const repoFullName of inst.repositories) {\n const fullName = repoFullName.includes(\"/\") ? repoFullName : `${inst.account}/${repoFullName}`;\n const repo = gh.repos.findOneBy(\"full_name\", fullName);\n if (repo) repoIds.push(repo.id);\n }\n }\n\n gh.appInstallations.insert({\n installation_id: inst.installation_id,\n app_id: a.app_id,\n account_type: accountType,\n account_id: account.id,\n account_login: inst.account,\n repository_selection: inst.repository_selection ?? \"all\",\n repository_ids: repoIds,\n permissions: inst.permissions ?? a.permissions ?? {},\n events: inst.events ?? a.events ?? [],\n suspended_at: null,\n });\n }\n }\n }\n }\n}\n\nfunction findInstallationsForRepo(\n gh: GitHubStore,\n ownerLogin: string,\n repoName: string | undefined,\n event: string,\n): GitHubAppInstallation[] {\n const ownerEntity = gh.users.findOneBy(\"login\", ownerLogin) ?? gh.orgs.findOneBy(\"login\", ownerLogin);\n if (!ownerEntity) return [];\n\n const repoEntity = repoName ? gh.repos.findOneBy(\"full_name\", `${ownerLogin}/${repoName}`) : null;\n\n const results: GitHubAppInstallation[] = [];\n for (const inst of gh.appInstallations.all()) {\n if (inst.account_id !== ownerEntity.id) continue;\n if (inst.suspended_at) continue;\n\n const ghApp = gh.apps.all().find((a) => a.app_id === inst.app_id);\n if (!ghApp) continue;\n if (!ghApp.events.includes(event) && !ghApp.events.includes(\"*\")) continue;\n\n if (repoEntity && inst.repository_selection === \"selected\") {\n if (!inst.repository_ids.includes(repoEntity.id)) continue;\n }\n\n results.push(inst);\n }\n return results;\n}\n\nfunction enrichPayloadWithInstallation(payload: unknown, installation: GitHubAppInstallation): unknown {\n if (!payload || typeof payload !== \"object\") return payload;\n return {\n ...(payload as Record<string, unknown>),\n installation: {\n id: installation.installation_id,\n node_id: generateNodeId(\"Installation\", installation.installation_id),\n },\n };\n}\n\nasync function deliverToAppWebhookUrls(\n gh: GitHubStore,\n event: string,\n action: string | undefined,\n payload: unknown,\n ownerLogin: string,\n repoName: string | undefined,\n): Promise<void> {\n const installations = findInstallationsForRepo(gh, ownerLogin, repoName, event);\n\n for (const inst of installations) {\n const ghApp = gh.apps.all().find((a) => a.app_id === inst.app_id);\n if (!ghApp?.webhook_url) continue;\n\n const enriched = enrichPayloadWithInstallation(payload, inst);\n const body = JSON.stringify(enriched);\n\n const headers: Record<string, string> = {\n \"Content-Type\": \"application/json\",\n \"X-GitHub-Event\": event,\n \"X-GitHub-Delivery\": String(Date.now()),\n };\n if (ghApp.webhook_secret) {\n const hmac = createHmac(\"sha256\", ghApp.webhook_secret).update(body).digest(\"hex\");\n headers[\"X-Hub-Signature-256\"] = `sha256=${hmac}`;\n }\n\n try {\n await fetch(ghApp.webhook_url, {\n method: \"POST\",\n headers,\n body,\n signal: AbortSignal.timeout(10000),\n });\n } catch {\n // Best-effort delivery\n }\n }\n}\n\nexport const githubPlugin: ServicePlugin = {\n name: \"github\",\n register(app: Hono<AppEnv>, store: Store, webhooks: WebhookDispatcher, baseUrl: string, tokenMap?: TokenMap): void {\n const gh = getGitHubStore(store);\n\n const originalDispatch = webhooks.dispatch.bind(webhooks);\n webhooks.dispatch = async (\n event: string,\n action: string | undefined,\n payload: unknown,\n owner: string,\n repo?: string,\n ): Promise<void> => {\n const installations = findInstallationsForRepo(gh, owner, repo, event);\n\n const enrichedPayload =\n installations.length > 0 ? enrichPayloadWithInstallation(payload, installations[0]) : payload;\n\n await originalDispatch(event, action, enrichedPayload, owner, repo);\n await deliverToAppWebhookUrls(gh, event, action, payload, owner, repo);\n };\n\n const ctx: RouteContext = { app, store, webhooks, baseUrl, tokenMap };\n usersRoutes(ctx);\n reposRoutes(ctx);\n issuesRoutes(ctx);\n pullsRoutes(ctx);\n commentsRoutes(ctx);\n reviewsRoutes(ctx);\n labelsAndMilestonesRoutes(ctx);\n branchesAndGitRoutes(ctx);\n orgsAndTeamsRoutes(ctx);\n releasesRoutes(ctx);\n webhooksRoutes(ctx);\n searchRoutes(ctx);\n actionsRoutes(ctx);\n checksRoutes(ctx);\n rateLimitRoutes(ctx);\n metaRoutes(ctx);\n oauthRoutes(ctx);\n appsRoutes(ctx);\n },\n seed(store: Store, baseUrl: string): void {\n seedDefaults(store, baseUrl);\n },\n};\n\nexport default githubPlugin;\n","import { Store, type Collection } from \"@emulators/core\";\nimport type {\n GitHubUser,\n GitHubOrg,\n GitHubTeam,\n GitHubTeamMember,\n GitHubTeamRepo,\n GitHubRepo,\n GitHubCollaborator,\n GitHubIssue,\n GitHubPullRequest,\n GitHubLabel,\n GitHubMilestone,\n GitHubComment,\n GitHubReview,\n GitHubIssueEvent,\n GitHubBranch,\n GitHubBranchProtection,\n GitHubRef,\n GitHubCommit,\n GitHubTree,\n GitHubBlob,\n GitHubTag,\n GitHubRelease,\n GitHubReleaseAsset,\n GitHubWebhook,\n GitHubWorkflow,\n GitHubWorkflowRun,\n GitHubJob,\n GitHubArtifact,\n GitHubSecret,\n GitHubCheckRun,\n GitHubCheckSuite,\n GitHubOAuthApp,\n GitHubApp,\n GitHubAppInstallation,\n GitHubOAuthGrant,\n} from \"./entities.js\";\n\nexport interface GitHubStore {\n users: Collection<GitHubUser>;\n orgs: Collection<GitHubOrg>;\n teams: Collection<GitHubTeam>;\n teamMembers: Collection<GitHubTeamMember>;\n teamRepos: Collection<GitHubTeamRepo>;\n repos: Collection<GitHubRepo>;\n collaborators: Collection<GitHubCollaborator>;\n issues: Collection<GitHubIssue>;\n pullRequests: Collection<GitHubPullRequest>;\n labels: Collection<GitHubLabel>;\n milestones: Collection<GitHubMilestone>;\n comments: Collection<GitHubComment>;\n reviews: Collection<GitHubReview>;\n issueEvents: Collection<GitHubIssueEvent>;\n branches: Collection<GitHubBranch>;\n branchProtections: Collection<GitHubBranchProtection>;\n refs: Collection<GitHubRef>;\n commits: Collection<GitHubCommit>;\n trees: Collection<GitHubTree>;\n blobs: Collection<GitHubBlob>;\n tags: Collection<GitHubTag>;\n releases: Collection<GitHubRelease>;\n releaseAssets: Collection<GitHubReleaseAsset>;\n webhooks: Collection<GitHubWebhook>;\n workflows: Collection<GitHubWorkflow>;\n workflowRuns: Collection<GitHubWorkflowRun>;\n jobs: Collection<GitHubJob>;\n artifacts: Collection<GitHubArtifact>;\n secrets: Collection<GitHubSecret>;\n checkRuns: Collection<GitHubCheckRun>;\n checkSuites: Collection<GitHubCheckSuite>;\n oauthApps: Collection<GitHubOAuthApp>;\n apps: Collection<GitHubApp>;\n appInstallations: Collection<GitHubAppInstallation>;\n oauthGrants: Collection<GitHubOAuthGrant>;\n}\n\nexport function getGitHubStore(store: Store): GitHubStore {\n return {\n users: store.collection<GitHubUser>(\"github.users\", [\"login\"]),\n orgs: store.collection<GitHubOrg>(\"github.orgs\", [\"login\"]),\n teams: store.collection<GitHubTeam>(\"github.teams\", [\"org_id\", \"slug\"]),\n teamMembers: store.collection<GitHubTeamMember>(\"github.team_members\", [\"team_id\", \"user_id\"]),\n teamRepos: store.collection<GitHubTeamRepo>(\"github.team_repos\", [\"team_id\", \"repo_id\"]),\n repos: store.collection<GitHubRepo>(\"github.repos\", [\"owner_id\", \"full_name\"]),\n collaborators: store.collection<GitHubCollaborator>(\"github.collaborators\", [\"repo_id\", \"user_id\"]),\n issues: store.collection<GitHubIssue>(\"github.issues\", [\"repo_id\", \"number\"]),\n pullRequests: store.collection<GitHubPullRequest>(\"github.pull_requests\", [\"repo_id\", \"number\"]),\n labels: store.collection<GitHubLabel>(\"github.labels\", [\"repo_id\"]),\n milestones: store.collection<GitHubMilestone>(\"github.milestones\", [\"repo_id\", \"number\"]),\n comments: store.collection<GitHubComment>(\"github.comments\", [\"repo_id\"]),\n reviews: store.collection<GitHubReview>(\"github.reviews\", [\"repo_id\", \"pull_number\"]),\n issueEvents: store.collection<GitHubIssueEvent>(\"github.issue_events\", [\"repo_id\", \"issue_number\"]),\n branches: store.collection<GitHubBranch>(\"github.branches\", [\"repo_id\"]),\n branchProtections: store.collection<GitHubBranchProtection>(\"github.branch_protections\", [\"repo_id\"]),\n refs: store.collection<GitHubRef>(\"github.refs\", [\"repo_id\"]),\n commits: store.collection<GitHubCommit>(\"github.commits\", [\"repo_id\", \"sha\"]),\n trees: store.collection<GitHubTree>(\"github.trees\", [\"repo_id\", \"sha\"]),\n blobs: store.collection<GitHubBlob>(\"github.blobs\", [\"repo_id\", \"sha\"]),\n tags: store.collection<GitHubTag>(\"github.tags\", [\"repo_id\"]),\n releases: store.collection<GitHubRelease>(\"github.releases\", [\"repo_id\"]),\n releaseAssets: store.collection<GitHubReleaseAsset>(\"github.release_assets\", [\"release_id\", \"repo_id\"]),\n webhooks: store.collection<GitHubWebhook>(\"github.webhooks\", [\"repo_id\", \"org_id\"]),\n workflows: store.collection<GitHubWorkflow>(\"github.workflows\", [\"repo_id\"]),\n workflowRuns: store.collection<GitHubWorkflowRun>(\"github.workflow_runs\", [\"repo_id\", \"workflow_id\"]),\n jobs: store.collection<GitHubJob>(\"github.jobs\", [\"run_id\"]),\n artifacts: store.collection<GitHubArtifact>(\"github.artifacts\", [\"run_id\", \"repo_id\"]),\n secrets: store.collection<GitHubSecret>(\"github.secrets\", [\"repo_id\", \"org_id\"]),\n checkRuns: store.collection<GitHubCheckRun>(\"github.check_runs\", [\"repo_id\", \"head_sha\"]),\n checkSuites: store.collection<GitHubCheckSuite>(\"github.check_suites\", [\"repo_id\", \"head_sha\"]),\n oauthApps: store.collection<GitHubOAuthApp>(\"github.oauth_apps\", [\"client_id\"]),\n apps: store.collection<GitHubApp>(\"github.apps\", [\"slug\"]),\n appInstallations: store.collection<GitHubAppInstallation>(\"github.app_installations\", [\n \"app_id\",\n \"installation_id\",\n ]),\n oauthGrants: store.collection<GitHubOAuthGrant>(\"github.oauth_grants\", [\"user_id\", \"client_id\"]),\n };\n}\n","import { randomBytes } from \"crypto\";\nimport type {\n GitHubUser,\n GitHubOrg,\n GitHubRepo,\n GitHubIssue,\n GitHubPullRequest,\n GitHubLabel,\n GitHubMilestone,\n GitHubComment,\n GitHubRelease,\n GitHubTeam,\n GitHubBranch,\n GitHubCommit,\n GitHubCheckRun,\n GitHubCheckSuite,\n GitHubReview,\n GitHubWorkflow,\n GitHubWorkflowRun,\n GitHubJob,\n GitHubArtifact,\n GitHubReleaseAsset,\n GitHubWebhook,\n GitHubRef,\n GitHubTag,\n GitHubBlob,\n GitHubTree,\n} from \"./entities.js\";\nimport type { GitHubStore } from \"./store.js\";\n\nexport function generateNodeId(type: string, id: number): string {\n return Buffer.from(`0:${type}${id}`).toString(\"base64\").replace(/=+$/, \"\");\n}\n\nexport function generateSha(): string {\n return randomBytes(20).toString(\"hex\");\n}\n\nexport function timestamp(): string {\n return new Date().toISOString();\n}\n\nexport function userUrl(baseUrl: string, login: string) {\n return {\n url: `${baseUrl}/users/${login}`,\n html_url: `${baseUrl}/${login}`,\n repos_url: `${baseUrl}/users/${login}/repos`,\n followers_url: `${baseUrl}/users/${login}/followers`,\n following_url: `${baseUrl}/users/${login}/following{/other_user}`,\n gists_url: `${baseUrl}/users/${login}/gists{/gist_id}`,\n starred_url: `${baseUrl}/users/${login}/starred{/owner}{/repo}`,\n subscriptions_url: `${baseUrl}/users/${login}/subscriptions`,\n organizations_url: `${baseUrl}/users/${login}/orgs`,\n events_url: `${baseUrl}/users/${login}/events{/privacy}`,\n received_events_url: `${baseUrl}/users/${login}/received_events`,\n avatar_url: `${baseUrl}/avatars/u/${login}`,\n };\n}\n\nexport function formatUser(user: GitHubUser, baseUrl: string) {\n const urls = userUrl(baseUrl, user.login);\n return {\n login: user.login,\n id: user.id,\n node_id: user.node_id,\n avatar_url: urls.avatar_url,\n gravatar_id: user.gravatar_id,\n url: urls.url,\n html_url: urls.html_url,\n followers_url: urls.followers_url,\n following_url: urls.following_url,\n gists_url: urls.gists_url,\n starred_url: urls.starred_url,\n subscriptions_url: urls.subscriptions_url,\n organizations_url: urls.organizations_url,\n repos_url: urls.repos_url,\n events_url: urls.events_url,\n received_events_url: urls.received_events_url,\n type: user.type,\n site_admin: user.site_admin,\n user_view_type: \"public\",\n };\n}\n\nexport function formatUserFull(user: GitHubUser, baseUrl: string) {\n return {\n ...formatUser(user, baseUrl),\n name: user.name,\n company: user.company,\n blog: user.blog,\n location: user.location,\n email: user.email,\n hireable: user.hireable,\n bio: user.bio,\n twitter_username: user.twitter_username,\n public_repos: user.public_repos,\n public_gists: user.public_gists,\n followers: user.followers,\n following: user.following,\n created_at: user.created_at,\n updated_at: user.updated_at,\n };\n}\n\nexport function formatOwner(store: GitHubStore, ownerId: number, ownerType: string, baseUrl: string) {\n if (ownerType === \"Organization\") {\n const org = store.orgs.get(ownerId);\n if (!org) return null;\n return formatOrgBrief(org, baseUrl);\n }\n const user = store.users.get(ownerId);\n if (!user) return null;\n return formatUser(user, baseUrl);\n}\n\nexport function formatOrgBrief(org: GitHubOrg, baseUrl: string) {\n return {\n login: org.login,\n id: org.id,\n node_id: org.node_id,\n url: `${baseUrl}/orgs/${org.login}`,\n html_url: `${baseUrl}/${org.login}`,\n repos_url: `${baseUrl}/orgs/${org.login}/repos`,\n events_url: `${baseUrl}/orgs/${org.login}/events`,\n hooks_url: `${baseUrl}/orgs/${org.login}/hooks`,\n issues_url: `${baseUrl}/orgs/${org.login}/issues`,\n members_url: `${baseUrl}/orgs/${org.login}/members{/member}`,\n public_members_url: `${baseUrl}/orgs/${org.login}/public_members{/member}`,\n avatar_url: `${baseUrl}/avatars/o/${org.login}`,\n description: org.description,\n type: \"Organization\",\n site_admin: false,\n user_view_type: \"public\",\n };\n}\n\nfunction permissionsFromLevel(level: string) {\n const levels = [\"pull\", \"triage\", \"push\", \"maintain\", \"admin\"];\n const idx = levels.indexOf(level);\n return {\n admin: idx >= 4,\n maintain: idx >= 3,\n push: idx >= 2,\n triage: idx >= 1,\n pull: idx >= 0,\n };\n}\n\nfunction computeRepoPermissions(store: GitHubStore, repo: GitHubRepo, authUserId: number) {\n if (repo.owner_type === \"User\" && repo.owner_id === authUserId) {\n return { admin: true, maintain: true, push: true, triage: true, pull: true };\n }\n if (repo.owner_type === \"Organization\") {\n for (const team of store.teams.all()) {\n if (team.org_id !== repo.owner_id) continue;\n const member = store.teamMembers.findBy(\"team_id\", team.id).find((m) => m.user_id === authUserId);\n if (member) {\n return { admin: true, maintain: true, push: true, triage: true, pull: true };\n }\n }\n }\n const collab = store.collaborators.findBy(\"repo_id\", repo.id).find((c) => c.user_id === authUserId);\n if (collab) {\n return permissionsFromLevel(collab.permission);\n }\n if (!repo.private) {\n return { admin: false, maintain: false, push: false, triage: false, pull: true };\n }\n return { admin: false, maintain: false, push: false, triage: false, pull: false };\n}\n\nexport function computeAuthorAssociation(store: GitHubStore, userId: number, repoId: number): string {\n const repo = store.repos.get(repoId);\n if (!repo) return \"NONE\";\n\n if (repo.owner_type === \"User\" && repo.owner_id === userId) return \"OWNER\";\n\n if (repo.owner_type === \"Organization\") {\n for (const team of store.teams.all()) {\n if (team.org_id !== repo.owner_id) continue;\n const member = store.teamMembers.findBy(\"team_id\", team.id).find((m) => m.user_id === userId);\n if (member) return \"MEMBER\";\n }\n }\n\n const collab = store.collaborators.findBy(\"repo_id\", repoId).find((c) => c.user_id === userId);\n if (collab) return \"COLLABORATOR\";\n\n return \"NONE\";\n}\n\nexport function formatOrgFull(org: GitHubOrg, baseUrl: string) {\n return {\n ...formatOrgBrief(org, baseUrl),\n name: org.name,\n company: org.company,\n blog: org.blog,\n location: org.location,\n email: org.email,\n twitter_username: org.twitter_username,\n is_verified: org.is_verified,\n has_organization_projects: org.has_organization_projects,\n has_repository_projects: org.has_repository_projects,\n public_repos: org.public_repos,\n public_gists: org.public_gists,\n followers: org.followers,\n following: org.following,\n created_at: org.created_at,\n updated_at: org.updated_at,\n members_can_create_repositories: org.members_can_create_repositories,\n default_repository_permission: org.default_repository_permission,\n billing_email: org.billing_email ?? null,\n };\n}\n\nexport function formatRepo(repo: GitHubRepo, store: GitHubStore, baseUrl: string, authUserId?: number) {\n const owner = formatOwner(store, repo.owner_id, repo.owner_type, baseUrl);\n const ownerLogin = owner?.login ?? \"unknown\";\n const repoUrl = `${baseUrl}/repos/${repo.full_name}`;\n const htmlUrl = `${baseUrl}/${repo.full_name}`;\n\n return {\n id: repo.id,\n node_id: repo.node_id,\n name: repo.name,\n full_name: repo.full_name,\n private: repo.private,\n owner,\n html_url: htmlUrl,\n description: repo.description,\n fork: repo.fork,\n url: repoUrl,\n forks_url: `${repoUrl}/forks`,\n keys_url: `${repoUrl}/keys{/key_id}`,\n collaborators_url: `${repoUrl}/collaborators{/collaborator}`,\n teams_url: `${repoUrl}/teams`,\n hooks_url: `${repoUrl}/hooks`,\n issue_events_url: `${repoUrl}/issues/events{/number}`,\n events_url: `${repoUrl}/events`,\n assignees_url: `${repoUrl}/assignees{/user}`,\n branches_url: `${repoUrl}/branches{/branch}`,\n tags_url: `${repoUrl}/tags`,\n blobs_url: `${repoUrl}/git/blobs{/sha}`,\n git_tags_url: `${repoUrl}/git/tags{/sha}`,\n git_refs_url: `${repoUrl}/git/ref{/sha}`,\n trees_url: `${repoUrl}/git/trees{/sha}`,\n statuses_url: `${repoUrl}/statuses/{sha}`,\n languages_url: `${repoUrl}/languages`,\n stargazers_url: `${repoUrl}/stargazers`,\n contributors_url: `${repoUrl}/contributors`,\n subscribers_url: `${repoUrl}/subscribers`,\n subscription_url: `${repoUrl}/subscription`,\n commits_url: `${repoUrl}/commits{/sha}`,\n git_commits_url: `${repoUrl}/git/commits{/sha}`,\n comments_url: `${repoUrl}/comments{/number}`,\n issue_comment_url: `${repoUrl}/issues/comments{/number}`,\n contents_url: `${repoUrl}/contents/{+path}`,\n compare_url: `${repoUrl}/compare/{base}...{head}`,\n merges_url: `${repoUrl}/merges`,\n archive_url: `${repoUrl}/{archive_format}{/ref}`,\n downloads_url: `${repoUrl}/downloads`,\n issues_url: `${repoUrl}/issues{/number}`,\n pulls_url: `${repoUrl}/pulls{/number}`,\n milestones_url: `${repoUrl}/milestones{/number}`,\n notifications_url: `${repoUrl}/notifications{?since,all,participating}`,\n labels_url: `${repoUrl}/labels{/name}`,\n releases_url: `${repoUrl}/releases{/id}`,\n deployments_url: `${repoUrl}/deployments`,\n created_at: repo.created_at,\n updated_at: repo.updated_at,\n pushed_at: repo.pushed_at,\n git_url: `git://${baseUrl.replace(/^https?:\\/\\//, \"\")}/${repo.full_name}.git`,\n ssh_url: `git@${baseUrl.replace(/^https?:\\/\\//, \"\")}:${repo.full_name}.git`,\n clone_url: `${htmlUrl}.git`,\n svn_url: htmlUrl,\n homepage: repo.homepage,\n size: repo.size,\n stargazers_count: repo.stargazers_count,\n watchers_count: repo.watchers_count,\n language: repo.language,\n has_issues: repo.has_issues,\n has_projects: repo.has_projects,\n has_downloads: repo.has_downloads,\n has_wiki: repo.has_wiki,\n has_pages: repo.has_pages,\n has_discussions: repo.has_discussions,\n forks_count: repo.forks_count,\n mirror_url: null,\n archived: repo.archived,\n disabled: repo.disabled,\n open_issues_count: repo.open_issues_count,\n license: repo.license,\n allow_forking: repo.allow_forking,\n is_template: repo.is_template,\n topics: repo.topics,\n visibility: repo.visibility,\n forks: repo.forks_count,\n open_issues: repo.open_issues_count,\n watchers: repo.watchers_count,\n default_branch: repo.default_branch,\n permissions:\n authUserId !== undefined\n ? computeRepoPermissions(store, repo, authUserId)\n : {\n admin: true,\n maintain: true,\n push: true,\n triage: true,\n pull: true,\n },\n allow_rebase_merge: repo.allow_rebase_merge,\n allow_squash_merge: repo.allow_squash_merge,\n allow_merge_commit: repo.allow_merge_commit,\n allow_auto_merge: repo.allow_auto_merge,\n delete_branch_on_merge: repo.delete_branch_on_merge,\n };\n}\n\nexport function formatIssue(issue: GitHubIssue, store: GitHubStore, baseUrl: string) {\n const repo = store.repos.get(issue.repo_id);\n if (!repo) return null;\n const user = store.users.get(issue.user_id);\n const repoUrl = `${baseUrl}/repos/${repo.full_name}`;\n\n const labels = issue.label_ids\n .map((id) => store.labels.get(id))\n .filter(Boolean)\n .map((l) => formatLabel(l!, repo, baseUrl));\n\n const assignees = issue.assignee_ids\n .map((id) => store.users.get(id))\n .filter(Boolean)\n .map((u) => formatUser(u!, baseUrl));\n\n const milestone = issue.milestone_id ? store.milestones.get(issue.milestone_id) : null;\n const closedBy = issue.closed_by_id ? store.users.get(issue.closed_by_id) : null;\n\n return {\n url: `${repoUrl}/issues/${issue.number}`,\n repository_url: repoUrl,\n labels_url: `${repoUrl}/issues/${issue.number}/labels{/name}`,\n comments_url: `${repoUrl}/issues/${issue.number}/comments`,\n events_url: `${repoUrl}/issues/${issue.number}/events`,\n html_url: `${baseUrl}/${repo.full_name}/issues/${issue.number}`,\n id: issue.id,\n node_id: issue.node_id,\n number: issue.number,\n title: issue.title,\n user: user ? formatUser(user, baseUrl) : null,\n labels,\n state: issue.state,\n state_reason: issue.state_reason,\n locked: issue.locked,\n active_lock_reason: issue.active_lock_reason,\n assignee: assignees[0] ?? null,\n assignees,\n milestone: milestone ? formatMilestone(milestone, repo, store, baseUrl) : null,\n comments: issue.comments,\n created_at: issue.created_at,\n updated_at: issue.updated_at,\n closed_at: issue.closed_at,\n closed_by: closedBy ? formatUser(closedBy, baseUrl) : null,\n body: issue.body,\n reactions: defaultReactions(`${repoUrl}/issues/${issue.number}`),\n timeline_url: `${repoUrl}/issues/${issue.number}/timeline`,\n performed_via_github_app: null,\n author_association: computeAuthorAssociation(store, issue.user_id, issue.repo_id),\n };\n}\n\nexport function formatPullRequest(pr: GitHubPullRequest, store: GitHubStore, baseUrl: string) {\n const repo = store.repos.get(pr.repo_id);\n if (!repo) return null;\n const user = store.users.get(pr.user_id);\n const repoUrl = `${baseUrl}/repos/${repo.full_name}`;\n const headRepo = store.repos.get(pr.head_repo_id);\n const baseRepo = store.repos.get(pr.base_repo_id);\n\n const labels = pr.label_ids\n .map((id) => store.labels.get(id))\n .filter(Boolean)\n .map((l) => formatLabel(l!, repo, baseUrl));\n\n const assignees = pr.assignee_ids\n .map((id) => store.users.get(id))\n .filter(Boolean)\n .map((u) => formatUser(u!, baseUrl));\n\n const requestedReviewers = pr.requested_reviewer_ids\n .map((id) => store.users.get(id))\n .filter(Boolean)\n .map((u) => formatUser(u!, baseUrl));\n\n const requestedTeams = pr.requested_team_ids\n .map((id) => store.teams.get(id))\n .filter(Boolean)\n .map((t) => formatTeamBrief(t!, store, baseUrl));\n\n const milestone = pr.milestone_id ? store.milestones.get(pr.milestone_id) : null;\n const mergedBy = pr.merged_by_id ? store.users.get(pr.merged_by_id) : null;\n\n return {\n url: `${repoUrl}/pulls/${pr.number}`,\n id: pr.id,\n node_id: pr.node_id,\n html_url: `${baseUrl}/${repo.full_name}/pull/${pr.number}`,\n diff_url: `${baseUrl}/${repo.full_name}/pull/${pr.number}.diff`,\n patch_url: `${baseUrl}/${repo.full_name}/pull/${pr.number}.patch`,\n issue_url: `${repoUrl}/issues/${pr.number}`,\n number: pr.number,\n state: pr.state,\n locked: pr.locked,\n title: pr.title,\n user: user ? formatUser(user, baseUrl) : null,\n body: pr.body,\n created_at: pr.created_at,\n updated_at: pr.updated_at,\n closed_at: pr.closed_at,\n merged_at: pr.merged_at,\n merge_commit_sha: pr.merge_commit_sha,\n assignee: assignees[0] ?? null,\n assignees,\n requested_reviewers: requestedReviewers,\n requested_teams: requestedTeams,\n labels,\n milestone: milestone ? formatMilestone(milestone, repo, store, baseUrl) : null,\n draft: pr.draft,\n commits_url: `${repoUrl}/pulls/${pr.number}/commits`,\n review_comments_url: `${repoUrl}/pulls/${pr.number}/comments`,\n review_comment_url: `${repoUrl}/pulls/comments{/number}`,\n comments_url: `${repoUrl}/issues/${pr.number}/comments`,\n statuses_url: `${repoUrl}/statuses/${pr.head_sha}`,\n head: {\n label: `${headRepo?.full_name?.split(\"/\")[0] ?? \"unknown\"}:${pr.head_ref}`,\n ref: pr.head_ref,\n sha: pr.head_sha,\n user: headRepo ? formatOwner(store, headRepo.owner_id, headRepo.owner_type, baseUrl) : null,\n repo: headRepo ? formatRepo(headRepo, store, baseUrl) : null,\n },\n base: {\n label: `${baseRepo?.full_name?.split(\"/\")[0] ?? \"unknown\"}:${pr.base_ref}`,\n ref: pr.base_ref,\n sha: pr.base_sha,\n user: baseRepo ? formatOwner(store, baseRepo.owner_id, baseRepo.owner_type, baseUrl) : null,\n repo: baseRepo ? formatRepo(baseRepo, store, baseUrl) : null,\n },\n _links: {\n self: { href: `${repoUrl}/pulls/${pr.number}` },\n html: { href: `${baseUrl}/${repo.full_name}/pull/${pr.number}` },\n issue: { href: `${repoUrl}/issues/${pr.number}` },\n comments: { href: `${repoUrl}/issues/${pr.number}/comments` },\n review_comments: { href: `${repoUrl}/pulls/${pr.number}/comments` },\n review_comment: { href: `${repoUrl}/pulls/comments{/number}` },\n commits: { href: `${repoUrl}/pulls/${pr.number}/commits` },\n statuses: { href: `${repoUrl}/statuses/${pr.head_sha}` },\n },\n author_association: computeAuthorAssociation(store, pr.user_id, pr.repo_id),\n auto_merge: pr.auto_merge,\n merged: pr.merged,\n mergeable: pr.mergeable,\n rebaseable: true,\n mergeable_state: pr.mergeable_state,\n merged_by: mergedBy ? formatUser(mergedBy, baseUrl) : null,\n comments: pr.comments,\n review_comments: pr.review_comments,\n maintainer_can_modify: true,\n commits: pr.commits,\n additions: pr.additions,\n deletions: pr.deletions,\n changed_files: pr.changed_files,\n };\n}\n\nexport function formatLabel(label: GitHubLabel, repo: GitHubRepo, baseUrl: string) {\n return {\n id: label.id,\n node_id: label.node_id,\n url: `${baseUrl}/repos/${repo.full_name}/labels/${encodeURIComponent(label.name)}`,\n name: label.name,\n description: label.description,\n color: label.color,\n default: label.default,\n };\n}\n\nexport function formatMilestone(m: GitHubMilestone, repo: GitHubRepo, store: GitHubStore, baseUrl: string) {\n const creator = store.users.get(m.creator_id);\n return {\n url: `${baseUrl}/repos/${repo.full_name}/milestones/${m.number}`,\n html_url: `${baseUrl}/${repo.full_name}/milestone/${m.number}`,\n labels_url: `${baseUrl}/repos/${repo.full_name}/milestones/${m.number}/labels`,\n id: m.id,\n node_id: m.node_id,\n number: m.number,\n title: m.title,\n description: m.description,\n creator: creator ? formatUser(creator, baseUrl) : null,\n open_issues: m.open_issues,\n closed_issues: m.closed_issues,\n state: m.state,\n created_at: m.created_at,\n updated_at: m.updated_at,\n due_on: m.due_on,\n closed_at: m.closed_at,\n };\n}\n\nexport function formatComment(comment: GitHubComment, store: GitHubStore, baseUrl: string) {\n const repo = store.repos.get(comment.repo_id);\n if (!repo) return null;\n const user = store.users.get(comment.user_id);\n const repoUrl = `${baseUrl}/repos/${repo.full_name}`;\n\n if (comment.comment_type === \"issue\") {\n return {\n url: `${repoUrl}/issues/comments/${comment.id}`,\n html_url: `${baseUrl}/${repo.full_name}/issues/${comment.issue_number}#issuecomment-${comment.id}`,\n issue_url: `${repoUrl}/issues/${comment.issue_number}`,\n id: comment.id,\n node_id: comment.node_id,\n user: user ? formatUser(user, baseUrl) : null,\n created_at: comment.created_at,\n updated_at: comment.updated_at,\n author_association: computeAuthorAssociation(store, comment.user_id, comment.repo_id),\n body: comment.body,\n reactions: defaultReactions(`${repoUrl}/issues/comments/${comment.id}`),\n performed_via_github_app: null,\n };\n }\n\n if (comment.comment_type === \"review\") {\n return {\n url: `${repoUrl}/pulls/comments/${comment.id}`,\n html_url: `${baseUrl}/${repo.full_name}/pull/${comment.pull_number}#discussion_r${comment.id}`,\n pull_request_url: `${repoUrl}/pulls/${comment.pull_number}`,\n id: comment.id,\n node_id: comment.node_id,\n diff_hunk: \"\",\n path: comment.path ?? \"\",\n position: comment.position,\n original_position: comment.position,\n commit_id: comment.commit_sha ?? \"\",\n original_commit_id: comment.commit_sha ?? \"\",\n in_reply_to_id: comment.in_reply_to_id,\n user: user ? formatUser(user, baseUrl) : null,\n body: comment.body,\n created_at: comment.created_at,\n updated_at: comment.updated_at,\n author_association: computeAuthorAssociation(store, comment.user_id, comment.repo_id),\n reactions: defaultReactions(`${repoUrl}/pulls/comments/${comment.id}`),\n line: comment.line,\n side: comment.side ?? \"RIGHT\",\n subject_type: comment.subject_type ?? \"line\",\n pull_request_review_id: comment.review_id,\n };\n }\n\n return {\n url: `${repoUrl}/comments/${comment.id}`,\n html_url: `${baseUrl}/${repo.full_name}/commit/${comment.commit_sha}#commitcomment-${comment.id}`,\n id: comment.id,\n node_id: comment.node_id,\n user: user ? formatUser(user, baseUrl) : null,\n body: comment.body,\n path: comment.path,\n position: comment.position,\n line: comment.line,\n commit_id: comment.commit_sha,\n created_at: comment.created_at,\n updated_at: comment.updated_at,\n author_association: computeAuthorAssociation(store, comment.user_id, comment.repo_id),\n reactions: defaultReactions(`${repoUrl}/comments/${comment.id}`),\n };\n}\n\nexport function formatReview(review: GitHubReview, store: GitHubStore, baseUrl: string) {\n const repo = store.repos.get(review.repo_id);\n if (!repo) return null;\n const user = store.users.get(review.user_id);\n const repoUrl = `${baseUrl}/repos/${repo.full_name}`;\n\n return {\n id: review.id,\n node_id: review.node_id,\n user: user ? formatUser(user, baseUrl) : null,\n body: review.body ?? \"\",\n state: review.state,\n html_url: `${baseUrl}/${repo.full_name}/pull/${review.pull_number}#pullrequestreview-${review.id}`,\n pull_request_url: `${repoUrl}/pulls/${review.pull_number}`,\n _links: {\n html: { href: `${baseUrl}/${repo.full_name}/pull/${review.pull_number}#pullrequestreview-${review.id}` },\n pull_request: { href: `${repoUrl}/pulls/${review.pull_number}` },\n },\n submitted_at: review.submitted_at,\n commit_id: review.commit_id,\n author_association: computeAuthorAssociation(store, review.user_id, review.repo_id),\n created_at: review.created_at,\n updated_at: review.updated_at,\n };\n}\n\nexport function formatTeamBrief(team: GitHubTeam, store: GitHubStore, baseUrl: string) {\n const org = store.orgs.get(team.org_id);\n return {\n id: team.id,\n node_id: team.node_id,\n url: `${baseUrl}/teams/${team.id}`,\n html_url: `${baseUrl}/orgs/${org?.login}/teams/${team.slug}`,\n name: team.name,\n slug: team.slug,\n description: team.description,\n privacy: team.privacy,\n permission: team.permission,\n members_url: `${baseUrl}/teams/${team.id}/members{/member}`,\n repositories_url: `${baseUrl}/teams/${team.id}/repos`,\n };\n}\n\nexport function formatBranch(branch: GitHubBranch, repo: GitHubRepo, baseUrl: string) {\n const repoUrl = `${baseUrl}/repos/${repo.full_name}`;\n return {\n name: branch.name,\n commit: {\n sha: branch.sha,\n url: `${repoUrl}/commits/${branch.sha}`,\n },\n protected: branch.protected,\n protection_url: `${repoUrl}/branches/${branch.name}/protection`,\n };\n}\n\nexport function formatRelease(release: GitHubRelease, store: GitHubStore, baseUrl: string) {\n const repo = store.repos.get(release.repo_id);\n if (!repo) return null;\n const author = store.users.get(release.author_id);\n const repoUrl = `${baseUrl}/repos/${repo.full_name}`;\n const assets = store.releaseAssets.findBy(\"release_id\", release.id);\n\n return {\n url: `${repoUrl}/releases/${release.id}`,\n html_url: `${baseUrl}/${repo.full_name}/releases/tag/${release.tag_name}`,\n assets_url: `${repoUrl}/releases/${release.id}/assets`,\n upload_url: `${repoUrl}/releases/${release.id}/assets{?name,label}`,\n tarball_url: `${repoUrl}/tarball/${release.tag_name}`,\n zipball_url: `${repoUrl}/zipball/${release.tag_name}`,\n id: release.id,\n node_id: release.node_id,\n tag_name: release.tag_name,\n target_commitish: release.target_commitish,\n name: release.name,\n draft: release.draft,\n prerelease: release.prerelease,\n created_at: release.created_at,\n published_at: release.published_at,\n author: author ? formatUser(author, baseUrl) : null,\n assets: assets.map((a) => formatReleaseAsset(a, repo, baseUrl)),\n body: release.body,\n };\n}\n\nexport function formatReleaseAsset(asset: GitHubReleaseAsset, repo: GitHubRepo, baseUrl: string) {\n const repoUrl = `${baseUrl}/repos/${repo.full_name}`;\n const uploader = null;\n return {\n url: `${repoUrl}/releases/assets/${asset.id}`,\n id: asset.id,\n node_id: asset.node_id,\n name: asset.name,\n label: asset.label,\n uploader,\n content_type: asset.content_type,\n state: asset.state,\n size: asset.size,\n download_count: asset.download_count,\n created_at: asset.created_at,\n updated_at: asset.updated_at,\n browser_download_url: `${baseUrl}/${repo.full_name}/releases/download/${asset.name}`,\n };\n}\n\nexport function formatWebhook(wh: GitHubWebhook, baseUrl: string, ownerPath: string) {\n const pathPrefix = wh.repo_id != null ? `repos/${ownerPath}` : `orgs/${ownerPath}`;\n return {\n type: wh.repo_id ? \"Repository\" : \"Organization\",\n id: wh.id,\n name: wh.name,\n active: wh.active,\n events: wh.events,\n config: {\n content_type: wh.config.content_type,\n insecure_ssl: wh.config.insecure_ssl,\n url: wh.config.url,\n },\n updated_at: wh.updated_at,\n created_at: wh.created_at,\n url: `${baseUrl}/${pathPrefix}/hooks/${wh.id}`,\n test_url: `${baseUrl}/${pathPrefix}/hooks/${wh.id}/tests`,\n ping_url: `${baseUrl}/${pathPrefix}/hooks/${wh.id}/pings`,\n deliveries_url: `${baseUrl}/${pathPrefix}/hooks/${wh.id}/deliveries`,\n last_response: wh.last_response,\n };\n}\n\nfunction defaultReactions(url: string) {\n return {\n url: `${url}/reactions`,\n total_count: 0,\n \"+1\": 0,\n \"-1\": 0,\n laugh: 0,\n hooray: 0,\n confused: 0,\n heart: 0,\n rocket: 0,\n eyes: 0,\n };\n}\n\nexport function lookupRepo(store: GitHubStore, owner: string, repoName: string) {\n const fullName = `${owner}/${repoName}`;\n return store.repos.findOneBy(\"full_name\", fullName);\n}\n\nexport function lookupOwner(store: GitHubStore, login: string) {\n const user = store.users.findOneBy(\"login\", login);\n if (user) return { type: \"User\" as const, id: user.id, login: user.login };\n const org = store.orgs.findOneBy(\"login\", login);\n if (org) return { type: \"Organization\" as const, id: org.id, login: org.login };\n return null;\n}\n\nexport function getNextIssueNumber(store: GitHubStore, repoId: number): number {\n const issues = store.issues.findBy(\"repo_id\", repoId);\n const prs = store.pullRequests.findBy(\"repo_id\", repoId);\n const maxIssue = issues.reduce((max, i) => Math.max(max, i.number), 0);\n const maxPr = prs.reduce((max, p) => Math.max(max, p.number), 0);\n return Math.max(maxIssue, maxPr) + 1;\n}\n\nexport function getNextMilestoneNumber(store: GitHubStore, repoId: number): number {\n const milestones = store.milestones.findBy(\"repo_id\", repoId);\n return milestones.reduce((max, m) => Math.max(max, m.number), 0) + 1;\n}\n","export interface Entity {\n id: number;\n created_at: string;\n updated_at: string;\n}\n\nexport type InsertInput<T extends Entity> = Omit<T, \"id\" | \"created_at\" | \"updated_at\"> & { id?: number };\n\nexport type FilterFn<T> = (item: T) => boolean;\nexport type SortFn<T> = (a: T, b: T) => number;\n\nexport interface QueryOptions<T> {\n filter?: FilterFn<T>;\n sort?: SortFn<T>;\n page?: number;\n per_page?: number;\n}\n\nexport interface PaginatedResult<T> {\n items: T[];\n total_count: number;\n page: number;\n per_page: number;\n has_next: boolean;\n has_prev: boolean;\n}\n\nexport interface CollectionSnapshot<T extends Entity = Entity> {\n items: T[];\n autoId: number;\n indexFields: string[];\n}\n\nexport interface StoreSnapshot {\n collections: Record<string, CollectionSnapshot>;\n data: Record<string, unknown>;\n}\n\nexport function serializeValue(value: unknown): unknown {\n if (value instanceof Map) {\n return { __type: \"Map\" as const, entries: [...value.entries()].map(([k, v]) => [k, serializeValue(v)]) };\n }\n if (value instanceof Set) {\n return { __type: \"Set\" as const, values: [...value.values()] };\n }\n return value;\n}\n\nexport function deserializeValue(value: unknown): unknown {\n if (value !== null && typeof value === \"object\" && \"__type\" in value) {\n const tagged = value as Record<string, unknown>;\n if (tagged.__type === \"Map\") {\n const entries = tagged.entries as [unknown, unknown][];\n return new Map(entries.map(([k, v]) => [k, deserializeValue(v)]));\n }\n if (tagged.__type === \"Set\") {\n return new Set(tagged.values as unknown[]);\n }\n }\n return value;\n}\n\nexport class Collection<T extends Entity> {\n private items = new Map<number, T>();\n private indexes = new Map<string, Map<string | number, Set<number>>>();\n private autoId = 1;\n readonly fieldNames: string[];\n\n constructor(private indexFields: (keyof T)[] = []) {\n this.fieldNames = indexFields.map(String).sort();\n for (const field of indexFields) {\n this.indexes.set(String(field), new Map());\n }\n }\n\n private addToIndex(item: T): void {\n for (const field of this.indexFields) {\n const value = item[field];\n if (value === undefined || value === null) continue;\n const indexMap = this.indexes.get(String(field))!;\n const key = String(value);\n if (!indexMap.has(key)) {\n indexMap.set(key, new Set());\n }\n indexMap.get(key)!.add(item.id);\n }\n }\n\n private removeFromIndex(item: T): void {\n for (const field of this.indexFields) {\n const value = item[field];\n if (value === undefined || value === null) continue;\n const indexMap = this.indexes.get(String(field))!;\n const key = String(value);\n indexMap.get(key)?.delete(item.id);\n }\n }\n\n insert(data: InsertInput<T>): T {\n const now = new Date().toISOString();\n const explicitId = data.id != null && data.id > 0 ? data.id : undefined;\n const id = explicitId ?? this.autoId++;\n if (id >= this.autoId) {\n this.autoId = id + 1;\n }\n const item = {\n ...data,\n id,\n created_at: now,\n updated_at: now,\n } as unknown as T;\n this.items.set(id, item);\n this.addToIndex(item);\n return item;\n }\n\n get(id: number): T | undefined {\n return this.items.get(id);\n }\n\n findBy(field: keyof T, value: T[keyof T] | string | number): T[] {\n if (this.indexes.has(String(field))) {\n const ids = this.indexes.get(String(field))!.get(String(value));\n if (!ids) return [];\n return Array.from(ids)\n .map((id) => this.items.get(id)!)\n .filter(Boolean);\n }\n return this.all().filter((item) => item[field] === value);\n }\n\n findOneBy(field: keyof T, value: T[keyof T] | string | number): T | undefined {\n return this.findBy(field, value)[0];\n }\n\n update(id: number, data: Partial<T>): T | undefined {\n const existing = this.items.get(id);\n if (!existing) return undefined;\n this.removeFromIndex(existing);\n const updated = {\n ...existing,\n ...data,\n id,\n updated_at: new Date().toISOString(),\n } as T;\n this.items.set(id, updated);\n this.addToIndex(updated);\n return updated;\n }\n\n delete(id: number): boolean {\n const existing = this.items.get(id);\n if (!existing) return false;\n this.removeFromIndex(existing);\n return this.items.delete(id);\n }\n\n all(): T[] {\n return Array.from(this.items.values());\n }\n\n query(options: QueryOptions<T> = {}): PaginatedResult<T> {\n let results = this.all();\n\n if (options.filter) {\n results = results.filter(options.filter);\n }\n\n const total_count = results.length;\n\n if (options.sort) {\n results.sort(options.sort);\n }\n\n const page = options.page ?? 1;\n const per_page = Math.min(options.per_page ?? 30, 100);\n const start = (page - 1) * per_page;\n const paged = results.slice(start, start + per_page);\n\n return {\n items: paged,\n total_count,\n page,\n per_page,\n has_next: start + per_page < total_count,\n has_prev: page > 1,\n };\n }\n\n count(filter?: FilterFn<T>): number {\n if (!filter) return this.items.size;\n return this.all().filter(filter).length;\n }\n\n clear(): void {\n this.items.clear();\n for (const indexMap of this.indexes.values()) {\n indexMap.clear();\n }\n this.autoId = 1;\n }\n\n snapshot(): CollectionSnapshot<T> {\n return {\n items: this.all(),\n autoId: this.autoId,\n indexFields: this.fieldNames,\n };\n }\n\n restore(snap: CollectionSnapshot<T>): void {\n this.clear();\n this.autoId = snap.autoId;\n for (const item of snap.items) {\n this.items.set(item.id, item);\n this.addToIndex(item);\n }\n }\n}\n\nexport class Store {\n private collections = new Map<string, Collection<any>>();\n private _data = new Map<string, unknown>();\n\n collection<T extends Entity>(name: string, indexFields: (keyof T)[] = []): Collection<T> {\n const existing = this.collections.get(name);\n if (existing) {\n if (indexFields.length > 0) {\n const requested = indexFields.map(String).sort();\n if (existing.fieldNames.length !== requested.length || existing.fieldNames.some((f, i) => f !== requested[i])) {\n throw new Error(\n `Collection \"${name}\" already exists with indexes [${existing.fieldNames}] but was requested with [${requested}]`,\n );\n }\n }\n return existing as Collection<T>;\n }\n const col = new Collection<T>(indexFields);\n this.collections.set(name, col);\n return col;\n }\n\n getData<V>(key: string): V | undefined {\n return this._data.get(key) as V | undefined;\n }\n\n setData<V>(key: string, value: V): void {\n this._data.set(key, value);\n }\n\n reset(): void {\n for (const collection of this.collections.values()) {\n collection.clear();\n }\n this._data.clear();\n }\n\n snapshot(): StoreSnapshot {\n const collections: Record<string, CollectionSnapshot> = {};\n for (const [name, col] of this.collections) {\n collections[name] = col.snapshot();\n }\n const data: Record<string, unknown> = {};\n for (const [key, value] of this._data) {\n data[key] = serializeValue(value);\n }\n return { collections, data };\n }\n\n restore(snap: StoreSnapshot): void {\n const snapshotNames = new Set(Object.keys(snap.collections));\n for (const name of this.collections.keys()) {\n if (!snapshotNames.has(name)) {\n this.collections.delete(name);\n }\n }\n for (const [name, colSnap] of Object.entries(snap.collections)) {\n const indexFields = colSnap.indexFields as (keyof Entity)[];\n const col = this.collection(name, indexFields);\n col.restore(colSnap as CollectionSnapshot<any>);\n }\n this._data.clear();\n for (const [key, value] of Object.entries(snap.data)) {\n this._data.set(key, deserializeValue(value));\n }\n }\n}\n","import { createServer as createNodeServer, type IncomingMessage, type Server, type ServerResponse } from \"node:http\";\n\ntype BodyInit = ConstructorParameters<typeof Response>[0];\ntype HeadersInit = ConstructorParameters<typeof Headers>[0];\ntype FormDataEntryValue = string | File;\n\nexport type ContentfulStatusCode = number;\nexport type Next = () => Promise<void>;\n\ntype VariablesOf<E> = unknown extends E\n ? Record<string, any>\n : E extends { Variables: infer V }\n ? V\n : Record<string, any>;\ntype HandlerResult = Response | void | Promise<Response | void>;\n\nexport type Handler<E = unknown, P extends string = string> = (c: Context<E, P>, next: Next) => HandlerResult;\nexport type MiddlewareHandler<E = unknown> = Handler<E>;\nexport type ErrorHandler<E = unknown> = (err: unknown, c: Context<E>) => Response | Promise<Response>;\nexport type FetchHandler = (request: Request) => Response | Promise<Response>;\n\ninterface CompiledPath {\n pattern: string;\n regex: RegExp;\n paramNames: string[];\n}\n\ninterface Route<E> {\n method: string;\n compiled: CompiledPath;\n handlers: Handler<E>[];\n}\n\ninterface MatchedHandler<E> {\n handler: Handler<E>;\n params: Record<string, string>;\n}\n\nexport interface ServeOptions {\n fetch: FetchHandler;\n port?: number;\n hostname?: string;\n}\n\nexport interface CorsOptions {\n origin?: string;\n allowMethods?: string[];\n allowHeaders?: string[];\n credentials?: boolean;\n maxAge?: number;\n}\n\nexport class HonoRequest<P extends string = string> {\n readonly raw: Request;\n readonly url: string;\n readonly method: string;\n readonly path: string;\n\n constructor(\n request: Request,\n private readonly params: Record<string, string>,\n ) {\n this.raw = request;\n this.url = request.url;\n this.method = request.method;\n this.path = new URL(request.url).pathname;\n }\n\n header(): Record<string, string>;\n header(name: string): string | undefined;\n header(name?: string): Record<string, string> | string | undefined {\n if (name) return this.raw.headers.get(name) ?? undefined;\n const headers: Record<string, string> = {};\n this.raw.headers.forEach((value, key) => {\n headers[key] = value;\n });\n return headers;\n }\n\n query(name: string): string | undefined {\n return new URL(this.url).searchParams.get(name) ?? undefined;\n }\n\n queries(name: string): string[] | undefined {\n const values = new URL(this.url).searchParams.getAll(name);\n return values.length > 0 ? values : undefined;\n }\n\n param(): Record<string, string>;\n param(name: string): string;\n param(name?: string): Record<string, string> | string {\n if (!name) return { ...this.params };\n return this.params[name] ?? \"\";\n }\n\n json<T = any>(): Promise<T> {\n return this.raw.json() as Promise<T>;\n }\n\n text(): Promise<string> {\n return this.raw.text();\n }\n\n arrayBuffer(): Promise<ArrayBuffer> {\n return this.raw.arrayBuffer();\n }\n\n async parseBody(): Promise<Record<string, FormDataEntryValue | FormDataEntryValue[]>> {\n const contentType = this.header(\"Content-Type\") ?? \"\";\n if (contentType.includes(\"multipart/form-data\")) {\n return formDataToObject(await this.raw.formData());\n }\n if (contentType.includes(\"application/x-www-form-urlencoded\")) {\n const params = new URLSearchParams(await this.raw.text());\n const out: Record<string, string | string[]> = {};\n for (const [key, value] of params) {\n appendBodyValue(out, key, value);\n }\n return out;\n }\n if (contentType.includes(\"application/json\")) {\n const body = await this.raw.json().catch(() => ({}));\n return body && typeof body === \"object\" && !Array.isArray(body)\n ? (body as Record<string, FormDataEntryValue | FormDataEntryValue[]>)\n : {};\n }\n return {};\n }\n}\n\nexport class Context<E = unknown, P extends string = string> {\n readonly req: HonoRequest<P>;\n private readonly vars = new Map<string, unknown>();\n private readonly responseHeaders = new Headers();\n private responseStatus = 200;\n\n constructor(\n request: Request,\n params: Record<string, string>,\n private readonly notFoundHandler: (c: Context<E>) => Response | Promise<Response>,\n ) {\n this.req = new HonoRequest<P>(request, params);\n }\n\n get<K extends keyof VariablesOf<E> & string>(key: K): VariablesOf<E>[K] | undefined {\n return this.vars.get(key) as VariablesOf<E>[K] | undefined;\n }\n\n set<K extends keyof VariablesOf<E> & string>(key: K, value: VariablesOf<E>[K]): void {\n this.vars.set(key, value);\n }\n\n header(name: string, value: string): void {\n this.responseHeaders.set(name, value);\n }\n\n status(status: number): void {\n this.responseStatus = status;\n }\n\n json(data: unknown, status?: ContentfulStatusCode, headers?: HeadersInit): Response {\n return this.response(JSON.stringify(data), status, defaultContentType(headers, \"application/json; charset=UTF-8\"));\n }\n\n text(text: string, status?: ContentfulStatusCode, headers?: HeadersInit): Response {\n return this.response(text, status, defaultContentType(headers, \"text/plain; charset=UTF-8\"));\n }\n\n html(html: string, status?: ContentfulStatusCode, headers?: HeadersInit): Response {\n return this.response(html, status, defaultContentType(headers, \"text/html; charset=UTF-8\"));\n }\n\n body(body: BodyInit | null, status?: ContentfulStatusCode, headers?: HeadersInit): Response {\n return this.response(body, status, headers);\n }\n\n redirect(location: string, status: ContentfulStatusCode = 302): Response {\n return this.response(null, status, { Location: location });\n }\n\n notFound(): Response | Promise<Response> {\n return this.notFoundHandler(this);\n }\n\n finalize(response: Response): Response {\n if (!hasHeaders(this.responseHeaders)) return response;\n const headers = new Headers(response.headers);\n this.responseHeaders.forEach((value, key) => {\n headers.set(key, value);\n });\n return new Response(response.body, {\n status: response.status,\n statusText: response.statusText,\n headers,\n });\n }\n\n private response(body: BodyInit | null, status?: ContentfulStatusCode, headers?: HeadersInit): Response {\n const merged = new Headers(headers);\n this.responseHeaders.forEach((value, key) => {\n merged.set(key, value);\n });\n return new Response(body, {\n status: status ?? this.responseStatus,\n headers: merged,\n });\n }\n}\n\nexport class Hono<E = unknown> {\n private readonly middleware: Route<E>[] = [];\n private readonly routes: Route<E>[] = [];\n private errorHandler: ErrorHandler<E> = (err) => {\n const message = err instanceof Error ? err.message : \"Internal Server Error\";\n return new Response(message, { status: 500 });\n };\n private notFoundHandler: (c: Context<E>) => Response | Promise<Response> = () =>\n new Response(\"404 Not Found\", { status: 404 });\n\n use<P extends string = string>(path: string, ...handlers: Handler<E, P>[]): this;\n use(...handlers: Handler<E>[]): this;\n use<P extends string = string>(pathOrHandler: string | Handler<E>, ...handlers: Handler<E, P>[]): this {\n if (typeof pathOrHandler === \"string\") {\n this.middleware.push({ method: \"ALL\", compiled: compilePath(pathOrHandler), handlers: handlers as Handler<E>[] });\n } else {\n this.middleware.push({ method: \"ALL\", compiled: compilePath(\"*\"), handlers: [pathOrHandler, ...handlers] });\n }\n return this;\n }\n\n on<P extends string = string>(method: string, path: string, ...handlers: Handler<E, P>[]): this {\n this.routes.push({ method: method.toUpperCase(), compiled: compilePath(path), handlers: handlers as Handler<E>[] });\n return this;\n }\n\n get<P extends string = string>(path: string, ...handlers: Handler<E, P>[]): this {\n return this.on(\"GET\", path, ...handlers);\n }\n\n post<P extends string = string>(path: string, ...handlers: Handler<E, P>[]): this {\n return this.on(\"POST\", path, ...handlers);\n }\n\n put<P extends string = string>(path: string, ...handlers: Handler<E, P>[]): this {\n return this.on(\"PUT\", path, ...handlers);\n }\n\n patch<P extends string = string>(path: string, ...handlers: Handler<E, P>[]): this {\n return this.on(\"PATCH\", path, ...handlers);\n }\n\n delete<P extends string = string>(path: string, ...handlers: Handler<E, P>[]): this {\n return this.on(\"DELETE\", path, ...handlers);\n }\n\n onError(handler: ErrorHandler<E>): this {\n this.errorHandler = handler;\n return this;\n }\n\n notFound(handler: (c: Context<E>) => Response | Promise<Response>): this {\n this.notFoundHandler = handler;\n return this;\n }\n\n async request(input: string | Request, init?: RequestInit): Promise<Response> {\n if (input instanceof Request) return this.fetch(input);\n const url = input.startsWith(\"/\") ? `http://localhost${input}` : input;\n return this.fetch(new Request(url, init));\n }\n\n fetch = async (request: Request): Promise<Response> => {\n const url = new URL(request.url);\n const path = url.pathname;\n const method = request.method.toUpperCase();\n const matched = this.match(method, path);\n const context = new Context<E>(request, matched.params, this.notFoundHandler);\n\n try {\n const response = await this.dispatch(context, matched.handlers);\n return context.finalize(response ?? (await this.notFoundHandler(context)));\n } catch (err) {\n return context.finalize(await this.errorHandler(err, context));\n }\n };\n\n private match(method: string, path: string): { handlers: MatchedHandler<E>[]; params: Record<string, string> } {\n const handlers: MatchedHandler<E>[] = [];\n const params: Record<string, string> = {};\n\n for (const route of this.middleware) {\n const match = matchPath(route.compiled, path);\n if (!match) continue;\n Object.assign(params, match);\n for (const handler of route.handlers) {\n handlers.push({ handler, params: match });\n }\n }\n\n const route =\n this.routes.find((candidate) => candidate.method === method && matchPath(candidate.compiled, path) != null) ??\n (method === \"HEAD\"\n ? this.routes.find((candidate) => candidate.method === \"GET\" && matchPath(candidate.compiled, path) != null)\n : undefined);\n\n if (route) {\n const match = matchPath(route.compiled, path) ?? {};\n Object.assign(params, match);\n for (const handler of route.handlers) {\n handlers.push({ handler, params: match });\n }\n }\n\n return { handlers, params };\n }\n\n private async dispatch(context: Context<E>, handlers: MatchedHandler<E>[]): Promise<Response | void> {\n let index = -1;\n const run = async (nextIndex: number): Promise<Response | void> => {\n if (nextIndex <= index) throw new Error(\"next() called multiple times\");\n index = nextIndex;\n const matched = handlers[nextIndex];\n if (!matched) return undefined;\n\n const originalParams = context.req.param();\n Object.assign(originalParams, matched.params);\n\n let nextResponse: Response | void = undefined;\n let nextCalled = false;\n const next: Next = async () => {\n nextCalled = true;\n nextResponse = await run(nextIndex + 1);\n };\n\n const response = await matched.handler(context, next);\n if (response instanceof Response) return response;\n if (nextCalled) return nextResponse;\n return response;\n };\n\n return run(0);\n }\n}\n\nexport function cors(options: CorsOptions = {}): MiddlewareHandler {\n const origin = options.origin ?? \"*\";\n const allowMethods = options.allowMethods ?? [\"GET\", \"HEAD\", \"PUT\", \"POST\", \"DELETE\", \"PATCH\", \"OPTIONS\"];\n\n return async (c, next) => {\n c.header(\"Access-Control-Allow-Origin\", origin);\n if (options.credentials) c.header(\"Access-Control-Allow-Credentials\", \"true\");\n\n if (c.req.method.toUpperCase() === \"OPTIONS\") {\n c.header(\"Access-Control-Allow-Methods\", allowMethods.join(\",\"));\n const allowHeaders = options.allowHeaders?.join(\",\") ?? c.req.header(\"Access-Control-Request-Headers\");\n if (allowHeaders) c.header(\"Access-Control-Allow-Headers\", allowHeaders);\n if (options.maxAge != null) c.header(\"Access-Control-Max-Age\", String(options.maxAge));\n return c.body(null, 204);\n }\n\n await next();\n };\n}\n\nexport function serve(options: ServeOptions): Server {\n const port = options.port ?? 3000;\n const server = createNodeServer(async (req, res) => {\n try {\n const request = nodeRequestToFetchRequest(req);\n const response = await options.fetch(request);\n await writeFetchResponse(res, response, req.method?.toUpperCase() === \"HEAD\");\n } catch (err) {\n const message = err instanceof Error ? err.message : \"Internal Server Error\";\n res.statusCode = 500;\n res.setHeader(\"Content-Type\", \"text/plain; charset=UTF-8\");\n res.end(message);\n }\n });\n server.listen(port, options.hostname);\n return server;\n}\n\nfunction compilePath(pattern: string): CompiledPath {\n if (pattern === \"*\" || pattern === \"/*\") {\n return { pattern, regex: /^.*$/, paramNames: [] };\n }\n\n const paramNames: string[] = [];\n let source = \"^\";\n for (let i = 0; i < pattern.length; i++) {\n const char = pattern[i];\n if (char !== \":\") {\n source += escapeRegex(char);\n continue;\n }\n\n let name = \"\";\n i++;\n while (i < pattern.length && /[A-Za-z0-9_]/.test(pattern[i])) {\n name += pattern[i];\n i++;\n }\n i--;\n paramNames.push(name);\n\n if (pattern[i + 1] === \"{\") {\n const close = pattern.indexOf(\"}\", i + 2);\n if (close < 0) throw new Error(`Invalid route pattern: ${pattern}`);\n const expr = pattern.slice(i + 2, close);\n source += `(${expr})`;\n i = close;\n } else {\n source += \"([^/]+)\";\n }\n }\n source += \"$\";\n return { pattern, regex: new RegExp(source), paramNames };\n}\n\nfunction matchPath(compiled: CompiledPath, path: string): Record<string, string> | null {\n const match = compiled.regex.exec(path);\n if (!match) return null;\n const params: Record<string, string> = {};\n for (let i = 0; i < compiled.paramNames.length; i++) {\n params[compiled.paramNames[i]] = decodePathParam(match[i + 1] ?? \"\");\n }\n return params;\n}\n\nfunction decodePathParam(value: string): string {\n try {\n return decodeURIComponent(value);\n } catch {\n return value;\n }\n}\n\nfunction escapeRegex(value: string): string {\n return value.replace(/[|\\\\{}()[\\]^$+*?.]/g, \"\\\\$&\");\n}\n\nfunction hasHeaders(headers: Headers): boolean {\n for (const _ of headers) return true;\n return false;\n}\n\nfunction defaultContentType(headers: HeadersInit | undefined, contentType: string): Headers {\n const out = new Headers(headers);\n if (!out.has(\"Content-Type\")) {\n out.set(\"Content-Type\", contentType);\n }\n return out;\n}\n\nfunction formDataToObject(formData: FormData): Record<string, FormDataEntryValue | FormDataEntryValue[]> {\n const out: Record<string, FormDataEntryValue | FormDataEntryValue[]> = {};\n for (const [key, value] of formData) {\n appendBodyValue(out, key, value);\n }\n return out;\n}\n\nfunction appendBodyValue<T>(target: Record<string, T | T[]>, key: string, value: T): void {\n const existing = target[key];\n if (existing === undefined) {\n target[key] = value;\n } else if (Array.isArray(existing)) {\n existing.push(value);\n } else {\n target[key] = [existing, value];\n }\n}\n\nfunction nodeRequestToFetchRequest(req: IncomingMessage): Request {\n const host = req.headers.host ?? \"localhost\";\n const url = new URL(req.url ?? \"/\", `http://${host}`);\n const headers = new Headers();\n for (const [key, value] of Object.entries(req.headers)) {\n if (value == null) continue;\n if (Array.isArray(value)) {\n for (const item of value) headers.append(key, item);\n } else {\n headers.set(key, value);\n }\n }\n\n const method = req.method ?? \"GET\";\n const hasBody = method !== \"GET\" && method !== \"HEAD\";\n return new Request(url.toString(), {\n method,\n headers,\n body: hasBody ? (req as unknown as BodyInit) : undefined,\n duplex: \"half\",\n } as RequestInit & { duplex: string });\n}\n\nasync function writeFetchResponse(res: ServerResponse, response: Response, headOnly: boolean): Promise<void> {\n res.statusCode = response.status;\n res.statusMessage = response.statusText;\n\n const headersWithCookies = response.headers as Headers & { getSetCookie?: () => string[] };\n const cookies = headersWithCookies.getSetCookie?.();\n response.headers.forEach((value, key) => {\n if (key.toLowerCase() === \"set-cookie\" && cookies && cookies.length > 0) return;\n res.setHeader(key, value);\n });\n if (cookies && cookies.length > 0) {\n res.setHeader(\"Set-Cookie\", cookies);\n }\n\n if (headOnly || !response.body) {\n res.end();\n return;\n }\n\n const reader = response.body.getReader();\n try {\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n if (!res.write(value)) {\n await new Promise<void>((resolve) => res.once(\"drain\", resolve));\n }\n }\n res.end();\n } catch (err) {\n res.destroy(err instanceof Error ? err : undefined);\n }\n}\n","import { createHmac } from \"crypto\";\n\nexport interface WebhookSubscription {\n id: number;\n url: string;\n events: string[];\n active: boolean;\n secret?: string;\n owner: string;\n repo?: string;\n}\n\nexport interface WebhookDelivery {\n id: number;\n hook_id: number;\n event: string;\n action?: string;\n payload: unknown;\n status_code: number | null;\n delivered_at: string;\n duration: number | null;\n success: boolean;\n}\n\nconst MAX_DELIVERIES = 1000;\n\nexport class WebhookDispatcher {\n private subscriptions: WebhookSubscription[] = [];\n private deliveries: WebhookDelivery[] = [];\n private subscriptionIdCounter = 1;\n private deliveryIdCounter = 1;\n\n register(sub: Omit<WebhookSubscription, \"id\"> & { id?: number }): WebhookSubscription {\n const { id: explicitId, ...rest } = sub;\n const id = explicitId !== undefined ? explicitId : this.subscriptionIdCounter++;\n if (id >= this.subscriptionIdCounter) {\n this.subscriptionIdCounter = id + 1;\n }\n const subscription: WebhookSubscription = { ...rest, id };\n this.subscriptions.push(subscription);\n return subscription;\n }\n\n unregister(id: number): boolean {\n const idx = this.subscriptions.findIndex((s) => s.id === id);\n if (idx === -1) return false;\n this.subscriptions.splice(idx, 1);\n return true;\n }\n\n getSubscription(id: number): WebhookSubscription | undefined {\n return this.subscriptions.find((s) => s.id === id);\n }\n\n getSubscriptions(owner?: string, repo?: string): WebhookSubscription[] {\n return this.subscriptions.filter((s) => {\n if (owner && s.owner !== owner) return false;\n if (repo !== undefined && s.repo !== repo) return false;\n return true;\n });\n }\n\n updateSubscription(\n id: number,\n data: Partial<Pick<WebhookSubscription, \"url\" | \"events\" | \"active\" | \"secret\">>,\n ): WebhookSubscription | undefined {\n const sub = this.subscriptions.find((s) => s.id === id);\n if (!sub) return undefined;\n Object.assign(sub, data);\n return sub;\n }\n\n async dispatch(\n event: string,\n action: string | undefined,\n payload: unknown,\n owner: string,\n repo?: string,\n ): Promise<void> {\n const matchingSubs = this.subscriptions.filter((s) => {\n if (!s.active) return false;\n if (s.owner !== owner) return false;\n if (repo !== undefined) {\n if (s.repo !== repo) return false;\n } else if (s.repo !== undefined) {\n return false;\n }\n return event === \"ping\" || s.events.includes(\"*\") || s.events.includes(event);\n });\n\n for (const sub of matchingSubs) {\n const delivery: WebhookDelivery = {\n id: this.deliveryIdCounter++,\n hook_id: sub.id,\n event,\n action,\n payload,\n status_code: null,\n delivered_at: new Date().toISOString(),\n duration: null,\n success: false,\n };\n\n const body = JSON.stringify(payload);\n\n const signatureHeaders: Record<string, string> = {};\n if (sub.secret) {\n const hmac = createHmac(\"sha256\", sub.secret).update(body).digest(\"hex\");\n signatureHeaders[\"X-Hub-Signature-256\"] = `sha256=${hmac}`;\n }\n\n try {\n const start = Date.now();\n const response = await fetch(sub.url, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n \"X-GitHub-Event\": event,\n \"X-GitHub-Delivery\": String(delivery.id),\n ...signatureHeaders,\n },\n body,\n signal: AbortSignal.timeout(10000),\n });\n delivery.duration = Date.now() - start;\n delivery.status_code = response.status;\n delivery.success = response.ok;\n } catch {\n delivery.duration = 0;\n delivery.success = false;\n }\n\n this.deliveries.push(delivery);\n if (this.deliveries.length > MAX_DELIVERIES) {\n this.deliveries.splice(0, this.deliveries.length - MAX_DELIVERIES);\n }\n }\n }\n\n getDeliveries(hookId?: number): WebhookDelivery[] {\n if (hookId !== undefined) {\n return this.deliveries.filter((d) => d.hook_id === hookId);\n }\n return [...this.deliveries];\n }\n\n clear(): void {\n this.subscriptions.length = 0;\n this.deliveries.length = 0;\n this.subscriptionIdCounter = 1;\n this.deliveryIdCounter = 1;\n }\n}\n","import type { Context, ContentfulStatusCode, ErrorHandler, MiddlewareHandler } from \"../http.js\";\n\nconst DEFAULT_DOCS_URL = \"https://emulate.dev\";\n\nfunction getDocsUrl(c: Context): string {\n return (c.get(\"docsUrl\") as string | undefined) ?? DEFAULT_DOCS_URL;\n}\n\nfunction errorStatus(err: unknown): number {\n if (err && typeof err === \"object\" && \"status\" in err) {\n const s = (err as { status: unknown }).status;\n if (typeof s === \"number\" && Number.isFinite(s)) return s;\n }\n return 500;\n}\n\n/**\n * Use with `app.onError(...)`. Route handlers throw to the app error handler.\n */\nexport function createApiErrorHandler(documentationUrl?: string): ErrorHandler {\n return (err, c) => {\n if (documentationUrl) {\n c.set(\"docsUrl\", documentationUrl);\n }\n const status = errorStatus(err);\n const message = err instanceof Error ? err.message : \"Internal Server Error\";\n return c.json(\n {\n message,\n documentation_url: getDocsUrl(c),\n },\n status as ContentfulStatusCode,\n );\n };\n}\n\n/** Sets `docsUrl` on the context for successful responses; register `createApiErrorHandler` for thrown `ApiError`s. */\nexport function createErrorHandler(documentationUrl?: string): MiddlewareHandler {\n return async (c, next) => {\n if (documentationUrl) {\n c.set(\"docsUrl\", documentationUrl);\n }\n await next();\n };\n}\n\nexport const errorHandler: MiddlewareHandler = createErrorHandler();\n\nexport class ApiError extends Error {\n constructor(\n public status: number,\n message: string,\n public errors?: Array<{ resource: string; field: string; code: string }>,\n ) {\n super(message);\n this.name = \"ApiError\";\n }\n}\n\nexport function notFound(resource?: string): ApiError {\n return new ApiError(404, resource ? `${resource} not found` : \"Not Found\");\n}\n\nexport function validationError(message: string, errors?: ApiError[\"errors\"]): ApiError {\n return new ApiError(422, message, errors);\n}\n\nexport function unauthorized(): ApiError {\n return new ApiError(401, \"Requires authentication\");\n}\n\nexport function forbidden(): ApiError {\n return new ApiError(403, \"Forbidden\");\n}\n\nexport async function parseJsonBody(c: Context): Promise<Record<string, unknown>> {\n try {\n const body = await c.req.json();\n if (body && typeof body === \"object\" && !Array.isArray(body)) {\n return body as Record<string, unknown>;\n }\n return {};\n } catch {\n throw new ApiError(400, \"Problems parsing JSON\");\n }\n}\n","import type { Context, Next } from \"../http.js\";\nimport { jwtVerify, importPKCS8 } from \"jose\";\nimport { debug } from \"../debug.js\";\n\nexport interface AuthUser {\n login: string;\n id: number;\n scopes: string[];\n}\n\nexport interface AuthApp {\n appId: number;\n slug: string;\n name: string;\n}\n\nexport interface AuthInstallation {\n installationId: number;\n appId: number;\n permissions: Record<string, string>;\n repositoryIds: number[];\n repositorySelection: \"all\" | \"selected\";\n}\n\nexport type TokenMap = Map<string, AuthUser>;\n\nexport interface TokenEntry {\n token: string;\n login: string;\n id: number;\n scopes: string[];\n}\n\nexport function serializeTokenMap(tokenMap: TokenMap): TokenEntry[] {\n return [...tokenMap.entries()].map(([token, user]) => ({\n token,\n login: user.login,\n id: user.id,\n scopes: user.scopes,\n }));\n}\n\nexport function restoreTokenMap(tokenMap: TokenMap, tokens: TokenEntry[]): void {\n tokenMap.clear();\n for (const t of tokens) {\n tokenMap.set(t.token, { login: t.login, id: t.id, scopes: t.scopes });\n }\n}\n\nexport type AppEnv = {\n Variables: {\n authUser?: AuthUser;\n authApp?: AuthApp;\n authToken?: string;\n authScopes?: string[];\n docsUrl?: string;\n };\n};\n\nexport interface AppKeyResolver {\n (appId: number): { privateKey: string; slug: string; name: string } | null;\n}\n\nexport interface AuthFallback {\n login: string;\n id: number;\n scopes: string[];\n}\n\nexport function authMiddleware(tokens: TokenMap, appKeyResolver?: AppKeyResolver, fallbackUser?: AuthFallback) {\n return async (c: Context, next: Next) => {\n const authHeader = c.req.header(\"Authorization\");\n if (authHeader) {\n const token = authHeader.replace(/^(Bearer|token)\\s+/i, \"\").trim();\n\n if (token.startsWith(\"eyJ\") && appKeyResolver) {\n try {\n const [, payloadB64] = token.split(\".\");\n const payload = JSON.parse(Buffer.from(payloadB64, \"base64url\").toString());\n const appId = typeof payload.iss === \"string\" ? parseInt(payload.iss, 10) : payload.iss;\n\n if (typeof appId === \"number\" && !isNaN(appId)) {\n const appInfo = appKeyResolver(appId);\n if (appInfo) {\n const key = await importPKCS8(appInfo.privateKey, \"RS256\");\n await jwtVerify(token, key, { algorithms: [\"RS256\"] });\n c.set(\"authApp\", {\n appId,\n slug: appInfo.slug,\n name: appInfo.name,\n } satisfies AuthApp);\n }\n }\n } catch {\n // JWT verification failed\n }\n } else {\n let user = tokens.get(token);\n if (!user && fallbackUser && token.length > 0) {\n debug(\"auth\", \"fallback user for unknown token\", { login: fallbackUser.login, id: fallbackUser.id });\n user = { login: fallbackUser.login, id: fallbackUser.id, scopes: fallbackUser.scopes };\n }\n if (user) {\n c.set(\"authUser\", user);\n c.set(\"authToken\", token);\n c.set(\"authScopes\", user.scopes);\n }\n }\n }\n await next();\n };\n}\n\nexport function requireAuth() {\n return async (c: Context, next: Next) => {\n if (!c.get(\"authUser\")) {\n const docsUrl = (c.get(\"docsUrl\") as string | undefined) ?? \"https://emulate.dev\";\n return c.json(\n {\n message: \"Requires authentication\",\n documentation_url: docsUrl,\n },\n 401,\n );\n }\n await next();\n };\n}\n\nexport function requireAppAuth() {\n return async (c: Context, next: Next) => {\n if (!c.get(\"authApp\")) {\n const docsUrl = (c.get(\"docsUrl\") as string | undefined) ?? \"https://emulate.dev\";\n return c.json(\n {\n message: \"A JSON web token could not be decoded\",\n documentation_url: docsUrl,\n },\n 401,\n );\n }\n await next();\n };\n}\n","const isDebug =\n typeof process !== \"undefined\" &&\n (process.env.DEBUG === \"1\" || process.env.DEBUG === \"true\" || process.env.EMULATE_DEBUG === \"1\");\n\nexport function debug(label: string, ...args: unknown[]): void {\n if (isDebug) {\n console.log(`[${label}]`, ...args);\n }\n}\n","import { readFileSync } from \"node:fs\";\nimport { fileURLToPath } from \"node:url\";\nimport { dirname, join } from \"node:path\";\nimport type { Hono } from \"./http.js\";\nimport type { AppEnv } from \"./middleware/auth.js\";\n\nconst __dirname = dirname(fileURLToPath(import.meta.url));\n\nconst FONTS: Record<string, Buffer> = {\n \"geist-sans.woff2\": readFileSync(join(__dirname, \"fonts\", \"geist-sans.woff2\")),\n \"GeistPixel-Square.woff2\": readFileSync(join(__dirname, \"fonts\", \"GeistPixel-Square.woff2\")),\n};\n\nconst FAVICON = readFileSync(join(__dirname, \"fonts\", \"favicon.ico\"));\n\nexport function registerFontRoutes(app: Hono<AppEnv>): void {\n app.get(\"/_emulate/fonts/:name\", (c) => {\n const name = c.req.param(\"name\");\n const buf = FONTS[name];\n if (!buf) return c.notFound();\n return new Response(buf, {\n headers: {\n \"Content-Type\": \"font/woff2\",\n \"Cache-Control\": \"public, max-age=31536000, immutable\",\n \"Access-Control-Allow-Origin\": \"*\",\n },\n });\n });\n\n app.get(\"/_emulate/favicon.ico\", (c) => {\n return new Response(FAVICON, {\n headers: {\n \"Content-Type\": \"image/x-icon\",\n \"Cache-Control\": \"public, max-age=31536000, immutable\",\n },\n });\n });\n}\n","import { Hono, cors } from \"./http.js\";\nimport { Store } from \"./store.js\";\nimport { WebhookDispatcher } from \"./webhooks.js\";\nimport { createApiErrorHandler, createErrorHandler } from \"./middleware/error-handler.js\";\nimport {\n authMiddleware,\n type AuthFallback,\n type TokenMap,\n type AppKeyResolver,\n type AppEnv,\n} from \"./middleware/auth.js\";\nimport type { ServicePlugin } from \"./plugin.js\";\nimport { registerFontRoutes } from \"./fonts.js\";\n\nexport interface ServerOptions {\n port?: number;\n baseUrl?: string;\n docsUrl?: string;\n tokens?: Record<string, { login: string; id: number; scopes?: string[] }>;\n appKeyResolver?: AppKeyResolver;\n fallbackUser?: AuthFallback;\n}\n\nexport function createServer(plugin: ServicePlugin, options: ServerOptions = {}) {\n const port = options.port ?? 4000;\n const baseUrl = options.baseUrl ?? `http://localhost:${port}`;\n\n const app = new Hono<AppEnv>();\n const store = new Store();\n const webhooks = new WebhookDispatcher();\n\n const tokenMap: TokenMap = new Map();\n if (options.tokens) {\n for (const [token, user] of Object.entries(options.tokens)) {\n tokenMap.set(token, {\n login: user.login,\n id: user.id,\n scopes: user.scopes ?? [\"repo\", \"user\", \"admin:org\", \"admin:repo_hook\"],\n });\n }\n }\n\n const docsUrl = options.docsUrl ?? `https://emulate.dev/${plugin.name}`;\n\n registerFontRoutes(app);\n\n app.onError(createApiErrorHandler(docsUrl));\n app.use(\"*\", cors());\n app.use(\"*\", createErrorHandler(docsUrl));\n app.use(\"*\", authMiddleware(tokenMap, options.appKeyResolver, options.fallbackUser));\n\n const rateLimitCounters = new Map<string, { remaining: number; resetAt: number }>();\n let lastPruneAt = Math.floor(Date.now() / 1000);\n\n app.use(\"*\", async (c, next) => {\n const token = c.get(\"authToken\") ?? \"__anonymous__\";\n const now = Math.floor(Date.now() / 1000);\n\n if (now - lastPruneAt > 3600) {\n for (const [key, val] of rateLimitCounters) {\n if (val.resetAt <= now) rateLimitCounters.delete(key);\n }\n lastPruneAt = now;\n }\n\n let counter = rateLimitCounters.get(token);\n if (!counter || counter.resetAt <= now) {\n counter = { remaining: 5000, resetAt: now + 3600 };\n rateLimitCounters.set(token, counter);\n }\n\n counter.remaining = Math.max(0, counter.remaining - 1);\n\n c.header(\"X-RateLimit-Limit\", \"5000\");\n c.header(\"X-RateLimit-Remaining\", String(counter.remaining));\n c.header(\"X-RateLimit-Reset\", String(counter.resetAt));\n c.header(\"X-RateLimit-Resource\", \"core\");\n\n if (counter.remaining === 0) {\n return c.json(\n {\n message: \"API rate limit exceeded\",\n documentation_url: docsUrl,\n },\n 403,\n );\n }\n\n await next();\n });\n\n plugin.register(app, store, webhooks, baseUrl, tokenMap);\n\n app.notFound((c) =>\n c.json(\n {\n message: \"Not Found\",\n documentation_url: docsUrl,\n },\n 404,\n ),\n );\n\n return { app, store, webhooks, port, baseUrl, tokenMap };\n}\n","import type { Context } from \"../http.js\";\n\nexport interface PaginationParams {\n page: number;\n per_page: number;\n}\n\nexport function parsePagination(c: Context): PaginationParams {\n const page = Math.max(1, parseInt(c.req.query(\"page\") ?? \"1\", 10) || 1);\n const per_page = Math.min(100, Math.max(1, parseInt(c.req.query(\"per_page\") ?? \"30\", 10) || 30));\n return { page, per_page };\n}\n\nexport function setLinkHeader(c: Context, totalCount: number, page: number, perPage: number): void {\n const lastPage = Math.max(1, Math.ceil(totalCount / perPage));\n const baseUrl = new URL(c.req.url);\n const links: string[] = [];\n\n const makeLink = (p: number, rel: string) => {\n baseUrl.searchParams.set(\"page\", String(p));\n baseUrl.searchParams.set(\"per_page\", String(perPage));\n return `<${baseUrl.toString()}>; rel=\"${rel}\"`;\n };\n\n if (page < lastPage) {\n links.push(makeLink(page + 1, \"next\"));\n links.push(makeLink(lastPage, \"last\"));\n }\n if (page > 1) {\n links.push(makeLink(1, \"first\"));\n links.push(makeLink(page - 1, \"prev\"));\n }\n\n if (links.length > 0) {\n c.header(\"Link\", links.join(\", \"));\n }\n}\n","export function escapeHtml(s: string): string {\n return s.replace(/&/g, \"&\").replace(/</g, \"<\").replace(/>/g, \">\").replace(/\"/g, \""\");\n}\n\nexport function escapeAttr(s: string): string {\n return escapeHtml(s).replace(/'/g, \"'\");\n}\n\nconst CSS = `\n@font-face{\n font-family:'Geist';font-style:normal;font-weight:100 900;font-display:swap;\n src:url('/_emulate/fonts/geist-sans.woff2') format('woff2');\n}\n@font-face{\n font-family:'Geist Pixel';font-style:normal;font-weight:400;font-display:swap;\n src:url('/_emulate/fonts/GeistPixel-Square.woff2') format('woff2');\n}\n*{box-sizing:border-box;margin:0;padding:0}\nbody{\n font-family:'Geist',-apple-system,BlinkMacSystemFont,sans-serif;\n background:#000;color:#33ff00;min-height:100vh;\n -webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;\n}\n.emu-bar{\n border-bottom:1px solid #0a3300;padding:10px 20px;\n display:flex;align-items:center;gap:10px;font-size:.8125rem;color:#1a8c00;\n}\n.emu-bar-title{font-weight:600;color:#33ff00;font-family:'Geist Pixel',monospace;}\n.emu-bar-links{margin-left:auto;display:flex;gap:16px;}\n.emu-bar-links a{\n color:#1a8c00;font-size:.75rem;text-decoration:none;transition:color .15s;\n}\n.emu-bar-links a:hover{color:#33ff00;}\n.emu-bar-links a .full{display:inline;}\n.emu-bar-links a .short{display:none;}\n@media(max-width:600px){\n .emu-bar-links a .full{display:none;}\n .emu-bar-links a .short{display:inline;}\n}\n\n.content{\n display:flex;align-items:center;justify-content:center;\n min-height:calc(100vh - 42px);padding:24px 16px;\n}\n.content-inner{width:100%;max-width:420px;}\n.card-title{\n font-family:'Geist Pixel',monospace;\n font-size:1.125rem;font-weight:600;margin-bottom:4px;color:#33ff00;\n}\n.card-subtitle{color:#1a8c00;font-size:.8125rem;margin-bottom:18px;line-height:1.45;}\n.powered-by{\n position:fixed;bottom:0;left:0;right:0;\n text-align:center;padding:12px;font-size:.6875rem;color:#0a3300;\n font-family:'Geist Pixel',monospace;\n}\n.powered-by a{color:#1a8c00;text-decoration:none;transition:color .15s;}\n.powered-by a:hover{color:#33ff00;}\n\n.error-title{\n font-family:'Geist Pixel',monospace;\n color:#ff4444;font-size:1.125rem;font-weight:600;margin-bottom:8px;\n}\n.error-msg{color:#1a8c00;font-size:.875rem;line-height:1.5;}\n.error-card{text-align:center;}\n\n.user-form{margin-bottom:8px;}\n.user-form:last-of-type{margin-bottom:0;}\n.user-btn{\n width:100%;display:flex;align-items:center;gap:12px;\n padding:10px 12px;border:1px solid #0a3300;border-radius:8px;\n background:#000;color:inherit;cursor:pointer;text-align:left;\n font:inherit;transition:border-color .15s;\n}\n.user-btn:hover{border-color:#33ff00;}\n.avatar{\n width:36px;height:36px;border-radius:50%;\n background:#0a3300;color:#33ff00;font-weight:600;font-size:.875rem;\n display:flex;align-items:center;justify-content:center;flex-shrink:0;\n font-family:'Geist Pixel',monospace;\n}\n.user-text{min-width:0;}\n.user-login{font-weight:600;font-size:.875rem;display:block;color:#33ff00;}\n.user-meta{color:#1a8c00;font-size:.75rem;margin-top:1px;}\n.user-email{font-size:.6875rem;color:#116600;word-break:break-all;margin-top:1px;}\n\n.settings-layout{\n max-width:920px;margin:0 auto;padding:28px 20px;\n display:flex;gap:28px;\n}\n.settings-sidebar{width:200px;flex-shrink:0;}\n.settings-sidebar a{\n display:block;padding:6px 10px;border-radius:6px;color:#1a8c00;\n text-decoration:none;font-size:.8125rem;transition:color .15s;\n}\n.settings-sidebar a:hover{color:#33ff00;}\n.settings-sidebar a.active{color:#33ff00;font-weight:600;}\n.settings-main{flex:1;min-width:0;}\n\n.s-card{\n padding:18px 0;margin-bottom:14px;border-bottom:1px solid #0a3300;\n}\n.s-card:last-child{border-bottom:none;}\n.s-card-header{display:flex;align-items:center;gap:14px;margin-bottom:14px;}\n.s-icon{\n width:42px;height:42px;border-radius:8px;\n background:#0a3300;display:flex;align-items:center;justify-content:center;\n font-size:1.125rem;font-weight:700;color:#116600;flex-shrink:0;\n font-family:'Geist Pixel',monospace;\n}\n.s-title{\n font-family:'Geist Pixel',monospace;\n font-size:1.25rem;font-weight:600;color:#33ff00;\n}\n.s-subtitle{font-size:.75rem;color:#1a8c00;margin-top:2px;}\n.section-heading{\n font-size:.9375rem;font-weight:600;margin-bottom:10px;color:#33ff00;\n display:flex;align-items:center;justify-content:space-between;\n}\n.perm-list{list-style:none;}\n.perm-list li{padding:5px 0;font-size:.8125rem;display:flex;align-items:center;gap:6px;color:#1a8c00;}\n.check{color:#33ff00;}\n.org-row{\n display:flex;align-items:center;gap:8px;padding:7px 0;\n border-bottom:1px solid #0a3300;font-size:.8125rem;\n}\n.org-row:last-child{border-bottom:none;}\n.org-icon{\n width:22px;height:22px;border-radius:4px;background:#0a3300;\n display:flex;align-items:center;justify-content:center;\n font-size:.625rem;font-weight:700;color:#116600;flex-shrink:0;\n font-family:'Geist Pixel',monospace;\n}\n.org-name{font-weight:600;color:#33ff00;}\n.badge{font-size:.6875rem;padding:1px 7px;border-radius:999px;font-weight:500;}\n.badge-granted{background:#0a3300;color:#33ff00;}\n.badge-denied{background:#1a0a0a;color:#ff4444;}\n.badge-requested{background:#0a3300;color:#1a8c00;}\n.btn-revoke{\n display:inline-block;padding:5px 14px;border-radius:6px;\n border:1px solid #0a3300;background:transparent;color:#ff4444;\n font-size:.75rem;font-weight:600;cursor:pointer;transition:border-color .15s;\n}\n.btn-revoke:hover{border-color:#ff4444;}\n.info-text{color:#1a8c00;font-size:.75rem;line-height:1.5;margin-top:10px;}\n.app-link{\n display:flex;align-items:center;gap:12px;padding:12px;\n border:1px solid #0a3300;border-radius:8px;background:#000;\n text-decoration:none;color:inherit;margin-bottom:8px;transition:border-color .15s;\n}\n.app-link:hover{border-color:#33ff00;}\n.app-link-name{font-weight:600;font-size:.875rem;color:#33ff00;}\n.app-link-scopes{font-size:.6875rem;color:#1a8c00;margin-top:1px;}\n.empty{color:#1a8c00;text-align:center;padding:28px 0;font-size:.875rem;}\n\n.inspector-layout{max-width:960px;margin:0 auto;padding:28px 20px;}\n.inspector-tabs{display:flex;gap:4px;margin-bottom:20px;}\n.inspector-tabs a{\n padding:7px 16px;border-radius:6px;text-decoration:none;\n font-size:.8125rem;color:#1a8c00;border:1px solid transparent;\n transition:color .15s,border-color .15s;\n}\n.inspector-tabs a:hover{color:#33ff00;}\n.inspector-tabs a.active{color:#33ff00;font-weight:600;border-color:#0a3300;background:#0a3300;}\n.inspector-section{margin-bottom:24px;}\n.inspector-section h2{\n font-family:'Geist Pixel',monospace;\n font-size:1rem;font-weight:600;color:#33ff00;margin-bottom:10px;\n}\n.inspector-section h3{\n font-family:'Geist Pixel',monospace;\n font-size:.875rem;font-weight:600;color:#1a8c00;margin:16px 0 8px;\n}\n.inspector-table{width:100%;border-collapse:collapse;margin-bottom:12px;}\n.inspector-table th,.inspector-table td{\n text-align:left;padding:8px 12px;border-bottom:1px solid #0a3300;\n font-size:.8125rem;\n}\n.inspector-table th{color:#1a8c00;font-weight:600;font-size:.75rem;text-transform:uppercase;letter-spacing:.04em;}\n.inspector-table td{color:#33ff00;}\n.inspector-table tbody tr{transition:background .1s;}\n.inspector-table tbody tr:hover{background:#0a3300;}\n.inspector-empty{color:#1a8c00;text-align:center;padding:20px 0;font-size:.8125rem;}\n\n.checkout-layout{\n display:flex;min-height:calc(100vh - 42px);\n}\n.checkout-summary{\n flex:1;background:#020;padding:48px 40px 48px 10%;\n display:flex;flex-direction:column;justify-content:center;\n border-right:1px solid #0a3300;\n}\n.checkout-form-side{\n flex:1;background:#000;padding:48px 10% 48px 40px;\n display:flex;flex-direction:column;justify-content:center;\n}\n.checkout-merchant{\n display:flex;align-items:center;gap:10px;margin-bottom:6px;\n}\n.checkout-merchant-name{\n font-family:'Geist Pixel',monospace;\n font-size:.9375rem;font-weight:600;color:#33ff00;\n}\n.checkout-test-badge{\n font-size:.625rem;font-weight:700;letter-spacing:.04em;text-transform:uppercase;\n background:#0a3300;color:#1a8c00;padding:2px 8px;border-radius:4px;\n}\n.checkout-total{\n font-family:'Geist Pixel',monospace;\n font-size:2rem;font-weight:700;color:#33ff00;margin:8px 0 28px;\n}\n.checkout-line-item{\n display:flex;align-items:center;gap:14px;padding:14px 0;\n border-bottom:1px solid #0a3300;\n}\n.checkout-line-item:first-child{border-top:1px solid #0a3300;}\n.checkout-item-icon{\n width:42px;height:42px;border-radius:6px;background:#0a3300;\n display:flex;align-items:center;justify-content:center;flex-shrink:0;\n font-family:'Geist Pixel',monospace;font-size:.875rem;font-weight:700;color:#116600;\n}\n.checkout-item-details{flex:1;min-width:0;}\n.checkout-item-name{font-size:.875rem;font-weight:600;color:#33ff00;}\n.checkout-item-qty{font-size:.75rem;color:#1a8c00;margin-top:2px;}\n.checkout-item-price{\n font-size:.875rem;font-weight:600;color:#33ff00;text-align:right;white-space:nowrap;\n}\n.checkout-item-unit{font-size:.6875rem;color:#1a8c00;text-align:right;margin-top:2px;}\n.checkout-totals{margin-top:20px;}\n.checkout-totals-row{\n display:flex;justify-content:space-between;padding:6px 0;\n font-size:.8125rem;color:#1a8c00;\n}\n.checkout-totals-row.total{\n border-top:1px solid #0a3300;margin-top:8px;padding-top:14px;\n font-size:.9375rem;font-weight:600;color:#33ff00;\n}\n.checkout-form-section{margin-bottom:24px;}\n.checkout-form-label{\n font-size:.8125rem;font-weight:600;color:#33ff00;margin-bottom:8px;display:block;\n}\n.checkout-input{\n width:100%;padding:10px 12px;border:1px solid #0a3300;border-radius:6px;\n background:#020;color:#33ff00;font:inherit;font-size:.875rem;\n transition:border-color .15s;outline:none;\n}\n.checkout-input:focus{border-color:#33ff00;}\n.checkout-input::placeholder{color:#116600;}\n.checkout-card-box{\n border:1px solid #0a3300;border-radius:6px;padding:14px;\n background:#020;\n}\n.checkout-card-row{\n display:flex;gap:12px;margin-top:10px;\n}\n.checkout-card-row .checkout-input{flex:1;}\n.checkout-sim-note{\n font-size:.6875rem;color:#1a8c00;margin-top:10px;text-align:center;\n font-style:italic;\n}\n.checkout-pay-btn{\n width:100%;padding:14px;border:none;border-radius:8px;\n background:#33ff00;color:#000;font:inherit;font-size:.9375rem;font-weight:700;\n cursor:pointer;transition:background .15s;\n font-family:'Geist Pixel',monospace;\n}\n.checkout-pay-btn:hover{background:#44ff22;}\n.checkout-cancel{\n text-align:center;margin-top:14px;\n}\n.checkout-cancel a{\n color:#1a8c00;text-decoration:none;font-size:.8125rem;\n transition:color .15s;\n}\n.checkout-cancel a:hover{color:#33ff00;}\n@media(max-width:768px){\n .checkout-layout{flex-direction:column;}\n .checkout-summary{padding:32px 20px;border-right:none;border-bottom:1px solid #0a3300;}\n .checkout-form-side{padding:32px 20px;}\n}\n`;\n\nconst POWERED_BY = `<div class=\"powered-by\">Powered by <a href=\"https://emulate.dev\" target=\"_blank\" rel=\"noopener\">emulate</a></div>`;\n\nfunction emuBar(service?: string): string {\n const title = service ? `${escapeHtml(service)} Emulator` : \"Emulator\";\n return `<div class=\"emu-bar\">\n <span class=\"emu-bar-title\">${title}</span>\n <nav class=\"emu-bar-links\">\n <a href=\"https://github.com/vercel-labs/emulate/issues\" target=\"_blank\" rel=\"noopener\"><span class=\"full\">Report Issue</span><span class=\"short\">Report</span></a>\n <a href=\"https://github.com/vercel-labs/emulate\" target=\"_blank\" rel=\"noopener\"><span class=\"full\">Source Code</span><span class=\"short\">Source</span></a>\n <a href=\"https://emulate.dev\" target=\"_blank\" rel=\"noopener\"><span class=\"full\">Learn More</span><span class=\"short\">Learn</span></a>\n </nav>\n</div>`;\n}\n\nfunction head(title: string): string {\n return `<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n<meta charset=\"utf-8\"/>\n<meta name=\"viewport\" content=\"width=device-width,initial-scale=1\"/>\n<link rel=\"icon\" href=\"/_emulate/favicon.ico\"/>\n<title>${escapeHtml(title)} | emulate</title>\n<style>${CSS}</style>\n</head>`;\n}\n\nexport function renderCardPage(title: string, subtitle: string, body: string, service?: string): string {\n return `${head(title)}\n<body>\n${emuBar(service)}\n<div class=\"content\">\n <div class=\"content-inner\">\n <div class=\"card-title\">${escapeHtml(title)}</div>\n <div class=\"card-subtitle\">${subtitle}</div>\n ${body}\n </div>\n</div>\n${POWERED_BY}\n</body></html>`;\n}\n\nexport function renderErrorPage(title: string, message: string, service?: string): string {\n return `${head(title)}\n<body>\n${emuBar(service)}\n<div class=\"content\">\n <div class=\"content-inner error-card\">\n <div class=\"error-title\">${escapeHtml(title)}</div>\n <div class=\"error-msg\">${escapeHtml(message)}</div>\n </div>\n</div>\n${POWERED_BY}\n</body></html>`;\n}\n\nexport function renderSettingsPage(title: string, sidebarHtml: string, bodyHtml: string, service?: string): string {\n return `${head(title)}\n<body>\n${emuBar(service)}\n<div class=\"settings-layout\">\n <nav class=\"settings-sidebar\">${sidebarHtml}</nav>\n <div class=\"settings-main\">${bodyHtml}</div>\n</div>\n${POWERED_BY}\n</body></html>`;\n}\n\nexport interface InspectorTab {\n id: string;\n label: string;\n href: string;\n}\n\nexport function renderInspectorPage(\n title: string,\n tabs: InspectorTab[],\n activeTab: string,\n body: string,\n service?: string,\n): string {\n const tabLinks = tabs\n .map(\n (t) => `<a href=\"${escapeAttr(t.href)}\" class=\"${t.id === activeTab ? \"active\" : \"\"}\">${escapeHtml(t.label)}</a>`,\n )\n .join(\"\");\n\n return `${head(title)}\n<body>\n${emuBar(service)}\n<div class=\"inspector-layout\">\n <nav class=\"inspector-tabs\">${tabLinks}</nav>\n ${body}\n</div>\n${POWERED_BY}\n</body></html>`;\n}\n\nexport function renderFormPostPage(action: string, fields: Record<string, string>, service?: string): string {\n const hiddens = Object.entries(fields)\n .filter(([, v]) => v != null)\n .map(([k, v]) => `<input type=\"hidden\" name=\"${escapeAttr(k)}\" value=\"${escapeAttr(v)}\"/>`)\n .join(\"\\n\");\n\n return `${head(\"Redirecting\")}\n<body onload=\"document.forms[0].submit()\">\n${emuBar(service)}\n<div class=\"content\">\n <div class=\"content-inner\" style=\"text-align:center\">\n <div class=\"card-subtitle\">Redirecting…</div>\n <form method=\"POST\" action=\"${escapeAttr(action)}\">\n${hiddens}\n <noscript><button type=\"submit\" class=\"user-btn\" style=\"margin-top:12px;justify-content:center\">\n <span class=\"user-login\">Continue</span>\n </button></noscript>\n </form>\n </div>\n</div>\n${POWERED_BY}\n</body></html>`;\n}\n\nexport interface CheckoutLineItem {\n name: string;\n quantity: number;\n unitPrice: number;\n totalPrice: number;\n currency: string;\n}\n\nexport interface CheckoutPageOptions {\n merchantName?: string;\n lineItems: CheckoutLineItem[];\n subtotal: number;\n total: number;\n currency: string;\n sessionId: string;\n cancelUrl?: string | null;\n}\n\nexport function renderCheckoutPage(opts: CheckoutPageOptions, service?: string): string {\n const fmt = (cents: number, cur: string) => `$${(cents / 100).toFixed(2)} ${cur.toUpperCase()}`;\n const fmtShort = (cents: number) => `$${(cents / 100).toFixed(2)}`;\n\n const itemsHtml =\n opts.lineItems.length > 0\n ? opts.lineItems\n .map((li) => {\n const initial = li.name.charAt(0).toUpperCase();\n const unitNote =\n li.quantity > 1 ? `<div class=\"checkout-item-unit\">${fmtShort(li.unitPrice)} each</div>` : \"\";\n return `<div class=\"checkout-line-item\">\n <div class=\"checkout-item-icon\">${escapeHtml(initial)}</div>\n <div class=\"checkout-item-details\">\n <div class=\"checkout-item-name\">${escapeHtml(li.name)}</div>\n <div class=\"checkout-item-qty\">Qty ${li.quantity}</div>\n </div>\n <div>\n <div class=\"checkout-item-price\">${fmtShort(li.totalPrice)}</div>\n ${unitNote}\n </div>\n</div>`;\n })\n .join(\"\")\n : '<p class=\"empty\">No line items</p>';\n\n const totalsHtml = `<div class=\"checkout-totals\">\n <div class=\"checkout-totals-row\">\n <span>Subtotal</span><span>${fmtShort(opts.subtotal)}</span>\n </div>\n <div class=\"checkout-totals-row total\">\n <span>Total due</span><span>${fmt(opts.total, opts.currency)}</span>\n </div>\n</div>`;\n\n const cancelHtml = opts.cancelUrl\n ? `<div class=\"checkout-cancel\"><a href=\"${escapeAttr(opts.cancelUrl)}\">Cancel</a></div>`\n : \"\";\n\n const merchant = opts.merchantName ? escapeHtml(opts.merchantName) : \"Checkout\";\n\n return `${head(\"Checkout\")}\n<body>\n${emuBar(service)}\n<div class=\"checkout-layout\">\n <div class=\"checkout-summary\">\n <div class=\"checkout-merchant\">\n <span class=\"checkout-merchant-name\">${merchant}</span>\n <span class=\"checkout-test-badge\">Test Mode</span>\n </div>\n <div class=\"checkout-total\">${fmtShort(opts.total)}</div>\n ${itemsHtml}\n ${totalsHtml}\n </div>\n <div class=\"checkout-form-side\">\n <form method=\"post\" action=\"/checkout/${escapeAttr(opts.sessionId)}/complete\">\n <div class=\"checkout-form-section\">\n <label class=\"checkout-form-label\">Email</label>\n <input type=\"email\" name=\"email\" class=\"checkout-input\" placeholder=\"you@example.com\"/>\n </div>\n <div class=\"checkout-form-section\">\n <label class=\"checkout-form-label\">Card information</label>\n <div class=\"checkout-card-box\">\n <input type=\"text\" class=\"checkout-input\" placeholder=\"1234 1234 1234 1234\" disabled/>\n <div class=\"checkout-card-row\">\n <input type=\"text\" class=\"checkout-input\" placeholder=\"MM / YY\" disabled/>\n <input type=\"text\" class=\"checkout-input\" placeholder=\"CVC\" disabled/>\n </div>\n </div>\n <div class=\"checkout-sim-note\">Card fields are simulated. Payment will be auto-approved.</div>\n </div>\n <button type=\"submit\" class=\"checkout-pay-btn\">Pay ${fmtShort(opts.total)}</button>\n </form>\n ${cancelHtml}\n </div>\n</div>\n${POWERED_BY}\n</body></html>`;\n}\n\nexport interface UserButtonOptions {\n letter: string;\n login: string;\n name?: string;\n email?: string;\n formAction: string;\n hiddenFields: Record<string, string>;\n}\n\nexport function renderUserButton(opts: UserButtonOptions): string {\n const hiddens = Object.entries(opts.hiddenFields)\n .map(([k, v]) => `<input type=\"hidden\" name=\"${escapeAttr(k)}\" value=\"${escapeAttr(v)}\"/>`)\n .join(\"\");\n\n const nameLine = opts.name ? `<div class=\"user-meta\">${escapeHtml(opts.name)}</div>` : \"\";\n const emailLine = opts.email ? `<div class=\"user-email\">${escapeHtml(opts.email)}</div>` : \"\";\n\n return `<form class=\"user-form\" method=\"post\" action=\"${escapeAttr(opts.formAction)}\">\n${hiddens}\n<button type=\"submit\" class=\"user-btn\">\n <span class=\"avatar\">${escapeHtml(opts.letter)}</span>\n <span class=\"user-text\">\n <span class=\"user-login\">${escapeHtml(opts.login)}</span>\n ${nameLine}${emailLine}\n </span>\n</button>\n</form>`;\n}\n","import { timingSafeEqual } from \"crypto\";\n\nexport function normalizeUri(uri: string): string {\n try {\n const u = new URL(uri);\n return `${u.origin}${u.pathname.replace(/\\/+$/, \"\")}`;\n } catch {\n return uri.replace(/\\/+$/, \"\").split(\"?\")[0];\n }\n}\n\nexport function matchesRedirectUri(incoming: string, registered: string[]): boolean {\n const normalized = normalizeUri(incoming);\n return registered.some((r) => normalizeUri(r) === normalized);\n}\n\nexport function constantTimeSecretEqual(a: string, b: string): boolean {\n const bufA = Buffer.from(a, \"utf-8\");\n const bufB = Buffer.from(b, \"utf-8\");\n if (bufA.length !== bufB.length) return false;\n return timingSafeEqual(bufA, bufB);\n}\n\nexport function bodyStr(v: unknown): string {\n if (typeof v === \"string\") return v;\n if (Array.isArray(v) && typeof v[0] === \"string\") return v[0];\n return \"\";\n}\n\nexport function parseCookies(header: string): Record<string, string> {\n const cookies: Record<string, string> = {};\n for (const part of header.split(\";\")) {\n const [k, ...v] = part.split(\"=\");\n if (k) cookies[k.trim()] = v.join(\"=\").trim();\n }\n return cookies;\n}\n","import { readFile, writeFile, mkdir } from \"node:fs/promises\";\nimport { dirname } from \"node:path\";\n\nexport interface PersistenceAdapter {\n load(): Promise<string | null>;\n save(data: string): Promise<void>;\n}\n\nexport function filePersistence(path: string): PersistenceAdapter {\n return {\n async load() {\n try {\n return await readFile(path, \"utf-8\");\n } catch {\n return null;\n }\n },\n async save(data: string) {\n await mkdir(dirname(path), { recursive: true });\n await writeFile(path, data, \"utf-8\");\n },\n };\n}\n","import type { AuthUser } from \"@emulators/core\";\nimport { notFound, unauthorized, forbidden } from \"@emulators/core\";\nimport type { GitHubStore } from \"./store.js\";\nimport type { GitHubRepo, GitHubUser } from \"./entities.js\";\n\nexport { notFound as notFoundResponse };\n\nexport function ownerLoginOf(gh: GitHubStore, repo: GitHubRepo): string {\n if (repo.owner_type === \"User\") {\n return gh.users.get(repo.owner_id)?.login ?? \"unknown\";\n }\n return gh.orgs.get(repo.owner_id)?.login ?? \"unknown\";\n}\n\nexport function isOrgMember(gh: GitHubStore, userId: number, orgId: number): boolean {\n for (const team of gh.teams.all()) {\n if (team.org_id !== orgId) continue;\n const m = gh.teamMembers.findBy(\"team_id\", team.id).find((x) => x.user_id === userId);\n if (m) return true;\n }\n return false;\n}\n\nexport function getActorUser(gh: GitHubStore, authUser: AuthUser): GitHubUser | undefined {\n return gh.users.findOneBy(\"login\", authUser.login);\n}\n\nexport function canAccessRepo(gh: GitHubStore, authUser: AuthUser | undefined, repo: GitHubRepo): boolean {\n if (!repo.private) return true;\n if (!authUser) return false;\n const user = getActorUser(gh, authUser);\n if (!user) return false;\n if (repo.owner_type === \"User\" && repo.owner_id === user.id) return true;\n if (repo.owner_type === \"Organization\" && isOrgMember(gh, user.id, repo.owner_id)) return true;\n return Boolean(gh.collaborators.findBy(\"repo_id\", repo.id).find((c) => c.user_id === user.id));\n}\n\nexport function assertRepoRead(gh: GitHubStore, authUser: AuthUser | undefined, repo: GitHubRepo): void {\n if (canAccessRepo(gh, authUser, repo)) return;\n if (!authUser) throw unauthorized();\n throw forbidden();\n}\n\nexport function assertAuthenticatedUser(gh: GitHubStore, authUser: AuthUser | undefined): GitHubUser {\n if (!authUser) throw unauthorized();\n const user = getActorUser(gh, authUser);\n if (!user) throw unauthorized();\n return user;\n}\n\nexport function hasRepoAdmin(gh: GitHubStore, user: GitHubUser, repo: GitHubRepo): boolean {\n if (repo.owner_type === \"User\" && repo.owner_id === user.id) return true;\n if (repo.owner_type === \"Organization\" && isOrgMember(gh, user.id, repo.owner_id)) return true;\n const collab = gh.collaborators.findBy(\"repo_id\", repo.id).find((c) => c.user_id === user.id);\n return collab?.permission === \"admin\" || collab?.permission === \"maintain\";\n}\n\nexport function assertRepoAdmin(gh: GitHubStore, authUser: AuthUser | undefined, repo: GitHubRepo): GitHubUser {\n if (!authUser) throw unauthorized();\n const user = getActorUser(gh, authUser);\n if (!user) throw unauthorized();\n if (hasRepoAdmin(gh, user, repo)) return user;\n throw forbidden();\n}\n\nexport function assertRepoWrite(gh: GitHubStore, authUser: AuthUser | undefined, repo: GitHubRepo): GitHubUser {\n const user = assertAuthenticatedUser(gh, authUser);\n if (!repo.private) return user;\n if (!canAccessRepo(gh, authUser, repo)) throw forbidden();\n return user;\n}\n\nexport function assertIssueWrite(gh: GitHubStore, authUser: AuthUser | undefined, repo: GitHubRepo): GitHubUser {\n const user = assertAuthenticatedUser(gh, authUser);\n if (!repo.private) return user;\n if (!canAccessRepo(gh, authUser, repo)) throw forbidden();\n return user;\n}\n","import type { RouteContext } from \"@emulators/core\";\nimport { ApiError, parseJsonBody, parsePagination, setLinkHeader, unauthorized } from \"@emulators/core\";\nimport { assertAuthenticatedUser, canAccessRepo, notFoundResponse } from \"../route-helpers.js\";\nimport { getGitHubStore } from \"../store.js\";\nimport type { GitHubStore } from \"../store.js\";\nimport type { GitHubRepo, GitHubUser } from \"../entities.js\";\nimport { formatOrgBrief, formatRepo, formatUser, formatUserFull } from \"../helpers.js\";\n\nfunction listReposForUser(gh: GitHubStore, user: GitHubUser, type: \"all\" | \"owner\" | \"member\"): GitHubRepo[] {\n const owned = gh.repos.all().filter((r) => r.owner_id === user.id && r.owner_type === \"User\");\n const member = gh.collaborators\n .findBy(\"user_id\", user.id)\n .map((c) => gh.repos.get(c.repo_id))\n .filter((r): r is GitHubRepo => Boolean(r))\n .filter((r) => !(r.owner_id === user.id && r.owner_type === \"User\"));\n\n if (type === \"owner\") return owned;\n if (type === \"member\") return member;\n\n const map = new Map<number, GitHubRepo>();\n for (const r of owned) map.set(r.id, r);\n for (const r of member) map.set(r.id, r);\n return Array.from(map.values());\n}\n\nfunction sortRepos(\n repos: GitHubRepo[],\n sort: \"created\" | \"updated\" | \"pushed\" | \"full_name\",\n direction: \"asc\" | \"desc\",\n): GitHubRepo[] {\n const mul = direction === \"asc\" ? 1 : -1;\n const sorted = [...repos];\n sorted.sort((a, b) => {\n if (sort === \"full_name\") {\n return a.full_name.localeCompare(b.full_name) * mul;\n }\n const field = sort === \"created\" ? \"created_at\" : sort === \"updated\" ? \"updated_at\" : \"pushed_at\";\n const av = a[field] ?? \"\";\n const bv = b[field] ?? \"\";\n if (av < bv) return -1 * mul;\n if (av > bv) return 1 * mul;\n return 0;\n });\n return sorted;\n}\n\nfunction orgsForUser(gh: GitHubStore, userId: number) {\n const memberships = gh.teamMembers.findBy(\"user_id\", userId);\n const orgIds = new Set<number>();\n for (const m of memberships) {\n const team = gh.teams.get(m.team_id);\n if (team) orgIds.add(team.org_id);\n }\n const orgs = [...orgIds].map((id) => gh.orgs.get(id)).filter((o): o is NonNullable<typeof o> => Boolean(o));\n orgs.sort((a, b) => a.login.localeCompare(b.login));\n return orgs;\n}\n\nexport function usersRoutes({ app, store, baseUrl }: RouteContext): void {\n const gh = getGitHubStore(store);\n\n app.get(\"/user\", (c) => {\n const authUser = c.get(\"authUser\");\n if (!authUser) {\n throw unauthorized();\n }\n const user = gh.users.findOneBy(\"login\", authUser.login);\n if (!user) {\n throw notFoundResponse();\n }\n return c.json(formatUserFull(user, baseUrl));\n });\n\n app.patch(\"/user\", async (c) => {\n const authUser = c.get(\"authUser\");\n if (!authUser) {\n throw unauthorized();\n }\n const existing = gh.users.findOneBy(\"login\", authUser.login);\n if (!existing) {\n throw notFoundResponse();\n }\n\n const body = await parseJsonBody(c);\n const patch: Partial<GitHubUser> = {};\n\n if (\"name\" in body) {\n if (body.name === null) patch.name = null;\n else if (typeof body.name === \"string\") patch.name = body.name;\n }\n if (\"email\" in body) {\n if (body.email === null) patch.email = null;\n else if (typeof body.email === \"string\") patch.email = body.email;\n }\n if (\"blog\" in body && typeof body.blog === \"string\") {\n patch.blog = body.blog;\n }\n if (\"twitter_username\" in body) {\n if (body.twitter_username === null) patch.twitter_username = null;\n else if (typeof body.twitter_username === \"string\") {\n patch.twitter_username = body.twitter_username;\n }\n }\n if (\"company\" in body) {\n if (body.company === null) patch.company = null;\n else if (typeof body.company === \"string\") patch.company = body.company;\n }\n if (\"location\" in body) {\n if (body.location === null) patch.location = null;\n else if (typeof body.location === \"string\") patch.location = body.location;\n }\n if (\"hireable\" in body) {\n if (body.hireable === null) patch.hireable = null;\n else if (typeof body.hireable === \"boolean\") patch.hireable = body.hireable;\n }\n if (\"bio\" in body) {\n if (body.bio === null) patch.bio = null;\n else if (typeof body.bio === \"string\") patch.bio = body.bio;\n }\n\n const updated = gh.users.update(existing.id, patch);\n if (!updated) {\n throw notFoundResponse();\n }\n return c.json(formatUserFull(updated, baseUrl));\n });\n\n app.get(\"/user/repos\", (c) => {\n const authUser = c.get(\"authUser\");\n const user = assertAuthenticatedUser(gh, authUser);\n\n const typeRaw = (c.req.query(\"type\") ?? \"all\").toLowerCase();\n if (typeRaw !== \"all\" && typeRaw !== \"owner\" && typeRaw !== \"member\") {\n throw new ApiError(422, \"Invalid type parameter\");\n }\n const type = typeRaw as \"all\" | \"owner\" | \"member\";\n\n const sortRaw = (c.req.query(\"sort\") ?? \"full_name\").toLowerCase();\n if (sortRaw !== \"created\" && sortRaw !== \"updated\" && sortRaw !== \"pushed\" && sortRaw !== \"full_name\") {\n throw new ApiError(422, \"Invalid sort parameter\");\n }\n const sort = sortRaw as \"created\" | \"updated\" | \"pushed\" | \"full_name\";\n\n const direction =\n (c.req.query(\"direction\")?.toLowerCase() as \"asc\" | \"desc\" | undefined) ??\n (sort === \"full_name\" ? \"asc\" : \"desc\");\n if (direction !== \"asc\" && direction !== \"desc\") {\n throw new ApiError(422, \"Invalid direction parameter\");\n }\n\n const { page, per_page } = parsePagination(c);\n const allRepos = sortRepos(listReposForUser(gh, user, type), sort, direction).filter((r) =>\n canAccessRepo(gh, authUser, r),\n );\n const total = allRepos.length;\n const start = (page - 1) * per_page;\n const items = allRepos.slice(start, start + per_page).map((r) => formatRepo(r, gh, baseUrl));\n\n setLinkHeader(c, total, page, per_page);\n return c.json(items);\n });\n\n app.get(\"/users\", (c) => {\n const since = Math.max(0, parseInt(c.req.query(\"since\") ?? \"0\", 10) || 0);\n const perPage = Math.min(100, Math.max(1, parseInt(c.req.query(\"per_page\") ?? \"30\", 10) || 30));\n\n const ordered = gh.users\n .all()\n .filter((u) => u.id > since)\n .sort((a, b) => a.id - b.id);\n const page = ordered.slice(0, perPage);\n\n if (page.length === perPage && ordered.length > perPage) {\n const lastId = page[page.length - 1]!.id;\n const nextUrl = new URL(c.req.url);\n nextUrl.searchParams.set(\"since\", String(lastId));\n nextUrl.searchParams.set(\"per_page\", String(perPage));\n c.header(\"Link\", `<${nextUrl.toString()}>; rel=\"next\"`);\n }\n\n return c.json(page.map((u) => formatUser(u, baseUrl)));\n });\n\n app.get(\"/users/:username/repos\", (c) => {\n const username = c.req.param(\"username\")!;\n const user = gh.users.findOneBy(\"login\", username);\n if (!user) {\n throw notFoundResponse();\n }\n\n const typeRaw = (c.req.query(\"type\") ?? \"owner\").toLowerCase();\n if (typeRaw !== \"all\" && typeRaw !== \"owner\" && typeRaw !== \"member\") {\n throw new ApiError(422, \"Invalid type parameter\");\n }\n const type = typeRaw as \"all\" | \"owner\" | \"member\";\n\n const sortRaw = (c.req.query(\"sort\") ?? \"full_name\").toLowerCase();\n if (sortRaw !== \"created\" && sortRaw !== \"updated\" && sortRaw !== \"pushed\" && sortRaw !== \"full_name\") {\n throw new ApiError(422, \"Invalid sort parameter\");\n }\n const sort = sortRaw as \"created\" | \"updated\" | \"pushed\" | \"full_name\";\n\n const direction =\n (c.req.query(\"direction\")?.toLowerCase() as \"asc\" | \"desc\" | undefined) ??\n (sort === \"full_name\" ? \"asc\" : \"desc\");\n if (direction !== \"asc\" && direction !== \"desc\") {\n throw new ApiError(422, \"Invalid direction parameter\");\n }\n\n const { page, per_page } = parsePagination(c);\n const allRepos = sortRepos(listReposForUser(gh, user, type), sort, direction);\n const total = allRepos.length;\n const start = (page - 1) * per_page;\n const items = allRepos.slice(start, start + per_page).map((r) => formatRepo(r, gh, baseUrl));\n\n setLinkHeader(c, total, page, per_page);\n return c.json(items);\n });\n\n app.get(\"/users/:username/orgs\", (c) => {\n const username = c.req.param(\"username\")!;\n const user = gh.users.findOneBy(\"login\", username);\n if (!user) {\n throw notFoundResponse();\n }\n\n const orgs = orgsForUser(gh, user.id);\n return c.json(orgs.map((o) => formatOrgBrief(o, baseUrl)));\n });\n\n app.get(\"/users/:username/followers\", (c) => {\n const username = c.req.param(\"username\")!;\n if (!gh.users.findOneBy(\"login\", username)) {\n throw notFoundResponse();\n }\n\n const { page, per_page } = parsePagination(c);\n setLinkHeader(c, 0, page, per_page);\n return c.json([]);\n });\n\n app.get(\"/users/:username/following\", (c) => {\n const username = c.req.param(\"username\")!;\n if (!gh.users.findOneBy(\"login\", username)) {\n throw notFoundResponse();\n }\n\n const { page, per_page } = parsePagination(c);\n setLinkHeader(c, 0, page, per_page);\n return c.json([]);\n });\n\n app.get(\"/users/:username/hovercard\", (c) => {\n const username = c.req.param(\"username\")!;\n if (!gh.users.findOneBy(\"login\", username)) {\n throw notFoundResponse();\n }\n\n return c.json({ contexts: [] });\n });\n\n app.get(\"/users/:username\", (c) => {\n const username = c.req.param(\"username\")!;\n const user = gh.users.findOneBy(\"login\", username);\n if (!user) {\n throw notFoundResponse();\n }\n return c.json(formatUserFull(user, baseUrl));\n });\n}\n","import type { RouteContext } from \"@emulators/core\";\nimport { ApiError, forbidden, parseJsonBody, parsePagination, setLinkHeader } from \"@emulators/core\";\nimport { getGitHubStore } from \"../store.js\";\nimport {\n assertAuthenticatedUser,\n assertRepoRead,\n hasRepoAdmin,\n isOrgMember,\n notFoundResponse,\n ownerLoginOf,\n} from \"../route-helpers.js\";\nimport type { GitHubStore } from \"../store.js\";\nimport type {\n GitHubBlob,\n GitHubBranch,\n GitHubCollaborator,\n GitHubCommit,\n GitHubRef,\n GitHubRepo,\n GitHubTag,\n GitHubTree,\n GitHubUser,\n} from \"../entities.js\";\nimport type { Collection, Entity } from \"@emulators/core\";\nimport { formatRepo, formatUser, generateNodeId, generateSha, lookupOwner, lookupRepo, timestamp } from \"../helpers.js\";\n\nconst LICENSE_TEMPLATES: Record<string, { key: string; name: string; spdx_id: string }> = {\n mit: { key: \"mit\", name: \"MIT License\", spdx_id: \"MIT\" },\n \"apache-2.0\": { key: \"apache-2.0\", name: \"Apache License 2.0\", spdx_id: \"Apache-2.0\" },\n \"gpl-3.0\": { key: \"gpl-3.0\", name: \"GNU General Public License v3.0\", spdx_id: \"GPL-3.0\" },\n \"bsd-3-clause\": {\n key: \"bsd-3-clause\",\n name: 'BSD 3-Clause \"New\" or \"Revised\" License',\n spdx_id: \"BSD-3-Clause\",\n },\n unlicense: { key: \"unlicense\", name: \"The Unlicense\", spdx_id: \"Unlicense\" },\n};\n\nfunction resolveLicenseTemplate(template: string) {\n const key = template.trim().toLowerCase();\n return LICENSE_TEMPLATES[key] ?? null;\n}\n\nfunction validateRepoName(name: unknown): string {\n if (typeof name !== \"string\" || !name.trim()) {\n throw new ApiError(422, \"Invalid repository name\");\n }\n const trimmed = name.trim();\n if (trimmed.length > 100 || !/^[a-zA-Z0-9._-]+$/.test(trimmed)) {\n throw new ApiError(422, \"Invalid repository name\");\n }\n return trimmed;\n}\n\nfunction seedInitialGit(gh: GitHubStore, repo: GitHubRepo, actor: GitHubUser | null, readmeTitle?: string) {\n const repoId = repo.id;\n const readme = `# ${readmeTitle ?? repo.name}\\n`;\n const size = Buffer.byteLength(readme, \"utf8\");\n\n const blob = gh.blobs.insert({\n repo_id: repoId,\n sha: generateSha(),\n node_id: \"\",\n content: readme,\n encoding: \"utf-8\",\n size,\n } as Omit<GitHubBlob, \"id\" | \"created_at\" | \"updated_at\">);\n gh.blobs.update(blob.id, { node_id: generateNodeId(\"Blob\", blob.id) });\n\n const tree = gh.trees.insert({\n repo_id: repoId,\n sha: generateSha(),\n node_id: \"\",\n tree: [{ path: \"README.md\", mode: \"100644\", type: \"blob\", sha: blob.sha }],\n truncated: false,\n } as Omit<GitHubTree, \"id\" | \"created_at\" | \"updated_at\">);\n gh.trees.update(tree.id, { node_id: generateNodeId(\"Tree\", tree.id) });\n\n const authorName = actor?.name ?? actor?.login ?? \"User\";\n const login = actor?.login ?? \"user\";\n const email = actor?.email ?? `${login}@users.noreply.github.com`;\n const now = timestamp();\n\n const commit = gh.commits.insert({\n repo_id: repoId,\n sha: generateSha(),\n node_id: \"\",\n message: \"Initial commit\",\n author_name: authorName,\n author_email: email,\n author_date: now,\n committer_name: authorName,\n committer_email: email,\n committer_date: now,\n tree_sha: tree.sha,\n parent_shas: [],\n user_id: actor?.id ?? null,\n } as Omit<GitHubCommit, \"id\" | \"created_at\" | \"updated_at\">);\n gh.commits.update(commit.id, { node_id: generateNodeId(\"Commit\", commit.id) });\n\n gh.branches.insert({\n repo_id: repoId,\n name: repo.default_branch,\n sha: commit.sha,\n protected: false,\n } as Omit<GitHubBranch, \"id\" | \"created_at\" | \"updated_at\">);\n\n const ref = gh.refs.insert({\n repo_id: repoId,\n ref: `refs/heads/${repo.default_branch}`,\n sha: commit.sha,\n node_id: \"\",\n } as Omit<GitHubRef, \"id\" | \"created_at\" | \"updated_at\">);\n gh.refs.update(ref.id, { node_id: generateNodeId(\"Ref\", ref.id) });\n\n gh.repos.update(repo.id, {\n size,\n pushed_at: now,\n language: \"Markdown\",\n languages: { Markdown: size },\n });\n}\n\nfunction bumpPublicRepos(gh: GitHubStore, ownerId: number, ownerType: \"User\" | \"Organization\", delta: number) {\n if (delta === 0) return;\n if (ownerType === \"User\") {\n const u = gh.users.get(ownerId);\n if (u) gh.users.update(ownerId, { public_repos: Math.max(0, u.public_repos + delta) });\n } else {\n const o = gh.orgs.get(ownerId);\n if (o) gh.orgs.update(ownerId, { public_repos: Math.max(0, o.public_repos + delta) });\n }\n}\n\ntype CreateRepoRecordParams = {\n name: unknown;\n description: string | null;\n private: boolean;\n homepage: string | null;\n has_issues: boolean;\n has_wiki: boolean;\n has_projects: boolean;\n auto_init: boolean;\n license_template: string | null | undefined;\n gitignore_template: string | null | undefined;\n owner_id: number;\n owner_type: \"User\" | \"Organization\";\n owner_login: string;\n default_branch: string;\n baseUrl: string;\n allow_rebase_merge?: boolean;\n allow_squash_merge?: boolean;\n allow_merge_commit?: boolean;\n delete_branch_on_merge?: boolean;\n};\n\nfunction createRepoRecord(gh: GitHubStore, params: CreateRepoRecordParams, actor: GitHubUser): GitHubRepo {\n const name = validateRepoName(params.name);\n const fullName = `${params.owner_login}/${name}`;\n if (gh.repos.findOneBy(\"full_name\", fullName)) {\n throw new ApiError(422, \"Repository already exists\");\n }\n\n const isPrivate = params.private;\n const visibility = isPrivate ? \"private\" : (\"public\" as GitHubRepo[\"visibility\"]);\n\n const license = typeof params.license_template === \"string\" ? resolveLicenseTemplate(params.license_template) : null;\n\n const repo = gh.repos.insert({\n node_id: \"\",\n name,\n full_name: fullName,\n owner_id: params.owner_id,\n owner_type: params.owner_type,\n private: isPrivate,\n description: params.description,\n fork: false,\n forked_from_id: null,\n homepage: params.homepage,\n language: null,\n languages: {},\n forks_count: 0,\n stargazers_count: 0,\n watchers_count: 0,\n size: 0,\n default_branch: params.default_branch,\n open_issues_count: 0,\n topics: [],\n has_issues: params.has_issues,\n has_projects: params.has_projects,\n has_wiki: params.has_wiki,\n has_pages: false,\n has_downloads: true,\n has_discussions: false,\n archived: false,\n disabled: false,\n visibility,\n pushed_at: null,\n allow_rebase_merge: params.allow_rebase_merge ?? true,\n allow_squash_merge: params.allow_squash_merge ?? true,\n allow_merge_commit: params.allow_merge_commit ?? true,\n allow_auto_merge: false,\n delete_branch_on_merge: params.delete_branch_on_merge ?? false,\n allow_forking: true,\n is_template: false,\n license,\n } as Omit<GitHubRepo, \"id\" | \"created_at\" | \"updated_at\">);\n\n gh.repos.update(repo.id, { node_id: generateNodeId(\"Repository\", repo.id) });\n\n if (!isPrivate) {\n bumpPublicRepos(gh, params.owner_id, params.owner_type, 1);\n }\n\n const updated = gh.repos.get(repo.id)!;\n if (params.auto_init) {\n seedInitialGit(gh, updated, actor);\n }\n\n return gh.repos.get(repo.id)!;\n}\n\nfunction deleteRepoCascade(gh: GitHubStore, repo: GitHubRepo) {\n const repoId = repo.id;\n const wasPublic = !repo.private;\n\n const delByRepo = <T extends Entity>(col: Collection<T>) => {\n for (const item of col.findBy(\"repo_id\" as keyof T, repoId as T[keyof T])) {\n col.delete(item.id);\n }\n };\n\n delByRepo(gh.collaborators);\n delByRepo(gh.issues);\n delByRepo(gh.pullRequests);\n delByRepo(gh.labels);\n delByRepo(gh.milestones);\n delByRepo(gh.comments);\n delByRepo(gh.reviews);\n delByRepo(gh.issueEvents);\n delByRepo(gh.branches);\n delByRepo(gh.branchProtections);\n delByRepo(gh.refs);\n delByRepo(gh.commits);\n delByRepo(gh.trees);\n delByRepo(gh.blobs);\n delByRepo(gh.tags);\n\n for (const rel of gh.releases.findBy(\"repo_id\", repoId)) {\n for (const a of gh.releaseAssets.findBy(\"release_id\", rel.id)) {\n gh.releaseAssets.delete(a.id);\n }\n gh.releases.delete(rel.id);\n }\n\n delByRepo(gh.webhooks);\n delByRepo(gh.workflows);\n for (const run of gh.workflowRuns.findBy(\"repo_id\", repoId)) {\n for (const j of gh.jobs.findBy(\"run_id\", run.id)) {\n gh.jobs.delete(j.id);\n }\n for (const a of gh.artifacts.findBy(\"run_id\", run.id)) {\n gh.artifacts.delete(a.id);\n }\n gh.workflowRuns.delete(run.id);\n }\n\n delByRepo(gh.secrets);\n delByRepo(gh.checkRuns);\n delByRepo(gh.checkSuites);\n\n gh.repos.delete(repoId);\n\n if (wasPublic) {\n bumpPublicRepos(gh, repo.owner_id, repo.owner_type, -1);\n }\n\n if (repo.forked_from_id) {\n const parent = gh.repos.get(repo.forked_from_id);\n if (parent && parent.forks_count > 0) {\n gh.repos.update(parent.id, { forks_count: parent.forks_count - 1 });\n }\n }\n}\n\nfunction formatTagItem(tag: GitHubTag, repo: GitHubRepo, baseUrl: string) {\n const repoUrl = `${baseUrl}/repos/${repo.full_name}`;\n return {\n name: tag.tag,\n zipball_url: `${repoUrl}/zipball/${encodeURIComponent(tag.tag)}`,\n tarball_url: `${repoUrl}/tarball/${encodeURIComponent(tag.tag)}`,\n commit: {\n sha: tag.sha,\n url: `${repoUrl}/commits/${tag.sha}`,\n },\n node_id: tag.node_id,\n };\n}\n\nfunction parsePermission(raw: unknown): \"pull\" | \"triage\" | \"push\" | \"maintain\" | \"admin\" | undefined {\n if (raw === undefined) return undefined;\n if (raw === \"pull\" || raw === \"triage\" || raw === \"push\" || raw === \"maintain\" || raw === \"admin\") {\n return raw;\n }\n return undefined;\n}\n\nexport function reposRoutes({ app, store, webhooks, baseUrl }: RouteContext): void {\n const gh = getGitHubStore(store);\n\n app.get(\"/repos/:owner/:repo\", (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n assertRepoRead(gh, c.get(\"authUser\"), repo);\n return c.json(formatRepo(repo, gh, baseUrl));\n });\n\n app.post(\"/user/repos\", async (c) => {\n const authUser = c.get(\"authUser\");\n const user = assertAuthenticatedUser(gh, authUser);\n const body = await parseJsonBody(c);\n\n const finalRepo = createRepoRecord(\n gh,\n {\n name: body.name,\n description: typeof body.description === \"string\" ? body.description : null,\n private: typeof body.private === \"boolean\" ? body.private : false,\n homepage: typeof body.homepage === \"string\" ? body.homepage : null,\n has_issues: typeof body.has_issues === \"boolean\" ? body.has_issues : true,\n has_projects: typeof body.has_projects === \"boolean\" ? body.has_projects : true,\n has_wiki: typeof body.has_wiki === \"boolean\" ? body.has_wiki : true,\n auto_init: body.auto_init === true,\n license_template: typeof body.license_template === \"string\" ? body.license_template : undefined,\n gitignore_template: typeof body.gitignore_template === \"string\" ? body.gitignore_template : undefined,\n owner_id: user.id,\n owner_type: \"User\",\n owner_login: user.login,\n default_branch: \"main\",\n baseUrl,\n allow_rebase_merge: typeof body.allow_rebase_merge === \"boolean\" ? body.allow_rebase_merge : undefined,\n allow_squash_merge: typeof body.allow_squash_merge === \"boolean\" ? body.allow_squash_merge : undefined,\n allow_merge_commit: typeof body.allow_merge_commit === \"boolean\" ? body.allow_merge_commit : undefined,\n delete_branch_on_merge:\n typeof body.delete_branch_on_merge === \"boolean\" ? body.delete_branch_on_merge : undefined,\n },\n user,\n );\n\n webhooks.dispatch(\n \"repository\",\n \"created\",\n { action: \"created\", repository: formatRepo(finalRepo, gh, baseUrl), sender: formatUser(user, baseUrl) },\n user.login,\n finalRepo.name,\n );\n\n return c.json(formatRepo(finalRepo, gh, baseUrl), 201);\n });\n\n app.post(\"/orgs/:org/repos\", async (c) => {\n const authUser = c.get(\"authUser\");\n const user = assertAuthenticatedUser(gh, authUser);\n const orgLogin = c.req.param(\"org\")!;\n const org = gh.orgs.findOneBy(\"login\", orgLogin);\n if (!org) throw notFoundResponse();\n\n if (!isOrgMember(gh, user.id, org.id)) {\n throw forbidden();\n }\n\n const body = await parseJsonBody(c);\n\n const finalRepo = createRepoRecord(\n gh,\n {\n name: body.name,\n description: typeof body.description === \"string\" ? body.description : null,\n private: typeof body.private === \"boolean\" ? body.private : false,\n homepage: typeof body.homepage === \"string\" ? body.homepage : null,\n has_issues: typeof body.has_issues === \"boolean\" ? body.has_issues : true,\n has_projects: typeof body.has_projects === \"boolean\" ? body.has_projects : true,\n has_wiki: typeof body.has_wiki === \"boolean\" ? body.has_wiki : true,\n auto_init: body.auto_init === true,\n license_template: typeof body.license_template === \"string\" ? body.license_template : undefined,\n gitignore_template: typeof body.gitignore_template === \"string\" ? body.gitignore_template : undefined,\n owner_id: org.id,\n owner_type: \"Organization\",\n owner_login: org.login,\n default_branch: \"main\",\n baseUrl,\n allow_rebase_merge: typeof body.allow_rebase_merge === \"boolean\" ? body.allow_rebase_merge : undefined,\n allow_squash_merge: typeof body.allow_squash_merge === \"boolean\" ? body.allow_squash_merge : undefined,\n allow_merge_commit: typeof body.allow_merge_commit === \"boolean\" ? body.allow_merge_commit : undefined,\n delete_branch_on_merge:\n typeof body.delete_branch_on_merge === \"boolean\" ? body.delete_branch_on_merge : undefined,\n },\n user,\n );\n\n webhooks.dispatch(\n \"repository\",\n \"created\",\n { action: \"created\", repository: formatRepo(finalRepo, gh, baseUrl), sender: formatUser(user, baseUrl) },\n org.login,\n finalRepo.name,\n );\n\n return c.json(formatRepo(finalRepo, gh, baseUrl), 201);\n });\n\n app.patch(\"/repos/:owner/:repo\", async (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n assertRepoRead(gh, c.get(\"authUser\"), repo);\n const authUser = c.get(\"authUser\");\n const user = assertAuthenticatedUser(gh, authUser);\n if (!hasRepoAdmin(gh, user, repo)) throw forbidden();\n\n const body = await parseJsonBody(c);\n const patch: Partial<GitHubRepo> = {};\n\n if (typeof body.name === \"string\") {\n const newName = validateRepoName(body.name);\n const login = ownerLoginOf(gh, repo);\n const newFull = `${login}/${newName}`;\n if (newFull !== repo.full_name && gh.repos.findOneBy(\"full_name\", newFull)) {\n throw new ApiError(422, \"Repository already exists\");\n }\n patch.name = newName;\n patch.full_name = newFull;\n }\n\n if (\"description\" in body) {\n patch.description = body.description === null ? null : String(body.description);\n }\n if (\"homepage\" in body && (typeof body.homepage === \"string\" || body.homepage === null)) {\n patch.homepage = body.homepage;\n }\n if (typeof body.private === \"boolean\") {\n patch.private = body.private;\n patch.visibility = body.private ? \"private\" : \"public\";\n }\n if (typeof body.has_issues === \"boolean\") patch.has_issues = body.has_issues;\n if (typeof body.has_projects === \"boolean\") patch.has_projects = body.has_projects;\n if (typeof body.has_wiki === \"boolean\") patch.has_wiki = body.has_wiki;\n if (typeof body.has_pages === \"boolean\") patch.has_pages = body.has_pages;\n if (typeof body.has_downloads === \"boolean\") patch.has_downloads = body.has_downloads;\n if (typeof body.has_discussions === \"boolean\") patch.has_discussions = body.has_discussions;\n if (typeof body.archived === \"boolean\") patch.archived = body.archived;\n if (typeof body.disabled === \"boolean\") patch.disabled = body.disabled;\n if (typeof body.default_branch === \"string\") patch.default_branch = body.default_branch;\n\n if (Array.isArray(body.topics)) {\n patch.topics = body.topics.filter((t): t is string => typeof t === \"string\");\n }\n\n if (typeof body.visibility === \"string\") {\n const v = body.visibility;\n if (v === \"public\" || v === \"private\" || v === \"internal\") {\n patch.visibility = v;\n patch.private = v !== \"public\";\n }\n }\n\n if (\"license\" in body) {\n if (body.license === null) patch.license = null;\n else if (typeof body.license === \"object\" && body.license !== null) {\n const L = body.license as Record<string, unknown>;\n if (typeof L.key === \"string\" && typeof L.name === \"string\" && typeof L.spdx_id === \"string\") {\n patch.license = { key: L.key, name: L.name, spdx_id: L.spdx_id };\n }\n }\n }\n\n if (typeof body.allow_rebase_merge === \"boolean\") patch.allow_rebase_merge = body.allow_rebase_merge;\n if (typeof body.allow_squash_merge === \"boolean\") patch.allow_squash_merge = body.allow_squash_merge;\n if (typeof body.allow_merge_commit === \"boolean\") patch.allow_merge_commit = body.allow_merge_commit;\n if (typeof body.allow_auto_merge === \"boolean\") patch.allow_auto_merge = body.allow_auto_merge;\n if (typeof body.delete_branch_on_merge === \"boolean\") {\n patch.delete_branch_on_merge = body.delete_branch_on_merge;\n }\n if (typeof body.allow_forking === \"boolean\") patch.allow_forking = body.allow_forking;\n if (typeof body.is_template === \"boolean\") patch.is_template = body.is_template;\n\n const oldPrivate = repo.private;\n const updated = gh.repos.update(repo.id, patch);\n if (!updated) throw notFoundResponse();\n\n if (oldPrivate !== updated.private) {\n const delta = updated.private ? -1 : 1;\n bumpPublicRepos(gh, updated.owner_id, updated.owner_type, delta);\n }\n\n webhooks.dispatch(\n \"repository\",\n \"edited\",\n { action: \"edited\", repository: formatRepo(updated, gh, baseUrl), sender: formatUser(user, baseUrl) },\n ownerLoginOf(gh, updated),\n updated.name,\n );\n\n return c.json(formatRepo(updated, gh, baseUrl));\n });\n\n app.delete(\"/repos/:owner/:repo\", (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n const authUser = c.get(\"authUser\");\n const user = assertAuthenticatedUser(gh, authUser);\n if (!hasRepoAdmin(gh, user, repo)) throw forbidden();\n\n webhooks.dispatch(\n \"repository\",\n \"deleted\",\n { action: \"deleted\", repository: formatRepo(repo, gh, baseUrl), sender: formatUser(user, baseUrl) },\n owner,\n repoName,\n );\n\n deleteRepoCascade(gh, repo);\n return c.body(null, 204);\n });\n\n app.get(\"/repos/:owner/:repo/topics\", (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n assertRepoRead(gh, c.get(\"authUser\"), repo);\n return c.json({ names: repo.topics });\n });\n\n app.put(\"/repos/:owner/:repo/topics\", async (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n const authUser = c.get(\"authUser\");\n const user = assertAuthenticatedUser(gh, authUser);\n if (!hasRepoAdmin(gh, user, repo)) throw forbidden();\n\n const body = (await parseJsonBody(c)) as { names?: unknown };\n const names = Array.isArray(body.names) ? body.names.filter((n): n is string => typeof n === \"string\") : [];\n const updated = gh.repos.update(repo.id, { topics: names });\n if (!updated) throw notFoundResponse();\n return c.json({ names: updated.topics });\n });\n\n app.get(\"/repos/:owner/:repo/languages\", (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n assertRepoRead(gh, c.get(\"authUser\"), repo);\n return c.json(repo.languages);\n });\n\n app.get(\"/repos/:owner/:repo/contributors\", (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n assertRepoRead(gh, c.get(\"authUser\"), repo);\n\n const collabUsers = gh.collaborators\n .findBy(\"repo_id\", repo.id)\n .map((col) => gh.users.get(col.user_id))\n .filter((u): u is GitHubUser => Boolean(u));\n\n const ownerUser = repo.owner_type === \"User\" ? gh.users.get(repo.owner_id) : undefined;\n\n const map = new Map<number, GitHubUser>();\n if (ownerUser) map.set(ownerUser.id, ownerUser);\n for (const u of collabUsers) map.set(u.id, u);\n\n const all = [...map.values()].sort((a, b) => a.login.localeCompare(b.login));\n const { page, per_page } = parsePagination(c);\n const total = all.length;\n const start = (page - 1) * per_page;\n const slice = all.slice(start, start + per_page);\n\n setLinkHeader(c, total, page, per_page);\n return c.json(\n slice.map((u) => ({\n ...formatUser(u, baseUrl),\n contributions: 1,\n })),\n );\n });\n\n app.get(\"/repos/:owner/:repo/forks\", (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n assertRepoRead(gh, c.get(\"authUser\"), repo);\n\n const forks = gh.repos\n .all()\n .filter((r) => r.forked_from_id === repo.id)\n .sort((a, b) => (a.created_at < b.created_at ? 1 : -1));\n\n const { page, per_page } = parsePagination(c);\n const total = forks.length;\n const start = (page - 1) * per_page;\n const slice = forks.slice(start, start + per_page);\n\n setLinkHeader(c, total, page, per_page);\n return c.json(slice.map((r) => formatRepo(r, gh, baseUrl)));\n });\n\n app.post(\"/repos/:owner/:repo/forks\", async (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const parent = lookupRepo(gh, owner, repoName);\n if (!parent) throw notFoundResponse();\n\n const authUser = c.get(\"authUser\");\n const user = assertAuthenticatedUser(gh, authUser);\n assertRepoRead(gh, authUser, parent);\n\n const body = (await parseJsonBody(c)) as {\n organization?: unknown;\n name?: unknown;\n };\n\n let ownerType: \"User\" | \"Organization\" = \"User\";\n let ownerId = user.id;\n let fullName = \"\";\n const forkName = typeof body.name === \"string\" && body.name.trim() ? validateRepoName(body.name) : parent.name;\n\n if (typeof body.organization === \"string\" && body.organization.trim()) {\n const org = gh.orgs.findOneBy(\"login\", body.organization.trim());\n if (!org) throw notFoundResponse();\n if (!isOrgMember(gh, user.id, org.id)) throw forbidden();\n ownerType = \"Organization\";\n ownerId = org.id;\n fullName = `${org.login}/${forkName}`;\n } else {\n fullName = `${user.login}/${forkName}`;\n }\n\n if (gh.repos.findOneBy(\"full_name\", fullName)) {\n throw new ApiError(422, \"Repository already exists\");\n }\n\n const isPrivate = parent.private;\n const visibility = isPrivate ? \"private\" : \"public\";\n\n const repo = gh.repos.insert({\n node_id: \"\",\n name: forkName,\n full_name: fullName,\n owner_id: ownerId,\n owner_type: ownerType,\n private: isPrivate,\n description: parent.description,\n fork: true,\n forked_from_id: parent.id,\n homepage: parent.homepage,\n language: parent.language,\n languages: { ...parent.languages },\n forks_count: 0,\n stargazers_count: 0,\n watchers_count: 0,\n size: parent.size,\n default_branch: parent.default_branch,\n open_issues_count: 0,\n topics: [...parent.topics],\n has_issues: parent.has_issues,\n has_projects: parent.has_projects,\n has_wiki: parent.has_wiki,\n has_pages: parent.has_pages,\n has_downloads: parent.has_downloads,\n has_discussions: parent.has_discussions,\n archived: false,\n disabled: false,\n visibility: visibility as GitHubRepo[\"visibility\"],\n pushed_at: parent.pushed_at,\n allow_rebase_merge: parent.allow_rebase_merge,\n allow_squash_merge: parent.allow_squash_merge,\n allow_merge_commit: parent.allow_merge_commit,\n allow_auto_merge: parent.allow_auto_merge,\n delete_branch_on_merge: parent.delete_branch_on_merge,\n allow_forking: parent.allow_forking,\n is_template: false,\n license: parent.license,\n } as Omit<GitHubRepo, \"id\" | \"created_at\" | \"updated_at\">);\n\n gh.repos.update(repo.id, { node_id: generateNodeId(\"Repository\", repo.id) });\n\n if (!isPrivate) {\n bumpPublicRepos(gh, ownerId, ownerType, 1);\n }\n\n gh.repos.update(parent.id, { forks_count: parent.forks_count + 1 });\n\n seedInitialGit(gh, gh.repos.get(repo.id)!, user, parent.full_name);\n\n const finalRepo = gh.repos.get(repo.id)!;\n const ownerLogin = ownerLoginOf(gh, finalRepo);\n webhooks.dispatch(\n \"fork\",\n \"created\",\n { action: \"created\", repository: formatRepo(finalRepo, gh, baseUrl), sender: formatUser(user, baseUrl) },\n ownerLogin,\n finalRepo.name,\n );\n\n return c.json(formatRepo(finalRepo, gh, baseUrl), 202);\n });\n\n app.get(\"/repos/:owner/:repo/collaborators\", (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n assertRepoRead(gh, c.get(\"authUser\"), repo);\n\n const collabs = gh.collaborators.findBy(\"repo_id\", repo.id);\n const users = collabs\n .map((col) => {\n const u = gh.users.get(col.user_id);\n if (!u) return null;\n return { user: u, permission: col.permission };\n })\n .filter((x): x is { user: GitHubUser; permission: GitHubCollaborator[\"permission\"] } => Boolean(x))\n .sort((a, b) => a.user.login.localeCompare(b.user.login));\n\n const { page, per_page } = parsePagination(c);\n const total = users.length;\n const start = (page - 1) * per_page;\n const slice = users.slice(start, start + per_page);\n\n setLinkHeader(c, total, page, per_page);\n return c.json(slice.map((x) => formatUser(x.user, baseUrl)));\n });\n\n app.put(\"/repos/:owner/:repo/collaborators/:username\", async (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const username = c.req.param(\"username\")!;\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n const authUser = c.get(\"authUser\");\n const actor = assertAuthenticatedUser(gh, authUser);\n if (!hasRepoAdmin(gh, actor, repo)) throw forbidden();\n\n const target = gh.users.findOneBy(\"login\", username);\n if (!target) throw notFoundResponse();\n\n const body = (await parseJsonBody(c)) as { permission?: unknown };\n const permission = parsePermission(body.permission) ?? \"push\";\n\n const existing = gh.collaborators.findBy(\"repo_id\", repo.id).find((c) => c.user_id === target.id);\n if (existing) {\n gh.collaborators.update(existing.id, { permission });\n } else {\n gh.collaborators.insert({\n repo_id: repo.id,\n user_id: target.id,\n permission,\n } as Omit<GitHubCollaborator, \"id\" | \"created_at\" | \"updated_at\">);\n }\n\n return c.json({ permission }, 201);\n });\n\n app.delete(\"/repos/:owner/:repo/collaborators/:username\", (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const username = c.req.param(\"username\")!;\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n const authUser = c.get(\"authUser\");\n const actor = assertAuthenticatedUser(gh, authUser);\n if (!hasRepoAdmin(gh, actor, repo)) throw forbidden();\n\n const target = gh.users.findOneBy(\"login\", username);\n if (!target) throw notFoundResponse();\n\n const existing = gh.collaborators.findBy(\"repo_id\", repo.id).find((col) => col.user_id === target.id);\n if (existing) {\n gh.collaborators.delete(existing.id);\n }\n\n return c.body(null, 204);\n });\n\n app.get(\"/repos/:owner/:repo/collaborators/:username/permission\", (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const username = c.req.param(\"username\")!;\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n assertRepoRead(gh, c.get(\"authUser\"), repo);\n\n const target = gh.users.findOneBy(\"login\", username);\n if (!target) throw notFoundResponse();\n\n if (repo.owner_type === \"User\" && repo.owner_id === target.id) {\n return c.json({\n permission: \"admin\",\n role_name: \"admin\",\n user: formatUser(target, baseUrl),\n });\n }\n\n if (repo.owner_type === \"Organization\" && isOrgMember(gh, target.id, repo.owner_id)) {\n return c.json({\n permission: \"admin\",\n role_name: \"admin\",\n user: formatUser(target, baseUrl),\n });\n }\n\n const collab = gh.collaborators.findBy(\"repo_id\", repo.id).find((col) => col.user_id === target.id);\n if (!collab) throw notFoundResponse();\n\n const roleName =\n collab.permission === \"admin\"\n ? \"admin\"\n : collab.permission === \"maintain\"\n ? \"maintain\"\n : collab.permission === \"push\"\n ? \"write\"\n : collab.permission === \"triage\"\n ? \"triage\"\n : \"read\";\n\n return c.json({\n permission: collab.permission,\n role_name: roleName,\n user: formatUser(target, baseUrl),\n });\n });\n\n app.post(\"/repos/:owner/:repo/transfer\", async (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n const authUser = c.get(\"authUser\");\n const actor = assertAuthenticatedUser(gh, authUser);\n if (!hasRepoAdmin(gh, actor, repo)) throw forbidden();\n\n const body = (await parseJsonBody(c)) as { new_owner?: unknown };\n if (typeof body.new_owner !== \"string\" || !body.new_owner.trim()) {\n throw new ApiError(422, \"new_owner is required\");\n }\n\n const newOwner = lookupOwner(gh, body.new_owner.trim());\n if (!newOwner) throw notFoundResponse();\n\n const newFull = `${newOwner.login}/${repo.name}`;\n if (newFull !== repo.full_name && gh.repos.findOneBy(\"full_name\", newFull)) {\n throw new ApiError(422, \"Repository already exists\");\n }\n\n const updated = gh.repos.update(repo.id, {\n owner_id: newOwner.id,\n owner_type: newOwner.type === \"User\" ? \"User\" : \"Organization\",\n full_name: newFull,\n });\n if (!updated) throw notFoundResponse();\n\n webhooks.dispatch(\n \"repository\",\n \"transferred\",\n { action: \"transferred\", repository: formatRepo(updated, gh, baseUrl), sender: formatUser(actor, baseUrl) },\n newOwner.login,\n updated.name,\n );\n\n return c.json(formatRepo(updated, gh, baseUrl));\n });\n\n app.get(\"/repos/:owner/:repo/tags\", (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n assertRepoRead(gh, c.get(\"authUser\"), repo);\n\n const tags = [...gh.tags.findBy(\"repo_id\", repo.id)].sort((a, b) => a.tag.localeCompare(b.tag));\n\n const { page, per_page } = parsePagination(c);\n const total = tags.length;\n const start = (page - 1) * per_page;\n const slice = tags.slice(start, start + per_page);\n\n setLinkHeader(c, total, page, per_page);\n return c.json(slice.map((t) => formatTagItem(t, repo, baseUrl)));\n });\n}\n","import type { Context } from \"@emulators/core\";\nimport type { RouteContext } from \"@emulators/core\";\nimport { ApiError, parseJsonBody, parsePagination, setLinkHeader } from \"@emulators/core\";\nimport { getGitHubStore } from \"../store.js\";\nimport { assertIssueWrite, assertRepoRead, notFoundResponse, ownerLoginOf } from \"../route-helpers.js\";\nimport type { GitHubStore } from \"../store.js\";\nimport type { GitHubIssue, GitHubIssueEvent, GitHubLabel, GitHubRepo, GitHubUser } from \"../entities.js\";\nimport {\n formatIssue,\n formatRepo,\n formatUser,\n generateNodeId,\n getNextIssueNumber,\n lookupRepo,\n timestamp,\n} from \"../helpers.js\";\n\nfunction findIssueForRepo(gh: GitHubStore, repoId: number, issueNumber: number): GitHubIssue | undefined {\n return gh.issues.findBy(\"repo_id\", repoId).find((i) => i.number === issueNumber && !i.is_pull_request);\n}\n\nfunction adjustRepoOpenIssues(gh: GitHubStore, repoId: number, delta: number) {\n const repo = gh.repos.get(repoId);\n if (!repo) return;\n gh.repos.update(repoId, { open_issues_count: Math.max(0, repo.open_issues_count + delta) });\n}\n\nfunction getOrCreateLabel(gh: GitHubStore, repo: GitHubRepo, name: string): GitHubLabel {\n const existing = gh.labels.findBy(\"repo_id\", repo.id).find((l) => l.name === name);\n if (existing) return existing;\n const label = gh.labels.insert({\n node_id: \"\",\n repo_id: repo.id,\n name,\n description: null,\n color: \"ededed\",\n default: false,\n } as Omit<GitHubLabel, \"id\" | \"created_at\" | \"updated_at\">);\n gh.labels.update(label.id, { node_id: generateNodeId(\"Label\", label.id) });\n return gh.labels.get(label.id)!;\n}\n\nfunction resolveLabelIds(gh: GitHubStore, repo: GitHubRepo, raw: unknown, createMissing: boolean): number[] {\n if (raw === undefined) return [];\n if (!Array.isArray(raw)) {\n throw new ApiError(422, \"Validation failed\");\n }\n const ids: number[] = [];\n for (const item of raw) {\n if (typeof item === \"number\" && Number.isFinite(item)) {\n const label = gh.labels.get(item);\n if (!label || label.repo_id !== repo.id) {\n throw new ApiError(422, \"Validation failed\");\n }\n ids.push(item);\n } else if (typeof item === \"string\") {\n if (createMissing) {\n ids.push(getOrCreateLabel(gh, repo, item).id);\n } else {\n const label = gh.labels.findBy(\"repo_id\", repo.id).find((l) => l.name === item);\n if (!label) throw new ApiError(422, \"Validation failed\");\n ids.push(label.id);\n }\n } else {\n throw new ApiError(422, \"Validation failed\");\n }\n }\n return [...new Set(ids)];\n}\n\nfunction lookupUserByLogin(gh: GitHubStore, login: string): GitHubUser {\n const u = gh.users.findOneBy(\"login\", login);\n if (!u) throw new ApiError(422, \"Validation failed\");\n return u;\n}\n\nfunction insertIssueEvent(\n gh: GitHubStore,\n repo: GitHubRepo,\n issueNumber: number,\n event: string,\n actorId: number,\n extra?: Partial<\n Pick<GitHubIssueEvent, \"commit_id\" | \"commit_url\" | \"label_name\" | \"assignee_id\" | \"milestone_title\" | \"rename\">\n >,\n): GitHubIssueEvent {\n const row = gh.issueEvents.insert({\n node_id: \"\",\n repo_id: repo.id,\n issue_number: issueNumber,\n event,\n actor_id: actorId,\n commit_id: null,\n commit_url: null,\n label_name: null,\n assignee_id: null,\n milestone_title: null,\n rename: null,\n ...extra,\n } as Omit<GitHubIssueEvent, \"id\" | \"created_at\" | \"updated_at\">);\n gh.issueEvents.update(row.id, { node_id: generateNodeId(\"IssueEvent\", row.id) });\n return gh.issueEvents.get(row.id)!;\n}\n\nfunction formatIssueEventApi(\n ev: GitHubIssueEvent,\n gh: GitHubStore,\n repo: GitHubRepo,\n issue: GitHubIssue,\n baseUrl: string,\n) {\n const actor = gh.users.get(ev.actor_id);\n const issueJson = formatIssue(issue, gh, baseUrl);\n return {\n id: ev.id,\n node_id: ev.node_id,\n url: `${baseUrl}/repos/${repo.full_name}/issues/events/${ev.id}`,\n actor: actor ? formatUser(actor, baseUrl) : null,\n event: ev.event,\n commit_id: ev.commit_id,\n commit_url: ev.commit_url,\n created_at: ev.created_at,\n label:\n ev.label_name !== null\n ? gh.labels.findBy(\"repo_id\", repo.id).find((l) => l.name === ev.label_name)\n ? {\n name: ev.label_name,\n color: gh.labels.findBy(\"repo_id\", repo.id).find((l) => l.name === ev.label_name)!.color,\n }\n : { name: ev.label_name, color: \"ededed\" }\n : null,\n assignee:\n ev.assignee_id !== null && gh.users.get(ev.assignee_id)\n ? formatUser(gh.users.get(ev.assignee_id)!, baseUrl)\n : null,\n milestone: null,\n rename: ev.rename,\n issue: issueJson,\n };\n}\n\nfunction sortIssues(\n issues: GitHubIssue[],\n sort: \"created\" | \"updated\" | \"comments\",\n direction: \"asc\" | \"desc\",\n): GitHubIssue[] {\n const mul = direction === \"asc\" ? 1 : -1;\n const field = sort === \"created\" ? \"created_at\" : sort === \"updated\" ? \"updated_at\" : \"comments\";\n const sorted = [...issues];\n sorted.sort((a, b) => {\n const av = a[field];\n const bv = b[field];\n if (typeof av === \"number\" && typeof bv === \"number\") {\n return av < bv ? -1 * mul : av > bv ? 1 * mul : 0;\n }\n const as = String(av);\n const bs = String(bv);\n if (as < bs) return -1 * mul;\n if (as > bs) return 1 * mul;\n return 0;\n });\n return sorted;\n}\n\nfunction parseIssueListFilters(c: Context) {\n const stateQ = c.req.query(\"state\") ?? \"open\";\n const state: \"open\" | \"closed\" | \"all\" =\n stateQ === \"closed\" || stateQ === \"all\" || stateQ === \"open\" ? stateQ : \"open\";\n\n const labelsParam = c.req.query(\"labels\");\n const labelNames = labelsParam\n ? labelsParam\n .split(\",\")\n .map((s) => s.trim())\n .filter(Boolean)\n : [];\n\n const sortRaw = c.req.query(\"sort\") ?? \"created\";\n const sort: \"created\" | \"updated\" | \"comments\" =\n sortRaw === \"updated\" || sortRaw === \"comments\" ? sortRaw : \"created\";\n\n const dirRaw = c.req.query(\"direction\") ?? \"desc\";\n const direction: \"asc\" | \"desc\" = dirRaw === \"asc\" ? \"asc\" : \"desc\";\n\n const milestoneQ = c.req.query(\"milestone\");\n const assigneeQ = c.req.query(\"assignee\");\n const creatorQ = c.req.query(\"creator\");\n const sinceQ = c.req.query(\"since\");\n\n return {\n state,\n labelNames,\n sort,\n direction,\n milestoneQ,\n assigneeQ,\n creatorQ,\n sinceQ,\n };\n}\n\nexport function issuesRoutes({ app, store, webhooks, baseUrl }: RouteContext): void {\n const gh = getGitHubStore(store);\n\n app.get(\"/repos/:owner/:repo/issues\", (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n assertRepoRead(gh, c.get(\"authUser\"), repo);\n if (!repo.has_issues) throw notFoundResponse();\n\n const { page, per_page } = parsePagination(c);\n const { state, labelNames, sort, direction, milestoneQ, assigneeQ, creatorQ, sinceQ } = parseIssueListFilters(c);\n\n let list = gh.issues.findBy(\"repo_id\", repo.id).filter((i) => !i.is_pull_request);\n\n if (state === \"open\") list = list.filter((i) => i.state === \"open\");\n else if (state === \"closed\") list = list.filter((i) => i.state === \"closed\");\n\n if (labelNames.length > 0) {\n const labelIds = labelNames\n .map((name) => gh.labels.findBy(\"repo_id\", repo.id).find((l) => l.name === name)?.id)\n .filter((x): x is number => x !== undefined);\n if (labelIds.length !== labelNames.length) {\n return c.json([]);\n }\n list = list.filter((i) => labelIds.every((lid) => i.label_ids.includes(lid)));\n }\n\n if (milestoneQ !== undefined && milestoneQ !== \"\") {\n if (milestoneQ === \"none\") {\n list = list.filter((i) => i.milestone_id === null);\n } else if (milestoneQ === \"*\") {\n list = list.filter((i) => i.milestone_id !== null);\n } else {\n const n = parseInt(milestoneQ, 10);\n if (!Number.isFinite(n)) {\n list = [];\n } else {\n const ms = gh.milestones.findBy(\"repo_id\", repo.id).find((m) => m.number === n);\n if (!ms) list = [];\n else list = list.filter((i) => i.milestone_id === ms.id);\n }\n }\n }\n\n if (assigneeQ !== undefined && assigneeQ !== \"\") {\n if (assigneeQ === \"none\") {\n list = list.filter((i) => i.assignee_ids.length === 0);\n } else if (assigneeQ === \"*\") {\n list = list.filter((i) => i.assignee_ids.length > 0);\n } else {\n const u = gh.users.findOneBy(\"login\", assigneeQ);\n if (!u) list = [];\n else list = list.filter((i) => i.assignee_ids.includes(u.id));\n }\n }\n\n if (creatorQ !== undefined && creatorQ !== \"\") {\n const u = gh.users.findOneBy(\"login\", creatorQ);\n if (!u) list = [];\n else list = list.filter((i) => i.user_id === u.id);\n }\n\n if (sinceQ) {\n list = list.filter((i) => i.updated_at >= sinceQ);\n }\n\n list = sortIssues(list, sort, direction);\n const total = list.length;\n setLinkHeader(c, total, page, per_page);\n const start = (page - 1) * per_page;\n const pageItems = list.slice(start, start + per_page);\n const body = pageItems\n .map((i) => formatIssue(i, gh, baseUrl))\n .filter((x): x is NonNullable<typeof x> => x !== null);\n return c.json(body);\n });\n\n app.post(\"/repos/:owner/:repo/issues\", async (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n if (!repo.has_issues) throw notFoundResponse();\n\n const actor = assertIssueWrite(gh, c.get(\"authUser\"), repo);\n const body = await parseJsonBody(c);\n\n const title = body.title;\n if (typeof title !== \"string\" || !title.trim()) {\n throw new ApiError(422, \"Validation failed\");\n }\n\n const issueBody = typeof body.body === \"string\" || body.body === null ? (body.body as string | null) : null;\n\n const assigneeLogins = Array.isArray(body.assignees)\n ? body.assignees.filter((x): x is string => typeof x === \"string\")\n : [];\n const assigneeIds = assigneeLogins.map((login) => lookupUserByLogin(gh, login).id);\n\n const labelIds = body.labels !== undefined ? resolveLabelIds(gh, repo, body.labels, true) : [];\n\n let milestoneId: number | null = null;\n if (body.milestone !== undefined && body.milestone !== null) {\n const mn = typeof body.milestone === \"number\" ? body.milestone : parseInt(String(body.milestone), 10);\n if (!Number.isFinite(mn)) throw new ApiError(422, \"Validation failed\");\n const ms = gh.milestones.findBy(\"repo_id\", repo.id).find((m) => m.number === mn);\n if (!ms) throw new ApiError(422, \"Validation failed\");\n milestoneId = ms.id;\n }\n\n const num = getNextIssueNumber(gh, repo.id);\n const row = gh.issues.insert({\n node_id: \"\",\n number: num,\n repo_id: repo.id,\n title: title.trim(),\n body: issueBody,\n state: \"open\",\n state_reason: null,\n locked: false,\n active_lock_reason: null,\n user_id: actor.id,\n assignee_ids: assigneeIds,\n label_ids: labelIds,\n milestone_id: milestoneId,\n comments: 0,\n closed_at: null,\n closed_by_id: null,\n is_pull_request: false,\n } as Omit<GitHubIssue, \"id\" | \"created_at\" | \"updated_at\">);\n gh.issues.update(row.id, { node_id: generateNodeId(\"Issue\", row.id) });\n const issue = gh.issues.get(row.id)!;\n\n adjustRepoOpenIssues(gh, repo.id, 1);\n\n insertIssueEvent(gh, repo, issue.number, \"opened\", actor.id);\n\n const ownerLogin = ownerLoginOf(gh, repo);\n const issueFmt = formatIssue(issue, gh, baseUrl)!;\n webhooks.dispatch(\n \"issues\",\n \"opened\",\n {\n action: \"opened\",\n issue: issueFmt,\n repository: formatRepo(repo, gh, baseUrl),\n sender: formatUser(actor, baseUrl),\n },\n ownerLogin,\n repo.name,\n );\n\n return c.json(issueFmt, 201);\n });\n\n app.get(\"/repos/:owner/:repo/issues/:issue_number\", (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n assertRepoRead(gh, c.get(\"authUser\"), repo);\n if (!repo.has_issues) throw notFoundResponse();\n\n const issueNumber = parseInt(c.req.param(\"issue_number\")!, 10);\n if (!Number.isFinite(issueNumber)) throw notFoundResponse();\n\n const issue = findIssueForRepo(gh, repo.id, issueNumber);\n if (!issue || issue.is_pull_request) throw notFoundResponse();\n\n const json = formatIssue(issue, gh, baseUrl);\n if (!json) throw notFoundResponse();\n return c.json(json);\n });\n\n app.patch(\"/repos/:owner/:repo/issues/:issue_number\", async (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n if (!repo.has_issues) throw notFoundResponse();\n\n const actor = assertIssueWrite(gh, c.get(\"authUser\"), repo);\n\n const issueNumber = parseInt(c.req.param(\"issue_number\")!, 10);\n if (!Number.isFinite(issueNumber)) throw notFoundResponse();\n\n let issue = findIssueForRepo(gh, repo.id, issueNumber);\n if (!issue || issue.is_pull_request) throw notFoundResponse();\n\n const beforePatch = issue;\n\n const body = await parseJsonBody(c);\n const patch: Partial<GitHubIssue> = {};\n\n if (typeof body.title === \"string\") patch.title = body.title;\n if (\"body\" in body) {\n patch.body = body.body === null ? null : String(body.body);\n }\n\n const oldState = issue.state;\n if (body.state === \"open\" || body.state === \"closed\") {\n patch.state = body.state;\n }\n\n if (\"state_reason\" in body) {\n if (body.state_reason === null) {\n patch.state_reason = null;\n } else if (\n body.state_reason === \"completed\" ||\n body.state_reason === \"not_planned\" ||\n body.state_reason === \"reopened\"\n ) {\n patch.state_reason = body.state_reason;\n }\n }\n\n if (Array.isArray(body.labels)) {\n patch.label_ids = resolveLabelIds(gh, repo, body.labels, true);\n }\n\n if (Array.isArray(body.assignees)) {\n const logins = body.assignees.filter((x): x is string => typeof x === \"string\");\n patch.assignee_ids = logins.map((login) => lookupUserByLogin(gh, login).id);\n }\n\n if (\"milestone\" in body) {\n if (body.milestone === null) {\n patch.milestone_id = null;\n } else {\n const mn = typeof body.milestone === \"number\" ? body.milestone : parseInt(String(body.milestone), 10);\n if (!Number.isFinite(mn)) throw new ApiError(422, \"Validation failed\");\n const ms = gh.milestones.findBy(\"repo_id\", repo.id).find((m) => m.number === mn);\n if (!ms) throw new ApiError(422, \"Validation failed\");\n patch.milestone_id = ms.id;\n }\n }\n\n const prevLabelIds = new Set(issue.label_ids);\n const prevAssigneeIds = new Set(issue.assignee_ids);\n const prevMilestoneId = issue.milestone_id;\n\n const updated = gh.issues.update(issue.id, patch);\n if (!updated) throw notFoundResponse();\n issue = updated;\n\n let statePatch: Partial<GitHubIssue> = {};\n if (patch.state === \"closed\" && oldState === \"open\") {\n statePatch = {\n closed_at: timestamp(),\n closed_by_id: actor.id,\n ...(patch.state_reason === undefined ? { state_reason: \"completed\" as const } : {}),\n };\n } else if (patch.state === \"open\" && oldState === \"closed\") {\n statePatch = {\n closed_at: null,\n closed_by_id: null,\n ...(patch.state_reason === undefined ? { state_reason: \"reopened\" as const } : {}),\n };\n } else if (patch.state === \"closed\" && oldState === \"closed\") {\n if (patch.state_reason !== undefined) statePatch.state_reason = patch.state_reason;\n }\n\n if (Object.keys(statePatch).length > 0) {\n const again = gh.issues.update(issue.id, statePatch);\n if (again) issue = again;\n }\n\n const ownerLogin = ownerLoginOf(gh, repo);\n\n if (patch.state === \"closed\" && oldState === \"open\") {\n adjustRepoOpenIssues(gh, repo.id, -1);\n insertIssueEvent(gh, repo, issue.number, \"closed\", actor.id);\n webhooks.dispatch(\n \"issues\",\n \"closed\",\n {\n action: \"closed\",\n issue: formatIssue(issue, gh, baseUrl)!,\n repository: formatRepo(repo, gh, baseUrl),\n sender: formatUser(actor, baseUrl),\n },\n ownerLogin,\n repo.name,\n );\n } else if (patch.state === \"open\" && oldState === \"closed\") {\n adjustRepoOpenIssues(gh, repo.id, 1);\n insertIssueEvent(gh, repo, issue.number, \"reopened\", actor.id);\n webhooks.dispatch(\n \"issues\",\n \"reopened\",\n {\n action: \"reopened\",\n issue: formatIssue(issue, gh, baseUrl)!,\n repository: formatRepo(repo, gh, baseUrl),\n sender: formatUser(actor, baseUrl),\n },\n ownerLogin,\n repo.name,\n );\n }\n\n if (Array.isArray(body.labels)) {\n const newIds = new Set(issue.label_ids);\n for (const id of prevLabelIds) {\n if (!newIds.has(id)) {\n const label = gh.labels.get(id);\n insertIssueEvent(gh, repo, issue.number, \"unlabeled\", actor.id, {\n label_name: label?.name ?? null,\n });\n webhooks.dispatch(\n \"issues\",\n \"unlabeled\",\n {\n action: \"unlabeled\",\n issue: formatIssue(issue, gh, baseUrl)!,\n label: label ? { name: label.name, color: label.color } : null,\n repository: formatRepo(repo, gh, baseUrl),\n sender: formatUser(actor, baseUrl),\n },\n ownerLogin,\n repo.name,\n );\n }\n }\n for (const id of newIds) {\n if (!prevLabelIds.has(id)) {\n const label = gh.labels.get(id);\n if (label) {\n insertIssueEvent(gh, repo, issue.number, \"labeled\", actor.id, { label_name: label.name });\n webhooks.dispatch(\n \"issues\",\n \"labeled\",\n {\n action: \"labeled\",\n issue: formatIssue(issue, gh, baseUrl)!,\n label: { name: label.name, color: label.color },\n repository: formatRepo(repo, gh, baseUrl),\n sender: formatUser(actor, baseUrl),\n },\n ownerLogin,\n repo.name,\n );\n }\n }\n }\n }\n\n if (Array.isArray(body.assignees)) {\n const newAssignees = new Set(issue.assignee_ids);\n for (const id of prevAssigneeIds) {\n if (!newAssignees.has(id)) {\n insertIssueEvent(gh, repo, issue.number, \"unassigned\", actor.id, { assignee_id: id });\n const u = gh.users.get(id);\n webhooks.dispatch(\n \"issues\",\n \"unassigned\",\n {\n action: \"unassigned\",\n issue: formatIssue(issue, gh, baseUrl)!,\n assignee: u ? formatUser(u, baseUrl) : null,\n repository: formatRepo(repo, gh, baseUrl),\n sender: formatUser(actor, baseUrl),\n },\n ownerLogin,\n repo.name,\n );\n }\n }\n for (const id of newAssignees) {\n if (!prevAssigneeIds.has(id)) {\n insertIssueEvent(gh, repo, issue.number, \"assigned\", actor.id, { assignee_id: id });\n const u = gh.users.get(id);\n webhooks.dispatch(\n \"issues\",\n \"assigned\",\n {\n action: \"assigned\",\n issue: formatIssue(issue, gh, baseUrl)!,\n assignee: u ? formatUser(u, baseUrl) : null,\n repository: formatRepo(repo, gh, baseUrl),\n sender: formatUser(actor, baseUrl),\n },\n ownerLogin,\n repo.name,\n );\n }\n }\n }\n\n if (\"milestone\" in body) {\n const newMs = issue.milestone_id;\n if (prevMilestoneId !== newMs) {\n const oldTitle = prevMilestoneId ? (gh.milestones.get(prevMilestoneId)?.title ?? null) : null;\n const newTitle = newMs ? (gh.milestones.get(newMs)?.title ?? null) : null;\n if (prevMilestoneId !== null) {\n insertIssueEvent(gh, repo, issue.number, \"demilestoned\", actor.id, {\n milestone_title: oldTitle,\n });\n webhooks.dispatch(\n \"issues\",\n \"demilestoned\",\n {\n action: \"demilestoned\",\n issue: formatIssue(issue, gh, baseUrl)!,\n milestone: oldTitle ? { title: oldTitle } : null,\n repository: formatRepo(repo, gh, baseUrl),\n sender: formatUser(actor, baseUrl),\n },\n ownerLogin,\n repo.name,\n );\n }\n if (newMs !== null) {\n insertIssueEvent(gh, repo, issue.number, \"milestoned\", actor.id, {\n milestone_title: newTitle,\n });\n webhooks.dispatch(\n \"issues\",\n \"milestoned\",\n {\n action: \"milestoned\",\n issue: formatIssue(issue, gh, baseUrl)!,\n milestone: newTitle ? { title: newTitle } : null,\n repository: formatRepo(repo, gh, baseUrl),\n sender: formatUser(actor, baseUrl),\n },\n ownerLogin,\n repo.name,\n );\n }\n }\n }\n\n const titleEdited = typeof body.title === \"string\" && body.title !== beforePatch.title;\n const bodyEdited =\n \"body\" in body &&\n (body.body === null ? beforePatch.body !== null : String(body.body) !== (beforePatch.body ?? \"\"));\n if (titleEdited || bodyEdited) {\n insertIssueEvent(gh, repo, issue.number, \"edited\", actor.id);\n webhooks.dispatch(\n \"issues\",\n \"edited\",\n {\n action: \"edited\",\n issue: formatIssue(issue, gh, baseUrl)!,\n repository: formatRepo(repo, gh, baseUrl),\n sender: formatUser(actor, baseUrl),\n changes: {\n title: titleEdited,\n body: bodyEdited,\n },\n },\n ownerLogin,\n repo.name,\n );\n }\n\n const json = formatIssue(issue, gh, baseUrl);\n if (!json) throw notFoundResponse();\n return c.json(json);\n });\n\n app.put(\"/repos/:owner/:repo/issues/:issue_number/lock\", async (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n if (!repo.has_issues) throw notFoundResponse();\n\n const actor = assertIssueWrite(gh, c.get(\"authUser\"), repo);\n const issueNumber = parseInt(c.req.param(\"issue_number\")!, 10);\n if (!Number.isFinite(issueNumber)) throw notFoundResponse();\n\n let issue = findIssueForRepo(gh, repo.id, issueNumber);\n if (!issue || issue.is_pull_request) throw notFoundResponse();\n\n const body = await parseJsonBody(c);\n const lockReason =\n typeof body.lock_reason === \"string\"\n ? body.lock_reason\n : typeof body.active_lock_reason === \"string\"\n ? body.active_lock_reason\n : \"resolved\";\n\n issue = gh.issues.update(issue.id, {\n locked: true,\n active_lock_reason: lockReason,\n })!;\n\n insertIssueEvent(gh, repo, issue.number, \"locked\", actor.id);\n const ownerLogin = ownerLoginOf(gh, repo);\n webhooks.dispatch(\n \"issues\",\n \"locked\",\n {\n action: \"locked\",\n issue: formatIssue(issue, gh, baseUrl)!,\n repository: formatRepo(repo, gh, baseUrl),\n sender: formatUser(actor, baseUrl),\n },\n ownerLogin,\n repo.name,\n );\n\n return c.body(null, 204);\n });\n\n app.delete(\"/repos/:owner/:repo/issues/:issue_number/lock\", (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n if (!repo.has_issues) throw notFoundResponse();\n\n const actor = assertIssueWrite(gh, c.get(\"authUser\"), repo);\n const issueNumber = parseInt(c.req.param(\"issue_number\")!, 10);\n if (!Number.isFinite(issueNumber)) throw notFoundResponse();\n\n let issue = findIssueForRepo(gh, repo.id, issueNumber);\n if (!issue || issue.is_pull_request) throw notFoundResponse();\n\n issue = gh.issues.update(issue.id, { locked: false, active_lock_reason: null })!;\n\n insertIssueEvent(gh, repo, issue.number, \"unlocked\", actor.id);\n const ownerLogin = ownerLoginOf(gh, repo);\n webhooks.dispatch(\n \"issues\",\n \"unlocked\",\n {\n action: \"unlocked\",\n issue: formatIssue(issue, gh, baseUrl)!,\n repository: formatRepo(repo, gh, baseUrl),\n sender: formatUser(actor, baseUrl),\n },\n ownerLogin,\n repo.name,\n );\n\n return c.body(null, 204);\n });\n\n function listIssueEventsForIssue(c: Context) {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n assertRepoRead(gh, c.get(\"authUser\"), repo);\n if (!repo.has_issues) throw notFoundResponse();\n\n const issueNumber = parseInt(c.req.param(\"issue_number\")!, 10);\n if (!Number.isFinite(issueNumber)) throw notFoundResponse();\n\n const issue = findIssueForRepo(gh, repo.id, issueNumber);\n if (!issue || issue.is_pull_request) throw notFoundResponse();\n\n const { page, per_page } = parsePagination(c);\n let events = gh.issueEvents.findBy(\"repo_id\", repo.id).filter((e) => e.issue_number === issueNumber);\n events.sort((a, b) => a.created_at.localeCompare(b.created_at));\n const total = events.length;\n setLinkHeader(c, total, page, per_page);\n const start = (page - 1) * per_page;\n events = events.slice(start, start + per_page);\n\n const payload = events.map((ev) => formatIssueEventApi(ev, gh, repo, issue, baseUrl));\n return c.json(payload);\n }\n\n app.get(\"/repos/:owner/:repo/issues/:issue_number/timeline\", (c) => listIssueEventsForIssue(c));\n app.get(\"/repos/:owner/:repo/issues/:issue_number/events\", (c) => listIssueEventsForIssue(c));\n\n app.post(\"/repos/:owner/:repo/issues/:issue_number/assignees\", async (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n if (!repo.has_issues) throw notFoundResponse();\n\n const actor = assertIssueWrite(gh, c.get(\"authUser\"), repo);\n const issueNumber = parseInt(c.req.param(\"issue_number\")!, 10);\n if (!Number.isFinite(issueNumber)) throw notFoundResponse();\n\n let issue = findIssueForRepo(gh, repo.id, issueNumber);\n if (!issue || issue.is_pull_request) throw notFoundResponse();\n\n const body = (await parseJsonBody(c)) as { assignees?: unknown };\n const logins = Array.isArray(body.assignees)\n ? body.assignees.filter((x): x is string => typeof x === \"string\")\n : [];\n const addIds = logins.map((login) => lookupUserByLogin(gh, login).id);\n const prevAssigneeSet = new Set(issue.assignee_ids);\n const merged = [...new Set([...issue.assignee_ids, ...addIds])];\n issue = gh.issues.update(issue.id, { assignee_ids: merged })!;\n\n const ownerLogin = ownerLoginOf(gh, repo);\n for (const id of addIds) {\n if (prevAssigneeSet.has(id)) continue;\n insertIssueEvent(gh, repo, issue.number, \"assigned\", actor.id, { assignee_id: id });\n const u = gh.users.get(id);\n webhooks.dispatch(\n \"issues\",\n \"assigned\",\n {\n action: \"assigned\",\n issue: formatIssue(issue, gh, baseUrl)!,\n assignee: u ? formatUser(u, baseUrl) : null,\n repository: formatRepo(repo, gh, baseUrl),\n sender: formatUser(actor, baseUrl),\n },\n ownerLogin,\n repo.name,\n );\n }\n\n const json = formatIssue(issue, gh, baseUrl);\n if (!json) throw notFoundResponse();\n return c.json(json);\n });\n\n app.delete(\"/repos/:owner/:repo/issues/:issue_number/assignees\", async (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n if (!repo.has_issues) throw notFoundResponse();\n\n const actor = assertIssueWrite(gh, c.get(\"authUser\"), repo);\n const issueNumber = parseInt(c.req.param(\"issue_number\")!, 10);\n if (!Number.isFinite(issueNumber)) throw notFoundResponse();\n\n let issue = findIssueForRepo(gh, repo.id, issueNumber);\n if (!issue || issue.is_pull_request) throw notFoundResponse();\n\n const body = (await parseJsonBody(c)) as { assignees?: unknown };\n const logins = Array.isArray(body.assignees)\n ? body.assignees.filter((x): x is string => typeof x === \"string\")\n : [];\n const removeIds = new Set(logins.map((login) => lookupUserByLogin(gh, login).id));\n const prevAssignees = new Set(issue.assignee_ids);\n const merged = issue.assignee_ids.filter((id) => !removeIds.has(id));\n issue = gh.issues.update(issue.id, { assignee_ids: merged })!;\n\n const ownerLogin = ownerLoginOf(gh, repo);\n for (const id of removeIds) {\n if (prevAssignees.has(id)) {\n insertIssueEvent(gh, repo, issue.number, \"unassigned\", actor.id, { assignee_id: id });\n const u = gh.users.get(id);\n webhooks.dispatch(\n \"issues\",\n \"unassigned\",\n {\n action: \"unassigned\",\n issue: formatIssue(issue, gh, baseUrl)!,\n assignee: u ? formatUser(u, baseUrl) : null,\n repository: formatRepo(repo, gh, baseUrl),\n sender: formatUser(actor, baseUrl),\n },\n ownerLogin,\n repo.name,\n );\n }\n }\n\n const json = formatIssue(issue, gh, baseUrl);\n if (!json) throw notFoundResponse();\n return c.json(json);\n });\n}\n","import type { RouteContext } from \"@emulators/core\";\nimport { ApiError, parseJsonBody, parsePagination, setLinkHeader } from \"@emulators/core\";\nimport { getGitHubStore } from \"../store.js\";\nimport {\n assertAuthenticatedUser,\n assertRepoRead,\n assertRepoWrite,\n notFoundResponse,\n ownerLoginOf,\n} from \"../route-helpers.js\";\nimport type { GitHubStore } from \"../store.js\";\nimport type {\n GitHubBranch,\n GitHubCommit,\n GitHubIssue,\n GitHubPullRequest,\n GitHubRef,\n GitHubRepo,\n GitHubUser,\n} from \"../entities.js\";\nimport {\n formatPullRequest,\n formatRepo,\n formatUser,\n generateNodeId,\n generateSha,\n getNextIssueNumber,\n lookupRepo,\n timestamp,\n} from \"../helpers.js\";\n\nfunction findPull(gh: GitHubStore, repoId: number, pullNumber: number): GitHubPullRequest | undefined {\n return gh.pullRequests.findBy(\"repo_id\", repoId).find((p) => p.number === pullNumber);\n}\n\nfunction findPrIssue(gh: GitHubStore, repoId: number, number: number): GitHubIssue | undefined {\n return gh.issues.findBy(\"repo_id\", repoId).find((i) => i.number === number && i.is_pull_request);\n}\n\nfunction adjustRepoOpenIssues(gh: GitHubStore, repoId: number, delta: number) {\n const repo = gh.repos.get(repoId);\n if (!repo) return;\n gh.repos.update(repoId, { open_issues_count: Math.max(0, repo.open_issues_count + delta) });\n}\n\nfunction getDefaultBranchSha(gh: GitHubStore, repo: GitHubRepo): string {\n const branch = gh.branches.findBy(\"repo_id\", repo.id).find((b) => b.name === repo.default_branch);\n if (!branch) {\n throw new ApiError(422, \"The repository is empty.\");\n }\n return branch.sha;\n}\n\nfunction createBranchAt(gh: GitHubStore, repo: GitHubRepo, branchName: string, sha: string): GitHubBranch {\n const b = gh.branches.insert({\n repo_id: repo.id,\n name: branchName,\n sha,\n protected: false,\n } as Omit<GitHubBranch, \"id\" | \"created_at\" | \"updated_at\">);\n const ref = gh.refs.insert({\n repo_id: repo.id,\n ref: `refs/heads/${branchName}`,\n sha,\n node_id: \"\",\n } as Omit<GitHubRef, \"id\" | \"created_at\" | \"updated_at\">);\n gh.refs.update(ref.id, { node_id: generateNodeId(\"Ref\", ref.id) });\n return b;\n}\n\nfunction getOrCreateBranch(gh: GitHubStore, repo: GitHubRepo, branchName: string): GitHubBranch {\n const existing = gh.branches.findBy(\"repo_id\", repo.id).find((b) => b.name === branchName);\n if (existing) return existing;\n const tip = getDefaultBranchSha(gh, repo);\n return createBranchAt(gh, repo, branchName, tip);\n}\n\nfunction updateBranchSha(gh: GitHubStore, repo: GitHubRepo, branchName: string, newSha: string) {\n const branch = gh.branches.findBy(\"repo_id\", repo.id).find((b) => b.name === branchName);\n if (branch) gh.branches.update(branch.id, { sha: newSha });\n const ref = gh.refs.findBy(\"repo_id\", repo.id).find((r) => r.ref === `refs/heads/${branchName}`);\n if (ref) gh.refs.update(ref.id, { sha: newSha });\n}\n\nfunction resolveHeadTarget(\n gh: GitHubStore,\n baseRepo: GitHubRepo,\n head: string,\n): { headRepo: GitHubRepo; headRef: string } {\n const trimmed = head.trim();\n if (!trimmed.includes(\":\")) {\n return { headRepo: baseRepo, headRef: trimmed };\n }\n const idx = trimmed.indexOf(\":\");\n const ownerLogin = trimmed.slice(0, idx).trim();\n const ref = trimmed.slice(idx + 1).trim();\n if (!ref) throw new ApiError(422, \"Validation failed\");\n\n const baseOwner = ownerLoginOf(gh, baseRepo);\n if (ownerLogin === baseOwner) {\n return { headRepo: baseRepo, headRef: ref };\n }\n\n const fork = gh.repos.all().find((r) => {\n if (r.forked_from_id !== baseRepo.id) return false;\n const login = r.owner_type === \"User\" ? gh.users.get(r.owner_id)?.login : gh.orgs.get(r.owner_id)?.login;\n return login === ownerLogin;\n });\n if (!fork) throw new ApiError(422, \"Validation failed\");\n return { headRepo: fork, headRef: ref };\n}\n\nfunction countCommitsBetween(gh: GitHubStore, repo: GitHubRepo, headSha: string, baseSha: string): number {\n const chain = walkCommitsToBase(gh, repo, headSha, baseSha);\n return chain.length;\n}\n\nfunction walkCommitsToBase(gh: GitHubStore, repo: GitHubRepo, headSha: string, baseSha: string): GitHubCommit[] {\n const out: GitHubCommit[] = [];\n const seen = new Set<string>();\n let cur: string | undefined = headSha;\n while (cur && !seen.has(cur)) {\n seen.add(cur);\n const commit = gh.commits.findBy(\"repo_id\", repo.id).find((c) => c.sha === cur);\n if (!commit) break;\n out.push(commit);\n if (cur === baseSha) break;\n cur = commit.parent_shas[0];\n }\n return out.reverse();\n}\n\nfunction insertCommit(\n gh: GitHubStore,\n repo: GitHubRepo,\n opts: {\n treeSha: string;\n parentShas: string[];\n message: string;\n user: GitHubUser | null;\n },\n): GitHubCommit {\n const u = opts.user;\n const authorName = u?.name ?? u?.login ?? \"User\";\n const login = u?.login ?? \"user\";\n const email = u?.email ?? `${login}@users.noreply.github.com`;\n const now = timestamp();\n const row = gh.commits.insert({\n repo_id: repo.id,\n sha: generateSha(),\n node_id: \"\",\n message: opts.message,\n author_name: authorName,\n author_email: email,\n author_date: now,\n committer_name: authorName,\n committer_email: email,\n committer_date: now,\n tree_sha: opts.treeSha,\n parent_shas: opts.parentShas,\n user_id: u?.id ?? null,\n } as Omit<GitHubCommit, \"id\" | \"created_at\" | \"updated_at\">);\n gh.commits.update(row.id, { node_id: generateNodeId(\"Commit\", row.id) });\n return gh.commits.get(row.id)!;\n}\n\nfunction formatCommitApi(commit: GitHubCommit, repo: GitHubRepo, baseUrl: string) {\n const repoUrl = `${baseUrl}/repos/${repo.full_name}`;\n return {\n sha: commit.sha,\n node_id: commit.node_id,\n url: `${repoUrl}/commits/${commit.sha}`,\n html_url: `${baseUrl}/${repo.full_name}/commit/${commit.sha}`,\n comments_url: `${repoUrl}/comments/${commit.sha}`,\n commit: {\n url: `${repoUrl}/git/commits/${commit.sha}`,\n author: {\n name: commit.author_name,\n email: commit.author_email,\n date: commit.author_date,\n },\n committer: {\n name: commit.committer_name,\n email: commit.committer_email,\n date: commit.committer_date,\n },\n message: commit.message,\n tree: { sha: commit.tree_sha },\n comment_count: 0,\n verification: {\n verified: false,\n reason: \"unsigned\",\n signature: null,\n payload: null,\n verified_at: null,\n },\n },\n author: null,\n committer: null,\n parents: commit.parent_shas.map((sha) => ({\n sha,\n url: `${repoUrl}/commits/${sha}`,\n html_url: `${baseUrl}/${repo.full_name}/commit/${sha}`,\n })),\n };\n}\n\nfunction headLabel(gh: GitHubStore, pr: GitHubPullRequest): string {\n const headRepo = gh.repos.get(pr.head_repo_id);\n const owner = headRepo\n ? headRepo.owner_type === \"User\"\n ? gh.users.get(headRepo.owner_id)?.login\n : gh.orgs.get(headRepo.owner_id)?.login\n : undefined;\n return `${owner ?? \"unknown\"}:${pr.head_ref}`;\n}\n\nfunction matchesHeadFilter(gh: GitHubStore, pr: GitHubPullRequest, headParam: string): boolean {\n const trimmed = headParam.trim();\n if (!trimmed) return true;\n if (!trimmed.includes(\":\")) {\n return pr.head_ref === trimmed;\n }\n return headLabel(gh, pr) === trimmed;\n}\n\nfunction sortPulls(\n list: GitHubPullRequest[],\n sort: \"created\" | \"updated\" | \"popularity\" | \"long-running\",\n direction: \"asc\" | \"desc\",\n): GitHubPullRequest[] {\n const sorted = [...list];\n sorted.sort((a, b) => {\n if (sort === \"long-running\") {\n const cmp = a.created_at.localeCompare(b.created_at);\n return direction === \"desc\" ? cmp : -cmp;\n }\n const mul = direction === \"asc\" ? 1 : -1;\n if (sort === \"updated\") {\n return a.updated_at.localeCompare(b.updated_at) * mul;\n }\n if (sort === \"created\") {\n return a.created_at.localeCompare(b.created_at) * mul;\n }\n const av = a.comments + a.review_comments;\n const bv = b.comments + b.review_comments;\n if (av < bv) return -1 * mul;\n if (av > bv) return 1 * mul;\n return 0;\n });\n return sorted;\n}\n\nfunction checkMergeRequirements(gh: GitHubStore, pr: GitHubPullRequest) {\n const baseRepo = gh.repos.get(pr.base_repo_id);\n if (!baseRepo) throw new ApiError(422, \"Base repository not found\");\n\n const rule = gh.branchProtections.findBy(\"repo_id\", baseRepo.id).find((p) => p.branch_name === pr.base_ref);\n\n if (!rule) return;\n\n const checks = rule.required_status_checks;\n if (checks && checks.contexts.length > 0) {\n const runs = gh.checkRuns.findBy(\"repo_id\", baseRepo.id).filter((r) => r.head_sha === pr.head_sha);\n for (const ctx of checks.contexts) {\n const ok = runs.some((r) => r.name === ctx && r.status === \"completed\" && r.conclusion === \"success\");\n if (!ok) {\n throw new ApiError(422, \"Required status checks have not succeeded.\");\n }\n }\n }\n\n const rev = rule.required_pull_request_reviews;\n if (rev) {\n const need = rev.required_approving_review_count;\n const approved = gh.reviews\n .findBy(\"repo_id\", baseRepo.id)\n .filter((r) => r.pull_number === pr.number && r.state === \"APPROVED\");\n const approvers = new Set(approved.map((r) => r.user_id));\n if (approvers.size < need) {\n throw new ApiError(422, \"Required approving review count not met.\");\n }\n }\n}\n\nfunction deleteBranchByName(gh: GitHubStore, repo: GitHubRepo, branchName: string) {\n const branch = gh.branches.findBy(\"repo_id\", repo.id).find((b) => b.name === branchName);\n if (branch) gh.branches.delete(branch.id);\n const ref = gh.refs.findBy(\"repo_id\", repo.id).find((r) => r.ref === `refs/heads/${branchName}`);\n if (ref) gh.refs.delete(ref.id);\n}\n\nfunction lookupUserByLogin(gh: GitHubStore, login: string): GitHubUser {\n const u = gh.users.findOneBy(\"login\", login);\n if (!u) throw new ApiError(422, \"Validation failed\");\n return u;\n}\n\nfunction lookupTeamSlug(gh: GitHubStore, orgId: number, slug: string) {\n const t = gh.teams.findBy(\"org_id\", orgId).find((x) => x.slug === slug);\n if (!t) throw new ApiError(422, \"Validation failed\");\n return t;\n}\n\nexport function pullsRoutes({ app, store, webhooks, baseUrl }: RouteContext): void {\n const gh = getGitHubStore(store);\n\n app.get(\"/repos/:owner/:repo/pulls\", (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n assertRepoRead(gh, c.get(\"authUser\"), repo);\n\n const stateQ = c.req.query(\"state\") ?? \"open\";\n const state: \"open\" | \"closed\" | \"all\" =\n stateQ === \"closed\" || stateQ === \"all\" || stateQ === \"open\" ? stateQ : \"open\";\n\n const headQ = c.req.query(\"head\") ?? \"\";\n const baseQ = c.req.query(\"base\") ?? \"\";\n\n const sortRaw = c.req.query(\"sort\") ?? \"created\";\n const sort: \"created\" | \"updated\" | \"popularity\" | \"long-running\" =\n sortRaw === \"updated\" || sortRaw === \"popularity\" || sortRaw === \"long-running\" ? sortRaw : \"created\";\n\n const dirRaw = c.req.query(\"direction\") ?? \"desc\";\n const direction: \"asc\" | \"desc\" = dirRaw === \"asc\" ? \"asc\" : \"desc\";\n\n let list = gh.pullRequests.findBy(\"repo_id\", repo.id);\n if (state === \"open\") list = list.filter((p) => p.state === \"open\");\n else if (state === \"closed\") list = list.filter((p) => p.state === \"closed\");\n\n if (baseQ.trim()) {\n list = list.filter((p) => p.base_ref === baseQ.trim());\n }\n if (headQ.trim()) {\n list = list.filter((p) => matchesHeadFilter(gh, p, headQ));\n }\n\n list = sortPulls(list, sort, direction);\n\n const { page, per_page } = parsePagination(c);\n const total = list.length;\n setLinkHeader(c, total, page, per_page);\n const start = (page - 1) * per_page;\n const pageItems = list.slice(start, start + per_page);\n const body = pageItems\n .map((p) => formatPullRequest(p, gh, baseUrl))\n .filter((x): x is NonNullable<typeof x> => x !== null);\n return c.json(body);\n });\n\n app.post(\"/repos/:owner/:repo/pulls\", async (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n\n const actor = assertRepoWrite(gh, c.get(\"authUser\"), repo);\n const body = await parseJsonBody(c);\n\n const title = body.title;\n if (typeof title !== \"string\" || !title.trim()) {\n throw new ApiError(422, \"Validation failed\");\n }\n const headRaw = body.head;\n const baseRaw = body.base;\n if (typeof headRaw !== \"string\" || !headRaw.trim()) throw new ApiError(422, \"Validation failed\");\n if (typeof baseRaw !== \"string\" || !baseRaw.trim()) throw new ApiError(422, \"Validation failed\");\n\n const { headRepo, headRef } = resolveHeadTarget(gh, repo, headRaw);\n const baseRef = baseRaw.trim();\n\n if (headRef === baseRef && headRepo.id === repo.id) {\n throw new ApiError(422, \"Validation failed\");\n }\n\n const prBody = typeof body.body === \"string\" || body.body === null ? (body.body as string | null) : null;\n const draft = typeof body.draft === \"boolean\" ? body.draft : false;\n\n const headBranch = getOrCreateBranch(gh, headRepo, headRef);\n const baseBranch = getOrCreateBranch(gh, repo, baseRef);\n\n const num = getNextIssueNumber(gh, repo.id);\n const now = timestamp();\n\n const issueRow = gh.issues.insert({\n node_id: \"\",\n number: num,\n repo_id: repo.id,\n title: title.trim(),\n body: prBody,\n state: \"open\",\n state_reason: null,\n locked: false,\n active_lock_reason: null,\n user_id: actor.id,\n assignee_ids: [],\n label_ids: [],\n milestone_id: null,\n comments: 0,\n closed_at: null,\n closed_by_id: null,\n is_pull_request: true,\n } as Omit<GitHubIssue, \"id\" | \"created_at\" | \"updated_at\">);\n gh.issues.update(issueRow.id, { node_id: generateNodeId(\"Issue\", issueRow.id) });\n\n const commitCount = countCommitsBetween(gh, headRepo, headBranch.sha, baseBranch.sha);\n\n const prRow = gh.pullRequests.insert({\n node_id: \"\",\n number: num,\n repo_id: repo.id,\n title: title.trim(),\n body: prBody,\n state: \"open\",\n locked: false,\n user_id: actor.id,\n assignee_ids: [],\n label_ids: [],\n milestone_id: null,\n head_ref: headRef,\n head_sha: headBranch.sha,\n head_repo_id: headRepo.id,\n base_ref: baseRef,\n base_sha: baseBranch.sha,\n base_repo_id: repo.id,\n merged: false,\n merged_at: null,\n merged_by_id: null,\n merge_commit_sha: null,\n mergeable: true,\n mergeable_state: \"clean\",\n comments: 0,\n review_comments: 0,\n commits: Math.max(1, commitCount),\n additions: 0,\n deletions: 0,\n changed_files: 0,\n draft,\n requested_reviewer_ids: [],\n requested_team_ids: [],\n closed_at: null,\n auto_merge: null,\n } as Omit<GitHubPullRequest, \"id\" | \"created_at\" | \"updated_at\">);\n gh.pullRequests.update(prRow.id, { node_id: generateNodeId(\"PullRequest\", prRow.id) });\n\n adjustRepoOpenIssues(gh, repo.id, 1);\n\n const pr = gh.pullRequests.get(prRow.id)!;\n const prFmt = formatPullRequest(pr, gh, baseUrl)!;\n const ownerLogin = ownerLoginOf(gh, repo);\n\n webhooks.dispatch(\n \"pull_request\",\n \"opened\",\n {\n action: \"opened\",\n pull_request: prFmt,\n repository: formatRepo(repo, gh, baseUrl),\n sender: formatUser(actor, baseUrl),\n },\n ownerLogin,\n repo.name,\n );\n\n return c.json(prFmt, 201);\n });\n\n app.get(\"/repos/:owner/:repo/pulls/:pull_number\", (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n assertRepoRead(gh, c.get(\"authUser\"), repo);\n\n const pullNumber = parseInt(c.req.param(\"pull_number\")!, 10);\n if (!Number.isFinite(pullNumber)) throw notFoundResponse();\n\n const pr = findPull(gh, repo.id, pullNumber);\n if (!pr) throw notFoundResponse();\n\n const fmt = formatPullRequest(pr, gh, baseUrl);\n if (!fmt) throw notFoundResponse();\n return c.json(fmt);\n });\n\n app.patch(\"/repos/:owner/:repo/pulls/:pull_number\", async (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n\n const actor = assertRepoWrite(gh, c.get(\"authUser\"), repo);\n const pullNumber = parseInt(c.req.param(\"pull_number\")!, 10);\n if (!Number.isFinite(pullNumber)) throw notFoundResponse();\n\n const pr = findPull(gh, repo.id, pullNumber);\n if (!pr) throw notFoundResponse();\n\n const body = await parseJsonBody(c);\n const patch: Partial<GitHubPullRequest> = {};\n const issuePatch: Partial<GitHubIssue> = {};\n\n if (typeof body.title === \"string\") {\n patch.title = body.title;\n issuePatch.title = body.title;\n }\n if (typeof body.body === \"string\" || body.body === null) {\n patch.body = body.body as string | null;\n issuePatch.body = body.body as string | null;\n }\n if (body.state === \"open\" || body.state === \"closed\") {\n const wasClosed = pr.state === \"closed\";\n patch.state = body.state;\n issuePatch.state = body.state;\n if (body.state === \"closed\") {\n patch.closed_at = timestamp();\n issuePatch.closed_at = timestamp();\n issuePatch.closed_by_id = actor.id;\n } else {\n patch.closed_at = null;\n issuePatch.closed_at = null;\n issuePatch.closed_by_id = null;\n }\n if (!wasClosed && body.state === \"closed\") {\n adjustRepoOpenIssues(gh, repo.id, -1);\n } else if (wasClosed && body.state === \"open\") {\n adjustRepoOpenIssues(gh, repo.id, 1);\n }\n }\n if (typeof body.base === \"string\" && body.base.trim()) {\n const newBase = body.base.trim();\n const bb = getOrCreateBranch(gh, repo, newBase);\n patch.base_ref = newBase;\n patch.base_sha = bb.sha;\n patch.base_repo_id = repo.id;\n }\n if (typeof body.draft === \"boolean\") {\n patch.draft = body.draft;\n }\n\n const updated = gh.pullRequests.update(pr.id, patch);\n if (!updated) throw notFoundResponse();\n\n const iss = findPrIssue(gh, repo.id, pullNumber);\n if (iss) {\n gh.issues.update(iss.id, issuePatch);\n }\n\n const fresh = gh.pullRequests.get(pr.id)!;\n const prFmt = formatPullRequest(fresh, gh, baseUrl)!;\n const ownerLogin = ownerLoginOf(gh, repo);\n\n if (body.state === \"closed\" && pr.state === \"open\") {\n webhooks.dispatch(\n \"pull_request\",\n \"closed\",\n {\n action: \"closed\",\n pull_request: prFmt,\n repository: formatRepo(repo, gh, baseUrl),\n sender: formatUser(actor, baseUrl),\n },\n ownerLogin,\n repo.name,\n );\n } else if (body.state === \"open\" && pr.state === \"closed\") {\n webhooks.dispatch(\n \"pull_request\",\n \"reopened\",\n {\n action: \"reopened\",\n pull_request: prFmt,\n repository: formatRepo(repo, gh, baseUrl),\n sender: formatUser(actor, baseUrl),\n },\n ownerLogin,\n repo.name,\n );\n } else if (typeof body.title === \"string\" || typeof body.body === \"string\" || body.body === null) {\n webhooks.dispatch(\n \"pull_request\",\n \"edited\",\n {\n action: \"edited\",\n pull_request: prFmt,\n repository: formatRepo(repo, gh, baseUrl),\n sender: formatUser(actor, baseUrl),\n },\n ownerLogin,\n repo.name,\n );\n }\n\n return c.json(prFmt);\n });\n\n app.put(\"/repos/:owner/:repo/pulls/:pull_number/merge\", async (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n\n const actor = assertRepoWrite(gh, c.get(\"authUser\"), repo);\n const pullNumber = parseInt(c.req.param(\"pull_number\")!, 10);\n if (!Number.isFinite(pullNumber)) throw notFoundResponse();\n\n const pr = findPull(gh, repo.id, pullNumber);\n if (!pr) throw notFoundResponse();\n if (pr.merged || pr.state === \"closed\") {\n throw new ApiError(422, \"Pull Request is not mergeable\");\n }\n if (pr.draft) {\n throw new ApiError(422, \"Draft pull requests cannot be merged.\");\n }\n\n const body = await parseJsonBody(c);\n if (typeof body.sha === \"string\" && body.sha !== pr.head_sha) {\n throw new ApiError(422, \"Head sha is out of date\");\n }\n\n const mergeMethod = body.merge_method === \"squash\" || body.merge_method === \"rebase\" ? body.merge_method : \"merge\";\n\n if (mergeMethod === \"merge\" && !repo.allow_merge_commit) {\n throw new ApiError(422, \"Merge commits are not allowed on this repository.\");\n }\n if (mergeMethod === \"squash\" && !repo.allow_squash_merge) {\n throw new ApiError(422, \"Squash merges are not allowed on this repository.\");\n }\n if (mergeMethod === \"rebase\" && !repo.allow_rebase_merge) {\n throw new ApiError(422, \"Rebase merges are not allowed on this repository.\");\n }\n\n checkMergeRequirements(gh, pr);\n\n const baseRepo = gh.repos.get(pr.base_repo_id)!;\n const headRepo = gh.repos.get(pr.head_repo_id)!;\n\n const baseCommit = gh.commits.findBy(\"repo_id\", baseRepo.id).find((x) => x.sha === pr.base_sha);\n const headCommit = gh.commits.findBy(\"repo_id\", headRepo.id).find((x) => x.sha === pr.head_sha);\n\n if (!baseCommit || !headCommit) {\n throw new ApiError(422, \"Could not resolve commits to merge.\");\n }\n\n const commitTitle =\n typeof body.commit_title === \"string\" && body.commit_title.trim()\n ? body.commit_title.trim()\n : `Merge pull request #${pr.number} from ${headLabel(gh, pr)}`;\n const commitMessage =\n typeof body.commit_message === \"string\" && body.commit_message.trim() ? body.commit_message.trim() : \"\";\n\n const fullMessage = commitMessage ? `${commitTitle}\\n\\n${commitMessage}` : commitTitle;\n\n let mergeCommit: GitHubCommit;\n if (mergeMethod === \"merge\") {\n mergeCommit = insertCommit(gh, baseRepo, {\n treeSha: headCommit.tree_sha,\n parentShas: [pr.base_sha, pr.head_sha],\n message: fullMessage,\n user: actor,\n });\n } else {\n mergeCommit = insertCommit(gh, baseRepo, {\n treeSha: headCommit.tree_sha,\n parentShas: [pr.base_sha],\n message: fullMessage,\n user: actor,\n });\n }\n\n updateBranchSha(gh, baseRepo, pr.base_ref, mergeCommit.sha);\n\n const now = timestamp();\n gh.pullRequests.update(pr.id, {\n merged: true,\n merged_at: now,\n merged_by_id: actor.id,\n merge_commit_sha: mergeCommit.sha,\n state: \"closed\",\n closed_at: now,\n mergeable: false,\n mergeable_state: \"unknown\",\n });\n\n const iss = findPrIssue(gh, repo.id, pullNumber);\n if (iss) {\n gh.issues.update(iss.id, {\n state: \"closed\",\n closed_at: now,\n closed_by_id: actor.id,\n });\n }\n\n adjustRepoOpenIssues(gh, repo.id, -1);\n\n if (repo.delete_branch_on_merge && pr.head_ref !== pr.base_ref) {\n deleteBranchByName(gh, headRepo, pr.head_ref);\n }\n\n const mergedPr = gh.pullRequests.get(pr.id)!;\n const prFmt = formatPullRequest(mergedPr, gh, baseUrl)!;\n const ownerLogin = ownerLoginOf(gh, repo);\n\n webhooks.dispatch(\n \"pull_request\",\n \"closed\",\n {\n action: \"closed\",\n pull_request: { ...prFmt, merged: true },\n repository: formatRepo(repo, gh, baseUrl),\n sender: formatUser(actor, baseUrl),\n },\n ownerLogin,\n repo.name,\n );\n\n return c.json({\n sha: mergeCommit.sha,\n merged: true,\n message: \"Pull Request successfully merged\",\n });\n });\n\n app.get(\"/repos/:owner/:repo/pulls/:pull_number/commits\", (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n assertRepoRead(gh, c.get(\"authUser\"), repo);\n\n const pullNumber = parseInt(c.req.param(\"pull_number\")!, 10);\n if (!Number.isFinite(pullNumber)) throw notFoundResponse();\n\n const pr = findPull(gh, repo.id, pullNumber);\n if (!pr) throw notFoundResponse();\n\n const headRepo = gh.repos.get(pr.head_repo_id);\n if (!headRepo) throw notFoundResponse();\n\n const chain = walkCommitsToBase(gh, headRepo, pr.head_sha, pr.base_sha);\n const { page, per_page } = parsePagination(c);\n const total = chain.length;\n setLinkHeader(c, total, page, per_page);\n const start = (page - 1) * per_page;\n const slice = chain.slice(start, start + per_page);\n\n return c.json(slice.map((commit) => formatCommitApi(commit, headRepo, baseUrl)));\n });\n\n app.get(\"/repos/:owner/:repo/pulls/:pull_number/files\", (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n assertRepoRead(gh, c.get(\"authUser\"), repo);\n\n const pullNumber = parseInt(c.req.param(\"pull_number\")!, 10);\n if (!Number.isFinite(pullNumber)) throw notFoundResponse();\n\n const pr = findPull(gh, repo.id, pullNumber);\n if (!pr) throw notFoundResponse();\n\n const { page, per_page } = parsePagination(c);\n const n = pr.changed_files;\n const stubNames = Array.from({ length: n }, (_, i) => `file${i + 1}.ts`);\n const total = stubNames.length;\n setLinkHeader(c, total, page, per_page);\n const start = (page - 1) * per_page;\n const pageNames = stubNames.slice(start, start + per_page);\n\n return c.json(\n pageNames.map((filename, i) => ({\n sha: generateSha(),\n filename,\n status: \"modified\",\n additions: 1,\n deletions: 0,\n changes: 1,\n blob_url: `${baseUrl}/${repo.full_name}/blob/${pr.head_sha}/${filename}`,\n raw_url: `${baseUrl}/${repo.full_name}/raw/${pr.head_sha}/${filename}`,\n contents_url: `${baseUrl}/repos/${repo.full_name}/contents/${encodeURIComponent(filename)}?ref=${pr.head_ref}`,\n patch: \"\",\n })),\n );\n });\n\n app.post(\"/repos/:owner/:repo/pulls/:pull_number/requested_reviewers\", async (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n\n const actor = assertRepoWrite(gh, c.get(\"authUser\"), repo);\n const pullNumber = parseInt(c.req.param(\"pull_number\")!, 10);\n if (!Number.isFinite(pullNumber)) throw notFoundResponse();\n\n const pr = findPull(gh, repo.id, pullNumber);\n if (!pr) throw notFoundResponse();\n\n const body = (await parseJsonBody(c)) as {\n reviewers?: unknown;\n team_reviewers?: unknown;\n };\n\n const reviewerLogins = Array.isArray(body.reviewers)\n ? body.reviewers.filter((x): x is string => typeof x === \"string\")\n : [];\n const teamSlugs = Array.isArray(body.team_reviewers)\n ? body.team_reviewers.filter((x): x is string => typeof x === \"string\")\n : [];\n\n const newUserIds = reviewerLogins.map((login) => lookupUserByLogin(gh, login).id);\n let newTeamIds: number[] = [];\n if (teamSlugs.length > 0) {\n if (repo.owner_type !== \"Organization\") {\n throw new ApiError(422, \"Team reviewers are only supported for organization repositories.\");\n }\n newTeamIds = teamSlugs.map((slug) => lookupTeamSlug(gh, repo.owner_id, slug).id);\n }\n\n const requested_reviewer_ids = [...new Set([...pr.requested_reviewer_ids, ...newUserIds])];\n const requested_team_ids = [...new Set([...pr.requested_team_ids, ...newTeamIds])];\n\n gh.pullRequests.update(pr.id, { requested_reviewer_ids, requested_team_ids });\n const fresh = gh.pullRequests.get(pr.id)!;\n const prFmt = formatPullRequest(fresh, gh, baseUrl)!;\n const ownerLogin = ownerLoginOf(gh, repo);\n\n webhooks.dispatch(\n \"pull_request\",\n \"review_requested\",\n {\n action: \"review_requested\",\n pull_request: prFmt,\n repository: formatRepo(repo, gh, baseUrl),\n sender: formatUser(actor, baseUrl),\n },\n ownerLogin,\n repo.name,\n );\n\n return c.json(prFmt);\n });\n\n app.delete(\"/repos/:owner/:repo/pulls/:pull_number/requested_reviewers\", async (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n\n assertRepoWrite(gh, c.get(\"authUser\"), repo);\n const pullNumber = parseInt(c.req.param(\"pull_number\")!, 10);\n if (!Number.isFinite(pullNumber)) throw notFoundResponse();\n\n const pr = findPull(gh, repo.id, pullNumber);\n if (!pr) throw notFoundResponse();\n\n const body = (await parseJsonBody(c)) as {\n reviewers?: unknown;\n team_reviewers?: unknown;\n };\n\n const reviewerLogins = Array.isArray(body.reviewers)\n ? body.reviewers.filter((x): x is string => typeof x === \"string\")\n : [];\n const teamSlugs = Array.isArray(body.team_reviewers)\n ? body.team_reviewers.filter((x): x is string => typeof x === \"string\")\n : [];\n\n const removeUserIds = new Set(reviewerLogins.map((login) => lookupUserByLogin(gh, login).id));\n let removeTeamIds = new Set<number>();\n if (teamSlugs.length > 0 && repo.owner_type === \"Organization\") {\n removeTeamIds = new Set(teamSlugs.map((slug) => lookupTeamSlug(gh, repo.owner_id, slug).id));\n }\n\n const requested_reviewer_ids = pr.requested_reviewer_ids.filter((id) => !removeUserIds.has(id));\n const requested_team_ids = pr.requested_team_ids.filter((id) => !removeTeamIds.has(id));\n\n gh.pullRequests.update(pr.id, { requested_reviewer_ids, requested_team_ids });\n const fresh = gh.pullRequests.get(pr.id)!;\n return c.json(formatPullRequest(fresh, gh, baseUrl)!);\n });\n\n app.put(\"/repos/:owner/:repo/pulls/:pull_number/update-branch\", async (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n\n assertRepoWrite(gh, c.get(\"authUser\"), repo);\n const pullNumber = parseInt(c.req.param(\"pull_number\")!, 10);\n if (!Number.isFinite(pullNumber)) throw notFoundResponse();\n\n const pr = findPull(gh, repo.id, pullNumber);\n if (!pr) throw notFoundResponse();\n if (pr.state === \"closed\" || pr.merged) {\n throw new ApiError(422, \"Cannot update a closed pull request\");\n }\n\n const body = (await parseJsonBody(c)) as { expected_head_sha?: unknown };\n if (typeof body.expected_head_sha === \"string\" && body.expected_head_sha !== pr.head_sha) {\n throw new ApiError(422, \"Head sha is out of date\");\n }\n\n const headRepo = gh.repos.get(pr.head_repo_id);\n const baseRepo = gh.repos.get(pr.base_repo_id);\n if (!headRepo || !baseRepo) throw notFoundResponse();\n\n const headCommit = gh.commits.findBy(\"repo_id\", headRepo.id).find((x) => x.sha === pr.head_sha);\n const baseCommit = gh.commits.findBy(\"repo_id\", baseRepo.id).find((x) => x.sha === pr.base_sha);\n if (!headCommit || !baseCommit) throw new ApiError(422, \"Could not resolve commits.\");\n\n const actor = assertAuthenticatedUser(gh, c.get(\"authUser\"));\n const mergeMsg = `Merge branch '${pr.base_ref}' into ${pr.head_ref}`;\n const newCommit = insertCommit(gh, headRepo, {\n treeSha: headCommit.tree_sha,\n parentShas: [pr.head_sha, pr.base_sha],\n message: mergeMsg,\n user: actor,\n });\n\n updateBranchSha(gh, headRepo, pr.head_ref, newCommit.sha);\n const next = gh.pullRequests.update(pr.id, {\n head_sha: newCommit.sha,\n commits: pr.commits + 1,\n });\n if (!next) throw notFoundResponse();\n\n const apiUrl = `${baseUrl}/repos/${repo.full_name}/pulls/${pullNumber}`;\n return c.json(\n {\n message: \"Updating pull request branch.\",\n url: apiUrl,\n },\n 202,\n );\n });\n}\n","import type { Context } from \"@emulators/core\";\nimport type { RouteContext } from \"@emulators/core\";\nimport { ApiError, parseJsonBody, parsePagination, setLinkHeader } from \"@emulators/core\";\nimport { getGitHubStore } from \"../store.js\";\nimport type { GitHubStore } from \"../store.js\";\nimport type { GitHubComment, GitHubCommit, GitHubIssue, GitHubPullRequest, GitHubRepo } from \"../entities.js\";\nimport {\n formatComment,\n formatIssue,\n formatPullRequest,\n formatRepo,\n formatUser,\n generateNodeId,\n lookupRepo,\n} from \"../helpers.js\";\nimport { assertRepoRead, assertRepoWrite, notFoundResponse, ownerLoginOf } from \"../route-helpers.js\";\n\nfunction findIssueByNumber(gh: GitHubStore, repoId: number, number: number): GitHubIssue | undefined {\n return gh.issues.findBy(\"repo_id\", repoId).find((i) => i.number === number);\n}\n\nfunction findPull(gh: GitHubStore, repoId: number, pullNumber: number): GitHubPullRequest | undefined {\n return gh.pullRequests.findBy(\"repo_id\", repoId).find((p) => p.number === pullNumber);\n}\n\nfunction findCommitInRepo(gh: GitHubStore, repoId: number, shaParam: string): GitHubCommit | undefined {\n const want = shaParam.toLowerCase();\n const list = gh.commits.findBy(\"repo_id\", repoId);\n return list.find((c) => c.sha === shaParam || c.sha.toLowerCase() === want || c.sha.startsWith(shaParam));\n}\n\nfunction getCommentForRepo(\n gh: GitHubStore,\n repo: GitHubRepo,\n commentId: number,\n kind: GitHubComment[\"comment_type\"],\n): GitHubComment | undefined {\n const c = gh.comments.get(commentId);\n if (!c || c.repo_id !== repo.id || c.comment_type !== kind) return undefined;\n return c;\n}\n\nfunction sortComments(\n comments: GitHubComment[],\n sort: \"created\" | \"updated\",\n direction: \"asc\" | \"desc\",\n): GitHubComment[] {\n const mul = direction === \"asc\" ? 1 : -1;\n const field = sort === \"created\" ? \"created_at\" : \"updated_at\";\n const sorted = [...comments];\n sorted.sort((a, b) => {\n const as = a[field];\n const bs = b[field];\n if (as < bs) return -1 * mul;\n if (as > bs) return 1 * mul;\n return a.id < b.id ? -1 * mul : a.id > b.id ? 1 * mul : 0;\n });\n return sorted;\n}\n\nfunction parseCommentSort(c: Context, defaultDirection: \"asc\" | \"desc\") {\n const sortRaw = c.req.query(\"sort\") ?? \"created\";\n const sort: \"created\" | \"updated\" = sortRaw === \"updated\" ? \"updated\" : \"created\";\n const dirRaw = c.req.query(\"direction\");\n const direction: \"asc\" | \"desc\" = dirRaw === \"desc\" ? \"desc\" : dirRaw === \"asc\" ? \"asc\" : defaultDirection;\n return { sort, direction };\n}\n\nfunction adjustIssueCommentCount(gh: GitHubStore, issue: GitHubIssue, delta: number) {\n gh.issues.update(issue.id, { comments: Math.max(0, issue.comments + delta) });\n}\n\nfunction adjustPrReviewCommentCount(gh: GitHubStore, pr: GitHubPullRequest, delta: number) {\n gh.pullRequests.update(pr.id, { review_comments: Math.max(0, pr.review_comments + delta) });\n}\n\nexport function commentsRoutes({ app, store, webhooks, baseUrl }: RouteContext): void {\n const gh = getGitHubStore(store);\n\n // --- Issue comments: specific paths before /issues/:issue_number/comments ---\n\n app.get(\"/repos/:owner/:repo/issues/comments/:comment_id\", (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n assertRepoRead(gh, c.get(\"authUser\"), repo);\n if (!repo.has_issues) throw notFoundResponse();\n\n const commentId = parseInt(c.req.param(\"comment_id\")!, 10);\n if (!Number.isFinite(commentId)) throw notFoundResponse();\n\n const comment = getCommentForRepo(gh, repo, commentId, \"issue\");\n if (!comment) throw notFoundResponse();\n\n const json = formatComment(comment, gh, baseUrl);\n if (!json) throw notFoundResponse();\n return c.json(json);\n });\n\n app.patch(\"/repos/:owner/:repo/issues/comments/:comment_id\", async (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n if (!repo.has_issues) throw notFoundResponse();\n\n const actor = assertRepoWrite(gh, c.get(\"authUser\"), repo);\n\n const commentId = parseInt(c.req.param(\"comment_id\")!, 10);\n if (!Number.isFinite(commentId)) throw notFoundResponse();\n\n let comment = getCommentForRepo(gh, repo, commentId, \"issue\");\n if (!comment) throw notFoundResponse();\n\n const body = await parseJsonBody(c);\n if (typeof body.body !== \"string\") {\n throw new ApiError(422, \"Validation failed\");\n }\n\n comment = gh.comments.update(comment.id, { body: body.body })!;\n const issue = comment.issue_number !== null ? findIssueByNumber(gh, repo.id, comment.issue_number) : undefined;\n const ownerLogin = ownerLoginOf(gh, repo);\n const issueFmt = issue ? formatIssue(issue, gh, baseUrl) : null;\n const commentFmt = formatComment(comment, gh, baseUrl);\n if (!commentFmt) throw notFoundResponse();\n\n webhooks.dispatch(\n \"issue_comment\",\n \"edited\",\n {\n action: \"edited\",\n comment: commentFmt,\n issue: issueFmt,\n repository: formatRepo(repo, gh, baseUrl),\n sender: formatUser(actor, baseUrl),\n },\n ownerLogin,\n repo.name,\n );\n\n return c.json(commentFmt);\n });\n\n app.delete(\"/repos/:owner/:repo/issues/comments/:comment_id\", (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n if (!repo.has_issues) throw notFoundResponse();\n\n const actor = assertRepoWrite(gh, c.get(\"authUser\"), repo);\n\n const commentId = parseInt(c.req.param(\"comment_id\")!, 10);\n if (!Number.isFinite(commentId)) throw notFoundResponse();\n\n const comment = getCommentForRepo(gh, repo, commentId, \"issue\");\n if (!comment) throw notFoundResponse();\n\n const issue = comment.issue_number !== null ? findIssueByNumber(gh, repo.id, comment.issue_number) : undefined;\n const commentFmt = formatComment(comment, gh, baseUrl);\n const issueFmt = issue ? formatIssue(issue, gh, baseUrl) : null;\n const ownerLogin = ownerLoginOf(gh, repo);\n\n gh.comments.delete(comment.id);\n if (issue) adjustIssueCommentCount(gh, issue, -1);\n\n webhooks.dispatch(\n \"issue_comment\",\n \"deleted\",\n {\n action: \"deleted\",\n comment: commentFmt,\n issue: issueFmt,\n repository: formatRepo(repo, gh, baseUrl),\n sender: formatUser(actor, baseUrl),\n },\n ownerLogin,\n repo.name,\n );\n\n return c.body(null, 204);\n });\n\n app.get(\"/repos/:owner/:repo/issues/comments\", (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n assertRepoRead(gh, c.get(\"authUser\"), repo);\n if (!repo.has_issues) throw notFoundResponse();\n\n const { page, per_page } = parsePagination(c);\n const { sort, direction } = parseCommentSort(c, \"asc\");\n const since = c.req.query(\"since\");\n\n let list = gh.comments.findBy(\"repo_id\", repo.id).filter((x) => x.comment_type === \"issue\");\n if (since) {\n list = list.filter((x) => x.updated_at >= since);\n }\n list = sortComments(list, sort, direction);\n const total = list.length;\n setLinkHeader(c, total, page, per_page);\n const start = (page - 1) * per_page;\n const pageItems = list.slice(start, start + per_page);\n const body = pageItems\n .map((x) => formatComment(x, gh, baseUrl))\n .filter((x): x is NonNullable<typeof x> => x !== null);\n return c.json(body);\n });\n\n // --- Pull review comments ---\n\n app.get(\"/repos/:owner/:repo/pulls/comments/:comment_id\", (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n assertRepoRead(gh, c.get(\"authUser\"), repo);\n\n const commentId = parseInt(c.req.param(\"comment_id\")!, 10);\n if (!Number.isFinite(commentId)) throw notFoundResponse();\n\n const comment = getCommentForRepo(gh, repo, commentId, \"review\");\n if (!comment) throw notFoundResponse();\n\n const json = formatComment(comment, gh, baseUrl);\n if (!json) throw notFoundResponse();\n return c.json(json);\n });\n\n app.patch(\"/repos/:owner/:repo/pulls/comments/:comment_id\", async (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n\n const actor = assertRepoWrite(gh, c.get(\"authUser\"), repo);\n\n const commentId = parseInt(c.req.param(\"comment_id\")!, 10);\n if (!Number.isFinite(commentId)) throw notFoundResponse();\n\n let comment = getCommentForRepo(gh, repo, commentId, \"review\");\n if (!comment) throw notFoundResponse();\n\n const body = await parseJsonBody(c);\n if (typeof body.body !== \"string\") {\n throw new ApiError(422, \"Validation failed\");\n }\n\n comment = gh.comments.update(comment.id, { body: body.body })!;\n const pr = comment.pull_number !== null ? findPull(gh, repo.id, comment.pull_number) : undefined;\n const ownerLogin = ownerLoginOf(gh, repo);\n const commentFmt = formatComment(comment, gh, baseUrl);\n if (!commentFmt) throw notFoundResponse();\n\n webhooks.dispatch(\n \"pull_request_review_comment\",\n \"edited\",\n {\n action: \"edited\",\n comment: commentFmt,\n pull_request: pr ? formatPullRequest(pr, gh, baseUrl) : null,\n repository: formatRepo(repo, gh, baseUrl),\n sender: formatUser(actor, baseUrl),\n },\n ownerLogin,\n repo.name,\n );\n\n return c.json(commentFmt);\n });\n\n app.delete(\"/repos/:owner/:repo/pulls/comments/:comment_id\", (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n\n const actor = assertRepoWrite(gh, c.get(\"authUser\"), repo);\n\n const commentId = parseInt(c.req.param(\"comment_id\")!, 10);\n if (!Number.isFinite(commentId)) throw notFoundResponse();\n\n const comment = getCommentForRepo(gh, repo, commentId, \"review\");\n if (!comment) throw notFoundResponse();\n\n const pr = comment.pull_number !== null ? findPull(gh, repo.id, comment.pull_number) : undefined;\n const commentFmt = formatComment(comment, gh, baseUrl);\n const ownerLogin = ownerLoginOf(gh, repo);\n\n gh.comments.delete(comment.id);\n if (pr) adjustPrReviewCommentCount(gh, pr, -1);\n\n webhooks.dispatch(\n \"pull_request_review_comment\",\n \"deleted\",\n {\n action: \"deleted\",\n comment: commentFmt,\n pull_request: pr ? formatPullRequest(pr, gh, baseUrl) : null,\n repository: formatRepo(repo, gh, baseUrl),\n sender: formatUser(actor, baseUrl),\n },\n ownerLogin,\n repo.name,\n );\n\n return c.body(null, 204);\n });\n\n app.get(\"/repos/:owner/:repo/pulls/comments\", (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n assertRepoRead(gh, c.get(\"authUser\"), repo);\n\n const { page, per_page } = parsePagination(c);\n const { sort, direction } = parseCommentSort(c, \"asc\");\n\n let list = gh.comments.findBy(\"repo_id\", repo.id).filter((x) => x.comment_type === \"review\");\n list = sortComments(list, sort, direction);\n const total = list.length;\n setLinkHeader(c, total, page, per_page);\n const start = (page - 1) * per_page;\n const pageItems = list.slice(start, start + per_page);\n const body = pageItems\n .map((x) => formatComment(x, gh, baseUrl))\n .filter((x): x is NonNullable<typeof x> => x !== null);\n return c.json(body);\n });\n\n // --- Commit comments (repo scope) ---\n\n app.get(\"/repos/:owner/:repo/comments/:comment_id\", (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n assertRepoRead(gh, c.get(\"authUser\"), repo);\n\n const commentId = parseInt(c.req.param(\"comment_id\")!, 10);\n if (!Number.isFinite(commentId)) throw notFoundResponse();\n\n const comment = getCommentForRepo(gh, repo, commentId, \"commit\");\n if (!comment) throw notFoundResponse();\n\n const json = formatComment(comment, gh, baseUrl);\n if (!json) throw notFoundResponse();\n return c.json(json);\n });\n\n app.patch(\"/repos/:owner/:repo/comments/:comment_id\", async (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n\n assertRepoWrite(gh, c.get(\"authUser\"), repo);\n\n const commentId = parseInt(c.req.param(\"comment_id\")!, 10);\n if (!Number.isFinite(commentId)) throw notFoundResponse();\n\n let comment = getCommentForRepo(gh, repo, commentId, \"commit\");\n if (!comment) throw notFoundResponse();\n\n const body = await parseJsonBody(c);\n if (typeof body.body !== \"string\") {\n throw new ApiError(422, \"Validation failed\");\n }\n\n comment = gh.comments.update(comment.id, { body: body.body })!;\n const json = formatComment(comment, gh, baseUrl);\n if (!json) throw notFoundResponse();\n return c.json(json);\n });\n\n app.delete(\"/repos/:owner/:repo/comments/:comment_id\", (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n\n assertRepoWrite(gh, c.get(\"authUser\"), repo);\n\n const commentId = parseInt(c.req.param(\"comment_id\")!, 10);\n if (!Number.isFinite(commentId)) throw notFoundResponse();\n\n const comment = getCommentForRepo(gh, repo, commentId, \"commit\");\n if (!comment) throw notFoundResponse();\n\n gh.comments.delete(comment.id);\n return c.body(null, 204);\n });\n\n app.get(\"/repos/:owner/:repo/comments\", (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n assertRepoRead(gh, c.get(\"authUser\"), repo);\n\n const { page, per_page } = parsePagination(c);\n const { sort, direction } = parseCommentSort(c, \"asc\");\n\n let list = gh.comments.findBy(\"repo_id\", repo.id).filter((x) => x.comment_type === \"commit\");\n list = sortComments(list, sort, direction);\n const total = list.length;\n setLinkHeader(c, total, page, per_page);\n const start = (page - 1) * per_page;\n const pageItems = list.slice(start, start + per_page);\n const body = pageItems\n .map((x) => formatComment(x, gh, baseUrl))\n .filter((x): x is NonNullable<typeof x> => x !== null);\n return c.json(body);\n });\n\n // --- Per-issue / per-PR / per-commit ---\n\n app.get(\"/repos/:owner/:repo/issues/:issue_number/comments\", (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n assertRepoRead(gh, c.get(\"authUser\"), repo);\n if (!repo.has_issues) throw notFoundResponse();\n\n const issueNumber = parseInt(c.req.param(\"issue_number\")!, 10);\n if (!Number.isFinite(issueNumber)) throw notFoundResponse();\n\n const issue = findIssueByNumber(gh, repo.id, issueNumber);\n if (!issue) throw notFoundResponse();\n\n const { page, per_page } = parsePagination(c);\n const { sort, direction } = parseCommentSort(c, \"asc\");\n\n let list = gh.comments\n .findBy(\"repo_id\", repo.id)\n .filter((x) => x.comment_type === \"issue\" && x.issue_number === issueNumber);\n list = sortComments(list, sort, direction);\n const total = list.length;\n setLinkHeader(c, total, page, per_page);\n const start = (page - 1) * per_page;\n const pageItems = list.slice(start, start + per_page);\n const body = pageItems\n .map((x) => formatComment(x, gh, baseUrl))\n .filter((x): x is NonNullable<typeof x> => x !== null);\n return c.json(body);\n });\n\n app.post(\"/repos/:owner/:repo/issues/:issue_number/comments\", async (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n if (!repo.has_issues) throw notFoundResponse();\n\n const actor = assertRepoWrite(gh, c.get(\"authUser\"), repo);\n\n const issueNumber = parseInt(c.req.param(\"issue_number\")!, 10);\n if (!Number.isFinite(issueNumber)) throw notFoundResponse();\n\n const issue = findIssueByNumber(gh, repo.id, issueNumber);\n if (!issue) throw notFoundResponse();\n\n const raw = await parseJsonBody(c);\n if (typeof raw.body !== \"string\" || !raw.body.trim()) {\n throw new ApiError(422, \"Validation failed\");\n }\n\n const row = gh.comments.insert({\n node_id: \"\",\n repo_id: repo.id,\n issue_number: issueNumber,\n pull_number: null,\n commit_sha: null,\n body: raw.body,\n user_id: actor.id,\n in_reply_to_id: null,\n path: null,\n position: null,\n line: null,\n side: null,\n subject_type: null,\n comment_type: \"issue\",\n review_id: null,\n } as Omit<GitHubComment, \"id\" | \"created_at\" | \"updated_at\">);\n gh.comments.update(row.id, { node_id: generateNodeId(\"IssueComment\", row.id) });\n const comment = gh.comments.get(row.id)!;\n\n adjustIssueCommentCount(gh, issue, 1);\n\n const ownerLogin = ownerLoginOf(gh, repo);\n const commentFmt = formatComment(comment, gh, baseUrl)!;\n\n webhooks.dispatch(\n \"issue_comment\",\n \"created\",\n {\n action: \"created\",\n comment: commentFmt,\n issue: formatIssue(issue, gh, baseUrl),\n repository: formatRepo(repo, gh, baseUrl),\n sender: formatUser(actor, baseUrl),\n },\n ownerLogin,\n repo.name,\n );\n\n return c.json(commentFmt, 201);\n });\n\n app.get(\"/repos/:owner/:repo/pulls/:pull_number/comments\", (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n assertRepoRead(gh, c.get(\"authUser\"), repo);\n\n const pullNumber = parseInt(c.req.param(\"pull_number\")!, 10);\n if (!Number.isFinite(pullNumber)) throw notFoundResponse();\n\n const pr = findPull(gh, repo.id, pullNumber);\n if (!pr) throw notFoundResponse();\n\n const { page, per_page } = parsePagination(c);\n const { sort, direction } = parseCommentSort(c, \"asc\");\n\n let list = gh.comments\n .findBy(\"repo_id\", repo.id)\n .filter((x) => x.comment_type === \"review\" && x.pull_number === pullNumber);\n list = sortComments(list, sort, direction);\n const total = list.length;\n setLinkHeader(c, total, page, per_page);\n const start = (page - 1) * per_page;\n const pageItems = list.slice(start, start + per_page);\n const body = pageItems\n .map((x) => formatComment(x, gh, baseUrl))\n .filter((x): x is NonNullable<typeof x> => x !== null);\n return c.json(body);\n });\n\n app.post(\"/repos/:owner/:repo/pulls/:pull_number/comments\", async (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n\n const actor = assertRepoWrite(gh, c.get(\"authUser\"), repo);\n\n const pullNumber = parseInt(c.req.param(\"pull_number\")!, 10);\n if (!Number.isFinite(pullNumber)) throw notFoundResponse();\n\n const pr = findPull(gh, repo.id, pullNumber);\n if (!pr) throw notFoundResponse();\n\n const raw = await parseJsonBody(c);\n if (typeof raw.body !== \"string\" || !raw.body.trim()) {\n throw new ApiError(422, \"Validation failed\");\n }\n\n const commitSha = typeof raw.commit_id === \"string\" && raw.commit_id.trim() ? raw.commit_id.trim() : pr.head_sha;\n\n let inReplyTo: number | null = null;\n if (raw.in_reply_to_id !== undefined && raw.in_reply_to_id !== null) {\n const rid =\n typeof raw.in_reply_to_id === \"number\" ? raw.in_reply_to_id : parseInt(String(raw.in_reply_to_id), 10);\n if (!Number.isFinite(rid)) throw new ApiError(422, \"Validation failed\");\n const parent = gh.comments.get(rid);\n if (\n !parent ||\n parent.repo_id !== repo.id ||\n parent.comment_type !== \"review\" ||\n parent.pull_number !== pullNumber\n ) {\n throw new ApiError(422, \"Validation failed\");\n }\n inReplyTo = rid;\n }\n\n const pathVal = raw.path === undefined || raw.path === null ? null : typeof raw.path === \"string\" ? raw.path : null;\n const position =\n raw.position === undefined || raw.position === null\n ? null\n : typeof raw.position === \"number\" && Number.isFinite(raw.position)\n ? raw.position\n : parseInt(String(raw.position), 10);\n const line =\n raw.line === undefined || raw.line === null\n ? null\n : typeof raw.line === \"number\" && Number.isFinite(raw.line)\n ? raw.line\n : parseInt(String(raw.line), 10);\n let side: \"LEFT\" | \"RIGHT\" | null = null;\n if (raw.side === \"LEFT\" || raw.side === \"RIGHT\") side = raw.side;\n else if (raw.side === null || raw.side === undefined) side = null;\n else throw new ApiError(422, \"Validation failed\");\n\n let subjectType: \"line\" | \"file\" | null = null;\n if (raw.subject_type === \"line\" || raw.subject_type === \"file\") subjectType = raw.subject_type;\n else if (raw.subject_type === null || raw.subject_type === undefined) subjectType = null;\n else throw new ApiError(422, \"Validation failed\");\n\n if (position !== null && !Number.isFinite(position)) throw new ApiError(422, \"Validation failed\");\n if (line !== null && !Number.isFinite(line)) throw new ApiError(422, \"Validation failed\");\n\n const row = gh.comments.insert({\n node_id: \"\",\n repo_id: repo.id,\n issue_number: null,\n pull_number: pullNumber,\n commit_sha: commitSha,\n body: raw.body,\n user_id: actor.id,\n in_reply_to_id: inReplyTo,\n path: pathVal,\n position: position !== null && Number.isFinite(position) ? position : null,\n line: line !== null && Number.isFinite(line) ? line : null,\n side,\n subject_type: subjectType,\n comment_type: \"review\",\n review_id: null,\n } as Omit<GitHubComment, \"id\" | \"created_at\" | \"updated_at\">);\n gh.comments.update(row.id, { node_id: generateNodeId(\"PullRequestReviewComment\", row.id) });\n const comment = gh.comments.get(row.id)!;\n\n adjustPrReviewCommentCount(gh, pr, 1);\n\n const ownerLogin = ownerLoginOf(gh, repo);\n const commentFmt = formatComment(comment, gh, baseUrl)!;\n\n webhooks.dispatch(\n \"pull_request_review_comment\",\n \"created\",\n {\n action: \"created\",\n comment: commentFmt,\n pull_request: formatPullRequest(pr, gh, baseUrl),\n repository: formatRepo(repo, gh, baseUrl),\n sender: formatUser(actor, baseUrl),\n },\n ownerLogin,\n repo.name,\n );\n\n return c.json(commentFmt, 201);\n });\n\n app.get(\"/repos/:owner/:repo/commits/:commit_sha/comments\", (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n assertRepoRead(gh, c.get(\"authUser\"), repo);\n\n const commitSha = c.req.param(\"commit_sha\")!;\n const commit = findCommitInRepo(gh, repo.id, commitSha);\n if (!commit) throw notFoundResponse();\n\n const { page, per_page } = parsePagination(c);\n const { sort, direction } = parseCommentSort(c, \"asc\");\n\n let list = gh.comments\n .findBy(\"repo_id\", repo.id)\n .filter((x) => x.comment_type === \"commit\" && x.commit_sha === commit.sha);\n list = sortComments(list, sort, direction);\n const total = list.length;\n setLinkHeader(c, total, page, per_page);\n const start = (page - 1) * per_page;\n const pageItems = list.slice(start, start + per_page);\n const body = pageItems\n .map((x) => formatComment(x, gh, baseUrl))\n .filter((x): x is NonNullable<typeof x> => x !== null);\n return c.json(body);\n });\n\n app.post(\"/repos/:owner/:repo/commits/:commit_sha/comments\", async (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n\n const actor = assertRepoWrite(gh, c.get(\"authUser\"), repo);\n\n const commitShaParam = c.req.param(\"commit_sha\")!;\n const commit = findCommitInRepo(gh, repo.id, commitShaParam);\n if (!commit) throw notFoundResponse();\n\n const raw = await parseJsonBody(c);\n if (typeof raw.body !== \"string\" || !raw.body.trim()) {\n throw new ApiError(422, \"Validation failed\");\n }\n\n const pathVal = raw.path === undefined || raw.path === null ? null : typeof raw.path === \"string\" ? raw.path : null;\n const position =\n raw.position === undefined || raw.position === null\n ? null\n : typeof raw.position === \"number\" && Number.isFinite(raw.position)\n ? raw.position\n : parseInt(String(raw.position), 10);\n const line =\n raw.line === undefined || raw.line === null\n ? null\n : typeof raw.line === \"number\" && Number.isFinite(raw.line)\n ? raw.line\n : parseInt(String(raw.line), 10);\n\n if (position !== null && !Number.isFinite(position)) throw new ApiError(422, \"Validation failed\");\n if (line !== null && !Number.isFinite(line)) throw new ApiError(422, \"Validation failed\");\n\n const row = gh.comments.insert({\n node_id: \"\",\n repo_id: repo.id,\n issue_number: null,\n pull_number: null,\n commit_sha: commit.sha,\n body: raw.body,\n user_id: actor.id,\n in_reply_to_id: null,\n path: pathVal,\n position: position !== null && Number.isFinite(position) ? position : null,\n line: line !== null && Number.isFinite(line) ? line : null,\n side: null,\n subject_type: null,\n comment_type: \"commit\",\n review_id: null,\n } as Omit<GitHubComment, \"id\" | \"created_at\" | \"updated_at\">);\n gh.comments.update(row.id, { node_id: generateNodeId(\"CommitComment\", row.id) });\n const comment = gh.comments.get(row.id)!;\n\n const commentFmt = formatComment(comment, gh, baseUrl)!;\n return c.json(commentFmt, 201);\n });\n}\n","import type { Context } from \"@emulators/core\";\nimport type { RouteContext, WebhookDispatcher } from \"@emulators/core\";\nimport { ApiError, parseJsonBody, parsePagination, setLinkHeader } from \"@emulators/core\";\nimport { getGitHubStore } from \"../store.js\";\nimport type { GitHubStore } from \"../store.js\";\nimport type { GitHubComment, GitHubPullRequest, GitHubRepo, GitHubReview, GitHubUser } from \"../entities.js\";\nimport {\n formatComment,\n formatPullRequest,\n formatRepo,\n formatReview,\n formatUser,\n generateNodeId,\n generateSha,\n lookupRepo,\n timestamp,\n} from \"../helpers.js\";\nimport { assertRepoRead, assertRepoWrite, notFoundResponse, ownerLoginOf } from \"../route-helpers.js\";\n\nfunction findPull(gh: GitHubStore, repoId: number, pullNumber: number): GitHubPullRequest | undefined {\n return gh.pullRequests.findBy(\"repo_id\", repoId).find((p) => p.number === pullNumber);\n}\n\nfunction findReview(gh: GitHubStore, repo: GitHubRepo, pullNumber: number, reviewId: number): GitHubReview | undefined {\n const r = gh.reviews.get(reviewId);\n if (!r || r.repo_id !== repo.id || r.pull_number !== pullNumber) return undefined;\n return r;\n}\n\nfunction adjustPrReviewCommentCount(gh: GitHubStore, pr: GitHubPullRequest, delta: number) {\n gh.pullRequests.update(pr.id, { review_comments: Math.max(0, pr.review_comments + delta) });\n}\n\nfunction sortComments(\n comments: GitHubComment[],\n sort: \"created\" | \"updated\",\n direction: \"asc\" | \"desc\",\n): GitHubComment[] {\n const mul = direction === \"asc\" ? 1 : -1;\n const field = sort === \"created\" ? \"created_at\" : \"updated_at\";\n const sorted = [...comments];\n sorted.sort((a, b) => {\n const as = a[field];\n const bs = b[field];\n if (as < bs) return -1 * mul;\n if (as > bs) return 1 * mul;\n return a.id < b.id ? -1 * mul : a.id > b.id ? 1 * mul : 0;\n });\n return sorted;\n}\n\nfunction parseCommentSort(c: Context, defaultDirection: \"asc\" | \"desc\") {\n const sortRaw = c.req.query(\"sort\") ?? \"created\";\n const sort: \"created\" | \"updated\" = sortRaw === \"updated\" ? \"updated\" : \"created\";\n const dirRaw = c.req.query(\"direction\");\n const direction: \"asc\" | \"desc\" = dirRaw === \"desc\" ? \"desc\" : dirRaw === \"asc\" ? \"asc\" : defaultDirection;\n return { sort, direction };\n}\n\nfunction parseSubmitEvent(raw: unknown): \"APPROVE\" | \"REQUEST_CHANGES\" | \"COMMENT\" {\n if (raw === \"APPROVE\" || raw === \"REQUEST_CHANGES\" || raw === \"COMMENT\") return raw;\n throw new ApiError(422, \"Validation failed\");\n}\n\nfunction eventToState(event: \"APPROVE\" | \"REQUEST_CHANGES\" | \"COMMENT\"): GitHubReview[\"state\"] {\n switch (event) {\n case \"APPROVE\":\n return \"APPROVED\";\n case \"REQUEST_CHANGES\":\n return \"CHANGES_REQUESTED\";\n case \"COMMENT\":\n return \"COMMENTED\";\n default:\n return \"COMMENTED\";\n }\n}\n\nfunction dispatchReviewWebhook(\n webhooks: WebhookDispatcher,\n gh: GitHubStore,\n repo: GitHubRepo,\n review: GitHubReview,\n pr: GitHubPullRequest,\n actor: GitHubUser,\n baseUrl: string,\n action: \"submitted\" | \"dismissed\",\n) {\n const ownerLogin = ownerLoginOf(gh, repo);\n const reviewFmt = formatReview(review, gh, baseUrl);\n if (!reviewFmt) return;\n webhooks.dispatch(\n \"pull_request_review\",\n action,\n {\n action,\n review: reviewFmt,\n pull_request: formatPullRequest(pr, gh, baseUrl),\n repository: formatRepo(repo, gh, baseUrl),\n sender: formatUser(actor, baseUrl),\n },\n ownerLogin,\n repo.name,\n );\n}\n\nexport function reviewsRoutes({ app, store, webhooks, baseUrl }: RouteContext): void {\n const gh = getGitHubStore(store);\n\n app.get(\"/repos/:owner/:repo/pulls/:pull_number/reviews\", (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n assertRepoRead(gh, c.get(\"authUser\"), repo);\n\n const pullNumber = parseInt(c.req.param(\"pull_number\")!, 10);\n if (!Number.isFinite(pullNumber)) throw notFoundResponse();\n\n const pr = findPull(gh, repo.id, pullNumber);\n if (!pr) throw notFoundResponse();\n\n const { page, per_page } = parsePagination(c);\n const list = gh.reviews.findBy(\"repo_id\", repo.id).filter((r) => r.pull_number === pullNumber);\n list.sort((a, b) => a.id - b.id);\n const total = list.length;\n setLinkHeader(c, total, page, per_page);\n const start = (page - 1) * per_page;\n const pageItems = list.slice(start, start + per_page);\n const body = pageItems\n .map((r) => formatReview(r, gh, baseUrl))\n .filter((x): x is NonNullable<typeof x> => x !== null);\n return c.json(body);\n });\n\n app.post(\"/repos/:owner/:repo/pulls/:pull_number/reviews\", async (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n\n const actor = assertRepoWrite(gh, c.get(\"authUser\"), repo);\n\n const pullNumber = parseInt(c.req.param(\"pull_number\")!, 10);\n if (!Number.isFinite(pullNumber)) throw notFoundResponse();\n\n const pr = findPull(gh, repo.id, pullNumber);\n if (!pr) throw notFoundResponse();\n\n const raw = await parseJsonBody(c);\n\n const eventRaw = raw.event;\n const hasEvent = eventRaw === \"APPROVE\" || eventRaw === \"REQUEST_CHANGES\" || eventRaw === \"COMMENT\";\n if (eventRaw !== undefined && eventRaw !== null && !hasEvent) {\n throw new ApiError(422, \"Validation failed\");\n }\n const event = hasEvent ? parseSubmitEvent(eventRaw) : undefined;\n\n let bodyText: string | null = null;\n if (typeof raw.body === \"string\") bodyText = raw.body;\n else if (raw.body === null || raw.body === undefined) bodyText = null;\n else throw new ApiError(422, \"Validation failed\");\n\n const commitId =\n typeof raw.commit_id === \"string\" && raw.commit_id.trim() ? raw.commit_id.trim() : pr.head_sha || generateSha();\n\n const state: GitHubReview[\"state\"] = event ? eventToState(event) : \"PENDING\";\n const submittedAt = event ? timestamp() : null;\n\n const row = gh.reviews.insert({\n node_id: \"\",\n repo_id: repo.id,\n pull_number: pullNumber,\n user_id: actor.id,\n body: bodyText,\n state,\n commit_id: commitId,\n submitted_at: submittedAt,\n } as Omit<GitHubReview, \"id\" | \"created_at\" | \"updated_at\">);\n gh.reviews.update(row.id, { node_id: generateNodeId(\"PullRequestReview\", row.id) });\n const review = gh.reviews.get(row.id)!;\n\n const commentsArr = Array.isArray(raw.comments) ? raw.comments : [];\n for (const entry of commentsArr) {\n if (!entry || typeof entry !== \"object\") throw new ApiError(422, \"Validation failed\");\n const o = entry as Record<string, unknown>;\n if (typeof o.path !== \"string\" || !o.path.trim()) throw new ApiError(422, \"Validation failed\");\n const pos =\n typeof o.position === \"number\" && Number.isFinite(o.position) ? o.position : parseInt(String(o.position), 10);\n if (!Number.isFinite(pos)) throw new ApiError(422, \"Validation failed\");\n if (typeof o.body !== \"string\") throw new ApiError(422, \"Validation failed\");\n\n const cRow = gh.comments.insert({\n node_id: \"\",\n repo_id: repo.id,\n issue_number: null,\n pull_number: pullNumber,\n commit_sha: commitId,\n body: o.body,\n user_id: actor.id,\n in_reply_to_id: null,\n path: o.path,\n position: pos,\n line: null,\n side: \"RIGHT\",\n subject_type: \"line\",\n comment_type: \"review\",\n review_id: review.id,\n } as Omit<GitHubComment, \"id\" | \"created_at\" | \"updated_at\">);\n gh.comments.update(cRow.id, { node_id: generateNodeId(\"PullRequestReviewComment\", cRow.id) });\n adjustPrReviewCommentCount(gh, pr, 1);\n }\n\n if (event) {\n dispatchReviewWebhook(webhooks, gh, repo, review, pr, actor, baseUrl, \"submitted\");\n }\n\n const json = formatReview(review, gh, baseUrl);\n if (!json) throw notFoundResponse();\n return c.json(json, 201);\n });\n\n app.get(\"/repos/:owner/:repo/pulls/:pull_number/reviews/:review_id\", (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n assertRepoRead(gh, c.get(\"authUser\"), repo);\n\n const pullNumber = parseInt(c.req.param(\"pull_number\")!, 10);\n const reviewId = parseInt(c.req.param(\"review_id\")!, 10);\n if (!Number.isFinite(pullNumber) || !Number.isFinite(reviewId)) throw notFoundResponse();\n\n const review = findReview(gh, repo, pullNumber, reviewId);\n if (!review) throw notFoundResponse();\n\n const json = formatReview(review, gh, baseUrl);\n if (!json) throw notFoundResponse();\n return c.json(json);\n });\n\n app.put(\"/repos/:owner/:repo/pulls/:pull_number/reviews/:review_id\", async (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n\n assertRepoWrite(gh, c.get(\"authUser\"), repo);\n\n const pullNumber = parseInt(c.req.param(\"pull_number\")!, 10);\n const reviewId = parseInt(c.req.param(\"review_id\")!, 10);\n if (!Number.isFinite(pullNumber) || !Number.isFinite(reviewId)) throw notFoundResponse();\n\n const existing = findReview(gh, repo, pullNumber, reviewId);\n if (!existing) throw notFoundResponse();\n if (existing.state !== \"PENDING\") {\n throw new ApiError(422, \"Validation failed\");\n }\n\n const raw = await parseJsonBody(c);\n if (typeof raw.body !== \"string\" && raw.body !== null) {\n throw new ApiError(422, \"Validation failed\");\n }\n const bodyVal = typeof raw.body === \"string\" ? raw.body : null;\n\n const updated = gh.reviews.update(reviewId, { body: bodyVal });\n if (!updated) throw notFoundResponse();\n\n const json = formatReview(updated, gh, baseUrl);\n if (!json) throw notFoundResponse();\n return c.json(json);\n });\n\n app.post(\"/repos/:owner/:repo/pulls/:pull_number/reviews/:review_id/events\", async (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n\n const actor = assertRepoWrite(gh, c.get(\"authUser\"), repo);\n\n const pullNumber = parseInt(c.req.param(\"pull_number\")!, 10);\n const reviewId = parseInt(c.req.param(\"review_id\")!, 10);\n if (!Number.isFinite(pullNumber) || !Number.isFinite(reviewId)) throw notFoundResponse();\n\n const pr = findPull(gh, repo.id, pullNumber);\n if (!pr) throw notFoundResponse();\n\n const review = findReview(gh, repo, pullNumber, reviewId);\n if (!review) throw notFoundResponse();\n if (review.state !== \"PENDING\") {\n throw new ApiError(422, \"Validation failed\");\n }\n\n const raw = await parseJsonBody(c);\n const event = parseSubmitEvent(raw.event);\n\n let bodyText: string | null = review.body;\n if (typeof raw.body === \"string\") bodyText = raw.body;\n else if (raw.body === null) bodyText = null;\n else if (raw.body !== undefined) throw new ApiError(422, \"Validation failed\");\n\n const nextState = eventToState(event);\n const updated = gh.reviews.update(reviewId, {\n body: bodyText,\n state: nextState,\n submitted_at: timestamp(),\n });\n if (!updated) throw notFoundResponse();\n\n dispatchReviewWebhook(webhooks, gh, repo, updated, pr, actor, baseUrl, \"submitted\");\n\n const json = formatReview(updated, gh, baseUrl);\n if (!json) throw notFoundResponse();\n return c.json(json);\n });\n\n app.put(\"/repos/:owner/:repo/pulls/:pull_number/reviews/:review_id/dismissals\", async (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n\n const actor = assertRepoWrite(gh, c.get(\"authUser\"), repo);\n\n const pullNumber = parseInt(c.req.param(\"pull_number\")!, 10);\n const reviewId = parseInt(c.req.param(\"review_id\")!, 10);\n if (!Number.isFinite(pullNumber) || !Number.isFinite(reviewId)) throw notFoundResponse();\n\n const pr = findPull(gh, repo.id, pullNumber);\n if (!pr) throw notFoundResponse();\n\n const review = findReview(gh, repo, pullNumber, reviewId);\n if (!review) throw notFoundResponse();\n if (review.state === \"PENDING\" || review.state === \"DISMISSED\") {\n throw new ApiError(422, \"Validation failed\");\n }\n\n const raw = await parseJsonBody(c);\n const message = typeof raw.message === \"string\" ? raw.message : null;\n\n const updated = gh.reviews.update(reviewId, {\n state: \"DISMISSED\",\n body: message !== null && message !== undefined ? message : review.body,\n });\n if (!updated) throw notFoundResponse();\n\n dispatchReviewWebhook(webhooks, gh, repo, updated, pr, actor, baseUrl, \"dismissed\");\n\n const json = formatReview(updated, gh, baseUrl);\n if (!json) throw notFoundResponse();\n return c.json(json);\n });\n\n app.get(\"/repos/:owner/:repo/pulls/:pull_number/reviews/:review_id/comments\", (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n assertRepoRead(gh, c.get(\"authUser\"), repo);\n\n const pullNumber = parseInt(c.req.param(\"pull_number\")!, 10);\n const reviewId = parseInt(c.req.param(\"review_id\")!, 10);\n if (!Number.isFinite(pullNumber) || !Number.isFinite(reviewId)) throw notFoundResponse();\n\n const review = findReview(gh, repo, pullNumber, reviewId);\n if (!review) throw notFoundResponse();\n\n const { page, per_page } = parsePagination(c);\n const { sort, direction } = parseCommentSort(c, \"asc\");\n\n let list = gh.comments\n .findBy(\"repo_id\", repo.id)\n .filter((x) => x.comment_type === \"review\" && x.pull_number === pullNumber && x.review_id === reviewId);\n list = sortComments(list, sort, direction);\n const total = list.length;\n setLinkHeader(c, total, page, per_page);\n const start = (page - 1) * per_page;\n const pageItems = list.slice(start, start + per_page);\n const body = pageItems\n .map((x) => formatComment(x, gh, baseUrl))\n .filter((x): x is NonNullable<typeof x> => x !== null);\n return c.json(body);\n });\n}\n","import type { Context } from \"@emulators/core\";\nimport type { RouteContext } from \"@emulators/core\";\nimport { ApiError, parseJsonBody, parsePagination, setLinkHeader } from \"@emulators/core\";\nimport { getGitHubStore } from \"../store.js\";\nimport type { GitHubStore } from \"../store.js\";\nimport type {\n GitHubIssue,\n GitHubIssueEvent,\n GitHubLabel,\n GitHubMilestone,\n GitHubRepo,\n GitHubUser,\n} from \"../entities.js\";\nimport {\n formatIssue,\n formatLabel,\n formatMilestone,\n formatPullRequest,\n formatRepo,\n formatUser,\n generateNodeId,\n getNextMilestoneNumber,\n lookupRepo,\n timestamp,\n} from \"../helpers.js\";\nimport { assertIssueWrite, assertRepoRead, notFoundResponse, ownerLoginOf } from \"../route-helpers.js\";\n\nfunction findIssueByNumber(gh: GitHubStore, repoId: number, issueNumber: number): GitHubIssue | undefined {\n return gh.issues.findBy(\"repo_id\", repoId).find((i) => i.number === issueNumber);\n}\n\nfunction findPullByNumber(gh: GitHubStore, repoId: number, num: number) {\n return gh.pullRequests.findBy(\"repo_id\", repoId).find((p) => p.number === num);\n}\n\nfunction formatIssueOrPullPayload(gh: GitHubStore, issue: GitHubIssue, current: GitHubIssue, baseUrl: string) {\n if (issue.is_pull_request) {\n const pr = findPullByNumber(gh, issue.repo_id, issue.number);\n return pr ? formatPullRequest(pr, gh, baseUrl) : null;\n }\n return formatIssue(current, gh, baseUrl);\n}\n\n/** Keep issue and pull request rows in sync for label_ids. */\nfunction setIssueLabelIds(gh: GitHubStore, issue: GitHubIssue, labelIds: number[]) {\n gh.issues.update(issue.id, { label_ids: labelIds });\n if (issue.is_pull_request) {\n const pr = findPullByNumber(gh, issue.repo_id, issue.number);\n if (pr) gh.pullRequests.update(pr.id, { label_ids: labelIds });\n }\n}\n\nfunction insertIssueEvent(\n gh: GitHubStore,\n repo: GitHubRepo,\n issueNumber: number,\n event: string,\n actorId: number,\n extra?: Partial<\n Pick<GitHubIssueEvent, \"commit_id\" | \"commit_url\" | \"label_name\" | \"assignee_id\" | \"milestone_title\" | \"rename\">\n >,\n): GitHubIssueEvent {\n const row = gh.issueEvents.insert({\n node_id: \"\",\n repo_id: repo.id,\n issue_number: issueNumber,\n event,\n actor_id: actorId,\n commit_id: null,\n commit_url: null,\n label_name: null,\n assignee_id: null,\n milestone_title: null,\n rename: null,\n ...extra,\n } as Omit<GitHubIssueEvent, \"id\" | \"created_at\" | \"updated_at\">);\n gh.issueEvents.update(row.id, { node_id: generateNodeId(\"IssueEvent\", row.id) });\n return gh.issueEvents.get(row.id)!;\n}\n\nfunction randomLabelColor(): string {\n return Math.floor(Math.random() * 0xffffff)\n .toString(16)\n .padStart(6, \"0\");\n}\n\nfunction normalizeColor(raw: unknown): string {\n if (typeof raw !== \"string\" || !raw.trim()) {\n throw new ApiError(422, \"Validation failed\");\n }\n const s = raw.trim().replace(/^#/, \"\");\n if (!/^[0-9a-fA-F]{6}$/.test(s)) {\n throw new ApiError(422, \"Validation failed\");\n }\n return s.toLowerCase();\n}\n\nfunction getOrCreateLabel(gh: GitHubStore, repo: GitHubRepo, name: string): GitHubLabel {\n const existing = gh.labels.findBy(\"repo_id\", repo.id).find((l) => l.name === name);\n if (existing) return existing;\n const label = gh.labels.insert({\n node_id: \"\",\n repo_id: repo.id,\n name,\n description: null,\n color: randomLabelColor(),\n default: false,\n } as Omit<GitHubLabel, \"id\" | \"created_at\" | \"updated_at\">);\n gh.labels.update(label.id, { node_id: generateNodeId(\"Label\", label.id) });\n return gh.labels.get(label.id)!;\n}\n\nasync function parseLabelNamesFromBody(c: Context): Promise<string[]> {\n const raw = await c.req.json().catch(() => null);\n if (raw === null) throw new ApiError(422, \"Validation failed\");\n let arr: unknown[];\n if (Array.isArray(raw)) {\n arr = raw;\n } else if (typeof raw === \"object\" && raw !== null && Array.isArray((raw as { labels?: unknown }).labels)) {\n arr = (raw as { labels: unknown[] }).labels;\n } else {\n throw new ApiError(422, \"Validation failed\");\n }\n const names = arr.filter((x): x is string => typeof x === \"string\" && x.length > 0);\n if (names.length !== arr.length) throw new ApiError(422, \"Validation failed\");\n return names;\n}\n\nfunction removeLabelFromAllIssuesAndPrs(gh: GitHubStore, repoId: number, labelId: number) {\n for (const i of gh.issues.findBy(\"repo_id\", repoId)) {\n if (i.label_ids.includes(labelId)) {\n const next = i.label_ids.filter((id) => id !== labelId);\n setIssueLabelIds(gh, i, next);\n }\n }\n}\n\nfunction recalcMilestoneIssueCounts(gh: GitHubStore, repoId: number, milestoneId: number): GitHubMilestone | undefined {\n const m = gh.milestones.get(milestoneId);\n if (!m) return undefined;\n const items = gh.issues.findBy(\"repo_id\", repoId).filter((i) => i.milestone_id === milestoneId);\n let open = 0;\n let closed = 0;\n for (const i of items) {\n if (i.state === \"open\") open++;\n else closed++;\n }\n return gh.milestones.update(milestoneId, { open_issues: open, closed_issues: closed }) ?? m;\n}\n\nfunction sortMilestones(\n list: GitHubMilestone[],\n sort: \"due_on\" | \"completeness\",\n direction: \"asc\" | \"desc\",\n): GitHubMilestone[] {\n const mul = direction === \"asc\" ? 1 : -1;\n const sorted = [...list];\n sorted.sort((a, b) => {\n if (sort === \"due_on\") {\n const aNull = a.due_on === null;\n const bNull = b.due_on === null;\n if (aNull && bNull) return 0;\n // Asc: no due date last. Desc: no due date first (GitHub-style).\n if (aNull) return direction === \"asc\" ? 1 : -1;\n if (bNull) return direction === \"asc\" ? -1 : 1;\n const cmp = a.due_on! < b.due_on! ? -1 : a.due_on! > b.due_on! ? 1 : 0;\n return cmp * mul;\n }\n const totalA = a.open_issues + a.closed_issues;\n const totalB = b.open_issues + b.closed_issues;\n const pctA = totalA === 0 ? 0 : a.closed_issues / totalA;\n const pctB = totalB === 0 ? 0 : b.closed_issues / totalB;\n const cmp = pctA < pctB ? -1 : pctA > pctB ? 1 : 0;\n return cmp * mul;\n });\n return sorted;\n}\n\nexport function labelsAndMilestonesRoutes({ app, store, webhooks, baseUrl }: RouteContext): void {\n const gh = getGitHubStore(store);\n\n app.get(\"/repos/:owner/:repo/labels\", (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n assertRepoRead(gh, c.get(\"authUser\"), repo);\n\n const { page, per_page } = parsePagination(c);\n const list = gh.labels.findBy(\"repo_id\", repo.id).slice();\n list.sort((a, b) => a.name.localeCompare(b.name));\n const total = list.length;\n setLinkHeader(c, total, page, per_page);\n const start = (page - 1) * per_page;\n const pageItems = list.slice(start, start + per_page);\n return c.json(pageItems.map((l) => formatLabel(l, repo, baseUrl)));\n });\n\n app.post(\"/repos/:owner/:repo/labels\", async (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n const actor = assertIssueWrite(gh, c.get(\"authUser\"), repo);\n\n const body = await parseJsonBody(c);\n const name = typeof body.name === \"string\" ? body.name.trim() : \"\";\n if (!name) throw new ApiError(422, \"Validation failed\");\n\n const dup = gh.labels.findBy(\"repo_id\", repo.id).find((l) => l.name === name);\n if (dup) throw new ApiError(422, \"Validation failed\");\n\n const color = body.color !== undefined && body.color !== null ? normalizeColor(body.color) : randomLabelColor();\n const description =\n typeof body.description === \"string\" || body.description === null ? (body.description as string | null) : null;\n\n const row = gh.labels.insert({\n node_id: \"\",\n repo_id: repo.id,\n name,\n description,\n color,\n default: false,\n } as Omit<GitHubLabel, \"id\" | \"created_at\" | \"updated_at\">);\n gh.labels.update(row.id, { node_id: generateNodeId(\"Label\", row.id) });\n const label = gh.labels.get(row.id)!;\n\n const ownerLogin = ownerLoginOf(gh, repo);\n webhooks.dispatch(\n \"label\",\n \"created\",\n {\n action: \"created\",\n label: formatLabel(label, repo, baseUrl),\n repository: formatRepo(repo, gh, baseUrl),\n sender: formatUser(actor, baseUrl),\n },\n ownerLogin,\n repo.name,\n );\n\n return c.json(formatLabel(label, repo, baseUrl), 201);\n });\n\n app.get(\"/repos/:owner/:repo/labels/:name\", (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n assertRepoRead(gh, c.get(\"authUser\"), repo);\n\n const rawName = c.req.param(\"name\")!;\n const name = decodeURIComponent(rawName);\n const label = gh.labels.findBy(\"repo_id\", repo.id).find((l) => l.name === name);\n if (!label) throw notFoundResponse();\n return c.json(formatLabel(label, repo, baseUrl));\n });\n\n app.patch(\"/repos/:owner/:repo/labels/:name\", async (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n const actor = assertIssueWrite(gh, c.get(\"authUser\"), repo);\n\n const rawName = c.req.param(\"name\")!;\n const name = decodeURIComponent(rawName);\n let label = gh.labels.findBy(\"repo_id\", repo.id).find((l) => l.name === name);\n if (!label) throw notFoundResponse();\n const labelId = label.id;\n\n const body = await parseJsonBody(c);\n const patch: Partial<GitHubLabel> = {};\n if (typeof body.new_name === \"string\" && body.new_name.trim()) {\n const nn = body.new_name.trim();\n const clash = gh.labels.findBy(\"repo_id\", repo.id).find((l) => l.name === nn && l.id !== labelId);\n if (clash) throw new ApiError(422, \"Validation failed\");\n patch.name = nn;\n }\n if (body.color !== undefined) {\n patch.color = normalizeColor(body.color);\n }\n if (\"description\" in body) {\n patch.description =\n typeof body.description === \"string\" || body.description === null ? (body.description as string | null) : null;\n }\n\n const updated = gh.labels.update(labelId, patch);\n if (!updated) throw notFoundResponse();\n label = updated;\n\n const ownerLogin = ownerLoginOf(gh, repo);\n webhooks.dispatch(\n \"label\",\n \"edited\",\n {\n action: \"edited\",\n label: formatLabel(label, repo, baseUrl),\n repository: formatRepo(repo, gh, baseUrl),\n sender: formatUser(actor, baseUrl),\n },\n ownerLogin,\n repo.name,\n );\n\n return c.json(formatLabel(label, repo, baseUrl));\n });\n\n app.delete(\"/repos/:owner/:repo/labels/:name\", (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n const actor = assertIssueWrite(gh, c.get(\"authUser\"), repo);\n\n const rawName = c.req.param(\"name\")!;\n const name = decodeURIComponent(rawName);\n const label = gh.labels.findBy(\"repo_id\", repo.id).find((l) => l.name === name);\n if (!label) throw notFoundResponse();\n\n removeLabelFromAllIssuesAndPrs(gh, repo.id, label.id);\n gh.labels.delete(label.id);\n\n const ownerLogin = ownerLoginOf(gh, repo);\n webhooks.dispatch(\n \"label\",\n \"deleted\",\n {\n action: \"deleted\",\n label: formatLabel(label, repo, baseUrl),\n repository: formatRepo(repo, gh, baseUrl),\n sender: formatUser(actor, baseUrl),\n },\n ownerLogin,\n repo.name,\n );\n\n return c.body(null, 204);\n });\n\n app.get(\"/repos/:owner/:repo/issues/:issue_number/labels\", (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n assertRepoRead(gh, c.get(\"authUser\"), repo);\n if (!repo.has_issues) throw notFoundResponse();\n\n const issueNumber = parseInt(c.req.param(\"issue_number\")!, 10);\n if (!Number.isFinite(issueNumber)) throw notFoundResponse();\n\n const issue = findIssueByNumber(gh, repo.id, issueNumber);\n if (!issue) throw notFoundResponse();\n\n const labels = issue.label_ids\n .map((id) => gh.labels.get(id))\n .filter(Boolean)\n .map((l) => formatLabel(l!, repo, baseUrl));\n return c.json(labels);\n });\n\n app.post(\"/repos/:owner/:repo/issues/:issue_number/labels\", async (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n const actor = assertIssueWrite(gh, c.get(\"authUser\"), repo);\n if (!repo.has_issues) throw notFoundResponse();\n\n const issueNumber = parseInt(c.req.param(\"issue_number\")!, 10);\n if (!Number.isFinite(issueNumber)) throw notFoundResponse();\n\n const issue = findIssueByNumber(gh, repo.id, issueNumber);\n if (!issue) throw notFoundResponse();\n\n const names = await parseLabelNamesFromBody(c);\n const prev = new Set(issue.label_ids);\n const ids = [...prev];\n for (const n of names) {\n const label = getOrCreateLabel(gh, repo, n);\n if (!ids.includes(label.id)) ids.push(label.id);\n }\n setIssueLabelIds(gh, issue, ids);\n\n const ownerLogin = ownerLoginOf(gh, repo);\n const after = gh.issues.get(issue.id)!;\n for (const id of after.label_ids) {\n if (!prev.has(id)) {\n const lbl = gh.labels.get(id);\n if (lbl) {\n insertIssueEvent(gh, repo, issue.number, \"labeled\", actor.id, { label_name: lbl.name });\n webhooks.dispatch(\n \"issues\",\n \"labeled\",\n {\n action: \"labeled\",\n issue: formatIssueOrPullPayload(gh, issue, after, baseUrl),\n label: lbl ? { name: lbl.name, color: lbl.color } : null,\n repository: formatRepo(repo, gh, baseUrl),\n sender: formatUser(actor, baseUrl),\n },\n ownerLogin,\n repo.name,\n );\n }\n }\n }\n\n const labelsJson = after.label_ids\n .map((id) => gh.labels.get(id))\n .filter(Boolean)\n .map((l) => formatLabel(l!, repo, baseUrl));\n return c.json(labelsJson);\n });\n\n app.put(\"/repos/:owner/:repo/issues/:issue_number/labels\", async (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n const actor = assertIssueWrite(gh, c.get(\"authUser\"), repo);\n if (!repo.has_issues) throw notFoundResponse();\n\n const issueNumber = parseInt(c.req.param(\"issue_number\")!, 10);\n if (!Number.isFinite(issueNumber)) throw notFoundResponse();\n\n const issue = findIssueByNumber(gh, repo.id, issueNumber);\n if (!issue) throw notFoundResponse();\n\n const names = await parseLabelNamesFromBody(c);\n const newIds = [...new Set(names.map((n) => getOrCreateLabel(gh, repo, n).id))];\n const prev = new Set(issue.label_ids);\n\n setIssueLabelIds(gh, issue, newIds);\n const after = gh.issues.get(issue.id)!;\n\n const ownerLogin = ownerLoginOf(gh, repo);\n for (const id of prev) {\n if (!newIds.includes(id)) {\n const lbl = gh.labels.get(id);\n insertIssueEvent(gh, repo, issue.number, \"unlabeled\", actor.id, { label_name: lbl?.name ?? null });\n webhooks.dispatch(\n \"issues\",\n \"unlabeled\",\n {\n action: \"unlabeled\",\n issue: formatIssueOrPullPayload(gh, issue, after, baseUrl),\n label: lbl ? { name: lbl.name, color: lbl.color } : null,\n repository: formatRepo(repo, gh, baseUrl),\n sender: formatUser(actor, baseUrl),\n },\n ownerLogin,\n repo.name,\n );\n }\n }\n for (const id of newIds) {\n if (!prev.has(id)) {\n const lbl = gh.labels.get(id);\n if (lbl) {\n insertIssueEvent(gh, repo, issue.number, \"labeled\", actor.id, { label_name: lbl.name });\n webhooks.dispatch(\n \"issues\",\n \"labeled\",\n {\n action: \"labeled\",\n issue: formatIssueOrPullPayload(gh, issue, after, baseUrl),\n label: { name: lbl.name, color: lbl.color },\n repository: formatRepo(repo, gh, baseUrl),\n sender: formatUser(actor, baseUrl),\n },\n ownerLogin,\n repo.name,\n );\n }\n }\n }\n\n const labelsJson = after.label_ids\n .map((id) => gh.labels.get(id))\n .filter(Boolean)\n .map((l) => formatLabel(l!, repo, baseUrl));\n return c.json(labelsJson);\n });\n\n app.delete(\"/repos/:owner/:repo/issues/:issue_number/labels/:name\", (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n const actor = assertIssueWrite(gh, c.get(\"authUser\"), repo);\n if (!repo.has_issues) throw notFoundResponse();\n\n const issueNumber = parseInt(c.req.param(\"issue_number\")!, 10);\n if (!Number.isFinite(issueNumber)) throw notFoundResponse();\n\n const issue = findIssueByNumber(gh, repo.id, issueNumber);\n if (!issue) throw notFoundResponse();\n\n const rawLabelName = c.req.param(\"name\")!;\n const labelName = decodeURIComponent(rawLabelName);\n const label = gh.labels.findBy(\"repo_id\", repo.id).find((l) => l.name === labelName);\n if (!label || !issue.label_ids.includes(label.id)) throw notFoundResponse();\n\n const next = issue.label_ids.filter((id) => id !== label.id);\n setIssueLabelIds(gh, issue, next);\n const after = gh.issues.get(issue.id)!;\n\n insertIssueEvent(gh, repo, issue.number, \"unlabeled\", actor.id, { label_name: label.name });\n const ownerLogin = ownerLoginOf(gh, repo);\n webhooks.dispatch(\n \"issues\",\n \"unlabeled\",\n {\n action: \"unlabeled\",\n issue: formatIssueOrPullPayload(gh, issue, after, baseUrl),\n label: { name: label.name, color: label.color },\n repository: formatRepo(repo, gh, baseUrl),\n sender: formatUser(actor, baseUrl),\n },\n ownerLogin,\n repo.name,\n );\n\n const labelsJson = after.label_ids\n .map((id) => gh.labels.get(id))\n .filter(Boolean)\n .map((l) => formatLabel(l!, repo, baseUrl));\n return c.json(labelsJson);\n });\n\n app.delete(\"/repos/:owner/:repo/issues/:issue_number/labels\", (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n assertIssueWrite(gh, c.get(\"authUser\"), repo);\n if (!repo.has_issues) throw notFoundResponse();\n\n const issueNumber = parseInt(c.req.param(\"issue_number\")!, 10);\n if (!Number.isFinite(issueNumber)) throw notFoundResponse();\n\n const issue = findIssueByNumber(gh, repo.id, issueNumber);\n if (!issue) throw notFoundResponse();\n\n setIssueLabelIds(gh, issue, []);\n return c.body(null, 204);\n });\n\n app.get(\"/repos/:owner/:repo/milestones\", (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n assertRepoRead(gh, c.get(\"authUser\"), repo);\n if (!repo.has_issues) throw notFoundResponse();\n\n const stateQ = c.req.query(\"state\") ?? \"open\";\n const state: \"open\" | \"closed\" | \"all\" =\n stateQ === \"closed\" || stateQ === \"all\" || stateQ === \"open\" ? stateQ : \"open\";\n\n const sortRaw = c.req.query(\"sort\") ?? \"due_on\";\n const sort: \"due_on\" | \"completeness\" = sortRaw === \"completeness\" ? \"completeness\" : \"due_on\";\n\n const dirRaw = c.req.query(\"direction\") ?? \"desc\";\n const direction: \"asc\" | \"desc\" = dirRaw === \"asc\" ? \"asc\" : \"desc\";\n\n let list = gh.milestones.findBy(\"repo_id\", repo.id).map((m) => recalcMilestoneIssueCounts(gh, repo.id, m.id)!);\n\n if (state === \"open\") list = list.filter((m) => m.state === \"open\");\n else if (state === \"closed\") list = list.filter((m) => m.state === \"closed\");\n\n list = sortMilestones(list, sort, direction);\n\n const { page, per_page } = parsePagination(c);\n const total = list.length;\n setLinkHeader(c, total, page, per_page);\n const start = (page - 1) * per_page;\n const pageItems = list.slice(start, start + per_page);\n return c.json(pageItems.map((m) => formatMilestone(m, repo, gh, baseUrl)));\n });\n\n app.post(\"/repos/:owner/:repo/milestones\", async (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n const actor = assertIssueWrite(gh, c.get(\"authUser\"), repo);\n if (!repo.has_issues) throw notFoundResponse();\n\n const body = await parseJsonBody(c);\n const title = typeof body.title === \"string\" ? body.title.trim() : \"\";\n if (!title) throw new ApiError(422, \"Validation failed\");\n\n let state: \"open\" | \"closed\" = \"open\";\n if (body.state === \"open\" || body.state === \"closed\") state = body.state;\n\n const description =\n typeof body.description === \"string\" || body.description === null ? (body.description as string | null) : null;\n\n let due_on: string | null = null;\n if (\"due_on\" in body) {\n if (body.due_on === null) {\n due_on = null;\n } else if (typeof body.due_on === \"string\") {\n due_on = body.due_on;\n } else {\n throw new ApiError(422, \"Validation failed\");\n }\n }\n\n const num = getNextMilestoneNumber(gh, repo.id);\n const closed_at = state === \"closed\" ? timestamp() : null;\n\n const row = gh.milestones.insert({\n node_id: \"\",\n repo_id: repo.id,\n number: num,\n title,\n description,\n state,\n open_issues: 0,\n closed_issues: 0,\n due_on,\n closed_at,\n creator_id: actor.id,\n } as Omit<GitHubMilestone, \"id\" | \"created_at\" | \"updated_at\">);\n gh.milestones.update(row.id, { node_id: generateNodeId(\"Milestone\", row.id) });\n const m = recalcMilestoneIssueCounts(gh, repo.id, row.id)!;\n\n const ownerLogin = ownerLoginOf(gh, repo);\n webhooks.dispatch(\n \"milestone\",\n state === \"closed\" ? \"closed\" : \"created\",\n {\n action: state === \"closed\" ? \"closed\" : \"created\",\n milestone: formatMilestone(m, repo, gh, baseUrl),\n repository: formatRepo(repo, gh, baseUrl),\n sender: formatUser(actor, baseUrl),\n },\n ownerLogin,\n repo.name,\n );\n\n return c.json(formatMilestone(m, repo, gh, baseUrl), 201);\n });\n\n app.get(\"/repos/:owner/:repo/milestones/:milestone_number\", (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n assertRepoRead(gh, c.get(\"authUser\"), repo);\n if (!repo.has_issues) throw notFoundResponse();\n\n const n = parseInt(c.req.param(\"milestone_number\")!, 10);\n if (!Number.isFinite(n)) throw notFoundResponse();\n\n const raw = gh.milestones.findBy(\"repo_id\", repo.id).find((m) => m.number === n);\n if (!raw) throw notFoundResponse();\n const m = recalcMilestoneIssueCounts(gh, repo.id, raw.id)!;\n return c.json(formatMilestone(m, repo, gh, baseUrl));\n });\n\n app.patch(\"/repos/:owner/:repo/milestones/:milestone_number\", async (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n const actor = assertIssueWrite(gh, c.get(\"authUser\"), repo);\n if (!repo.has_issues) throw notFoundResponse();\n\n const n = parseInt(c.req.param(\"milestone_number\")!, 10);\n if (!Number.isFinite(n)) throw notFoundResponse();\n\n let m = gh.milestones.findBy(\"repo_id\", repo.id).find((x) => x.number === n);\n if (!m) throw notFoundResponse();\n\n const body = await parseJsonBody(c);\n const patch: Partial<GitHubMilestone> = {};\n\n if (typeof body.title === \"string\") patch.title = body.title;\n if (body.state === \"open\" || body.state === \"closed\") {\n patch.state = body.state;\n }\n if (\"description\" in body) {\n patch.description =\n typeof body.description === \"string\" || body.description === null ? (body.description as string | null) : null;\n }\n if (\"due_on\" in body) {\n if (body.due_on === null) patch.due_on = null;\n else if (typeof body.due_on === \"string\") patch.due_on = body.due_on;\n else throw new ApiError(422, \"Validation failed\");\n }\n\n const prevState = m.state;\n if (patch.state === \"closed\" && prevState === \"open\") {\n patch.closed_at = m.closed_at ?? timestamp();\n } else if (patch.state === \"open\" && prevState === \"closed\") {\n patch.closed_at = null;\n }\n\n const updated = gh.milestones.update(m.id, patch);\n if (!updated) throw notFoundResponse();\n m = recalcMilestoneIssueCounts(gh, repo.id, updated.id)!;\n\n const ownerLogin = ownerLoginOf(gh, repo);\n if (patch.state === \"closed\" && prevState === \"open\") {\n webhooks.dispatch(\n \"milestone\",\n \"closed\",\n {\n action: \"closed\",\n milestone: formatMilestone(m, repo, gh, baseUrl),\n repository: formatRepo(repo, gh, baseUrl),\n sender: formatUser(actor, baseUrl),\n },\n ownerLogin,\n repo.name,\n );\n } else if (patch.state === \"open\" && prevState === \"closed\") {\n webhooks.dispatch(\n \"milestone\",\n \"opened\",\n {\n action: \"opened\",\n milestone: formatMilestone(m, repo, gh, baseUrl),\n repository: formatRepo(repo, gh, baseUrl),\n sender: formatUser(actor, baseUrl),\n },\n ownerLogin,\n repo.name,\n );\n } else {\n webhooks.dispatch(\n \"milestone\",\n \"edited\",\n {\n action: \"edited\",\n milestone: formatMilestone(m, repo, gh, baseUrl),\n repository: formatRepo(repo, gh, baseUrl),\n sender: formatUser(actor, baseUrl),\n },\n ownerLogin,\n repo.name,\n );\n }\n\n return c.json(formatMilestone(m, repo, gh, baseUrl));\n });\n\n app.delete(\"/repos/:owner/:repo/milestones/:milestone_number\", (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n const actor = assertIssueWrite(gh, c.get(\"authUser\"), repo);\n if (!repo.has_issues) throw notFoundResponse();\n\n const n = parseInt(c.req.param(\"milestone_number\")!, 10);\n if (!Number.isFinite(n)) throw notFoundResponse();\n\n const m = gh.milestones.findBy(\"repo_id\", repo.id).find((x) => x.number === n);\n if (!m) throw notFoundResponse();\n\n for (const i of gh.issues.findBy(\"repo_id\", repo.id)) {\n if (i.milestone_id === m.id) gh.issues.update(i.id, { milestone_id: null });\n }\n for (const p of gh.pullRequests.findBy(\"repo_id\", repo.id)) {\n if (p.milestone_id === m.id) gh.pullRequests.update(p.id, { milestone_id: null });\n }\n\n gh.milestones.delete(m.id);\n\n const ownerLogin = ownerLoginOf(gh, repo);\n webhooks.dispatch(\n \"milestone\",\n \"deleted\",\n {\n action: \"deleted\",\n milestone: formatMilestone(m, repo, gh, baseUrl),\n repository: formatRepo(repo, gh, baseUrl),\n sender: formatUser(actor, baseUrl),\n },\n ownerLogin,\n repo.name,\n );\n\n return c.body(null, 204);\n });\n\n app.get(\"/repos/:owner/:repo/milestones/:milestone_number/labels\", (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n assertRepoRead(gh, c.get(\"authUser\"), repo);\n if (!repo.has_issues) throw notFoundResponse();\n\n const n = parseInt(c.req.param(\"milestone_number\")!, 10);\n if (!Number.isFinite(n)) throw notFoundResponse();\n\n const ms = gh.milestones.findBy(\"repo_id\", repo.id).find((m) => m.number === n);\n if (!ms) throw notFoundResponse();\n\n const { page, per_page } = parsePagination(c);\n\n const labelIdSet = new Set<number>();\n for (const i of gh.issues.findBy(\"repo_id\", repo.id)) {\n if (i.milestone_id !== ms.id) continue;\n for (const lid of i.label_ids) labelIdSet.add(lid);\n }\n\n const labels = [...labelIdSet].map((id) => gh.labels.get(id)).filter(Boolean) as GitHubLabel[];\n labels.sort((a, b) => a.name.localeCompare(b.name));\n\n const total = labels.length;\n setLinkHeader(c, total, page, per_page);\n const start = (page - 1) * per_page;\n const pageItems = labels.slice(start, start + per_page);\n return c.json(pageItems.map((l) => formatLabel(l, repo, baseUrl)));\n });\n}\n","import type { RouteContext } from \"@emulators/core\";\nimport { ApiError, parseJsonBody, parsePagination, setLinkHeader } from \"@emulators/core\";\nimport { getGitHubStore } from \"../store.js\";\nimport type { GitHubStore } from \"../store.js\";\nimport type {\n GitHubBlob,\n GitHubBranch,\n GitHubBranchProtection,\n GitHubCommit,\n GitHubRef,\n GitHubRepo,\n GitHubTag,\n GitHubTree,\n GitHubUser,\n} from \"../entities.js\";\nimport {\n formatBranch,\n formatRepo,\n formatUser,\n generateNodeId,\n generateSha,\n lookupRepo,\n timestamp,\n} from \"../helpers.js\";\nimport {\n assertAuthenticatedUser,\n assertRepoAdmin,\n assertRepoRead,\n assertRepoWrite,\n getActorUser,\n notFoundResponse,\n ownerLoginOf,\n} from \"../route-helpers.js\";\n\nfunction findBranchByName(gh: GitHubStore, repoId: number, name: string) {\n return gh.branches.findBy(\"repo_id\", repoId).find((b) => b.name === name);\n}\n\nfunction findCommitBySha(gh: GitHubStore, repoId: number, sha: string) {\n return gh.commits.findBy(\"repo_id\", repoId).find((c) => c.sha === sha);\n}\n\nfunction findTreeBySha(gh: GitHubStore, repoId: number, sha: string) {\n return gh.trees.findBy(\"repo_id\", repoId).find((t) => t.sha === sha);\n}\n\nfunction findBlobBySha(gh: GitHubStore, repoId: number, sha: string) {\n return gh.blobs.findBy(\"repo_id\", repoId).find((b) => b.sha === sha);\n}\n\nfunction findTagObjectBySha(gh: GitHubStore, repoId: number, sha: string) {\n return gh.tags.findBy(\"repo_id\", repoId).find((t) => t.sha === sha);\n}\n\nfunction fullRefFromParam(refParam: string): string {\n return refParam.startsWith(\"refs/\") ? refParam : `refs/${refParam}`;\n}\n\nfunction isDescendantOf(gh: GitHubStore, repoId: number, ancestorSha: string, descendantSha: string): boolean {\n const visiting = new Set<string>();\n const stack = [descendantSha];\n while (stack.length) {\n const sha = stack.pop()!;\n if (sha === ancestorSha) return true;\n if (visiting.has(sha)) continue;\n visiting.add(sha);\n const commit = findCommitBySha(gh, repoId, sha);\n if (!commit) continue;\n for (const p of commit.parent_shas) stack.push(p);\n }\n return false;\n}\n\nfunction resolveGitObjectType(gh: GitHubStore, repoId: number, sha: string): \"commit\" | \"tag\" | \"blob\" | \"tree\" {\n if (findCommitBySha(gh, repoId, sha)) return \"commit\";\n if (findTagObjectBySha(gh, repoId, sha)) return \"tag\";\n if (findTreeBySha(gh, repoId, sha)) return \"tree\";\n if (findBlobBySha(gh, repoId, sha)) return \"blob\";\n return \"commit\";\n}\n\nfunction objectApiUrl(\n repo: GitHubRepo,\n baseUrl: string,\n type: \"commit\" | \"tag\" | \"blob\" | \"tree\",\n sha: string,\n): string {\n const repoUrl = `${baseUrl}/repos/${repo.full_name}`;\n switch (type) {\n case \"commit\":\n return `${repoUrl}/git/commits/${sha}`;\n case \"tag\":\n return `${repoUrl}/git/tags/${sha}`;\n case \"tree\":\n return `${repoUrl}/git/trees/${sha}`;\n default:\n return `${repoUrl}/git/blobs/${sha}`;\n }\n}\n\nfunction formatRefJson(gh: GitHubStore, repo: GitHubRepo, fullRef: string, sha: string, baseUrl: string) {\n const refRec = gh.refs.findBy(\"repo_id\", repo.id).find((r) => r.ref === fullRef);\n const type = resolveGitObjectType(gh, repo.id, sha);\n const shortRef = fullRef.startsWith(\"refs/\") ? fullRef.slice(5) : fullRef;\n const repoUrl = `${baseUrl}/repos/${repo.full_name}`;\n return {\n ref: fullRef,\n node_id: refRec?.node_id ?? \"\",\n url: `${repoUrl}/git/ref/${shortRef}`,\n object: {\n type,\n sha,\n url: objectApiUrl(repo, baseUrl, type, sha),\n },\n };\n}\n\nfunction syncBranchFromRef(gh: GitHubStore, repo: GitHubRepo, fullRef: string, sha: string) {\n if (!fullRef.startsWith(\"refs/heads/\")) return;\n const name = fullRef.slice(\"refs/heads/\".length);\n const existing = findBranchByName(gh, repo.id, name);\n if (existing) {\n gh.branches.update(existing.id, { sha });\n } else {\n gh.branches.insert({\n repo_id: repo.id,\n name,\n sha,\n protected: false,\n } as Omit<GitHubBranch, \"id\" | \"created_at\" | \"updated_at\">);\n }\n}\n\nfunction deleteBranchForHeadRef(gh: GitHubStore, repoId: number, fullRef: string) {\n if (!fullRef.startsWith(\"refs/heads/\")) return;\n const name = fullRef.slice(\"refs/heads/\".length);\n const b = findBranchByName(gh, repoId, name);\n if (b) gh.branches.delete(b.id);\n}\n\nfunction expandTreeEntries(\n gh: GitHubStore,\n repoId: number,\n entries: GitHubTree[\"tree\"],\n recursive: boolean,\n prefix = \"\",\n): GitHubTree[\"tree\"] {\n const out: GitHubTree[\"tree\"] = [];\n for (const e of entries) {\n const path = prefix ? `${prefix}/${e.path}` : e.path;\n if (e.type === \"blob\") {\n out.push({ ...e, path });\n } else if (e.type === \"tree\" && recursive) {\n const sub = findTreeBySha(gh, repoId, e.sha);\n if (sub) {\n out.push(...expandTreeEntries(gh, repoId, sub.tree, true, path));\n } else {\n out.push({ ...e, path });\n }\n } else {\n out.push({ ...e, path });\n }\n }\n return out.sort((a, b) => a.path.localeCompare(b.path));\n}\n\nfunction formatCommitJson(gh: GitHubStore, repo: GitHubRepo, c: GitHubCommit, baseUrl: string) {\n const repoUrl = `${baseUrl}/repos/${repo.full_name}`;\n const htmlUrl = `${baseUrl}/${repo.full_name}/commit/${c.sha}`;\n const authorUser = c.user_id ? gh.users.get(c.user_id) : null;\n return {\n sha: c.sha,\n node_id: c.node_id,\n url: `${repoUrl}/git/commits/${c.sha}`,\n html_url: htmlUrl,\n author: authorUser ? formatUser(authorUser, baseUrl) : null,\n committer: authorUser ? formatUser(authorUser, baseUrl) : null,\n parents: c.parent_shas.map((sha) => ({\n sha,\n url: `${repoUrl}/git/commits/${sha}`,\n })),\n stats: { total: 0, additions: 0, deletions: 0 },\n files: [],\n commit: {\n author: {\n name: c.author_name,\n email: c.author_email,\n date: c.author_date,\n },\n committer: {\n name: c.committer_name,\n email: c.committer_email,\n date: c.committer_date,\n },\n message: c.message,\n tree: { sha: c.tree_sha, url: `${repoUrl}/git/trees/${c.tree_sha}` },\n url: `${repoUrl}/git/commits/${c.sha}`,\n comment_count: 0,\n verification: { verified: false, reason: \"unsigned\", signature: null, payload: null, verified_at: null },\n },\n };\n}\n\nfunction protectionEntityToGitHub(gh: GitHubStore, repo: GitHubRepo, bp: GitHubBranchProtection, baseUrl: string) {\n const repoUrl = `${baseUrl}/repos/${repo.full_name}`;\n const encBranch = encodeURIComponent(bp.branch_name);\n const base = `${repoUrl}/branches/${encBranch}/protection`;\n return {\n url: base,\n required_status_checks: bp.required_status_checks\n ? {\n url: `${base}/required_status_checks`,\n strict: bp.required_status_checks.strict,\n contexts: bp.required_status_checks.contexts,\n contexts_url: `${base}/required_status_checks/contexts`,\n checks: bp.required_status_checks.contexts.map((c) => ({\n context: c,\n app_id: null,\n })),\n }\n : null,\n enforce_admins: {\n url: `${base}/enforce_admins`,\n enabled: bp.enforce_admins,\n },\n required_pull_request_reviews: bp.required_pull_request_reviews\n ? {\n url: `${base}/required_pull_request_reviews`,\n dismiss_stale_reviews: bp.required_pull_request_reviews.dismiss_stale_reviews,\n require_code_owner_reviews: bp.required_pull_request_reviews.require_code_owner_reviews,\n required_approving_review_count: bp.required_pull_request_reviews.required_approving_review_count,\n }\n : null,\n restrictions: bp.restrictions\n ? {\n url: `${base}/restrictions`,\n users_url: `${base}/restrictions/users`,\n teams_url: `${base}/restrictions/teams`,\n apps_url: `${base}/restrictions/apps`,\n users: bp.restrictions.users.map((login) => ({\n login,\n id: 0,\n node_id: \"\",\n avatar_url: `${baseUrl}/avatars/u/${login}`,\n gravatar_id: \"\",\n url: `${baseUrl}/users/${login}`,\n html_url: `${baseUrl}/${login}`,\n type: \"User\",\n site_admin: false,\n })),\n teams: bp.restrictions.teams.map((slug) => ({\n id: 0,\n node_id: \"\",\n url: `${baseUrl}/teams/0`,\n name: slug,\n slug,\n })),\n apps: [],\n }\n : null,\n required_linear_history: { enabled: bp.required_linear_history },\n allow_force_pushes: { enabled: bp.allow_force_pushes },\n allow_deletions: { enabled: bp.allow_deletions },\n required_conversation_resolution: { enabled: false },\n required_signatures: { url: `${base}/required_signatures`, enabled: bp.required_signatures },\n lock_branch: { enabled: false },\n allow_fork_syncing: { enabled: false },\n };\n}\n\nfunction parseProtectionPutBody(\n body: Record<string, unknown>,\n): Omit<GitHubBranchProtection, \"id\" | \"repo_id\" | \"branch_name\" | \"created_at\" | \"updated_at\"> {\n const rsc = body.required_status_checks;\n let required_status_checks: GitHubBranchProtection[\"required_status_checks\"] = null;\n if (rsc && typeof rsc === \"object\" && rsc !== null) {\n const o = rsc as Record<string, unknown>;\n required_status_checks = {\n strict: Boolean(o.strict),\n contexts: Array.isArray(o.contexts) ? o.contexts.filter((x): x is string => typeof x === \"string\") : [],\n };\n }\n\n let enforce_admins = false;\n const ea = body.enforce_admins;\n if (typeof ea === \"boolean\") enforce_admins = ea;\n else if (ea && typeof ea === \"object\" && \"enabled\" in ea) {\n enforce_admins = Boolean((ea as { enabled?: unknown }).enabled);\n }\n\n const rprr = body.required_pull_request_reviews;\n let required_pull_request_reviews: GitHubBranchProtection[\"required_pull_request_reviews\"] = null;\n if (rprr && typeof rprr === \"object\" && rprr !== null) {\n const o = rprr as Record<string, unknown>;\n required_pull_request_reviews = {\n required_approving_review_count:\n typeof o.required_approving_review_count === \"number\" ? o.required_approving_review_count : 1,\n dismiss_stale_reviews: Boolean(o.dismiss_stale_reviews),\n require_code_owner_reviews: Boolean(o.require_code_owner_reviews),\n };\n }\n\n const rest = body.restrictions;\n let restrictions: GitHubBranchProtection[\"restrictions\"] = null;\n if (rest && typeof rest === \"object\" && rest !== null) {\n const o = rest as Record<string, unknown>;\n restrictions = {\n users: Array.isArray(o.users)\n ? o.users\n .map((u) => (typeof u === \"string\" ? u : (u as { login?: string })?.login))\n .filter((x): x is string => typeof x === \"string\")\n : [],\n teams: Array.isArray(o.teams)\n ? o.teams\n .map((t) => (typeof t === \"string\" ? t : (t as { slug?: string })?.slug))\n .filter((x): x is string => typeof x === \"string\")\n : [],\n };\n }\n\n const rlh = body.required_linear_history;\n const required_linear_history =\n typeof rlh === \"boolean\"\n ? rlh\n : rlh && typeof rlh === \"object\" && rlh !== null\n ? Boolean((rlh as { enabled?: unknown }).enabled)\n : false;\n const afp = body.allow_force_pushes;\n const allow_force_pushes =\n typeof afp === \"boolean\"\n ? afp\n : afp && typeof afp === \"object\" && afp !== null\n ? Boolean((afp as { enabled?: unknown }).enabled)\n : false;\n const ad = body.allow_deletions;\n const allow_deletions =\n typeof ad === \"boolean\"\n ? ad\n : ad && typeof ad === \"object\" && ad !== null\n ? Boolean((ad as { enabled?: unknown }).enabled)\n : false;\n\n return {\n required_status_checks,\n enforce_admins,\n required_pull_request_reviews,\n restrictions,\n required_linear_history,\n allow_force_pushes,\n allow_deletions,\n required_signatures: Boolean(\n typeof body.required_signatures === \"boolean\"\n ? body.required_signatures\n : (body.required_signatures as { enabled?: boolean } | undefined)?.enabled,\n ),\n };\n}\n\nexport function branchesAndGitRoutes({ app, store, webhooks, baseUrl }: RouteContext): void {\n const gh = getGitHubStore(store);\n\n // --- Branches: sub-routes before generic protection/branch ---\n\n app.get(\"/repos/:owner/:repo/branches/:branch{.+}/protection/required_status_checks\", (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const branch = decodeURIComponent(c.req.param(\"branch\")!);\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n assertRepoRead(gh, c.get(\"authUser\"), repo);\n const bp = gh.branchProtections.findBy(\"repo_id\", repo.id).find((p) => p.branch_name === branch);\n if (!bp || !bp.required_status_checks) throw notFoundResponse();\n const encBranch = encodeURIComponent(branch);\n const repoUrl = `${baseUrl}/repos/${repo.full_name}`;\n const base = `${repoUrl}/branches/${encBranch}/protection/required_status_checks`;\n return c.json({\n url: base,\n strict: bp.required_status_checks.strict,\n contexts: bp.required_status_checks.contexts,\n contexts_url: `${base}/contexts`,\n checks: bp.required_status_checks.contexts.map((ctx) => ({\n context: ctx,\n app_id: null,\n })),\n });\n });\n\n app.patch(\"/repos/:owner/:repo/branches/:branch{.+}/protection/required_status_checks\", async (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const branch = decodeURIComponent(c.req.param(\"branch\")!);\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n assertRepoAdmin(gh, c.get(\"authUser\"), repo);\n const bp = gh.branchProtections.findBy(\"repo_id\", repo.id).find((p) => p.branch_name === branch);\n if (!bp) throw notFoundResponse();\n const body = await parseJsonBody(c);\n const strict = typeof body.strict === \"boolean\" ? body.strict : (bp.required_status_checks?.strict ?? false);\n const contexts = Array.isArray(body.contexts)\n ? body.contexts.filter((x): x is string => typeof x === \"string\")\n : (bp.required_status_checks?.contexts ?? []);\n gh.branchProtections.update(bp.id, {\n required_status_checks: { strict, contexts },\n });\n const encBranch = encodeURIComponent(branch);\n const repoUrl = `${baseUrl}/repos/${repo.full_name}`;\n const url = `${repoUrl}/branches/${encBranch}/protection/required_status_checks`;\n return c.json({\n url,\n strict,\n contexts,\n contexts_url: `${url}/contexts`,\n checks: contexts.map((ctx) => ({ context: ctx, app_id: null })),\n });\n });\n\n app.get(\"/repos/:owner/:repo/branches/:branch{.+}/protection/enforce_admins\", (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const branch = decodeURIComponent(c.req.param(\"branch\")!);\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n assertRepoRead(gh, c.get(\"authUser\"), repo);\n const bp = gh.branchProtections.findBy(\"repo_id\", repo.id).find((p) => p.branch_name === branch);\n if (!bp) throw notFoundResponse();\n const encBranch = encodeURIComponent(branch);\n const repoUrl = `${baseUrl}/repos/${repo.full_name}`;\n const url = `${repoUrl}/branches/${encBranch}/protection/enforce_admins`;\n return c.json({\n url,\n enabled: bp.enforce_admins,\n });\n });\n\n app.get(\"/repos/:owner/:repo/branches/:branch{.+}/protection/required_pull_request_reviews\", (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const branch = decodeURIComponent(c.req.param(\"branch\")!);\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n assertRepoRead(gh, c.get(\"authUser\"), repo);\n const bp = gh.branchProtections.findBy(\"repo_id\", repo.id).find((p) => p.branch_name === branch);\n if (!bp || !bp.required_pull_request_reviews) throw notFoundResponse();\n const encBranch = encodeURIComponent(branch);\n const repoUrl = `${baseUrl}/repos/${repo.full_name}`;\n const base = `${repoUrl}/branches/${encBranch}/protection/required_pull_request_reviews`;\n const r = bp.required_pull_request_reviews;\n return c.json({\n url: base,\n dismiss_stale_reviews: r.dismiss_stale_reviews,\n require_code_owner_reviews: r.require_code_owner_reviews,\n required_approving_review_count: r.required_approving_review_count,\n });\n });\n\n app.patch(\"/repos/:owner/:repo/branches/:branch{.+}/protection/required_pull_request_reviews\", async (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const branch = decodeURIComponent(c.req.param(\"branch\")!);\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n assertRepoAdmin(gh, c.get(\"authUser\"), repo);\n const bp = gh.branchProtections.findBy(\"repo_id\", repo.id).find((p) => p.branch_name === branch);\n if (!bp) throw notFoundResponse();\n const body = await parseJsonBody(c);\n const prev = bp.required_pull_request_reviews ?? {\n required_approving_review_count: 1,\n dismiss_stale_reviews: false,\n require_code_owner_reviews: false,\n };\n const next = {\n required_approving_review_count:\n typeof body.required_approving_review_count === \"number\"\n ? body.required_approving_review_count\n : prev.required_approving_review_count,\n dismiss_stale_reviews:\n typeof body.dismiss_stale_reviews === \"boolean\" ? body.dismiss_stale_reviews : prev.dismiss_stale_reviews,\n require_code_owner_reviews:\n typeof body.require_code_owner_reviews === \"boolean\"\n ? body.require_code_owner_reviews\n : prev.require_code_owner_reviews,\n };\n gh.branchProtections.update(bp.id, { required_pull_request_reviews: next });\n const encBranch = encodeURIComponent(branch);\n const repoUrl = `${baseUrl}/repos/${repo.full_name}`;\n const url = `${repoUrl}/branches/${encBranch}/protection/required_pull_request_reviews`;\n return c.json({\n url,\n ...next,\n });\n });\n\n app.get(\"/repos/:owner/:repo/branches/:branch{.+}/protection\", (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const branch = decodeURIComponent(c.req.param(\"branch\")!);\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n assertRepoRead(gh, c.get(\"authUser\"), repo);\n const bp = gh.branchProtections.findBy(\"repo_id\", repo.id).find((p) => p.branch_name === branch);\n if (!bp) throw notFoundResponse();\n return c.json(protectionEntityToGitHub(gh, repo, bp, baseUrl));\n });\n\n app.put(\"/repos/:owner/:repo/branches/:branch{.+}/protection\", async (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const branch = decodeURIComponent(c.req.param(\"branch\")!);\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n assertRepoAdmin(gh, c.get(\"authUser\"), repo);\n const b = findBranchByName(gh, repo.id, branch);\n if (!b) throw notFoundResponse();\n const body = await parseJsonBody(c);\n const parsed = parseProtectionPutBody(body);\n const existing = gh.branchProtections.findBy(\"repo_id\", repo.id).find((p) => p.branch_name === branch);\n if (existing) {\n gh.branchProtections.update(existing.id, { ...parsed });\n } else {\n gh.branchProtections.insert({\n repo_id: repo.id,\n branch_name: branch,\n ...parsed,\n } as Omit<GitHubBranchProtection, \"id\" | \"created_at\" | \"updated_at\">);\n }\n gh.branches.update(b.id, { protected: true });\n const bp = gh.branchProtections.findBy(\"repo_id\", repo.id).find((p) => p.branch_name === branch)!;\n webhooks.dispatch(\n \"branch_protection_rule\",\n \"edited\",\n {\n action: \"edited\",\n rule: protectionEntityToGitHub(gh, repo, bp, baseUrl),\n repository: formatRepo(repo, gh, baseUrl),\n },\n ownerLoginOf(gh, repo),\n repo.name,\n );\n return c.json(protectionEntityToGitHub(gh, repo, bp, baseUrl));\n });\n\n app.delete(\"/repos/:owner/:repo/branches/:branch{.+}/protection\", (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const branch = decodeURIComponent(c.req.param(\"branch\")!);\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n assertRepoAdmin(gh, c.get(\"authUser\"), repo);\n const bp = gh.branchProtections.findBy(\"repo_id\", repo.id).find((p) => p.branch_name === branch);\n if (bp) gh.branchProtections.delete(bp.id);\n const b = findBranchByName(gh, repo.id, branch);\n if (b) gh.branches.update(b.id, { protected: false });\n return c.body(null, 204);\n });\n\n app.get(\"/repos/:owner/:repo/branches/:branch{.+}\", (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const branchName = decodeURIComponent(c.req.param(\"branch\")!);\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n assertRepoRead(gh, c.get(\"authUser\"), repo);\n const branch = findBranchByName(gh, repo.id, branchName);\n if (!branch) throw notFoundResponse();\n const commit = findCommitBySha(gh, repo.id, branch.sha);\n const base = formatBranch(branch, repo, baseUrl);\n if (!branch.protected) return c.json(base);\n const bp = gh.branchProtections.findBy(\"repo_id\", repo.id).find((p) => p.branch_name === branchName);\n return c.json({\n ...base,\n protection: {\n enabled: true,\n required_status_checks: bp?.required_status_checks\n ? {\n enforcement_level: \"everyone\",\n contexts: bp.required_status_checks.contexts,\n checks: bp.required_status_checks.contexts.map((ctx) => ({ context: ctx, app_id: null })),\n }\n : { enforcement_level: \"off\", contexts: [], checks: [] },\n },\n protection_commit: commit\n ? {\n author: { email: commit.author_email, name: commit.author_name },\n url: `${baseUrl}/repos/${repo.full_name}/commits/${commit.sha}`,\n message: commit.message,\n html_url: `${baseUrl}/${repo.full_name}/commit/${commit.sha}`,\n }\n : null,\n });\n });\n\n app.get(\"/repos/:owner/:repo/branches\", (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n assertRepoRead(gh, c.get(\"authUser\"), repo);\n let list = [...gh.branches.findBy(\"repo_id\", repo.id)].sort((a, b) => a.name.localeCompare(b.name));\n const prot = c.req.query(\"protected\");\n if (prot === \"true\") list = list.filter((b) => b.protected);\n else if (prot === \"false\") list = list.filter((b) => !b.protected);\n const { page, per_page } = parsePagination(c);\n const total = list.length;\n const start = (page - 1) * per_page;\n const slice = list.slice(start, start + per_page);\n setLinkHeader(c, total, page, per_page);\n return c.json(slice.map((b) => formatBranch(b, repo, baseUrl)));\n });\n\n // --- Git refs ---\n\n app.get(\"/repos/:owner/:repo/git/ref/:ref{.+}\", (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const refParam = c.req.param(\"ref\")!;\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n assertRepoRead(gh, c.get(\"authUser\"), repo);\n const fullRef = fullRefFromParam(refParam);\n const r = gh.refs.findBy(\"repo_id\", repo.id).find((x) => x.ref === fullRef);\n if (!r) throw notFoundResponse();\n return c.json(formatRefJson(gh, repo, r.ref, r.sha, baseUrl));\n });\n\n app.get(\"/repos/:owner/:repo/git/matching-refs/:ref{.+}\", (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const refParam = c.req.param(\"ref\")!;\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n assertRepoRead(gh, c.get(\"authUser\"), repo);\n const prefix = fullRefFromParam(refParam);\n const matches = gh.refs\n .findBy(\"repo_id\", repo.id)\n .filter((r) => r.ref.startsWith(prefix))\n .sort((a, b) => a.ref.localeCompare(b.ref));\n return c.json(matches.map((r) => formatRefJson(gh, repo, r.ref, r.sha, baseUrl)));\n });\n\n app.post(\"/repos/:owner/:repo/git/refs\", async (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n const user = assertRepoWrite(gh, c.get(\"authUser\"), repo);\n const body = (await parseJsonBody(c)) as { ref?: unknown; sha?: unknown };\n if (typeof body.ref !== \"string\" || !body.ref.startsWith(\"refs/\")) {\n throw new ApiError(422, \"Invalid ref\");\n }\n if (typeof body.sha !== \"string\") {\n throw new ApiError(422, \"sha is required\");\n }\n const fullRef = body.ref;\n const sha = body.sha;\n if (findCommitBySha(gh, repo.id, sha) === undefined && findTagObjectBySha(gh, repo.id, sha) === undefined) {\n throw new ApiError(422, \"Invalid sha\");\n }\n if (gh.refs.findBy(\"repo_id\", repo.id).some((r) => r.ref === fullRef)) {\n throw new ApiError(422, \"Reference already exists\");\n }\n const refRow = gh.refs.insert({\n repo_id: repo.id,\n ref: fullRef,\n sha,\n node_id: \"\",\n } as Omit<GitHubRef, \"id\" | \"created_at\" | \"updated_at\">);\n gh.refs.update(refRow.id, { node_id: generateNodeId(\"Ref\", refRow.id) });\n syncBranchFromRef(gh, repo, fullRef, sha);\n webhooks.dispatch(\n \"create\",\n undefined,\n {\n ref: fullRef,\n ref_type: fullRef.startsWith(\"refs/heads/\") ? \"branch\" : \"tag\",\n master_branch: repo.default_branch,\n repository: formatRepo(repo, gh, baseUrl),\n sender: formatUser(user, baseUrl),\n },\n ownerLoginOf(gh, repo),\n repo.name,\n );\n const r = gh.refs.get(refRow.id)!;\n return c.json(formatRefJson(gh, repo, r.ref, r.sha, baseUrl), 201);\n });\n\n app.patch(\"/repos/:owner/:repo/git/refs/:ref{.+}\", async (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const refParam = c.req.param(\"ref\")!;\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n const user = assertRepoWrite(gh, c.get(\"authUser\"), repo);\n const fullRef = fullRefFromParam(refParam);\n const r = gh.refs.findBy(\"repo_id\", repo.id).find((x) => x.ref === fullRef);\n if (!r) throw notFoundResponse();\n const body = (await parseJsonBody(c)) as { sha?: unknown; force?: unknown };\n if (typeof body.sha !== \"string\") {\n throw new ApiError(422, \"sha is required\");\n }\n const newSha = body.sha;\n const force = Boolean(body.force);\n const oldSha = r.sha;\n if (findCommitBySha(gh, repo.id, newSha) === undefined && findTagObjectBySha(gh, repo.id, newSha) === undefined) {\n throw new ApiError(422, \"Invalid sha\");\n }\n if (!force) {\n const oldCommit = findCommitBySha(gh, repo.id, oldSha);\n const newCommit = findCommitBySha(gh, repo.id, newSha);\n if (!oldCommit || !newCommit) {\n throw new ApiError(422, \"Fast-forward update requires commit objects\");\n }\n if (!isDescendantOf(gh, repo.id, oldSha, newSha)) {\n throw new ApiError(422, \"Update is not a fast-forward\");\n }\n }\n gh.refs.update(r.id, { sha: newSha });\n syncBranchFromRef(gh, repo, fullRef, newSha);\n webhooks.dispatch(\n \"push\",\n undefined,\n {\n ref: fullRef,\n before: oldSha,\n after: newSha,\n repository: formatRepo(repo, gh, baseUrl),\n sender: formatUser(user, baseUrl),\n },\n ownerLoginOf(gh, repo),\n repo.name,\n );\n const updated = gh.refs.get(r.id)!;\n return c.json(formatRefJson(gh, repo, updated.ref, updated.sha, baseUrl));\n });\n\n app.delete(\"/repos/:owner/:repo/git/refs/:ref{.+}\", (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const refParam = c.req.param(\"ref\")!;\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n assertRepoWrite(gh, c.get(\"authUser\"), repo);\n const fullRef = fullRefFromParam(refParam);\n const r = gh.refs.findBy(\"repo_id\", repo.id).find((x) => x.ref === fullRef);\n if (!r) throw notFoundResponse();\n gh.refs.delete(r.id);\n deleteBranchForHeadRef(gh, repo.id, fullRef);\n return c.body(null, 204);\n });\n\n // --- Git commits ---\n\n app.get(\"/repos/:owner/:repo/git/commits/:commit_sha\", (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const commitSha = c.req.param(\"commit_sha\")!;\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n assertRepoRead(gh, c.get(\"authUser\"), repo);\n const commit = findCommitBySha(gh, repo.id, commitSha);\n if (!commit) throw notFoundResponse();\n return c.json(formatCommitJson(gh, repo, commit, baseUrl));\n });\n\n app.post(\"/repos/:owner/:repo/git/commits\", async (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n assertRepoWrite(gh, c.get(\"authUser\"), repo);\n const body = await parseJsonBody(c);\n if (typeof body.message !== \"string\") throw new ApiError(422, \"message is required\");\n if (typeof body.tree !== \"string\") throw new ApiError(422, \"tree is required\");\n if (!Array.isArray(body.parents)) throw new ApiError(422, \"parents must be an array\");\n const parents = body.parents.filter((p): p is string => typeof p === \"string\");\n const treeSha = body.tree as string;\n if (!findTreeBySha(gh, repo.id, treeSha)) throw new ApiError(422, \"Invalid tree\");\n for (const p of parents) {\n if (!findCommitBySha(gh, repo.id, p)) throw new ApiError(422, `Invalid parent ${p}`);\n }\n let author_name: string;\n let author_email: string;\n let author_date: string;\n let committer_name: string;\n let committer_email: string;\n let committer_date: string;\n const now = timestamp();\n const actor = getActorUser(gh, c.get(\"authUser\")!);\n const defaultName = actor?.name ?? actor?.login ?? \"user\";\n const defaultEmail = actor?.email ?? `${actor?.login ?? \"user\"}@users.noreply.github.com`;\n if (body.author && typeof body.author === \"object\" && body.author !== null) {\n const a = body.author as Record<string, unknown>;\n author_name = typeof a.name === \"string\" ? a.name : defaultName;\n author_email = typeof a.email === \"string\" ? a.email : defaultEmail;\n author_date = typeof a.date === \"string\" ? a.date : now;\n } else {\n author_name = defaultName;\n author_email = defaultEmail;\n author_date = now;\n }\n if (body.committer && typeof body.committer === \"object\" && body.committer !== null) {\n const a = body.committer as Record<string, unknown>;\n committer_name = typeof a.name === \"string\" ? a.name : defaultName;\n committer_email = typeof a.email === \"string\" ? a.email : defaultEmail;\n committer_date = typeof a.date === \"string\" ? a.date : now;\n } else {\n committer_name = author_name;\n committer_email = author_email;\n committer_date = author_date;\n }\n const commit = gh.commits.insert({\n repo_id: repo.id,\n sha: generateSha(),\n node_id: \"\",\n message: body.message as string,\n author_name,\n author_email,\n author_date,\n committer_name,\n committer_email,\n committer_date,\n tree_sha: treeSha,\n parent_shas: parents,\n user_id: actor?.id ?? null,\n } as Omit<GitHubCommit, \"id\" | \"created_at\" | \"updated_at\">);\n gh.commits.update(commit.id, { node_id: generateNodeId(\"Commit\", commit.id) });\n const saved = gh.commits.get(commit.id)!;\n return c.json(formatCommitJson(gh, repo, saved, baseUrl), 201);\n });\n\n // --- Git trees ---\n\n app.get(\"/repos/:owner/:repo/git/trees/:tree_sha\", (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const treeSha = c.req.param(\"tree_sha\")!;\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n assertRepoRead(gh, c.get(\"authUser\"), repo);\n const tree = findTreeBySha(gh, repo.id, treeSha);\n if (!tree) throw notFoundResponse();\n const recursive = c.req.query(\"recursive\") === \"1\" || c.req.query(\"recursive\") === \"true\";\n const repoUrl = `${baseUrl}/repos/${repo.full_name}`;\n const entries = recursive\n ? expandTreeEntries(gh, repo.id, tree.tree, true)\n : tree.tree.filter((e) => !e.path.includes(\"/\"));\n return c.json({\n sha: tree.sha,\n url: `${repoUrl}/git/trees/${tree.sha}`,\n tree: entries,\n truncated: tree.truncated,\n });\n });\n\n app.post(\"/repos/:owner/:repo/git/trees\", async (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n assertRepoWrite(gh, c.get(\"authUser\"), repo);\n const body = await parseJsonBody(c);\n if (!Array.isArray(body.tree)) throw new ApiError(422, \"tree array is required\");\n const items = body.tree as Array<{\n path?: string;\n mode?: string;\n type?: string;\n sha?: string;\n content?: string;\n }>;\n const pathMap = new Map<string, { mode: string; type: \"blob\" | \"tree\"; sha: string; size?: number }>();\n\n const baseTreeSha = typeof body.base_tree === \"string\" ? body.base_tree : undefined;\n if (baseTreeSha) {\n const base = findTreeBySha(gh, repo.id, baseTreeSha);\n if (!base) throw new ApiError(422, \"Invalid base_tree\");\n for (const e of base.tree) {\n pathMap.set(e.path, { mode: e.mode, type: e.type, sha: e.sha, size: e.size });\n }\n }\n\n for (const raw of items) {\n if (\n typeof raw.path !== \"string\" ||\n typeof raw.mode !== \"string\" ||\n (raw.type !== \"blob\" && raw.type !== \"tree\")\n ) {\n throw new ApiError(422, \"Each tree entry needs path, mode, type (blob|tree)\");\n }\n if (raw.sha !== undefined && raw.content !== undefined) {\n throw new ApiError(422, \"Cannot pass both sha and content\");\n }\n let sha = raw.sha;\n if (raw.content !== undefined) {\n const buf = Buffer.from(String(raw.content), \"utf8\");\n const blob = gh.blobs.insert({\n repo_id: repo.id,\n sha: generateSha(),\n node_id: \"\",\n content: String(raw.content),\n encoding: \"utf-8\",\n size: buf.byteLength,\n } as Omit<GitHubBlob, \"id\" | \"created_at\" | \"updated_at\">);\n gh.blobs.update(blob.id, { node_id: generateNodeId(\"Blob\", blob.id) });\n sha = blob.sha;\n }\n if (typeof sha !== \"string\") throw new ApiError(422, \"sha or content required\");\n pathMap.set(raw.path, { mode: raw.mode, type: raw.type, sha });\n }\n\n const treeEntries: GitHubTree[\"tree\"] = [...pathMap.entries()].map(([path, v]) => ({\n path,\n mode: v.mode,\n type: v.type,\n sha: v.sha,\n size: v.size,\n }));\n\n const tree = gh.trees.insert({\n repo_id: repo.id,\n sha: generateSha(),\n node_id: \"\",\n tree: treeEntries,\n truncated: false,\n } as Omit<GitHubTree, \"id\" | \"created_at\" | \"updated_at\">);\n gh.trees.update(tree.id, { node_id: generateNodeId(\"Tree\", tree.id) });\n const saved = gh.trees.get(tree.id)!;\n const repoUrl = `${baseUrl}/repos/${repo.full_name}`;\n return c.json(\n {\n sha: saved.sha,\n url: `${repoUrl}/git/trees/${saved.sha}`,\n tree: saved.tree,\n truncated: saved.truncated,\n },\n 201,\n );\n });\n\n // --- Git blobs ---\n\n app.get(\"/repos/:owner/:repo/git/blobs/:file_sha\", (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const fileSha = c.req.param(\"file_sha\")!;\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n assertRepoRead(gh, c.get(\"authUser\"), repo);\n const blob = findBlobBySha(gh, repo.id, fileSha);\n if (!blob) throw notFoundResponse();\n const repoUrl = `${baseUrl}/repos/${repo.full_name}`;\n const content = blob.encoding === \"base64\" ? blob.content : Buffer.from(blob.content, \"utf8\").toString(\"base64\");\n return c.json({\n sha: blob.sha,\n node_id: blob.node_id,\n size: blob.size,\n url: `${repoUrl}/git/blobs/${blob.sha}`,\n content,\n encoding: \"base64\",\n });\n });\n\n app.post(\"/repos/:owner/:repo/git/blobs\", async (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n assertRepoWrite(gh, c.get(\"authUser\"), repo);\n const body = (await parseJsonBody(c)) as {\n content?: unknown;\n encoding?: unknown;\n };\n if (typeof body.content !== \"string\") throw new ApiError(422, \"content is required\");\n const enc = body.encoding === \"base64\" || body.encoding === \"utf-8\" ? body.encoding : \"utf-8\";\n if (enc === \"base64\") {\n const blob = gh.blobs.insert({\n repo_id: repo.id,\n sha: generateSha(),\n node_id: \"\",\n content: body.content,\n encoding: \"base64\",\n size: Buffer.from(body.content, \"base64\").length,\n } as Omit<GitHubBlob, \"id\" | \"created_at\" | \"updated_at\">);\n gh.blobs.update(blob.id, { node_id: generateNodeId(\"Blob\", blob.id) });\n const repoUrl = `${baseUrl}/repos/${repo.full_name}`;\n const saved = gh.blobs.get(blob.id)!;\n return c.json(\n {\n sha: saved.sha,\n node_id: saved.node_id,\n url: `${repoUrl}/git/blobs/${saved.sha}`,\n size: saved.size,\n },\n 201,\n );\n }\n const raw = body.content;\n const size = Buffer.byteLength(raw, \"utf8\");\n const blob = gh.blobs.insert({\n repo_id: repo.id,\n sha: generateSha(),\n node_id: \"\",\n content: raw,\n encoding: \"utf-8\",\n size,\n } as Omit<GitHubBlob, \"id\" | \"created_at\" | \"updated_at\">);\n gh.blobs.update(blob.id, { node_id: generateNodeId(\"Blob\", blob.id) });\n const saved = gh.blobs.get(blob.id)!;\n const repoUrl = `${baseUrl}/repos/${repo.full_name}`;\n return c.json(\n {\n sha: saved.sha,\n node_id: saved.node_id,\n url: `${repoUrl}/git/blobs/${saved.sha}`,\n size: saved.size,\n },\n 201,\n );\n });\n\n // --- Git tags ---\n\n app.get(\"/repos/:owner/:repo/git/tags/:tag_sha\", (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const tagSha = c.req.param(\"tag_sha\")!;\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n assertRepoRead(gh, c.get(\"authUser\"), repo);\n const tag = findTagObjectBySha(gh, repo.id, tagSha);\n if (!tag) throw notFoundResponse();\n const repoUrl = `${baseUrl}/repos/${repo.full_name}`;\n return c.json({\n tag: tag.tag,\n sha: tag.sha,\n node_id: tag.node_id,\n url: `${repoUrl}/git/tags/${tag.sha}`,\n message: tag.message,\n tagger: {\n name: tag.tagger_name,\n email: tag.tagger_email,\n date: tag.tagger_date,\n },\n object: {\n type: tag.object_type,\n sha: tag.object_sha,\n url: objectApiUrl(repo, baseUrl, resolveGitObjectType(gh, repo.id, tag.object_sha), tag.object_sha),\n },\n verification: { verified: false, reason: \"unsigned\", signature: null, payload: null, verified_at: null },\n });\n });\n\n app.post(\"/repos/:owner/:repo/git/tags\", async (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n assertRepoWrite(gh, c.get(\"authUser\"), repo);\n const body = await parseJsonBody(c);\n if (typeof body.tag !== \"string\") throw new ApiError(422, \"tag is required\");\n if (typeof body.message !== \"string\") throw new ApiError(422, \"message is required\");\n if (typeof body.object !== \"string\") throw new ApiError(422, \"object is required\");\n if (typeof body.type !== \"string\") throw new ApiError(422, \"type is required\");\n const now = timestamp();\n let tagger_name = \"user\";\n let tagger_email = \"user@users.noreply.github.com\";\n let tagger_date = now;\n if (body.tagger && typeof body.tagger === \"object\" && body.tagger !== null) {\n const t = body.tagger as Record<string, unknown>;\n if (typeof t.name === \"string\") tagger_name = t.name;\n if (typeof t.email === \"string\") tagger_email = t.email;\n if (typeof t.date === \"string\") tagger_date = t.date;\n }\n const tag = gh.tags.insert({\n repo_id: repo.id,\n tag: body.tag as string,\n sha: generateSha(),\n node_id: \"\",\n message: body.message as string,\n tagger_name,\n tagger_email,\n tagger_date,\n object_type: body.type as string,\n object_sha: body.object as string,\n } as Omit<GitHubTag, \"id\" | \"created_at\" | \"updated_at\">);\n gh.tags.update(tag.id, { node_id: generateNodeId(\"Tag\", tag.id) });\n const saved = gh.tags.get(tag.id)!;\n const repoUrl = `${baseUrl}/repos/${repo.full_name}`;\n return c.json(\n {\n tag: saved.tag,\n sha: saved.sha,\n node_id: saved.node_id,\n url: `${repoUrl}/git/tags/${saved.sha}`,\n message: saved.message,\n tagger: {\n name: saved.tagger_name,\n email: saved.tagger_email,\n date: saved.tagger_date,\n },\n object: {\n type: saved.object_type,\n sha: saved.object_sha,\n url: objectApiUrl(repo, baseUrl, resolveGitObjectType(gh, repo.id, saved.object_sha), saved.object_sha),\n },\n verification: { verified: false, reason: \"unsigned\", signature: null, payload: null, verified_at: null },\n },\n 201,\n );\n });\n}\n","import type { RouteContext, AuthUser } from \"@emulators/core\";\nimport { ApiError, parseJsonBody, parsePagination, setLinkHeader, unauthorized, forbidden } from \"@emulators/core\";\nimport { getGitHubStore } from \"../store.js\";\nimport type { GitHubStore } from \"../store.js\";\nimport type { GitHubOrg, GitHubRepo, GitHubTeam, GitHubUser } from \"../entities.js\";\nimport {\n formatOrgBrief,\n formatOrgFull,\n formatRepo,\n formatTeamBrief,\n formatUser,\n generateNodeId,\n lookupOwner,\n lookupRepo,\n} from \"../helpers.js\";\n\nconst MEMBERS_TEAM_SLUG = \"members\";\n\nfunction notFound() {\n return new ApiError(404, \"Not Found\");\n}\n\nfunction requireAuthUser(c: { get: (k: \"authUser\") => AuthUser | undefined }): AuthUser {\n const u = c.get(\"authUser\");\n if (!u) throw unauthorized();\n return u;\n}\n\nfunction requireOrgAdmin(gh: GitHubStore, org: GitHubOrg, auth: AuthUser): void {\n const user = gh.users.findOneBy(\"login\", auth.login);\n if (!user) throw forbidden();\n const role = orgRoleForUser(gh, org.id, user.id);\n if (role !== \"admin\") throw forbidden();\n}\n\nfunction getOrgByLogin(gh: GitHubStore, login: string): GitHubOrg | undefined {\n return gh.orgs.findOneBy(\"login\", login);\n}\n\nfunction teamsForOrg(gh: GitHubStore, orgId: number): GitHubTeam[] {\n return gh.teams.findBy(\"org_id\", orgId);\n}\n\nfunction getTeamByOrgSlug(gh: GitHubStore, org: GitHubOrg, slug: string): GitHubTeam | undefined {\n return teamsForOrg(gh, org.id).find((t) => t.slug === slug);\n}\n\nfunction slugifyFromName(name: string): string {\n const s = name\n .trim()\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, \"-\")\n .replace(/^-+|-+$/g, \"\");\n return s || \"team\";\n}\n\nfunction uniqueTeamSlug(gh: GitHubStore, orgId: number, base: string): string {\n let slug = base;\n let n = 2;\n const taken = (s: string) => teamsForOrg(gh, orgId).some((t) => t.slug === s);\n while (taken(slug)) {\n slug = `${base}-${n}`;\n n += 1;\n }\n return slug;\n}\n\nfunction orgsForAuthenticatedUser(gh: GitHubStore, userId: number): GitHubOrg[] {\n const memberships = gh.teamMembers.findBy(\"user_id\", userId);\n const orgIds = new Set<number>();\n for (const m of memberships) {\n const team = gh.teams.get(m.team_id);\n if (team) orgIds.add(team.org_id);\n }\n const orgs = [...orgIds].map((id) => gh.orgs.get(id)).filter((o): o is GitHubOrg => Boolean(o));\n orgs.sort((a, b) => a.login.localeCompare(b.login));\n return orgs;\n}\n\ntype OrgMemberRow = { user: GitHubUser; orgRole: \"admin\" | \"member\" };\n\nfunction listOrgMembersDeduped(gh: GitHubStore, orgId: number): OrgMemberRow[] {\n const byUser = new Map<number, { user: GitHubUser; isAdmin: boolean }>();\n for (const team of teamsForOrg(gh, orgId)) {\n for (const m of gh.teamMembers.findBy(\"team_id\", team.id)) {\n const user = gh.users.get(m.user_id);\n if (!user) continue;\n const isAdmin = m.role === \"maintainer\";\n const prev = byUser.get(user.id);\n if (!prev) {\n byUser.set(user.id, { user, isAdmin });\n } else {\n byUser.set(user.id, { user, isAdmin: prev.isAdmin || isAdmin });\n }\n }\n }\n return [...byUser.values()]\n .map(({ user, isAdmin }) => ({\n user,\n orgRole: isAdmin ? (\"admin\" as const) : (\"member\" as const),\n }))\n .sort((a, b) => a.user.id - b.user.id);\n}\n\nfunction orgRoleForUser(gh: GitHubStore, orgId: number, userId: number): \"admin\" | \"member\" | null {\n const row = listOrgMembersDeduped(gh, orgId).find((r) => r.user.id === userId);\n return row?.orgRole ?? null;\n}\n\nfunction syncTeamMemberCount(gh: GitHubStore, teamId: number) {\n const n = gh.teamMembers.findBy(\"team_id\", teamId).length;\n gh.teams.update(teamId, { members_count: n });\n}\n\nfunction syncTeamRepoCount(gh: GitHubStore, teamId: number) {\n const n = gh.teamRepos.findBy(\"team_id\", teamId).length;\n gh.teams.update(teamId, { repos_count: n });\n}\n\nfunction findTeamRepo(gh: GitHubStore, teamId: number, repoId: number) {\n return gh.teamRepos.findBy(\"team_id\", teamId).find((r) => r.repo_id === repoId);\n}\n\nfunction getOrCreateMembersTeam(gh: GitHubStore, org: GitHubOrg): GitHubTeam {\n const existing = teamsForOrg(gh, org.id).find((t) => t.slug === MEMBERS_TEAM_SLUG);\n if (existing) return existing;\n const team = gh.teams.insert({\n node_id: \"pending\",\n name: \"Members\",\n slug: MEMBERS_TEAM_SLUG,\n description: null,\n privacy: \"closed\",\n permission: \"pull\",\n org_id: org.id,\n parent_id: null,\n members_count: 0,\n repos_count: 0,\n });\n const fixed = gh.teams.update(team.id, { node_id: generateNodeId(\"Team\", team.id) });\n return fixed ?? team;\n}\n\nfunction deleteTeamCascade(gh: GitHubStore, team: GitHubTeam) {\n for (const child of teamsForOrg(gh, team.org_id).filter((t) => t.parent_id === team.id)) {\n gh.teams.update(child.id, { parent_id: null });\n }\n for (const m of gh.teamMembers.findBy(\"team_id\", team.id)) {\n gh.teamMembers.delete(m.id);\n }\n for (const tr of gh.teamRepos.findBy(\"team_id\", team.id)) {\n gh.teamRepos.delete(tr.id);\n }\n gh.teams.delete(team.id);\n}\n\nfunction removeUserFromAllOrgTeams(gh: GitHubStore, orgId: number, userId: number) {\n for (const team of teamsForOrg(gh, orgId)) {\n const memberships = gh.teamMembers.findBy(\"team_id\", team.id).filter((m) => m.user_id === userId);\n for (const m of memberships) {\n gh.teamMembers.delete(m.id);\n }\n syncTeamMemberCount(gh, team.id);\n }\n}\n\nfunction membershipUrl(baseUrl: string, orgLogin: string, teamSlug: string, userLogin: string) {\n return `${baseUrl}/orgs/${orgLogin}/teams/${teamSlug}/memberships/${userLogin}`;\n}\n\nfunction orgMembershipUrl(baseUrl: string, orgLogin: string, userLogin: string) {\n return `${baseUrl}/orgs/${orgLogin}/memberships/${userLogin}`;\n}\n\nfunction formatTeamMembership(\n baseUrl: string,\n orgLogin: string,\n teamSlug: string,\n user: GitHubUser,\n role: \"member\" | \"maintainer\",\n) {\n return {\n url: membershipUrl(baseUrl, orgLogin, teamSlug, user.login),\n role,\n state: \"active\" as const,\n user: formatUser(user, baseUrl),\n };\n}\n\nexport function orgsAndTeamsRoutes({ app, store, baseUrl }: RouteContext): void {\n const gh = getGitHubStore(store);\n\n app.get(\"/organizations\", (c) => {\n const since = Math.max(0, parseInt(c.req.query(\"since\") ?? \"0\", 10) || 0);\n const perPage = Math.min(100, Math.max(1, parseInt(c.req.query(\"per_page\") ?? \"30\", 10) || 30));\n\n const ordered = gh.orgs\n .all()\n .filter((o) => o.id > since)\n .sort((a, b) => a.id - b.id);\n const page = ordered.slice(0, perPage);\n\n if (page.length === perPage && ordered.length > perPage) {\n const lastId = page[page.length - 1]!.id;\n const nextUrl = new URL(c.req.url);\n nextUrl.searchParams.set(\"since\", String(lastId));\n nextUrl.searchParams.set(\"per_page\", String(perPage));\n c.header(\"Link\", `<${nextUrl.toString()}>; rel=\"next\"`);\n }\n\n return c.json(page.map((o) => formatOrgBrief(o, baseUrl)));\n });\n\n app.get(\"/user/orgs\", (c) => {\n const auth = requireAuthUser(c);\n const user = gh.users.findOneBy(\"login\", auth.login);\n if (!user) throw notFound();\n const orgs = orgsForAuthenticatedUser(gh, user.id);\n return c.json(orgs.map((o) => formatOrgBrief(o, baseUrl)));\n });\n\n app.get(\"/orgs/:org\", (c) => {\n const org = getOrgByLogin(gh, c.req.param(\"org\")!);\n if (!org) throw notFound();\n return c.json(formatOrgFull(org, baseUrl));\n });\n\n app.patch(\"/orgs/:org\", async (c) => {\n const auth = requireAuthUser(c);\n const org = getOrgByLogin(gh, c.req.param(\"org\")!);\n if (!org) throw notFound();\n requireOrgAdmin(gh, org, auth);\n\n const body = await parseJsonBody(c);\n const patch: Partial<GitHubOrg> = {};\n\n if (\"billing_email\" in body) {\n if (body.billing_email === null) patch.billing_email = null;\n else if (typeof body.billing_email === \"string\") patch.billing_email = body.billing_email;\n }\n if (\"company\" in body) {\n if (body.company === null) patch.company = null;\n else if (typeof body.company === \"string\") patch.company = body.company;\n }\n if (\"email\" in body) {\n if (body.email === null) patch.email = null;\n else if (typeof body.email === \"string\") patch.email = body.email;\n }\n if (\"twitter_username\" in body) {\n if (body.twitter_username === null) patch.twitter_username = null;\n else if (typeof body.twitter_username === \"string\") {\n patch.twitter_username = body.twitter_username;\n }\n }\n if (\"location\" in body) {\n if (body.location === null) patch.location = null;\n else if (typeof body.location === \"string\") patch.location = body.location;\n }\n if (\"name\" in body) {\n if (body.name === null) patch.name = null;\n else if (typeof body.name === \"string\") patch.name = body.name;\n }\n if (\"description\" in body) {\n if (body.description === null) patch.description = null;\n else if (typeof body.description === \"string\") patch.description = body.description;\n }\n if (\"default_repository_permission\" in body && typeof body.default_repository_permission === \"string\") {\n patch.default_repository_permission = body.default_repository_permission;\n }\n if (\"members_can_create_repositories\" in body && typeof body.members_can_create_repositories === \"boolean\") {\n patch.members_can_create_repositories = body.members_can_create_repositories;\n }\n\n const updated = gh.orgs.update(org.id, patch);\n if (!updated) throw notFound();\n return c.json(formatOrgFull(updated, baseUrl));\n });\n\n app.get(\"/orgs/:org/members\", (c) => {\n const org = getOrgByLogin(gh, c.req.param(\"org\")!);\n if (!org) throw notFound();\n\n const roleQ = (c.req.query(\"role\") ?? \"all\").toLowerCase();\n if (roleQ !== \"all\" && roleQ !== \"admin\" && roleQ !== \"member\") {\n throw new ApiError(422, \"Invalid role parameter\");\n }\n\n let rows = listOrgMembersDeduped(gh, org.id);\n if (roleQ === \"admin\") rows = rows.filter((r) => r.orgRole === \"admin\");\n else if (roleQ === \"member\") rows = rows.filter((r) => r.orgRole === \"member\");\n\n const { page, per_page } = parsePagination(c);\n const total = rows.length;\n const start = (page - 1) * per_page;\n const slice = rows.slice(start, start + per_page);\n\n setLinkHeader(c, total, page, per_page);\n return c.json(slice.map((r) => formatUser(r.user, baseUrl)));\n });\n\n app.get(\"/orgs/:org/members/:username\", (c) => {\n const org = getOrgByLogin(gh, c.req.param(\"org\")!);\n if (!org) throw notFound();\n const user = gh.users.findOneBy(\"login\", c.req.param(\"username\")!);\n if (!user) throw notFound();\n if (!orgRoleForUser(gh, org.id, user.id)) throw notFound();\n return c.body(null, 204);\n });\n\n app.delete(\"/orgs/:org/members/:username\", (c) => {\n const auth = requireAuthUser(c);\n const org = getOrgByLogin(gh, c.req.param(\"org\")!);\n if (!org) throw notFound();\n requireOrgAdmin(gh, org, auth);\n const user = gh.users.findOneBy(\"login\", c.req.param(\"username\")!);\n if (!user) throw notFound();\n removeUserFromAllOrgTeams(gh, org.id, user.id);\n return c.body(null, 204);\n });\n\n app.get(\"/orgs/:org/memberships/:username\", (c) => {\n const org = getOrgByLogin(gh, c.req.param(\"org\")!);\n if (!org) throw notFound();\n const user = gh.users.findOneBy(\"login\", c.req.param(\"username\")!);\n if (!user) throw notFound();\n const role = orgRoleForUser(gh, org.id, user.id);\n if (!role) throw notFound();\n return c.json({\n url: orgMembershipUrl(baseUrl, org.login, user.login),\n state: \"active\",\n role,\n organization_url: `${baseUrl}/orgs/${org.login}`,\n user: formatUser(user, baseUrl),\n organization: formatOrgBrief(org, baseUrl),\n });\n });\n\n app.put(\"/orgs/:org/memberships/:username\", async (c) => {\n const auth = requireAuthUser(c);\n const org = getOrgByLogin(gh, c.req.param(\"org\")!);\n if (!org) throw notFound();\n requireOrgAdmin(gh, org, auth);\n const user = gh.users.findOneBy(\"login\", c.req.param(\"username\")!);\n if (!user) throw notFound();\n\n const body = await parseJsonBody(c);\n const roleRaw = body.role;\n if (roleRaw !== \"admin\" && roleRaw !== \"member\") {\n throw new ApiError(422, \"role must be admin or member\");\n }\n const teamRole: \"member\" | \"maintainer\" = roleRaw === \"admin\" ? \"maintainer\" : \"member\";\n\n const membersTeam = getOrCreateMembersTeam(gh, org);\n const existing = gh.teamMembers.findBy(\"team_id\", membersTeam.id).find((m) => m.user_id === user.id);\n if (existing) {\n gh.teamMembers.update(existing.id, { role: teamRole });\n } else {\n gh.teamMembers.insert({ team_id: membersTeam.id, user_id: user.id, role: teamRole });\n }\n syncTeamMemberCount(gh, membersTeam.id);\n\n const orgRole = orgRoleForUser(gh, org.id, user.id)!;\n return c.json({\n url: orgMembershipUrl(baseUrl, org.login, user.login),\n state: \"active\",\n role: orgRole,\n organization_url: `${baseUrl}/orgs/${org.login}`,\n user: formatUser(user, baseUrl),\n organization: formatOrgBrief(org, baseUrl),\n });\n });\n\n app.get(\"/orgs/:org/teams\", (c) => {\n const org = getOrgByLogin(gh, c.req.param(\"org\")!);\n if (!org) throw notFound();\n\n const all = teamsForOrg(gh, org.id).sort((a, b) => a.id - b.id);\n const { page, per_page } = parsePagination(c);\n const total = all.length;\n const start = (page - 1) * per_page;\n const slice = all.slice(start, start + per_page);\n\n setLinkHeader(c, total, page, per_page);\n return c.json(slice.map((t) => formatTeamBrief(t, gh, baseUrl)));\n });\n\n app.post(\"/orgs/:org/teams\", async (c) => {\n requireAuthUser(c);\n const org = getOrgByLogin(gh, c.req.param(\"org\")!);\n if (!org) throw notFound();\n\n const body = await parseJsonBody(c);\n const name = body.name;\n if (typeof name !== \"string\" || !name.trim()) {\n throw new ApiError(422, \"name is required\");\n }\n\n let parentId: number | null = null;\n if (body.parent_team_id != null) {\n const pid = Number(body.parent_team_id);\n const parent = gh.teams.get(pid);\n if (!parent || parent.org_id !== org.id) {\n throw new ApiError(422, \"Invalid parent_team_id\");\n }\n parentId = parent.id;\n }\n\n const baseSlug = uniqueTeamSlug(gh, org.id, slugifyFromName(name));\n const privacy = body.privacy === \"secret\" || body.privacy === \"closed\" ? body.privacy : \"closed\";\n const permission = typeof body.permission === \"string\" ? body.permission : \"pull\";\n const description =\n body.description === null ? null : typeof body.description === \"string\" ? body.description : null;\n\n const team = gh.teams.insert({\n node_id: \"pending\",\n name: name.trim(),\n slug: baseSlug,\n description,\n privacy,\n permission,\n org_id: org.id,\n parent_id: parentId,\n members_count: 0,\n repos_count: 0,\n });\n const fixed = gh.teams.update(team.id, { node_id: generateNodeId(\"Team\", team.id) });\n return c.json(formatTeamBrief(fixed ?? team, gh, baseUrl), 201);\n });\n\n app.get(\"/orgs/:org/teams/:team_slug\", (c) => {\n const org = getOrgByLogin(gh, c.req.param(\"org\")!);\n if (!org) throw notFound();\n const team = getTeamByOrgSlug(gh, org, c.req.param(\"team_slug\")!);\n if (!team) throw notFound();\n return c.json(formatTeamBrief(team, gh, baseUrl));\n });\n\n app.patch(\"/orgs/:org/teams/:team_slug\", async (c) => {\n requireAuthUser(c);\n const org = getOrgByLogin(gh, c.req.param(\"org\")!);\n if (!org) throw notFound();\n const team = getTeamByOrgSlug(gh, org, c.req.param(\"team_slug\")!);\n if (!team) throw notFound();\n\n const body = await parseJsonBody(c);\n const patch: Partial<GitHubTeam> = {};\n\n if (\"name\" in body && typeof body.name === \"string\" && body.name.trim()) {\n patch.name = body.name.trim();\n }\n if (\"description\" in body) {\n if (body.description === null) patch.description = null;\n else if (typeof body.description === \"string\") patch.description = body.description;\n }\n if (body.privacy === \"secret\" || body.privacy === \"closed\") {\n patch.privacy = body.privacy;\n }\n if (\"permission\" in body && typeof body.permission === \"string\") {\n patch.permission = body.permission;\n }\n if (\"parent_team_id\" in body) {\n if (body.parent_team_id === null) {\n patch.parent_id = null;\n } else {\n const pid = Number(body.parent_team_id);\n const parent = gh.teams.get(pid);\n if (!parent || parent.org_id !== org.id) {\n throw new ApiError(422, \"Invalid parent_team_id\");\n }\n if (parent.id === team.id) throw new ApiError(422, \"Invalid parent_team_id\");\n patch.parent_id = parent.id;\n }\n }\n\n const updated = gh.teams.update(team.id, patch);\n if (!updated) throw notFound();\n return c.json(formatTeamBrief(updated, gh, baseUrl));\n });\n\n app.delete(\"/orgs/:org/teams/:team_slug\", (c) => {\n requireAuthUser(c);\n const org = getOrgByLogin(gh, c.req.param(\"org\")!);\n if (!org) throw notFound();\n const team = getTeamByOrgSlug(gh, org, c.req.param(\"team_slug\")!);\n if (!team) throw notFound();\n deleteTeamCascade(gh, team);\n return c.body(null, 204);\n });\n\n app.get(\"/orgs/:org/teams/:team_slug/members\", (c) => {\n const org = getOrgByLogin(gh, c.req.param(\"org\")!);\n if (!org) throw notFound();\n const team = getTeamByOrgSlug(gh, org, c.req.param(\"team_slug\")!);\n if (!team) throw notFound();\n\n const roleQ = (c.req.query(\"role\") ?? \"all\").toLowerCase();\n if (roleQ !== \"all\" && roleQ !== \"member\" && roleQ !== \"maintainer\") {\n throw new ApiError(422, \"Invalid role parameter\");\n }\n\n let members = gh.teamMembers\n .findBy(\"team_id\", team.id)\n .map((m) => {\n const user = gh.users.get(m.user_id);\n return user ? { user, role: m.role } : null;\n })\n .filter((x): x is { user: GitHubUser; role: \"member\" | \"maintainer\" } => Boolean(x));\n\n if (roleQ === \"member\") members = members.filter((m) => m.role === \"member\");\n else if (roleQ === \"maintainer\") members = members.filter((m) => m.role === \"maintainer\");\n\n members.sort((a, b) => a.user.id - b.user.id);\n\n const { page, per_page } = parsePagination(c);\n const total = members.length;\n const start = (page - 1) * per_page;\n const slice = members.slice(start, start + per_page);\n\n setLinkHeader(c, total, page, per_page);\n return c.json(slice.map((m) => formatUser(m.user, baseUrl)));\n });\n\n app.put(\"/orgs/:org/teams/:team_slug/memberships/:username\", async (c) => {\n requireAuthUser(c);\n const org = getOrgByLogin(gh, c.req.param(\"org\")!);\n if (!org) throw notFound();\n const team = getTeamByOrgSlug(gh, org, c.req.param(\"team_slug\")!);\n if (!team) throw notFound();\n const user = gh.users.findOneBy(\"login\", c.req.param(\"username\")!);\n if (!user) throw notFound();\n\n const body = await parseJsonBody(c);\n const role: \"member\" | \"maintainer\" = body.role === \"maintainer\" ? \"maintainer\" : \"member\";\n\n const existing = gh.teamMembers.findBy(\"team_id\", team.id).find((m) => m.user_id === user.id);\n if (existing) {\n gh.teamMembers.update(existing.id, { role });\n } else {\n gh.teamMembers.insert({ team_id: team.id, user_id: user.id, role });\n }\n syncTeamMemberCount(gh, team.id);\n\n return c.json(formatTeamMembership(baseUrl, org.login, team.slug, user, role));\n });\n\n app.delete(\"/orgs/:org/teams/:team_slug/memberships/:username\", (c) => {\n requireAuthUser(c);\n const org = getOrgByLogin(gh, c.req.param(\"org\")!);\n if (!org) throw notFound();\n const team = getTeamByOrgSlug(gh, org, c.req.param(\"team_slug\")!);\n if (!team) throw notFound();\n const user = gh.users.findOneBy(\"login\", c.req.param(\"username\")!);\n if (!user) throw notFound();\n\n const existing = gh.teamMembers.findBy(\"team_id\", team.id).find((m) => m.user_id === user.id);\n if (existing) {\n gh.teamMembers.delete(existing.id);\n syncTeamMemberCount(gh, team.id);\n }\n return c.body(null, 204);\n });\n\n app.get(\"/orgs/:org/teams/:team_slug/memberships/:username\", (c) => {\n const org = getOrgByLogin(gh, c.req.param(\"org\")!);\n if (!org) throw notFound();\n const team = getTeamByOrgSlug(gh, org, c.req.param(\"team_slug\")!);\n if (!team) throw notFound();\n const user = gh.users.findOneBy(\"login\", c.req.param(\"username\")!);\n if (!user) throw notFound();\n\n const m = gh.teamMembers.findBy(\"team_id\", team.id).find((x) => x.user_id === user.id);\n if (!m) throw notFound();\n\n return c.json(formatTeamMembership(baseUrl, org.login, team.slug, user, m.role));\n });\n\n app.get(\"/orgs/:org/teams/:team_slug/repos\", (c) => {\n const org = getOrgByLogin(gh, c.req.param(\"org\")!);\n if (!org) throw notFound();\n const team = getTeamByOrgSlug(gh, org, c.req.param(\"team_slug\")!);\n if (!team) throw notFound();\n\n const links = gh.teamRepos.findBy(\"team_id\", team.id);\n const repos = links\n .map((l) => gh.repos.get(l.repo_id))\n .filter((r): r is GitHubRepo => Boolean(r))\n .sort((a, b) => a.id - b.id);\n\n const { page, per_page } = parsePagination(c);\n const total = repos.length;\n const start = (page - 1) * per_page;\n const slice = repos.slice(start, start + per_page);\n\n setLinkHeader(c, total, page, per_page);\n return c.json(slice.map((r) => formatRepo(r, gh, baseUrl)));\n });\n\n app.put(\"/orgs/:org/teams/:team_slug/repos/:owner/:repo\", (c) => {\n requireAuthUser(c);\n const org = getOrgByLogin(gh, c.req.param(\"org\")!);\n if (!org) throw notFound();\n const team = getTeamByOrgSlug(gh, org, c.req.param(\"team_slug\")!);\n if (!team) throw notFound();\n\n const ownerLogin = c.req.param(\"owner\")!;\n const ownerInfo = lookupOwner(gh, ownerLogin);\n if (!ownerInfo || ownerInfo.type !== \"Organization\" || ownerInfo.id !== org.id) {\n throw new ApiError(422, \"Repository must belong to this organization\");\n }\n const repo = lookupRepo(gh, ownerLogin, c.req.param(\"repo\")!);\n if (!repo) throw notFound();\n\n if (!findTeamRepo(gh, team.id, repo.id)) {\n gh.teamRepos.insert({ team_id: team.id, repo_id: repo.id });\n syncTeamRepoCount(gh, team.id);\n }\n return c.body(null, 204);\n });\n\n app.delete(\"/orgs/:org/teams/:team_slug/repos/:owner/:repo\", (c) => {\n requireAuthUser(c);\n const org = getOrgByLogin(gh, c.req.param(\"org\")!);\n if (!org) throw notFound();\n const team = getTeamByOrgSlug(gh, org, c.req.param(\"team_slug\")!);\n if (!team) throw notFound();\n\n const ownerLogin = c.req.param(\"owner\")!;\n const ownerInfo = lookupOwner(gh, ownerLogin);\n if (!ownerInfo || ownerInfo.type !== \"Organization\" || ownerInfo.id !== org.id) {\n throw new ApiError(422, \"Repository must belong to this organization\");\n }\n const repo = lookupRepo(gh, ownerLogin, c.req.param(\"repo\")!);\n if (!repo) throw notFound();\n\n const tr = findTeamRepo(gh, team.id, repo.id);\n if (tr) {\n gh.teamRepos.delete(tr.id);\n syncTeamRepoCount(gh, team.id);\n }\n return c.body(null, 204);\n });\n\n app.get(\"/teams/:team_id\", (c) => {\n const tid = parseInt(c.req.param(\"team_id\") ?? \"\", 10);\n if (Number.isNaN(tid)) throw notFound();\n const team = gh.teams.get(tid);\n if (!team) throw notFound();\n return c.json(formatTeamBrief(team, gh, baseUrl));\n });\n\n app.get(\"/teams/:team_id/members\", (c) => {\n const tid = parseInt(c.req.param(\"team_id\") ?? \"\", 10);\n if (Number.isNaN(tid)) throw notFound();\n const team = gh.teams.get(tid);\n if (!team) throw notFound();\n\n const roleQ = (c.req.query(\"role\") ?? \"all\").toLowerCase();\n if (roleQ !== \"all\" && roleQ !== \"member\" && roleQ !== \"maintainer\") {\n throw new ApiError(422, \"Invalid role parameter\");\n }\n\n let members = gh.teamMembers\n .findBy(\"team_id\", team.id)\n .map((m) => {\n const user = gh.users.get(m.user_id);\n return user ? { user, role: m.role } : null;\n })\n .filter((x): x is { user: GitHubUser; role: \"member\" | \"maintainer\" } => Boolean(x));\n\n if (roleQ === \"member\") members = members.filter((m) => m.role === \"member\");\n else if (roleQ === \"maintainer\") members = members.filter((m) => m.role === \"maintainer\");\n\n members.sort((a, b) => a.user.id - b.user.id);\n\n const { page, per_page } = parsePagination(c);\n const total = members.length;\n const start = (page - 1) * per_page;\n const slice = members.slice(start, start + per_page);\n\n setLinkHeader(c, total, page, per_page);\n return c.json(slice.map((m) => formatUser(m.user, baseUrl)));\n });\n}\n","import type { RouteContext, WebhookDispatcher, AuthUser } from \"@emulators/core\";\nimport { ApiError, parseJsonBody, parsePagination, setLinkHeader } from \"@emulators/core\";\nimport { getGitHubStore } from \"../store.js\";\nimport type { GitHubStore } from \"../store.js\";\nimport type { GitHubRelease, GitHubReleaseAsset, GitHubRepo, GitHubUser } from \"../entities.js\";\nimport {\n formatRelease,\n formatReleaseAsset,\n formatRepo,\n formatUser,\n generateNodeId,\n lookupRepo,\n timestamp,\n} from \"../helpers.js\";\nimport { assertRepoRead, assertRepoWrite, getActorUser, notFoundResponse, ownerLoginOf } from \"../route-helpers.js\";\n\n/** Draft releases are omitted for anonymous API clients; any authenticated user may see them once repo read is allowed. */\nfunction isAuthenticatedActor(gh: GitHubStore, authUser: AuthUser | undefined): boolean {\n return Boolean(authUser && getActorUser(gh, authUser));\n}\n\nfunction assertReleaseVisible(gh: GitHubStore, authUser: AuthUser | undefined, release: GitHubRelease) {\n if (release.draft && !isAuthenticatedActor(gh, authUser)) {\n throw notFoundResponse();\n }\n}\n\nfunction releasesForRepo(gh: GitHubStore, repoId: number): GitHubRelease[] {\n return gh.releases.findBy(\"repo_id\", repoId);\n}\n\nfunction findReleaseById(gh: GitHubStore, repoId: number, releaseId: number): GitHubRelease | undefined {\n const r = gh.releases.get(releaseId);\n if (!r || r.repo_id !== repoId) return undefined;\n return r;\n}\n\nfunction findReleaseByTag(gh: GitHubStore, repoId: number, tagName: string): GitHubRelease | undefined {\n return releasesForRepo(gh, repoId).find((rel) => rel.tag_name === tagName);\n}\n\nfunction tagTaken(gh: GitHubStore, repoId: number, tagName: string, exceptId?: number): boolean {\n return releasesForRepo(gh, repoId).some((r) => r.tag_name === tagName && r.id !== exceptId);\n}\n\nfunction sortReleasesByCreatedDesc(a: GitHubRelease, b: GitHubRelease): number {\n return b.created_at.localeCompare(a.created_at);\n}\n\nfunction deleteAssetsForRelease(gh: GitHubStore, releaseId: number) {\n for (const a of gh.releaseAssets.findBy(\"release_id\", releaseId)) {\n gh.releaseAssets.delete(a.id);\n }\n}\n\nfunction dispatchReleaseWebhook(\n webhooks: WebhookDispatcher,\n gh: GitHubStore,\n repo: GitHubRepo,\n actor: GitHubUser,\n release: GitHubRelease,\n action: string,\n baseUrl: string,\n) {\n const relFmt = formatRelease(release, gh, baseUrl);\n if (!relFmt) return;\n const ownerLogin = ownerLoginOf(gh, repo);\n webhooks.dispatch(\n \"release\",\n action,\n {\n action,\n release: relFmt,\n repository: formatRepo(repo, gh, baseUrl),\n sender: formatUser(actor, baseUrl),\n },\n ownerLogin,\n repo.name,\n );\n}\n\nexport function releasesRoutes({ app, store, webhooks, baseUrl }: RouteContext): void {\n const gh = getGitHubStore(store);\n\n app.get(\"/repos/:owner/:repo/releases\", (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n assertRepoRead(gh, c.get(\"authUser\"), repo);\n\n const authUser = c.get(\"authUser\");\n const showDrafts = isAuthenticatedActor(gh, authUser);\n\n let list = releasesForRepo(gh, repo.id);\n if (!showDrafts) {\n list = list.filter((r) => !r.draft);\n }\n list = [...list].sort(sortReleasesByCreatedDesc);\n\n const { page, per_page } = parsePagination(c);\n const total = list.length;\n setLinkHeader(c, total, page, per_page);\n const start = (page - 1) * per_page;\n const pageItems = list.slice(start, start + per_page);\n\n const out = pageItems.map((r) => formatRelease(r, gh, baseUrl)).filter(Boolean);\n return c.json(out);\n });\n\n app.post(\"/repos/:owner/:repo/releases/generate-notes\", async (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n assertRepoRead(gh, c.get(\"authUser\"), repo);\n\n const body = await parseJsonBody(c);\n const tagName = typeof body.tag_name === \"string\" ? body.tag_name : \"\";\n const target = typeof body.target_commitish === \"string\" ? body.target_commitish : undefined;\n const prev = typeof body.previous_tag_name === \"string\" ? body.previous_tag_name : undefined;\n return c.json({\n name: tagName ? `Release ${tagName}` : \"Release\",\n body: `## What's changed\\n\\n_Auto-generated release notes (stub)._\\n\\n<!-- target: ${target ?? \"default\"} previous: ${prev ?? \"none\"} -->`,\n });\n });\n\n app.get(\"/repos/:owner/:repo/releases/latest\", (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n assertRepoRead(gh, c.get(\"authUser\"), repo);\n\n const candidates = releasesForRepo(gh, repo.id).filter((r) => !r.draft && !r.prerelease && r.published_at);\n if (candidates.length === 0) throw notFoundResponse();\n\n candidates.sort((a, b) => {\n const pa = a.published_at ?? a.created_at;\n const pb = b.published_at ?? b.created_at;\n return pb.localeCompare(pa);\n });\n const latest = candidates[0]!;\n const fmt = formatRelease(latest, gh, baseUrl);\n if (!fmt) throw notFoundResponse();\n return c.json(fmt);\n });\n\n app.get(\"/repos/:owner/:repo/releases/tags/:tag\", (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n assertRepoRead(gh, c.get(\"authUser\"), repo);\n\n const tag = decodeURIComponent(c.req.param(\"tag\")!);\n const release = findReleaseByTag(gh, repo.id, tag);\n if (!release) throw notFoundResponse();\n assertReleaseVisible(gh, c.get(\"authUser\"), release);\n\n const fmt = formatRelease(release, gh, baseUrl);\n if (!fmt) throw notFoundResponse();\n return c.json(fmt);\n });\n\n app.get(\"/repos/:owner/:repo/releases/assets/:asset_id\", (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n assertRepoRead(gh, c.get(\"authUser\"), repo);\n\n const assetId = parseInt(c.req.param(\"asset_id\")!, 10);\n if (!Number.isFinite(assetId)) throw notFoundResponse();\n\n const asset = gh.releaseAssets.get(assetId);\n if (!asset || asset.repo_id !== repo.id) throw notFoundResponse();\n\n const release = gh.releases.get(asset.release_id);\n if (release) {\n assertReleaseVisible(gh, c.get(\"authUser\"), release);\n }\n\n return c.json(formatReleaseAsset(asset, repo, baseUrl));\n });\n\n app.patch(\"/repos/:owner/:repo/releases/assets/:asset_id\", async (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n assertRepoWrite(gh, c.get(\"authUser\"), repo);\n\n const assetId = parseInt(c.req.param(\"asset_id\")!, 10);\n if (!Number.isFinite(assetId)) throw notFoundResponse();\n\n const asset = gh.releaseAssets.get(assetId);\n if (!asset || asset.repo_id !== repo.id) throw notFoundResponse();\n\n const body = await parseJsonBody(c);\n const patch: Partial<GitHubReleaseAsset> = {};\n if (typeof body.name === \"string\") patch.name = body.name;\n if (typeof body.label === \"string\" || body.label === null) patch.label = body.label as string | null;\n\n const updated = gh.releaseAssets.update(asset.id, patch);\n if (!updated) throw notFoundResponse();\n\n return c.json(formatReleaseAsset(updated, repo, baseUrl));\n });\n\n app.delete(\"/repos/:owner/:repo/releases/assets/:asset_id\", (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n assertRepoWrite(gh, c.get(\"authUser\"), repo);\n\n const assetId = parseInt(c.req.param(\"asset_id\")!, 10);\n if (!Number.isFinite(assetId)) throw notFoundResponse();\n\n const asset = gh.releaseAssets.get(assetId);\n if (!asset || asset.repo_id !== repo.id) throw notFoundResponse();\n\n gh.releaseAssets.delete(asset.id);\n return c.body(null, 204);\n });\n\n app.post(\"/repos/:owner/:repo/releases\", async (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n\n const actor = assertRepoWrite(gh, c.get(\"authUser\"), repo);\n\n const body = await parseJsonBody(c);\n if (typeof body.tag_name !== \"string\" || !body.tag_name.trim()) {\n throw new ApiError(422, \"Validation failed\");\n }\n const tag_name = body.tag_name.trim();\n if (tagTaken(gh, repo.id, tag_name)) {\n throw new ApiError(422, \"Validation failed\");\n }\n\n const target_commitish =\n typeof body.target_commitish === \"string\" && body.target_commitish.trim()\n ? body.target_commitish.trim()\n : repo.default_branch;\n\n const draft = typeof body.draft === \"boolean\" ? body.draft : false;\n const prerelease = typeof body.prerelease === \"boolean\" ? body.prerelease : false;\n\n let name: string | null = typeof body.name === \"string\" || body.name === null ? (body.name as string | null) : null;\n let releaseBody: string | null =\n typeof body.body === \"string\" || body.body === null ? (body.body as string | null) : null;\n\n if (body.generate_release_notes === true) {\n releaseBody = releaseBody ?? `## What's changed\\n\\n_Auto-generated release notes (stub) for ${tag_name}._`;\n name = name ?? `Release ${tag_name}`;\n }\n\n const published_at = draft ? null : timestamp();\n\n const row = gh.releases.insert({\n node_id: \"\",\n repo_id: repo.id,\n tag_name,\n target_commitish,\n name,\n body: releaseBody,\n draft,\n prerelease,\n author_id: actor.id,\n published_at,\n } as Omit<GitHubRelease, \"id\" | \"created_at\" | \"updated_at\">);\n gh.releases.update(row.id, { node_id: generateNodeId(\"Release\", row.id) });\n\n const release = gh.releases.get(row.id)!;\n\n if (draft) {\n dispatchReleaseWebhook(webhooks, gh, repo, actor, release, \"created\", baseUrl);\n } else {\n dispatchReleaseWebhook(webhooks, gh, repo, actor, release, \"published\", baseUrl);\n }\n\n const fmt = formatRelease(release, gh, baseUrl);\n if (!fmt) throw notFoundResponse();\n return c.json(fmt, 201);\n });\n\n app.get(\"/repos/:owner/:repo/releases/:release_id\", (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n assertRepoRead(gh, c.get(\"authUser\"), repo);\n\n const releaseId = parseInt(c.req.param(\"release_id\")!, 10);\n if (!Number.isFinite(releaseId)) throw notFoundResponse();\n\n const release = findReleaseById(gh, repo.id, releaseId);\n if (!release) throw notFoundResponse();\n assertReleaseVisible(gh, c.get(\"authUser\"), release);\n\n const fmt = formatRelease(release, gh, baseUrl);\n if (!fmt) throw notFoundResponse();\n return c.json(fmt);\n });\n\n app.patch(\"/repos/:owner/:repo/releases/:release_id\", async (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n\n const actor = assertRepoWrite(gh, c.get(\"authUser\"), repo);\n\n const releaseId = parseInt(c.req.param(\"release_id\")!, 10);\n if (!Number.isFinite(releaseId)) throw notFoundResponse();\n\n const release = findReleaseById(gh, repo.id, releaseId);\n if (!release) throw notFoundResponse();\n\n const body = await parseJsonBody(c);\n const patch: Partial<GitHubRelease> = {};\n\n if (typeof body.tag_name === \"string\" && body.tag_name.trim()) {\n const nextTag = body.tag_name.trim();\n if (tagTaken(gh, repo.id, nextTag, release.id)) {\n throw new ApiError(422, \"Validation failed\");\n }\n patch.tag_name = nextTag;\n }\n if (typeof body.target_commitish === \"string\" && body.target_commitish.trim()) {\n patch.target_commitish = body.target_commitish.trim();\n }\n if (typeof body.name === \"string\" || body.name === null) patch.name = body.name as string | null;\n if (typeof body.body === \"string\" || body.body === null) patch.body = body.body as string | null;\n if (typeof body.draft === \"boolean\") patch.draft = body.draft;\n if (typeof body.prerelease === \"boolean\") patch.prerelease = body.prerelease;\n\n const wasDraft = release.draft;\n let publishedJustNow = false;\n if (wasDraft && typeof body.draft === \"boolean\" && body.draft === false) {\n patch.published_at = timestamp();\n publishedJustNow = true;\n }\n\n const updated = gh.releases.update(release.id, patch);\n if (!updated) throw notFoundResponse();\n\n if (publishedJustNow) {\n dispatchReleaseWebhook(webhooks, gh, repo, actor, updated, \"published\", baseUrl);\n }\n\n const fmt = formatRelease(updated, gh, baseUrl);\n if (!fmt) throw notFoundResponse();\n return c.json(fmt);\n });\n\n app.delete(\"/repos/:owner/:repo/releases/:release_id\", (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n assertRepoWrite(gh, c.get(\"authUser\"), repo);\n\n const releaseId = parseInt(c.req.param(\"release_id\")!, 10);\n if (!Number.isFinite(releaseId)) throw notFoundResponse();\n\n const release = findReleaseById(gh, repo.id, releaseId);\n if (!release) throw notFoundResponse();\n\n deleteAssetsForRelease(gh, release.id);\n gh.releases.delete(release.id);\n return c.body(null, 204);\n });\n\n app.get(\"/repos/:owner/:repo/releases/:release_id/assets\", (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n assertRepoRead(gh, c.get(\"authUser\"), repo);\n\n const releaseId = parseInt(c.req.param(\"release_id\")!, 10);\n if (!Number.isFinite(releaseId)) throw notFoundResponse();\n\n const release = findReleaseById(gh, repo.id, releaseId);\n if (!release) throw notFoundResponse();\n assertReleaseVisible(gh, c.get(\"authUser\"), release);\n\n let assets = gh.releaseAssets.findBy(\"release_id\", release.id);\n assets = [...assets].sort((a, b) => b.created_at.localeCompare(a.created_at));\n\n const { page, per_page } = parsePagination(c);\n const total = assets.length;\n setLinkHeader(c, total, page, per_page);\n const start = (page - 1) * per_page;\n const pageItems = assets.slice(start, start + per_page);\n\n return c.json(pageItems.map((a) => formatReleaseAsset(a, repo, baseUrl)));\n });\n\n app.post(\"/repos/:owner/:repo/releases/:release_id/assets\", async (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n\n const actor = assertRepoWrite(gh, c.get(\"authUser\"), repo);\n\n const releaseId = parseInt(c.req.param(\"release_id\")!, 10);\n if (!Number.isFinite(releaseId)) throw notFoundResponse();\n\n const release = findReleaseById(gh, repo.id, releaseId);\n if (!release) throw notFoundResponse();\n\n const nameQ = c.req.query(\"name\");\n if (!nameQ || !nameQ.trim()) {\n throw new ApiError(422, \"Validation failed\");\n }\n const assetName = nameQ.trim();\n const labelRaw = c.req.query(\"label\");\n const label = labelRaw === undefined || labelRaw === \"\" ? null : labelRaw;\n\n const buf = await c.req.arrayBuffer();\n const size = buf.byteLength;\n\n const contentType = c.req.header(\"Content-Type\")?.split(\";\")[0]?.trim() || \"application/octet-stream\";\n\n const row = gh.releaseAssets.insert({\n node_id: \"\",\n release_id: release.id,\n repo_id: repo.id,\n name: assetName,\n label,\n state: \"uploaded\",\n content_type: contentType,\n size,\n download_count: 0,\n uploader_id: actor.id,\n } as Omit<GitHubReleaseAsset, \"id\" | \"created_at\" | \"updated_at\">);\n gh.releaseAssets.update(row.id, { node_id: generateNodeId(\"ReleaseAsset\", row.id) });\n\n const asset = gh.releaseAssets.get(row.id)!;\n return c.json(formatReleaseAsset(asset, repo, baseUrl), 201);\n });\n}\n","import type { RouteContext, AuthUser, WebhookDelivery } from \"@emulators/core\";\nimport { ApiError, forbidden, parseJsonBody, parsePagination, setLinkHeader, unauthorized } from \"@emulators/core\";\nimport { getGitHubStore } from \"../store.js\";\nimport type { GitHubStore } from \"../store.js\";\nimport type { GitHubOrg, GitHubRepo, GitHubUser, GitHubWebhook } from \"../entities.js\";\nimport { formatRepo, formatUser, formatWebhook, lookupRepo } from \"../helpers.js\";\nimport { assertRepoAdmin, getActorUser, notFoundResponse, ownerLoginOf } from \"../route-helpers.js\";\n\nfunction teamsForOrg(gh: GitHubStore, orgId: number) {\n return gh.teams.findBy(\"org_id\", orgId);\n}\n\nfunction listOrgMembersDeduped(gh: GitHubStore, orgId: number): { user: GitHubUser; orgRole: \"admin\" | \"member\" }[] {\n const byUser = new Map<number, { user: GitHubUser; isAdmin: boolean }>();\n for (const team of teamsForOrg(gh, orgId)) {\n for (const m of gh.teamMembers.findBy(\"team_id\", team.id)) {\n const user = gh.users.get(m.user_id);\n if (!user) continue;\n const isAdmin = m.role === \"maintainer\";\n const prev = byUser.get(user.id);\n if (!prev) {\n byUser.set(user.id, { user, isAdmin });\n } else {\n byUser.set(user.id, { user, isAdmin: prev.isAdmin || isAdmin });\n }\n }\n }\n return [...byUser.values()]\n .map(({ user, isAdmin }) => ({\n user,\n orgRole: isAdmin ? (\"admin\" as const) : (\"member\" as const),\n }))\n .sort((a, b) => a.user.id - b.user.id);\n}\n\nfunction orgRoleForUser(gh: GitHubStore, orgId: number, userId: number): \"admin\" | \"member\" | null {\n const row = listOrgMembersDeduped(gh, orgId).find((r) => r.user.id === userId);\n return row?.orgRole ?? null;\n}\n\nfunction assertOrgAdmin(gh: GitHubStore, authUser: AuthUser | undefined, org: GitHubOrg) {\n if (!authUser) throw unauthorized();\n const user = getActorUser(gh, authUser);\n if (!user) throw unauthorized();\n if (orgRoleForUser(gh, org.id, user.id) === \"admin\") return;\n throw forbidden();\n}\n\nfunction getOrgByLogin(gh: GitHubStore, login: string): GitHubOrg | undefined {\n return gh.orgs.findOneBy(\"login\", login);\n}\n\nfunction pathPrefixForWebhook(wh: GitHubWebhook, ownerPath: string): string {\n return wh.repo_id != null ? `repos/${ownerPath}` : `orgs/${ownerPath}`;\n}\n\nfunction findRepoHook(gh: GitHubStore, repoId: number, hookId: number): GitHubWebhook | undefined {\n const wh = gh.webhooks.get(hookId);\n if (!wh || wh.repo_id !== repoId) return undefined;\n return wh;\n}\n\nfunction findOrgHook(gh: GitHubStore, orgId: number, hookId: number): GitHubWebhook | undefined {\n const wh = gh.webhooks.get(hookId);\n if (!wh || wh.org_id !== orgId) return undefined;\n return wh;\n}\n\nfunction webhooksForRepo(gh: GitHubStore, repoId: number): GitHubWebhook[] {\n return gh.webhooks.findBy(\"repo_id\", repoId).filter((w) => w.repo_id === repoId);\n}\n\nfunction webhooksForOrg(gh: GitHubStore, orgId: number): GitHubWebhook[] {\n return gh.webhooks.findBy(\"org_id\", orgId).filter((w) => w.org_id === orgId);\n}\n\nfunction normalizeInsecureSsl(v: unknown): string {\n if (v === true) return \"1\";\n if (v === false) return \"0\";\n if (typeof v === \"string\" && (v === \"0\" || v === \"1\")) return v;\n return \"0\";\n}\n\nfunction parseHookConfig(raw: unknown, existing?: GitHubWebhook[\"config\"]): GitHubWebhook[\"config\"] | null {\n if (raw === undefined && existing) return existing;\n if (!raw || typeof raw !== \"object\") return null;\n const o = raw as Record<string, unknown>;\n const urlRaw = typeof o.url === \"string\" ? o.url.trim() : \"\";\n const url = urlRaw || existing?.url || \"\";\n if (!url) return null;\n const content_type =\n typeof o.content_type === \"string\" && o.content_type ? o.content_type : (existing?.content_type ?? \"json\");\n let secret: string | undefined;\n if (o.secret === null) {\n secret = undefined;\n } else if (typeof o.secret === \"string\") {\n secret = o.secret;\n } else if (existing?.secret !== undefined) {\n secret = existing.secret;\n }\n const insecure_ssl = normalizeInsecureSsl(\n o.insecure_ssl !== undefined ? o.insecure_ssl : (existing?.insecure_ssl ?? \"0\"),\n );\n return { url, content_type, secret, insecure_ssl };\n}\n\nfunction formatHookDelivery(d: WebhookDelivery, baseUrl: string, pathPrefix: string, hookId: number) {\n return {\n id: d.id,\n guid: `${d.hook_id}-${d.id}-${d.delivered_at}`,\n delivered_at: d.delivered_at,\n redelivery: false,\n duration: d.duration,\n status: d.success ? \"OK\" : \"Failed\",\n status_code: d.status_code,\n event: d.event,\n action: d.action ?? null,\n url: `${baseUrl}/${pathPrefix}/hooks/${hookId}/deliveries/${d.id}`,\n };\n}\n\nexport function webhooksRoutes({ app, store, webhooks, baseUrl }: RouteContext): void {\n const gh = getGitHubStore(store);\n\n // --- Repository webhooks ---\n\n app.get(\"/repos/:owner/:repo/hooks\", (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n assertRepoAdmin(gh, c.get(\"authUser\"), repo);\n\n let list = webhooksForRepo(gh, repo.id).sort((a, b) => a.id - b.id);\n const { page, per_page } = parsePagination(c);\n const total = list.length;\n setLinkHeader(c, total, page, per_page);\n const start = (page - 1) * per_page;\n list = list.slice(start, start + per_page);\n\n const ownerPath = `${owner}/${repoName}`;\n return c.json(list.map((wh) => formatWebhook(wh, baseUrl, ownerPath)));\n });\n\n app.post(\"/repos/:owner/:repo/hooks\", async (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n assertRepoAdmin(gh, c.get(\"authUser\"), repo);\n\n const body = await parseJsonBody(c);\n const name = typeof body.name === \"string\" && body.name.trim() ? body.name.trim() : \"web\";\n const events = Array.isArray(body.events)\n ? (body.events as unknown[]).filter((e): e is string => typeof e === \"string\")\n : [\"push\"];\n const active = typeof body.active === \"boolean\" ? body.active : true;\n const config = parseHookConfig(body.config);\n if (!config) throw new ApiError(422, \"config.url is required\");\n\n const wh = gh.webhooks.insert({\n repo_id: repo.id,\n org_id: null,\n name,\n active,\n events,\n config,\n last_response: { code: null, status: \"unused\", message: null },\n });\n\n webhooks.register({\n id: wh.id,\n url: wh.config.url,\n events: wh.events,\n active: wh.active,\n secret: wh.config.secret,\n owner,\n repo: repo.name,\n });\n\n const ownerPath = `${owner}/${repoName}`;\n return c.json(formatWebhook(wh, baseUrl, ownerPath), 201);\n });\n\n app.get(\"/repos/:owner/:repo/hooks/:hook_id\", (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const hookId = Number(c.req.param(\"hook_id\"));\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n assertRepoAdmin(gh, c.get(\"authUser\"), repo);\n if (!Number.isFinite(hookId)) throw notFoundResponse();\n\n const wh = findRepoHook(gh, repo.id, hookId);\n if (!wh) throw notFoundResponse();\n\n const ownerPath = `${owner}/${repoName}`;\n return c.json(formatWebhook(wh, baseUrl, ownerPath));\n });\n\n app.patch(\"/repos/:owner/:repo/hooks/:hook_id\", async (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const hookId = Number(c.req.param(\"hook_id\"));\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n assertRepoAdmin(gh, c.get(\"authUser\"), repo);\n if (!Number.isFinite(hookId)) throw notFoundResponse();\n\n const existing = findRepoHook(gh, repo.id, hookId);\n if (!existing) throw notFoundResponse();\n\n const body = await parseJsonBody(c);\n const name = typeof body.name === \"string\" ? body.name.trim() : existing.name;\n const events = Array.isArray(body.events)\n ? (body.events as unknown[]).filter((e): e is string => typeof e === \"string\")\n : existing.events;\n const active = typeof body.active === \"boolean\" ? body.active : existing.active;\n const config = body.config !== undefined ? parseHookConfig(body.config, existing.config) : existing.config;\n if (!config) throw new ApiError(422, \"Invalid config\");\n\n const wh = gh.webhooks.update(hookId, { name, active, events, config })!;\n webhooks.updateSubscription(hookId, {\n url: wh.config.url,\n events: wh.events,\n active: wh.active,\n secret: wh.config.secret,\n });\n\n const ownerPath = `${owner}/${repoName}`;\n return c.json(formatWebhook(wh, baseUrl, ownerPath));\n });\n\n app.delete(\"/repos/:owner/:repo/hooks/:hook_id\", (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const hookId = Number(c.req.param(\"hook_id\"));\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n assertRepoAdmin(gh, c.get(\"authUser\"), repo);\n if (!Number.isFinite(hookId)) throw notFoundResponse();\n\n const wh = findRepoHook(gh, repo.id, hookId);\n if (!wh) throw notFoundResponse();\n\n webhooks.unregister(hookId);\n gh.webhooks.delete(hookId);\n return c.body(null, 204);\n });\n\n app.post(\"/repos/:owner/:repo/hooks/:hook_id/pings\", async (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const hookId = Number(c.req.param(\"hook_id\"));\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n assertRepoAdmin(gh, c.get(\"authUser\"), repo);\n if (!Number.isFinite(hookId)) throw notFoundResponse();\n\n const wh = findRepoHook(gh, repo.id, hookId);\n if (!wh) throw notFoundResponse();\n\n const ownerPath = `${owner}/${repoName}`;\n await webhooks.dispatch(\n \"ping\",\n undefined,\n {\n zen: \"Keep it logically awesome.\",\n hook_id: wh.id,\n hook: formatWebhook(wh, baseUrl, ownerPath),\n },\n owner,\n repo.name,\n );\n return c.body(null, 204);\n });\n\n app.post(\"/repos/:owner/:repo/hooks/:hook_id/tests\", async (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const hookId = Number(c.req.param(\"hook_id\"));\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n assertRepoAdmin(gh, c.get(\"authUser\"), repo);\n if (!Number.isFinite(hookId)) throw notFoundResponse();\n\n const wh = findRepoHook(gh, repo.id, hookId);\n if (!wh) throw notFoundResponse();\n\n const ownerLogin = ownerLoginOf(gh, repo);\n const actor = getActorUser(gh, c.get(\"authUser\")!) ?? gh.users.get(repo.owner_id) ?? gh.users.all()[0];\n const testPayload = {\n ref: \"refs/heads/main\",\n before: \"0000000000000000000000000000000000000000\",\n after: \"0000000000000000000000000000000000000000\",\n repository: formatRepo(repo, gh, baseUrl),\n pusher: actor ? formatUser(actor, baseUrl) : null,\n sender: actor ? formatUser(actor, baseUrl) : null,\n };\n await webhooks.dispatch(\"push\", undefined, testPayload, ownerLogin, repo.name);\n return c.body(null, 204);\n });\n\n app.get(\"/repos/:owner/:repo/hooks/:hook_id/deliveries\", (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const hookId = Number(c.req.param(\"hook_id\"));\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n assertRepoAdmin(gh, c.get(\"authUser\"), repo);\n if (!Number.isFinite(hookId)) throw notFoundResponse();\n\n const wh = findRepoHook(gh, repo.id, hookId);\n if (!wh) throw notFoundResponse();\n\n const { page, per_page } = parsePagination(c);\n let list = webhooks.getDeliveries(wh.id).sort((a, b) => b.id - a.id);\n const total = list.length;\n setLinkHeader(c, total, page, per_page);\n const start = (page - 1) * per_page;\n list = list.slice(start, start + per_page);\n\n const pp = pathPrefixForWebhook(wh, `${owner}/${repoName}`);\n return c.json(list.map((d) => formatHookDelivery(d, baseUrl, pp, wh.id)));\n });\n\n app.get(\"/repos/:owner/:repo/hooks/:hook_id/deliveries/:delivery_id\", (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const hookId = Number(c.req.param(\"hook_id\"));\n const deliveryId = Number(c.req.param(\"delivery_id\"));\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n assertRepoAdmin(gh, c.get(\"authUser\"), repo);\n if (!Number.isFinite(hookId) || !Number.isFinite(deliveryId)) throw notFoundResponse();\n\n const wh = findRepoHook(gh, repo.id, hookId);\n if (!wh) throw notFoundResponse();\n\n const d = webhooks.getDeliveries(wh.id).find((x) => x.id === deliveryId);\n if (!d) throw notFoundResponse();\n\n const pp = pathPrefixForWebhook(wh, `${owner}/${repoName}`);\n return c.json(formatHookDelivery(d, baseUrl, pp, wh.id));\n });\n\n // --- Organization webhooks ---\n\n app.get(\"/orgs/:org/hooks\", (c) => {\n const orgLogin = c.req.param(\"org\")!;\n const org = getOrgByLogin(gh, orgLogin);\n if (!org) throw notFoundResponse();\n assertOrgAdmin(gh, c.get(\"authUser\"), org);\n\n let list = webhooksForOrg(gh, org.id).sort((a, b) => a.id - b.id);\n const { page, per_page } = parsePagination(c);\n const total = list.length;\n setLinkHeader(c, total, page, per_page);\n const start = (page - 1) * per_page;\n list = list.slice(start, start + per_page);\n\n return c.json(list.map((wh) => formatWebhook(wh, baseUrl, org.login)));\n });\n\n app.post(\"/orgs/:org/hooks\", async (c) => {\n const orgLogin = c.req.param(\"org\")!;\n const org = getOrgByLogin(gh, orgLogin);\n if (!org) throw notFoundResponse();\n assertOrgAdmin(gh, c.get(\"authUser\"), org);\n\n const body = await parseJsonBody(c);\n const name = typeof body.name === \"string\" && body.name.trim() ? body.name.trim() : \"web\";\n const events = Array.isArray(body.events)\n ? (body.events as unknown[]).filter((e): e is string => typeof e === \"string\")\n : [\"push\"];\n const active = typeof body.active === \"boolean\" ? body.active : true;\n const config = parseHookConfig(body.config);\n if (!config) throw new ApiError(422, \"config.url is required\");\n\n const wh = gh.webhooks.insert({\n repo_id: null,\n org_id: org.id,\n name,\n active,\n events,\n config,\n last_response: { code: null, status: \"unused\", message: null },\n });\n\n webhooks.register({\n id: wh.id,\n url: wh.config.url,\n events: wh.events,\n active: wh.active,\n secret: wh.config.secret,\n owner: org.login,\n repo: undefined,\n });\n\n return c.json(formatWebhook(wh, baseUrl, org.login), 201);\n });\n\n app.get(\"/orgs/:org/hooks/:hook_id\", (c) => {\n const orgLogin = c.req.param(\"org\")!;\n const hookId = Number(c.req.param(\"hook_id\"));\n const org = getOrgByLogin(gh, orgLogin);\n if (!org) throw notFoundResponse();\n assertOrgAdmin(gh, c.get(\"authUser\"), org);\n if (!Number.isFinite(hookId)) throw notFoundResponse();\n\n const wh = findOrgHook(gh, org.id, hookId);\n if (!wh) throw notFoundResponse();\n\n return c.json(formatWebhook(wh, baseUrl, org.login));\n });\n\n app.patch(\"/orgs/:org/hooks/:hook_id\", async (c) => {\n const orgLogin = c.req.param(\"org\")!;\n const hookId = Number(c.req.param(\"hook_id\"));\n const org = getOrgByLogin(gh, orgLogin);\n if (!org) throw notFoundResponse();\n assertOrgAdmin(gh, c.get(\"authUser\"), org);\n if (!Number.isFinite(hookId)) throw notFoundResponse();\n\n const existing = findOrgHook(gh, org.id, hookId);\n if (!existing) throw notFoundResponse();\n\n const body = await parseJsonBody(c);\n const name = typeof body.name === \"string\" ? body.name.trim() : existing.name;\n const events = Array.isArray(body.events)\n ? (body.events as unknown[]).filter((e): e is string => typeof e === \"string\")\n : existing.events;\n const active = typeof body.active === \"boolean\" ? body.active : existing.active;\n const config = body.config !== undefined ? parseHookConfig(body.config, existing.config) : existing.config;\n if (!config) throw new ApiError(422, \"Invalid config\");\n\n const wh = gh.webhooks.update(hookId, { name, active, events, config })!;\n webhooks.updateSubscription(hookId, {\n url: wh.config.url,\n events: wh.events,\n active: wh.active,\n secret: wh.config.secret,\n });\n\n return c.json(formatWebhook(wh, baseUrl, org.login));\n });\n\n app.delete(\"/orgs/:org/hooks/:hook_id\", (c) => {\n const orgLogin = c.req.param(\"org\")!;\n const hookId = Number(c.req.param(\"hook_id\"));\n const org = getOrgByLogin(gh, orgLogin);\n if (!org) throw notFoundResponse();\n assertOrgAdmin(gh, c.get(\"authUser\"), org);\n if (!Number.isFinite(hookId)) throw notFoundResponse();\n\n const wh = findOrgHook(gh, org.id, hookId);\n if (!wh) throw notFoundResponse();\n\n webhooks.unregister(hookId);\n gh.webhooks.delete(hookId);\n return c.body(null, 204);\n });\n\n app.post(\"/orgs/:org/hooks/:hook_id/pings\", async (c) => {\n const orgLogin = c.req.param(\"org\")!;\n const hookId = Number(c.req.param(\"hook_id\"));\n const org = getOrgByLogin(gh, orgLogin);\n if (!org) throw notFoundResponse();\n assertOrgAdmin(gh, c.get(\"authUser\"), org);\n if (!Number.isFinite(hookId)) throw notFoundResponse();\n\n const wh = findOrgHook(gh, org.id, hookId);\n if (!wh) throw notFoundResponse();\n\n await webhooks.dispatch(\n \"ping\",\n undefined,\n {\n zen: \"Keep it logically awesome.\",\n hook_id: wh.id,\n hook: formatWebhook(wh, baseUrl, org.login),\n },\n org.login,\n undefined,\n );\n return c.body(null, 204);\n });\n}\n","import type { RouteContext, AuthUser } from \"@emulators/core\";\nimport { ApiError, parsePagination, setLinkHeader } from \"@emulators/core\";\nimport { getGitHubStore } from \"../store.js\";\nimport type { GitHubStore } from \"../store.js\";\nimport type {\n GitHubBlob,\n GitHubCommit,\n GitHubIssue,\n GitHubOrg,\n GitHubPullRequest,\n GitHubRepo,\n GitHubUser,\n} from \"../entities.js\";\nimport { formatIssue, formatOrgBrief, formatPullRequest, formatRepo, formatUser, lookupRepo } from \"../helpers.js\";\nimport { canAccessRepo } from \"../route-helpers.js\";\n\n/** Parsed GitHub-style search query (q parameter). */\nexport interface ParsedSearchQuery {\n text: string;\n qualifiers: Map<string, string[]>;\n negations: Map<string, string[]>;\n ranges: Map<string, Array<{ op: string; value: number | string }>>;\n}\n\nfunction tokenizeSearchQuery(q: string): string[] {\n const tokens: string[] = [];\n let i = 0;\n let buf = \"\";\n let quote: '\"' | \"'\" | null = null;\n while (i < q.length) {\n const c = q[i]!;\n if (quote) {\n if (c === quote) {\n quote = null;\n i++;\n continue;\n }\n buf += c;\n i++;\n continue;\n }\n if (c === '\"' || c === \"'\") {\n quote = c;\n i++;\n continue;\n }\n if (c === \" \" || c === \"\\t\" || c === \"\\n\" || c === \"\\r\") {\n if (buf.length) {\n tokens.push(buf);\n buf = \"\";\n }\n i++;\n continue;\n }\n buf += c;\n i++;\n }\n if (buf.length) tokens.push(buf);\n return tokens;\n}\n\nfunction parseRangeToken(raw: string): { op: string; value: number | string } | null {\n const range = /^(\\d+)\\.\\.(\\d+)$/.exec(raw);\n if (range) {\n return { op: \"..\", value: `${range[1]}..${range[2]}` };\n }\n const cmp = /^(>=|<=|>|<)(\\d+)$/.exec(raw);\n if (cmp) {\n return { op: cmp[1]!, value: parseInt(cmp[2]!, 10) };\n }\n if (/^\\d+$/.test(raw)) {\n return { op: \"=\", value: parseInt(raw, 10) };\n }\n return null;\n}\n\n/**\n * Splits `q` into free text vs qualifiers, handles `-qualifier:value` negation,\n * and numeric ranges (`stars:>10`, `stars:10..50`).\n */\nexport function parseSearchQuery(q: string): ParsedSearchQuery {\n const qualifiers = new Map<string, string[]>();\n const negations = new Map<string, string[]>();\n const ranges = new Map<string, Array<{ op: string; value: number | string }>>();\n const textParts: string[] = [];\n\n for (const rawTok of tokenizeSearchQuery(q.trim())) {\n let neg = false;\n let tok = rawTok;\n if (tok.startsWith(\"-\") && tok.includes(\":\") && tok.length > 1) {\n neg = true;\n tok = tok.slice(1);\n }\n\n const colon = tok.indexOf(\":\");\n if (colon <= 0) {\n textParts.push(rawTok);\n continue;\n }\n\n const key = tok.slice(0, colon).toLowerCase();\n const rawVal = tok.slice(colon + 1);\n if (!rawVal.length) {\n textParts.push(rawTok);\n continue;\n }\n\n const rangePred = parseRangeToken(rawVal);\n const isRangeKey =\n key === \"stars\" ||\n key === \"forks\" ||\n key === \"repos\" ||\n key === \"followers\" ||\n key === \"comments\" ||\n key === \"size\";\n\n if (rangePred && (rangePred.op !== \"=\" || isRangeKey)) {\n if (neg) {\n if (!negations.has(key)) negations.set(key, []);\n negations.get(key)!.push(rawVal);\n } else {\n if (!ranges.has(key)) ranges.set(key, []);\n ranges.get(key)!.push(rangePred);\n }\n continue;\n }\n\n if (neg) {\n if (!negations.has(key)) negations.set(key, []);\n negations.get(key)!.push(rawVal);\n } else {\n if (!qualifiers.has(key)) qualifiers.set(key, []);\n qualifiers.get(key)!.push(rawVal);\n }\n }\n\n return {\n text: textParts.join(\" \").trim(),\n qualifiers,\n negations,\n ranges,\n };\n}\n\nfunction textMatches(haystack: string, needle: string): boolean {\n if (!needle.trim()) return true;\n return haystack.toLowerCase().includes(needle.toLowerCase());\n}\n\nfunction repoVisibleForSearch(repo: GitHubRepo, gh: GitHubStore, authUser: AuthUser | undefined): boolean {\n return canAccessRepo(gh, authUser, repo);\n}\n\nfunction ownerLogin(gh: GitHubStore, repo: GitHubRepo): string {\n if (repo.owner_type === \"User\") {\n return gh.users.get(repo.owner_id)?.login ?? \"\";\n }\n return gh.orgs.get(repo.owner_id)?.login ?? \"\";\n}\n\nfunction matchesNumericPredicate(\n actual: number,\n preds: Array<{ op: string; value: number | string }>,\n equalsFromQualifiers: string[],\n): boolean {\n for (const e of equalsFromQualifiers) {\n if (/^\\d+$/.test(e) && actual !== parseInt(e, 10)) return false;\n }\n for (const p of preds) {\n if (p.op === \"..\") {\n const m = /^(\\d+)\\.\\.(\\d+)$/.exec(String(p.value));\n if (m) {\n const lo = parseInt(m[1]!, 10);\n const hi = parseInt(m[2]!, 10);\n if (actual < lo || actual > hi) return false;\n }\n } else if (p.op === \">\") {\n if (!(actual > Number(p.value))) return false;\n } else if (p.op === \"<\") {\n if (!(actual < Number(p.value))) return false;\n } else if (p.op === \">=\") {\n if (!(actual >= Number(p.value))) return false;\n } else if (p.op === \"<=\") {\n if (!(actual <= Number(p.value))) return false;\n } else if (p.op === \"=\") {\n if (actual !== Number(p.value)) return false;\n }\n }\n return true;\n}\n\nfunction filterRepos(\n gh: GitHubStore,\n repos: GitHubRepo[],\n parsed: ParsedSearchQuery,\n authUser: AuthUser | undefined,\n): GitHubRepo[] {\n const qUser = parsed.qualifiers.get(\"user\")?.[0];\n const qOrg = parsed.qualifiers.get(\"org\")?.[0];\n const negUser = parsed.negations.get(\"user\") ?? [];\n const negOrg = parsed.negations.get(\"org\") ?? [];\n\n const inScopes = parsed.qualifiers.get(\"in\") ?? [];\n const negIn = parsed.negations.get(\"in\") ?? [];\n\n return repos.filter((repo) => {\n if (!repoVisibleForSearch(repo, gh, authUser)) return false;\n\n const ologin = ownerLogin(gh, repo);\n if (qUser && ologin.toLowerCase() !== qUser.toLowerCase()) return false;\n if (qOrg && ologin.toLowerCase() !== qOrg.toLowerCase()) return false;\n if (repo.owner_type === \"User\" && negUser.some((n) => ologin.toLowerCase() === n.toLowerCase())) {\n return false;\n }\n if (repo.owner_type === \"Organization\" && negOrg.some((n) => ologin.toLowerCase() === n.toLowerCase())) {\n return false;\n }\n\n for (const lang of parsed.qualifiers.get(\"language\") ?? []) {\n if (!repo.language || repo.language.toLowerCase() !== lang.toLowerCase()) return false;\n }\n for (const lang of parsed.negations.get(\"language\") ?? []) {\n if (repo.language && repo.language.toLowerCase() === lang.toLowerCase()) return false;\n }\n\n for (const topic of parsed.qualifiers.get(\"topic\") ?? []) {\n if (!repo.topics.some((t) => t.toLowerCase() === topic.toLowerCase())) return false;\n }\n for (const topic of parsed.negations.get(\"topic\") ?? []) {\n if (repo.topics.some((t) => t.toLowerCase() === topic.toLowerCase())) return false;\n }\n\n const starRanges = parsed.ranges.get(\"stars\") ?? [];\n const starEq = parsed.qualifiers.get(\"stars\") ?? [];\n if (!matchesNumericPredicate(repo.stargazers_count, starRanges, starEq)) return false;\n for (const nv of parsed.negations.get(\"stars\") ?? []) {\n const r = parseRangeToken(nv);\n if (r) {\n if (matchesNumericPredicate(repo.stargazers_count, [r], [])) return false;\n } else if (/^\\d+$/.test(nv) && repo.stargazers_count === parseInt(nv, 10)) {\n return false;\n }\n }\n\n const forkRanges = parsed.ranges.get(\"forks\") ?? [];\n const forkEq = parsed.qualifiers.get(\"forks\") ?? [];\n if (!matchesNumericPredicate(repo.forks_count, forkRanges, forkEq)) return false;\n const negForkVals = parsed.negations.get(\"forks\") ?? [];\n if (negForkVals.length) {\n const negPreds = negForkVals.flatMap((s) => {\n const r = parseRangeToken(s);\n return r ? [r] : [];\n });\n const negEq = negForkVals.filter((s) => /^\\d+$/.test(s));\n if (matchesNumericPredicate(repo.forks_count, negPreds, negEq)) return false;\n }\n\n for (const a of parsed.qualifiers.get(\"archived\") ?? []) {\n const want = a === \"true\";\n if (repo.archived !== want) return false;\n }\n for (const a of parsed.negations.get(\"archived\") ?? []) {\n const want = a === \"true\";\n if (repo.archived === want) return false;\n }\n\n const isVals = parsed.qualifiers.get(\"is\") ?? [];\n for (const is of isVals) {\n if (is === \"public\" && repo.private) return false;\n if (is === \"private\" && !repo.private) return false;\n }\n for (const is of parsed.negations.get(\"is\") ?? []) {\n if (is === \"public\" && !repo.private) return false;\n if (is === \"private\" && repo.private) return false;\n }\n\n for (const f of parsed.qualifiers.get(\"fork\") ?? []) {\n const v = f.toLowerCase();\n if (v === \"true\" && !repo.fork) return false;\n if (v === \"false\" && repo.fork) return false;\n if (v === \"only\" && !repo.fork) return false;\n }\n for (const f of parsed.negations.get(\"fork\") ?? []) {\n const v = f.toLowerCase();\n if (v === \"true\" && repo.fork) return false;\n if (v === \"false\" && !repo.fork) return false;\n if (v === \"only\" && repo.fork) return false;\n }\n\n const searchIn = inScopes.length > 0 ? inScopes.map((s) => s.toLowerCase()) : [\"name\", \"description\", \"topics\"];\n\n const text = parsed.text;\n if (text.length) {\n const nameMatch = textMatches(repo.name, text);\n const fullMatch = textMatches(repo.full_name, text);\n const descMatch = repo.description ? textMatches(repo.description, text) : false;\n const topicsMatch = repo.topics.some((t) => textMatches(t, text));\n\n let ok = false;\n if (searchIn.includes(\"name\") && (nameMatch || fullMatch)) ok = true;\n if (searchIn.includes(\"description\") && descMatch) ok = true;\n if (searchIn.includes(\"topics\") && topicsMatch) ok = true;\n if (!ok) return false;\n }\n\n for (const n of negIn) {\n const scope = n.toLowerCase();\n if (scope === \"name\" && (textMatches(repo.name, parsed.text) || textMatches(repo.full_name, parsed.text))) {\n return false;\n }\n if (scope === \"description\" && repo.description && textMatches(repo.description, parsed.text)) {\n return false;\n }\n if (scope === \"topics\" && repo.topics.some((t) => textMatches(t, parsed.text))) {\n return false;\n }\n }\n\n return true;\n });\n}\n\nfunction repoRelevance(repo: GitHubRepo, parsed: ParsedSearchQuery): number {\n const t = parsed.text.trim().toLowerCase();\n if (!t) return 1;\n let score = 0;\n if (repo.name.toLowerCase().includes(t)) score += 5;\n if (repo.full_name.toLowerCase().includes(t)) score += 4;\n if (repo.description?.toLowerCase().includes(t)) score += 2;\n if (repo.topics.some((x) => x.toLowerCase().includes(t))) score += 1;\n return score;\n}\n\nfunction resolveRepoQualifier(gh: GitHubStore, spec: string): GitHubRepo | null {\n const trimmed = spec.trim();\n if (!trimmed.includes(\"/\")) return null;\n return lookupRepo(gh, trimmed.split(\"/\")[0]!, trimmed.split(\"/\")[1]!) ?? null;\n}\n\nfunction issuePrMatchesFilters(\n gh: GitHubStore,\n parsed: ParsedSearchQuery,\n repo: GitHubRepo,\n issue: GitHubIssue | null,\n pr: GitHubPullRequest | null,\n): boolean {\n const repoSpecs = parsed.qualifiers.get(\"repo\") ?? [];\n for (const rs of repoSpecs) {\n const r = resolveRepoQualifier(gh, rs);\n if (!r || r.id !== repo.id) return false;\n }\n for (const rs of parsed.negations.get(\"repo\") ?? []) {\n const r = resolveRepoQualifier(gh, rs);\n if (r && r.id === repo.id) return false;\n }\n\n const isVals = [...(parsed.qualifiers.get(\"is\") ?? []), ...(parsed.qualifiers.get(\"type\") ?? [])].map((x) =>\n x.toLowerCase(),\n );\n const negIs = [...(parsed.negations.get(\"is\") ?? []), ...(parsed.negations.get(\"type\") ?? [])].map((x) =>\n x.toLowerCase(),\n );\n\n const isPr = pr !== null || issue?.is_pull_request === true;\n\n if (isVals.includes(\"issue\") && isPr) return false;\n if (isVals.includes(\"pr\") && !isPr) return false;\n\n if (negIs.includes(\"issue\") && !isPr) return false;\n if (negIs.includes(\"pr\") && isPr) return false;\n\n const stateVals = parsed.qualifiers.get(\"state\") ?? [];\n for (const s of stateVals) {\n const sl = s.toLowerCase();\n if (isPr && pr) {\n if (sl === \"open\" && pr.state !== \"open\") return false;\n if (sl === \"closed\" && pr.state !== \"closed\") return false;\n } else if (issue) {\n if (sl === \"open\" && issue.state !== \"open\") return false;\n if (sl === \"closed\" && issue.state !== \"closed\") return false;\n }\n }\n\n for (const iv of isVals) {\n if (iv === \"open\") {\n if (isPr && pr && pr.state !== \"open\") return false;\n if (!isPr && issue && issue.state !== \"open\") return false;\n }\n if (iv === \"closed\") {\n if (isPr && pr && pr.state !== \"closed\") return false;\n if (!isPr && issue && issue.state !== \"closed\") return false;\n }\n if (iv === \"merged\") {\n if (!isPr || !pr || !pr.merged) return false;\n }\n if (iv === \"draft\") {\n if (!isPr || !pr || !pr.draft) return false;\n }\n }\n\n for (const iv of negIs) {\n if (iv === \"open\") {\n if (isPr && pr && pr.state === \"open\") return false;\n if (!isPr && issue && issue.state === \"open\") return false;\n }\n if (iv === \"closed\") {\n if (isPr && pr && pr.state === \"closed\") return false;\n if (!isPr && issue && issue.state === \"closed\") return false;\n }\n if (iv === \"merged\") {\n if (isPr && pr && pr.merged) return false;\n }\n if (iv === \"draft\") {\n if (isPr && pr && pr.draft) return false;\n }\n }\n\n const authors = parsed.qualifiers.get(\"author\") ?? [];\n for (const a of authors) {\n const u = gh.users.findOneBy(\"login\", a);\n const uid = u?.id;\n if (isPr && pr) {\n if (!uid || pr.user_id !== uid) return false;\n } else if (issue) {\n if (!uid || issue.user_id !== uid) return false;\n }\n }\n for (const a of parsed.negations.get(\"author\") ?? []) {\n const u = gh.users.findOneBy(\"login\", a);\n const uid = u?.id;\n if (isPr && pr && uid !== undefined && pr.user_id === uid) return false;\n if (!isPr && issue && uid !== undefined && issue.user_id === uid) return false;\n }\n\n const assignees = parsed.qualifiers.get(\"assignee\") ?? [];\n for (const a of assignees) {\n const u = gh.users.findOneBy(\"login\", a);\n const uid = u?.id;\n if (!uid) return false;\n const ids = isPr && pr ? pr.assignee_ids : (issue?.assignee_ids ?? []);\n if (!ids.includes(uid)) return false;\n }\n for (const a of parsed.negations.get(\"assignee\") ?? []) {\n const u = gh.users.findOneBy(\"login\", a);\n const uid = u?.id;\n if (uid === undefined) continue;\n const ids = isPr && pr ? pr.assignee_ids : (issue?.assignee_ids ?? []);\n if (ids.includes(uid)) return false;\n }\n\n const labels = parsed.qualifiers.get(\"label\") ?? [];\n for (const lb of labels) {\n const labelIds = isPr && pr ? pr.label_ids : (issue?.label_ids ?? []);\n const names = labelIds\n .map((id) => gh.labels.get(id))\n .filter(Boolean)\n .map((l) => l!.name.toLowerCase());\n if (!names.includes(lb.toLowerCase())) return false;\n }\n for (const lb of parsed.negations.get(\"label\") ?? []) {\n const labelIds = isPr && pr ? pr.label_ids : (issue?.label_ids ?? []);\n const names = labelIds\n .map((id) => gh.labels.get(id))\n .filter(Boolean)\n .map((l) => l!.name.toLowerCase());\n if (names.includes(lb.toLowerCase())) return false;\n }\n\n const milestones = parsed.qualifiers.get(\"milestone\") ?? [];\n for (const ms of milestones) {\n const mid = isPr && pr ? pr.milestone_id : issue?.milestone_id;\n const m = mid ? gh.milestones.get(mid) : null;\n if (!m || m.title.toLowerCase() !== ms.toLowerCase()) return false;\n }\n for (const ms of parsed.negations.get(\"milestone\") ?? []) {\n const mid = isPr && pr ? pr.milestone_id : issue?.milestone_id;\n const m = mid ? gh.milestones.get(mid) : null;\n if (m && m.title.toLowerCase() === ms.toLowerCase()) return false;\n }\n\n const commentRanges = parsed.ranges.get(\"comments\") ?? [];\n const commentEq = parsed.qualifiers.get(\"comments\") ?? [];\n const n = isPr && pr ? pr.comments : (issue?.comments ?? 0);\n if (!matchesNumericPredicate(n, commentRanges, commentEq)) return false;\n for (const nv of parsed.negations.get(\"comments\") ?? []) {\n const r = parseRangeToken(nv);\n if (r) {\n if (matchesNumericPredicate(n, [r], [])) return false;\n } else if (/^\\d+$/.test(nv) && n === parseInt(nv, 10)) return false;\n }\n\n const text = parsed.text.trim();\n if (text.length) {\n const title = isPr && pr ? pr.title : (issue?.title ?? \"\");\n const body = isPr && pr ? (pr.body ?? \"\") : (issue?.body ?? \"\");\n if (!textMatches(title, text) && !textMatches(body, text)) return false;\n }\n\n return true;\n}\n\nfunction userMatchesSearch(gh: GitHubStore, u: GitHubUser, parsed: ParsedSearchQuery): boolean {\n const types = parsed.qualifiers.get(\"type\") ?? [];\n if (types.length && !types.map((t) => t.toLowerCase()).includes(\"user\")) return false;\n for (const t of parsed.negations.get(\"type\") ?? []) {\n if (t.toLowerCase() === \"user\") return false;\n }\n\n const inScopes = parsed.qualifiers.get(\"in\") ?? [];\n const searchIn = inScopes.length > 0 ? inScopes.map((s) => s.toLowerCase()) : [\"login\", \"email\", \"fullname\"];\n\n const text = parsed.text.trim();\n if (text.length) {\n let ok = false;\n if (searchIn.includes(\"login\") && textMatches(u.login, text)) ok = true;\n if (searchIn.includes(\"email\") && u.email && textMatches(u.email, text)) ok = true;\n if (searchIn.includes(\"fullname\") && u.name && textMatches(u.name, text)) ok = true;\n if (!ok) return false;\n }\n\n const rpred = parsed.ranges.get(\"repos\") ?? [];\n const req = parsed.qualifiers.get(\"repos\") ?? [];\n if (!matchesNumericPredicate(u.public_repos, rpred, req)) return false;\n for (const nv of parsed.negations.get(\"repos\") ?? []) {\n const r = parseRangeToken(nv);\n if (r) {\n if (matchesNumericPredicate(u.public_repos, [r], [])) return false;\n } else if (/^\\d+$/.test(nv) && u.public_repos === parseInt(nv, 10)) return false;\n }\n\n const fpred = parsed.ranges.get(\"followers\") ?? [];\n const feq = parsed.qualifiers.get(\"followers\") ?? [];\n if (!matchesNumericPredicate(u.followers, fpred, feq)) return false;\n for (const nv of parsed.negations.get(\"followers\") ?? []) {\n const r = parseRangeToken(nv);\n if (r) {\n if (matchesNumericPredicate(u.followers, [r], [])) return false;\n } else if (/^\\d+$/.test(nv) && u.followers === parseInt(nv, 10)) return false;\n }\n\n return true;\n}\n\nfunction orgMatchesSearch(gh: GitHubStore, o: GitHubOrg, parsed: ParsedSearchQuery): boolean {\n void gh;\n const types = parsed.qualifiers.get(\"type\") ?? [];\n if (types.length && !types.map((t) => t.toLowerCase()).includes(\"org\")) return false;\n for (const t of parsed.negations.get(\"type\") ?? []) {\n if (t.toLowerCase() === \"org\") return false;\n }\n\n const inScopes = parsed.qualifiers.get(\"in\") ?? [];\n const searchIn = inScopes.length > 0 ? inScopes.map((s) => s.toLowerCase()) : [\"login\", \"email\", \"fullname\"];\n\n const text = parsed.text.trim();\n if (text.length) {\n let ok = false;\n if (searchIn.includes(\"login\") && textMatches(o.login, text)) ok = true;\n if (searchIn.includes(\"email\") && o.email && textMatches(o.email, text)) ok = true;\n if (searchIn.includes(\"fullname\") && o.name && textMatches(o.name, text)) ok = true;\n if (!ok) return false;\n }\n\n const rpred = parsed.ranges.get(\"repos\") ?? [];\n const req = parsed.qualifiers.get(\"repos\") ?? [];\n if (!matchesNumericPredicate(o.public_repos, rpred, req)) return false;\n for (const nv of parsed.negations.get(\"repos\") ?? []) {\n const r = parseRangeToken(nv);\n if (r) {\n if (matchesNumericPredicate(o.public_repos, [r], [])) return false;\n } else if (/^\\d+$/.test(nv) && o.public_repos === parseInt(nv, 10)) return false;\n }\n\n const fpred = parsed.ranges.get(\"followers\") ?? [];\n const feq = parsed.qualifiers.get(\"followers\") ?? [];\n if (!matchesNumericPredicate(o.followers, fpred, feq)) return false;\n for (const nv of parsed.negations.get(\"followers\") ?? []) {\n const r = parseRangeToken(nv);\n if (r) {\n if (matchesNumericPredicate(o.followers, [r], [])) return false;\n } else if (/^\\d+$/.test(nv) && o.followers === parseInt(nv, 10)) return false;\n }\n\n return true;\n}\n\nfunction blobText(blob: GitHubBlob): string {\n if (blob.encoding === \"base64\") {\n try {\n return Buffer.from(blob.content, \"base64\").toString(\"utf8\");\n } catch {\n return \"\";\n }\n }\n return blob.content;\n}\n\nfunction buildBlobPathIndex(gh: GitHubStore): Map<string, string> {\n const byRepo = new Map<number, Map<string, string>>();\n for (const tree of gh.trees.all()) {\n let map = byRepo.get(tree.repo_id);\n if (!map) {\n map = new Map();\n byRepo.set(tree.repo_id, map);\n }\n for (const e of tree.tree) {\n if (e.type === \"blob\") {\n if (!map.has(e.sha)) map.set(e.sha, e.path);\n }\n }\n }\n const key = (repoId: number, sha: string) => `${repoId}:${sha}`;\n const flat = new Map<string, string>();\n for (const [repoId, m] of byRepo) {\n for (const [sha, path] of m) {\n flat.set(key(repoId, sha), path);\n }\n }\n return flat;\n}\n\nfunction formatSearchCommit(gh: GitHubStore, commit: GitHubCommit, repo: GitHubRepo, baseUrl: string) {\n const repoUrl = `${baseUrl}/repos/${repo.full_name}`;\n return {\n sha: commit.sha,\n node_id: commit.node_id,\n url: `${repoUrl}/commits/${commit.sha}`,\n html_url: `${baseUrl}/${repo.full_name}/commit/${commit.sha}`,\n comments_url: `${repoUrl}/comments/${commit.sha}`,\n repository: formatRepo(repo, gh, baseUrl),\n commit: {\n url: `${repoUrl}/git/commits/${commit.sha}`,\n author: {\n name: commit.author_name,\n email: commit.author_email,\n date: commit.author_date,\n },\n committer: {\n name: commit.committer_name,\n email: commit.committer_email,\n date: commit.committer_date,\n },\n message: commit.message,\n },\n author: null as null,\n committer: null as null,\n parents: commit.parent_shas.map((sha) => ({\n sha,\n url: `${repoUrl}/commits/${sha}`,\n })),\n };\n}\n\nfunction loginMatchesCommitAuthor(\n gh: GitHubStore,\n login: string,\n commit: GitHubCommit,\n role: \"author\" | \"committer\",\n): boolean {\n const u = gh.users.findOneBy(\"login\", login);\n const email = (role === \"author\" ? commit.author_email : commit.committer_email).toLowerCase();\n if (u) {\n if (u.email && u.email.toLowerCase() === email) return true;\n if (commit.user_id != null && commit.user_id === u.id) return true;\n }\n const expect = `${login.toLowerCase()}@users.noreply.github.com`;\n return email === expect || email.startsWith(`${login.toLowerCase()}+`);\n}\n\nexport function searchRoutes({ app, store, baseUrl }: RouteContext): void {\n const gh = getGitHubStore(store);\n\n app.get(\"/search/repositories\", (c) => {\n const q = c.req.query(\"q\");\n if (q === undefined || q.trim() === \"\") {\n throw new ApiError(422, \"Validation Failed\");\n }\n const parsed = parseSearchQuery(q);\n const { page, per_page } = parsePagination(c);\n const sortRaw = (c.req.query(\"sort\") ?? \"best-match\").toLowerCase();\n const order = (c.req.query(\"order\") ?? \"desc\").toLowerCase() === \"asc\" ? \"asc\" : \"desc\";\n const authUser = c.get(\"authUser\");\n\n let list = gh.repos.all().filter((r) => repoVisibleForSearch(r, gh, authUser));\n list = filterRepos(gh, list, parsed, authUser);\n\n if (sortRaw === \"stars\") {\n list.sort((a, b) =>\n order === \"desc\" ? b.stargazers_count - a.stargazers_count : a.stargazers_count - b.stargazers_count,\n );\n } else if (sortRaw === \"forks\") {\n list.sort((a, b) => (order === \"desc\" ? b.forks_count - a.forks_count : a.forks_count - b.forks_count));\n } else if (sortRaw === \"updated\") {\n list.sort((a, b) =>\n order === \"desc\" ? b.updated_at.localeCompare(a.updated_at) : a.updated_at.localeCompare(b.updated_at),\n );\n } else {\n list.sort((a, b) => repoRelevance(b, parsed) - repoRelevance(a, parsed));\n }\n\n const total = list.length;\n const slice = list.slice((page - 1) * per_page, (page - 1) * per_page + per_page);\n setLinkHeader(c, total, page, per_page);\n return c.json({\n total_count: total,\n incomplete_results: false,\n items: slice.map((r) => formatRepo(r, gh, baseUrl)),\n });\n });\n\n app.get(\"/search/issues\", (c) => {\n const q = c.req.query(\"q\");\n if (q === undefined || q.trim() === \"\") {\n throw new ApiError(422, \"Validation Failed\");\n }\n const parsed = parseSearchQuery(q);\n const { page, per_page } = parsePagination(c);\n const sortRaw = (c.req.query(\"sort\") ?? \"best-match\").toLowerCase();\n const order = (c.req.query(\"order\") ?? \"desc\").toLowerCase() === \"asc\" ? \"asc\" : \"desc\";\n\n const authUser = c.get(\"authUser\");\n type Hit = { kind: \"issue\"; issue: GitHubIssue } | { kind: \"pr\"; pr: GitHubPullRequest };\n const hits: Hit[] = [];\n\n for (const issue of gh.issues.all()) {\n const repo = gh.repos.get(issue.repo_id);\n if (!repo) continue;\n if (!repoVisibleForSearch(repo, gh, authUser)) continue;\n if (issue.is_pull_request) {\n const pr = gh.pullRequests.findBy(\"repo_id\", issue.repo_id).find((p) => p.number === issue.number);\n if (!pr) continue;\n if (!issuePrMatchesFilters(gh, parsed, repo, issue, pr)) continue;\n hits.push({ kind: \"pr\", pr });\n } else {\n if (!issuePrMatchesFilters(gh, parsed, repo, issue, null)) continue;\n hits.push({ kind: \"issue\", issue });\n }\n }\n\n function relevance(h: Hit): number {\n const title = h.kind === \"issue\" ? h.issue.title : h.pr.title;\n const body = h.kind === \"issue\" ? (h.issue.body ?? \"\") : (h.pr.body ?? \"\");\n const t = parsed.text.trim().toLowerCase();\n if (!t) return 1;\n let s = 0;\n if (title.toLowerCase().includes(t)) s += 3;\n if (body.toLowerCase().includes(t)) s += 1;\n return s;\n }\n\n const sorted = [...hits];\n if (sortRaw === \"created\") {\n sorted.sort((a, b) => {\n const ca = a.kind === \"issue\" ? a.issue.created_at : a.pr.created_at;\n const cb = b.kind === \"issue\" ? b.issue.created_at : b.pr.created_at;\n const cmp = ca.localeCompare(cb);\n return order === \"desc\" ? -cmp : cmp;\n });\n } else if (sortRaw === \"updated\") {\n sorted.sort((a, b) => {\n const ca = a.kind === \"issue\" ? a.issue.updated_at : a.pr.updated_at;\n const cb = b.kind === \"issue\" ? b.issue.updated_at : b.pr.updated_at;\n const cmp = ca.localeCompare(cb);\n return order === \"desc\" ? -cmp : cmp;\n });\n } else if (sortRaw === \"comments\") {\n sorted.sort((a, b) => {\n const ca = a.kind === \"issue\" ? a.issue.comments : a.pr.comments;\n const cb = b.kind === \"issue\" ? b.issue.comments : b.pr.comments;\n return order === \"desc\" ? cb - ca : ca - cb;\n });\n } else {\n sorted.sort((a, b) => relevance(b) - relevance(a));\n }\n\n const total = sorted.length;\n const slice = sorted.slice((page - 1) * per_page, (page - 1) * per_page + per_page);\n setLinkHeader(c, total, page, per_page);\n\n const items = slice.map((h) => {\n if (h.kind === \"issue\") {\n return formatIssue(h.issue, gh, baseUrl);\n }\n return formatPullRequest(h.pr, gh, baseUrl);\n });\n\n return c.json({\n total_count: total,\n incomplete_results: false,\n items: items.filter(Boolean),\n });\n });\n\n app.get(\"/search/users\", (c) => {\n const q = c.req.query(\"q\");\n if (q === undefined || q.trim() === \"\") {\n throw new ApiError(422, \"Validation Failed\");\n }\n const parsed = parseSearchQuery(q);\n const { page, per_page } = parsePagination(c);\n const sortRaw = (c.req.query(\"sort\") ?? \"best-match\").toLowerCase();\n const order = (c.req.query(\"order\") ?? \"desc\").toLowerCase() === \"asc\" ? \"asc\" : \"desc\";\n\n type UHit = { kind: \"user\"; u: GitHubUser } | { kind: \"org\"; o: GitHubOrg };\n const hits: UHit[] = [];\n\n const typeFilters = parsed.qualifiers.get(\"type\")?.map((t) => t.toLowerCase()) ?? [];\n\n if (!typeFilters.length || typeFilters.includes(\"user\")) {\n for (const u of gh.users.all()) {\n if (u.type === \"Organization\") continue;\n if (userMatchesSearch(gh, u, parsed)) hits.push({ kind: \"user\", u });\n }\n }\n if (!typeFilters.length || typeFilters.includes(\"org\")) {\n for (const o of gh.orgs.all()) {\n if (orgMatchesSearch(gh, o, parsed)) hits.push({ kind: \"org\", o });\n }\n }\n\n function rel(h: UHit): number {\n const text = parsed.text.trim().toLowerCase();\n if (!text) return 1;\n if (h.kind === \"user\") {\n let s = 0;\n if (h.u.login.toLowerCase().includes(text)) s += 3;\n if (h.u.name?.toLowerCase().includes(text)) s += 1;\n return s;\n }\n let s = 0;\n if (h.o.login.toLowerCase().includes(text)) s += 3;\n if (h.o.name?.toLowerCase().includes(text)) s += 1;\n return s;\n }\n\n const list = [...hits];\n if (sortRaw === \"followers\") {\n list.sort((a, b) => {\n const fa = a.kind === \"user\" ? a.u.followers : a.o.followers;\n const fb = b.kind === \"user\" ? b.u.followers : b.o.followers;\n return order === \"desc\" ? fb - fa : fa - fb;\n });\n } else if (sortRaw === \"repositories\") {\n list.sort((a, b) => {\n const ra = a.kind === \"user\" ? a.u.public_repos : a.o.public_repos;\n const rb = b.kind === \"user\" ? b.u.public_repos : b.o.public_repos;\n return order === \"desc\" ? rb - ra : ra - rb;\n });\n } else if (sortRaw === \"joined\") {\n list.sort((a, b) => {\n const ca = a.kind === \"user\" ? a.u.created_at : a.o.created_at;\n const cb = b.kind === \"user\" ? b.u.created_at : b.o.created_at;\n const cmp = ca.localeCompare(cb);\n return order === \"desc\" ? -cmp : cmp;\n });\n } else {\n list.sort((a, b) => rel(b) - rel(a));\n }\n\n const total = list.length;\n const slice = list.slice((page - 1) * per_page, (page - 1) * per_page + per_page);\n setLinkHeader(c, total, page, per_page);\n\n const items = slice.map((h) => (h.kind === \"user\" ? formatUser(h.u, baseUrl) : formatOrgBrief(h.o, baseUrl)));\n\n return c.json({\n total_count: total,\n incomplete_results: false,\n items,\n });\n });\n\n app.get(\"/search/code\", (c) => {\n const q = c.req.query(\"q\") ?? \"\";\n const parsed = parseSearchQuery(q);\n const { page, per_page } = parsePagination(c);\n const authUser = c.get(\"authUser\");\n const blobs = gh.blobs.all();\n if (blobs.length === 0) {\n setLinkHeader(c, 0, 1, per_page);\n return c.json({\n total_count: 0,\n incomplete_results: false,\n items: [],\n });\n }\n\n const pathIdx = buildBlobPathIndex(gh);\n const text = parsed.text.trim();\n const repoSpecs = parsed.qualifiers.get(\"repo\") ?? [];\n const langs = parsed.qualifiers.get(\"language\") ?? [];\n const paths = parsed.qualifiers.get(\"path\") ?? [];\n const filenames = parsed.qualifiers.get(\"filename\") ?? [];\n const inScopes = (parsed.qualifiers.get(\"in\") ?? []).map((x) => x.toLowerCase());\n\n const matches: Array<{\n name: string;\n path: string;\n sha: string;\n score: number;\n repo: GitHubRepo;\n }> = [];\n\n for (const blob of blobs) {\n const repo = gh.repos.get(blob.repo_id);\n if (!repo) continue;\n if (!repoVisibleForSearch(repo, gh, authUser)) continue;\n if (repoSpecs.length) {\n const ok = repoSpecs.some((rs) => {\n const r = resolveRepoQualifier(gh, rs);\n return r && r.id === repo.id;\n });\n if (!ok) continue;\n }\n if (langs.length) {\n const lang = repo.language;\n if (!lang || !langs.some((l) => l.toLowerCase() === lang.toLowerCase())) continue;\n }\n\n const path = pathIdx.get(`${blob.repo_id}:${blob.sha}`) ?? `unknown/${blob.sha.slice(0, 7)}`;\n const base = path.split(\"/\").pop() ?? path;\n if (paths.length && !paths.some((p) => path.toLowerCase().includes(p.toLowerCase()))) continue;\n if (filenames.length && !filenames.some((p) => base.toLowerCase().includes(p.toLowerCase()))) continue;\n\n const content = blobText(blob);\n if (text.length) {\n const inFile = content.toLowerCase().includes(text.toLowerCase());\n const inPath = path.toLowerCase().includes(text.toLowerCase());\n let hit = false;\n if (!inScopes.length) hit = inFile || inPath;\n else {\n if (inScopes.includes(\"file\") && inFile) hit = true;\n if (inScopes.includes(\"path\") && inPath) hit = true;\n }\n if (!hit) continue;\n }\n\n matches.push({\n name: path.split(\"/\").pop() ?? blob.sha,\n path,\n sha: blob.sha,\n score: text.length ? (content.toLowerCase().includes(text.toLowerCase()) ? 2 : 1) : 1,\n repo,\n });\n }\n\n matches.sort((a, b) => b.score - a.score);\n const total = matches.length;\n const slice = matches.slice((page - 1) * per_page, (page - 1) * per_page + per_page);\n setLinkHeader(c, total, page, per_page);\n\n const items = slice.map((m) => {\n const repoUrl = `${baseUrl}/repos/${m.repo.full_name}`;\n return {\n name: m.name,\n path: m.path,\n sha: m.sha,\n url: `${repoUrl}/contents/${m.path}?ref=HEAD`,\n git_url: `${repoUrl}/git/blobs/${m.sha}`,\n html_url: `${baseUrl}/${m.repo.full_name}/blob/HEAD/${m.path}`,\n repository: formatRepo(m.repo, gh, baseUrl),\n score: 1,\n };\n });\n\n return c.json({\n total_count: total,\n incomplete_results: false,\n items,\n });\n });\n\n app.get(\"/search/commits\", (c) => {\n const q = c.req.query(\"q\");\n if (q === undefined || q.trim() === \"\") {\n throw new ApiError(422, \"Validation Failed\");\n }\n const parsed = parseSearchQuery(q);\n const { page, per_page } = parsePagination(c);\n const sortRaw = (c.req.query(\"sort\") ?? \"best-match\").toLowerCase();\n const order = (c.req.query(\"order\") ?? \"desc\").toLowerCase() === \"asc\" ? \"asc\" : \"desc\";\n\n const authUser = c.get(\"authUser\");\n const repoSpecs = parsed.qualifiers.get(\"repo\") ?? [];\n const authors = parsed.qualifiers.get(\"author\") ?? [];\n const committers = parsed.qualifiers.get(\"committer\") ?? [];\n const mergeVals = parsed.qualifiers.get(\"merge\") ?? [];\n\n let list: GitHubCommit[] = [];\n for (const commit of gh.commits.all()) {\n const repo = gh.repos.get(commit.repo_id);\n if (!repo) continue;\n if (!repoVisibleForSearch(repo, gh, authUser)) continue;\n if (repoSpecs.length) {\n const ok = repoSpecs.some((rs) => {\n const r = resolveRepoQualifier(gh, rs);\n return r && r.id === repo.id;\n });\n if (!ok) continue;\n }\n if (authors.length) {\n const ok = authors.some((a) => loginMatchesCommitAuthor(gh, a, commit, \"author\"));\n if (!ok) continue;\n }\n if (committers.length) {\n const ok = committers.some((a) => loginMatchesCommitAuthor(gh, a, commit, \"committer\"));\n if (!ok) continue;\n }\n if (mergeVals.length) {\n const isMerge = commit.parent_shas.length > 1;\n const ok = mergeVals.every((m) => {\n if (m === \"true\") return isMerge;\n if (m === \"false\") return !isMerge;\n return true;\n });\n if (!ok) continue;\n }\n const t = parsed.text.trim();\n if (t.length && !textMatches(commit.message, t)) continue;\n list.push(commit);\n }\n\n function rel(cm: GitHubCommit): number {\n const t = parsed.text.trim().toLowerCase();\n if (!t) return 1;\n return cm.message.toLowerCase().includes(t) ? 2 : 1;\n }\n\n if (sortRaw === \"author-date\") {\n list = [...list].sort((a, b) => {\n const cmp = a.author_date.localeCompare(b.author_date);\n return order === \"desc\" ? -cmp : cmp;\n });\n } else if (sortRaw === \"committer-date\") {\n list = [...list].sort((a, b) => {\n const cmp = a.committer_date.localeCompare(b.committer_date);\n return order === \"desc\" ? -cmp : cmp;\n });\n } else {\n list = [...list].sort((a, b) => rel(b) - rel(a));\n }\n\n const total = list.length;\n const slice = list.slice((page - 1) * per_page, (page - 1) * per_page + per_page);\n setLinkHeader(c, total, page, per_page);\n\n const items = slice.map((commit) => {\n const repo = gh.repos.get(commit.repo_id)!;\n return formatSearchCommit(gh, commit, repo, baseUrl);\n });\n\n return c.json({\n total_count: total,\n incomplete_results: false,\n items,\n });\n });\n\n app.get(\"/search/topics\", (c) => {\n const q = c.req.query(\"q\") ?? \"\";\n const parsed = parseSearchQuery(q);\n const { page, per_page } = parsePagination(c);\n const text = parsed.text.trim().toLowerCase();\n\n const topicSet = new Map<string, { name: string; updated: string }>();\n for (const repo of gh.repos.all()) {\n for (const t of repo.topics) {\n const key = t.toLowerCase();\n if (!topicSet.has(key)) {\n topicSet.set(key, { name: t, updated: repo.updated_at });\n } else {\n const cur = topicSet.get(key)!;\n if (repo.updated_at > cur.updated) topicSet.set(key, { name: t, updated: repo.updated_at });\n }\n }\n }\n\n let topics = Array.from(topicSet.values());\n if (text.length) {\n topics = topics.filter((t) => t.name.toLowerCase().includes(text));\n }\n\n topics.sort((a, b) => a.name.localeCompare(b.name));\n const total = topics.length;\n const slice = topics.slice((page - 1) * per_page, (page - 1) * per_page + per_page);\n setLinkHeader(c, total, page, per_page);\n\n const items = slice.map((t) => ({\n name: t.name,\n display_name: t.name,\n short_description: \"\",\n created_by: null as string | null,\n created_at: t.updated,\n updated_at: t.updated,\n }));\n\n return c.json({\n total_count: total,\n incomplete_results: false,\n items,\n });\n });\n\n app.get(\"/search/labels\", (c) => {\n const q = c.req.query(\"q\") ?? \"\";\n const rawId = c.req.query(\"repository_id\");\n if (rawId === undefined || rawId === \"\") {\n throw new ApiError(422, \"Validation Failed: repository_id is required\");\n }\n const repositoryId = parseInt(rawId, 10);\n if (Number.isNaN(repositoryId)) {\n throw new ApiError(422, \"Validation Failed: invalid repository_id\");\n }\n const repo = gh.repos.get(repositoryId);\n if (!repo) {\n throw new ApiError(404, \"Not Found\");\n }\n\n const parsed = parseSearchQuery(q);\n const { page, per_page } = parsePagination(c);\n const text = parsed.text.trim().toLowerCase();\n\n let labels = gh.labels.findBy(\"repo_id\", repositoryId);\n if (text.length) {\n labels = labels.filter(\n (l) => l.name.toLowerCase().includes(text) || (l.description && l.description.toLowerCase().includes(text)),\n );\n }\n\n labels.sort((a, b) => a.name.localeCompare(b.name));\n const total = labels.length;\n const slice = labels.slice((page - 1) * per_page, (page - 1) * per_page + per_page);\n setLinkHeader(c, total, page, per_page);\n\n return c.json({\n total_count: total,\n incomplete_results: false,\n items: slice.map((l) => ({\n id: l.id,\n node_id: l.node_id,\n url: `${baseUrl}/repos/${repo.full_name}/labels/${encodeURIComponent(l.name)}`,\n name: l.name,\n color: l.color,\n default: l.default,\n description: l.description,\n })),\n });\n });\n}\n","import type { RouteContext, AuthUser } from \"@emulators/core\";\nimport { ApiError, forbidden, parseJsonBody, parsePagination, setLinkHeader, unauthorized } from \"@emulators/core\";\nimport { getGitHubStore } from \"../store.js\";\nimport type { GitHubStore } from \"../store.js\";\nimport type {\n GitHubArtifact,\n GitHubJob,\n GitHubOrg,\n GitHubRepo,\n GitHubSecret,\n GitHubUser,\n GitHubWorkflow,\n GitHubWorkflowRun,\n} from \"../entities.js\";\nimport { formatRepo, formatUser, generateNodeId, generateSha, lookupRepo, timestamp } from \"../helpers.js\";\nimport {\n assertAuthenticatedUser,\n assertRepoAdmin,\n assertRepoRead,\n getActorUser,\n notFoundResponse,\n ownerLoginOf,\n} from \"../route-helpers.js\";\n\nfunction listOrgMembersDeduped(gh: GitHubStore, orgId: number): { user: GitHubUser; orgRole: \"admin\" | \"member\" }[] {\n const byUser = new Map<number, { user: GitHubUser; isAdmin: boolean }>();\n for (const team of gh.teams.findBy(\"org_id\", orgId)) {\n for (const m of gh.teamMembers.findBy(\"team_id\", team.id)) {\n const user = gh.users.get(m.user_id);\n if (!user) continue;\n const isAdmin = m.role === \"maintainer\";\n const prev = byUser.get(user.id);\n if (!prev) {\n byUser.set(user.id, { user, isAdmin });\n } else {\n byUser.set(user.id, { user, isAdmin: prev.isAdmin || isAdmin });\n }\n }\n }\n return [...byUser.values()]\n .map(({ user, isAdmin }) => ({\n user,\n orgRole: isAdmin ? (\"admin\" as const) : (\"member\" as const),\n }))\n .sort((a, b) => a.user.id - b.user.id);\n}\n\nfunction orgRoleForUser(gh: GitHubStore, orgId: number, userId: number): \"admin\" | \"member\" | null {\n const row = listOrgMembersDeduped(gh, orgId).find((r) => r.user.id === userId);\n return row?.orgRole ?? null;\n}\n\nfunction assertOrgAdmin(gh: GitHubStore, authUser: AuthUser | undefined, org: GitHubOrg) {\n if (!authUser) throw unauthorized();\n const user = getActorUser(gh, authUser);\n if (!user) throw unauthorized();\n if (orgRoleForUser(gh, org.id, user.id) === \"admin\") return;\n throw forbidden();\n}\n\nfunction getOrgByLogin(gh: GitHubStore, login: string): GitHubOrg | undefined {\n return gh.orgs.findOneBy(\"login\", login);\n}\n\nfunction resolveWorkflow(gh: GitHubStore, repoId: number, param: string): GitHubWorkflow | undefined {\n const trimmed = param.trim();\n const asNum = parseInt(trimmed, 10);\n if (!Number.isNaN(asNum) && String(asNum) === trimmed) {\n const w = gh.workflows.get(asNum);\n if (w && w.repo_id === repoId) return w;\n }\n const decoded = decodeURIComponent(trimmed);\n return gh.workflows\n .findBy(\"repo_id\", repoId)\n .find((w) => w.path === decoded || w.path.endsWith(`/${decoded}`) || w.name === decoded);\n}\n\nfunction resolveRefToBranchAndSha(gh: GitHubStore, repo: GitHubRepo, ref: string): { branch: string; sha: string } {\n const name = ref.replace(/^refs\\/heads\\//, \"\").replace(/^refs\\/tags\\//, \"\");\n const branch = gh.branches.findBy(\"repo_id\", repo.id).find((b) => b.name === name);\n if (branch) return { branch: branch.name, sha: branch.sha };\n return { branch: name, sha: generateSha() };\n}\n\nfunction nextRunNumber(gh: GitHubStore, workflowId: number, repoId: number): number {\n const runs = gh.workflowRuns.findBy(\"workflow_id\", workflowId).filter((r) => r.repo_id === repoId);\n return runs.reduce((m, r) => Math.max(m, r.run_number), 0) + 1;\n}\n\nfunction findRepoSecret(gh: GitHubStore, repoId: number, name: string): GitHubSecret | undefined {\n return gh.secrets.all().find((s) => s.repo_id === repoId && s.org_id === null && s.name === name);\n}\n\nfunction findOrgSecret(gh: GitHubStore, orgId: number, name: string): GitHubSecret | undefined {\n return gh.secrets.all().find((s) => s.org_id === orgId && s.repo_id === null && s.name === name);\n}\n\nfunction listRepoSecrets(gh: GitHubStore, repoId: number): GitHubSecret[] {\n return gh.secrets.all().filter((s) => s.repo_id === repoId && s.org_id === null);\n}\n\nfunction listOrgSecrets(gh: GitHubStore, orgId: number): GitHubSecret[] {\n return gh.secrets.all().filter((s) => s.org_id === orgId && s.repo_id === null);\n}\n\nfunction deleteJobsForRun(gh: GitHubStore, runId: number) {\n for (const j of gh.jobs.findBy(\"run_id\", runId)) {\n gh.jobs.delete(j.id);\n }\n}\n\nfunction deleteArtifactsForRun(gh: GitHubStore, runId: number) {\n for (const a of gh.artifacts.findBy(\"run_id\", runId)) {\n gh.artifacts.delete(a.id);\n }\n}\n\nfunction seedStubJobs(gh: GitHubStore, repo: GitHubRepo, run: GitHubWorkflowRun) {\n const job = gh.jobs.insert({\n node_id: \"\",\n repo_id: repo.id,\n run_id: run.id,\n name: \"build\",\n status: run.status === \"completed\" ? \"completed\" : \"in_progress\",\n conclusion: run.status === \"completed\" ? run.conclusion : null,\n started_at: run.run_started_at,\n completed_at: run.status === \"completed\" ? run.updated_at : null,\n runner_id: 1,\n runner_name: \"Hosted Agent\",\n steps: [\n {\n name: \"Set up job\",\n status: run.status === \"completed\" ? \"completed\" : \"in_progress\",\n conclusion: run.status === \"completed\" ? run.conclusion : null,\n number: 1,\n started_at: run.run_started_at,\n completed_at: run.status === \"completed\" ? run.updated_at : null,\n },\n ],\n } as Omit<GitHubJob, \"id\" | \"created_at\" | \"updated_at\">);\n gh.jobs.update(job.id, { node_id: generateNodeId(\"Job\", job.id) });\n}\n\nfunction formatWorkflow(w: GitHubWorkflow, repo: GitHubRepo, gh: GitHubStore, baseUrl: string) {\n const repoUrl = `${baseUrl}/repos/${repo.full_name}`;\n return {\n id: w.id,\n node_id: w.node_id,\n name: w.name,\n path: w.path,\n state: w.state,\n created_at: w.created_at,\n updated_at: w.updated_at,\n url: `${repoUrl}/actions/workflows/${w.id}`,\n html_url: `${baseUrl}/${repo.full_name}/blob/${repo.default_branch}/${w.path}`,\n badge_url:\n w.badge_url ||\n `${baseUrl}/${repo.full_name}/workflows/${encodeURIComponent(w.path.replace(/^\\/.github\\/workflows\\//, \"\"))}/badge.svg`,\n };\n}\n\nfunction formatWorkflowRun(run: GitHubWorkflowRun, repo: GitHubRepo, gh: GitHubStore, baseUrl: string) {\n const repoUrl = `${baseUrl}/repos/${repo.full_name}`;\n const wf = gh.workflows.get(run.workflow_id);\n const actor = gh.users.get(run.actor_id);\n const wfPath = wf?.path ?? \".github/workflows/main.yml\";\n return {\n id: run.id,\n name: run.name,\n node_id: run.node_id,\n head_branch: run.head_branch,\n head_sha: run.head_sha,\n path: wfPath,\n display_title: run.name,\n run_number: run.run_number,\n event: run.event,\n status: run.status,\n conclusion: run.conclusion,\n workflow_id: run.workflow_id,\n check_suite_id: null,\n url: `${repoUrl}/actions/runs/${run.id}`,\n html_url: `${baseUrl}/${repo.full_name}/actions/runs/${run.id}`,\n pull_requests: [],\n created_at: run.created_at,\n updated_at: run.updated_at,\n actor: actor ? formatUser(actor, baseUrl) : null,\n run_attempt: run.run_attempt,\n run_started_at: run.run_started_at,\n triggering_actor: actor ? formatUser(actor, baseUrl) : null,\n workflow_url: wf ? `${repoUrl}/actions/workflows/${wf.id}` : null,\n repository: formatRepo(repo, gh, baseUrl),\n head_commit: {\n id: run.head_sha,\n tree_id: generateSha(),\n message: \"Workflow run\",\n timestamp: run.created_at,\n author: actor\n ? { name: actor.login, email: `${actor.login}@users.noreply.github.com` }\n : { name: \"unknown\", email: \"unknown@users.noreply.github.com\" },\n },\n };\n}\n\nfunction formatJob(job: GitHubJob, repo: GitHubRepo, gh: GitHubStore, baseUrl: string) {\n const repoUrl = `${baseUrl}/repos/${repo.full_name}`;\n const run = gh.workflowRuns.get(job.run_id);\n const headSha = run?.head_sha ?? \"\";\n return {\n id: job.id,\n run_id: job.run_id,\n workflow_name: run?.name ?? \"workflow\",\n head_branch: run?.head_branch ?? \"\",\n run_url: `${repoUrl}/actions/runs/${job.run_id}`,\n node_id: job.node_id,\n head_sha: headSha,\n status: job.status,\n conclusion: job.conclusion,\n started_at: job.started_at,\n completed_at: job.completed_at,\n name: job.name,\n steps: job.steps,\n url: `${repoUrl}/actions/jobs/${job.id}`,\n html_url: `${baseUrl}/${repo.full_name}/commit/${headSha}/checks`,\n check_run_url: `${baseUrl}/repos/${repo.full_name}/check-runs/${job.id}`,\n labels: [\"hosted\"],\n runner_id: job.runner_id,\n runner_name: job.runner_name,\n runner_group_id: 1,\n runner_group_name: \"GitHub Actions\",\n created_at: job.created_at,\n updated_at: job.updated_at,\n };\n}\n\nfunction formatArtifact(a: GitHubArtifact, repo: GitHubRepo, gh: GitHubStore, baseUrl: string) {\n const repoUrl = `${baseUrl}/repos/${repo.full_name}`;\n const run = gh.workflowRuns.get(a.run_id);\n return {\n id: a.id,\n node_id: a.node_id,\n name: a.name,\n size_in_bytes: a.size_in_bytes,\n url: `${repoUrl}/actions/artifacts/${a.id}`,\n archive_download_url: `${repoUrl}/actions/artifacts/${a.id}/zip`,\n expired: a.expired,\n digest: null,\n created_at: a.created_at,\n expires_at: a.expires_at,\n workflow_run: run\n ? {\n id: run.id,\n repository_id: repo.id,\n head_repository_id: repo.id,\n head_branch: run.head_branch,\n head_sha: run.head_sha,\n }\n : null,\n };\n}\n\nfunction filterRuns(\n gh: GitHubStore,\n runs: GitHubWorkflowRun[],\n q: { actor?: string; branch?: string; event?: string; status?: string },\n) {\n let out = runs;\n if (q.actor) {\n const u = gh.users.findOneBy(\"login\", q.actor);\n out = u ? out.filter((r) => r.actor_id === u.id) : [];\n }\n if (q.branch) {\n out = out.filter((r) => r.head_branch === q.branch);\n }\n if (q.event) {\n out = out.filter((r) => r.event === q.event);\n }\n if (q.status) {\n out = out.filter((r) => r.status === q.status);\n }\n return out.sort((a, b) => b.created_at.localeCompare(a.created_at));\n}\n\nexport function actionsRoutes({ app, store, webhooks, baseUrl }: RouteContext): void {\n const gh = getGitHubStore(store);\n\n app.get(\"/repos/:owner/:repo/actions/workflows\", (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n assertRepoRead(gh, c.get(\"authUser\"), repo);\n const workflows = gh.workflows.findBy(\"repo_id\", repo.id).sort((a, b) => a.path.localeCompare(b.path));\n return c.json({\n total_count: workflows.length,\n workflows: workflows.map((w) => formatWorkflow(w, repo, gh, baseUrl)),\n });\n });\n\n app.get(\"/repos/:owner/:repo/actions/workflows/:workflow_id\", (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n assertRepoRead(gh, c.get(\"authUser\"), repo);\n const w = resolveWorkflow(gh, repo.id, c.req.param(\"workflow_id\")!);\n if (!w) throw notFoundResponse();\n return c.json(formatWorkflow(w, repo, gh, baseUrl));\n });\n\n app.put(\"/repos/:owner/:repo/actions/workflows/:workflow_id/disable\", (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n assertRepoAdmin(gh, c.get(\"authUser\"), repo);\n const w = resolveWorkflow(gh, repo.id, c.req.param(\"workflow_id\")!);\n if (!w) throw notFoundResponse();\n gh.workflows.update(w.id, { state: \"disabled_manually\" });\n return c.body(null, 204);\n });\n\n app.put(\"/repos/:owner/:repo/actions/workflows/:workflow_id/enable\", (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n assertRepoAdmin(gh, c.get(\"authUser\"), repo);\n const w = resolveWorkflow(gh, repo.id, c.req.param(\"workflow_id\")!);\n if (!w) throw notFoundResponse();\n gh.workflows.update(w.id, { state: \"active\" });\n return c.body(null, 204);\n });\n\n app.post(\"/repos/:owner/:repo/actions/workflows/:workflow_id/dispatches\", async (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n const actor = assertAuthenticatedUser(gh, c.get(\"authUser\"));\n assertRepoRead(gh, c.get(\"authUser\"), repo);\n const w = resolveWorkflow(gh, repo.id, c.req.param(\"workflow_id\")!);\n if (!w) throw notFoundResponse();\n if (w.state !== \"active\") {\n throw new ApiError(422, \"Workflow is not active\");\n }\n const body = await parseJsonBody(c);\n const ref = typeof body.ref === \"string\" ? body.ref : repo.default_branch;\n const { branch, sha } = resolveRefToBranchAndSha(gh, repo, ref);\n const now = timestamp();\n const runNumber = nextRunNumber(gh, w.id, repo.id);\n const run = gh.workflowRuns.insert({\n node_id: \"\",\n repo_id: repo.id,\n workflow_id: w.id,\n name: w.name,\n head_branch: branch,\n head_sha: sha,\n run_number: runNumber,\n event: \"workflow_dispatch\",\n status: \"queued\",\n conclusion: null,\n actor_id: actor.id,\n run_attempt: 1,\n run_started_at: now,\n } as Omit<GitHubWorkflowRun, \"id\" | \"created_at\" | \"updated_at\">);\n gh.workflowRuns.update(run.id, { node_id: generateNodeId(\"WorkflowRun\", run.id) });\n const created = gh.workflowRuns.get(run.id)!;\n seedStubJobs(gh, repo, created);\n const ownerLogin = ownerLoginOf(gh, repo);\n void webhooks.dispatch(\n \"workflow_dispatch\",\n undefined,\n {\n ref: `refs/heads/${branch}`,\n inputs: typeof body.inputs === \"object\" && body.inputs ? body.inputs : {},\n workflow: formatWorkflow(w, repo, gh, baseUrl),\n repository: formatRepo(repo, gh, baseUrl),\n sender: formatUser(actor, baseUrl),\n },\n ownerLogin,\n repo.name,\n );\n void webhooks.dispatch(\n \"workflow_run\",\n \"requested\",\n {\n workflow_run: formatWorkflowRun(created, repo, gh, baseUrl),\n repository: formatRepo(repo, gh, baseUrl),\n sender: formatUser(actor, baseUrl),\n },\n ownerLogin,\n repo.name,\n );\n return c.body(null, 204);\n });\n\n app.get(\"/repos/:owner/:repo/actions/runs\", (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n assertRepoRead(gh, c.get(\"authUser\"), repo);\n const { page, per_page } = parsePagination(c);\n const actor = c.req.query(\"actor\") ?? undefined;\n const branch = c.req.query(\"branch\") ?? undefined;\n const event = c.req.query(\"event\") ?? undefined;\n const status = c.req.query(\"status\") ?? undefined;\n const all = gh.workflowRuns.findBy(\"repo_id\", repo.id);\n const filtered = filterRuns(gh, all, { actor, branch, event, status });\n const total = filtered.length;\n const slice = filtered.slice((page - 1) * per_page, (page - 1) * per_page + per_page);\n setLinkHeader(c, total, page, per_page);\n return c.json({\n total_count: total,\n workflow_runs: slice.map((r) => formatWorkflowRun(r, repo, gh, baseUrl)),\n });\n });\n\n app.get(\"/repos/:owner/:repo/actions/runs/:run_id\", (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n assertRepoRead(gh, c.get(\"authUser\"), repo);\n const runId = parseInt(c.req.param(\"run_id\")!, 10);\n const run = gh.workflowRuns.get(runId);\n if (!run || run.repo_id !== repo.id) throw notFoundResponse();\n return c.json(formatWorkflowRun(run, repo, gh, baseUrl));\n });\n\n app.get(\"/repos/:owner/:repo/actions/workflows/:workflow_id/runs\", (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n assertRepoRead(gh, c.get(\"authUser\"), repo);\n const w = resolveWorkflow(gh, repo.id, c.req.param(\"workflow_id\")!);\n if (!w) throw notFoundResponse();\n const { page, per_page } = parsePagination(c);\n const actor = c.req.query(\"actor\") ?? undefined;\n const branch = c.req.query(\"branch\") ?? undefined;\n const event = c.req.query(\"event\") ?? undefined;\n const status = c.req.query(\"status\") ?? undefined;\n const all = gh.workflowRuns.findBy(\"repo_id\", repo.id).filter((r) => r.workflow_id === w.id);\n const filtered = filterRuns(gh, all, { actor, branch, event, status });\n const total = filtered.length;\n const slice = filtered.slice((page - 1) * per_page, (page - 1) * per_page + per_page);\n setLinkHeader(c, total, page, per_page);\n return c.json({\n total_count: total,\n workflow_runs: slice.map((r) => formatWorkflowRun(r, repo, gh, baseUrl)),\n });\n });\n\n app.post(\"/repos/:owner/:repo/actions/runs/:run_id/cancel\", (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n assertRepoRead(gh, c.get(\"authUser\"), repo);\n const runId = parseInt(c.req.param(\"run_id\")!, 10);\n const run = gh.workflowRuns.get(runId);\n if (!run || run.repo_id !== repo.id) throw notFoundResponse();\n gh.workflowRuns.update(run.id, { status: \"completed\", conclusion: \"cancelled\" });\n const updated = gh.workflowRuns.get(run.id)!;\n const ownerLogin = ownerLoginOf(gh, repo);\n const actor = gh.users.get(run.actor_id);\n void webhooks.dispatch(\n \"workflow_run\",\n \"completed\",\n {\n workflow_run: formatWorkflowRun(updated, repo, gh, baseUrl),\n repository: formatRepo(repo, gh, baseUrl),\n sender: actor ? formatUser(actor, baseUrl) : null,\n },\n ownerLogin,\n repo.name,\n );\n return c.body(null, 202);\n });\n\n app.post(\"/repos/:owner/:repo/actions/runs/:run_id/rerun\", (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n assertRepoRead(gh, c.get(\"authUser\"), repo);\n const runId = parseInt(c.req.param(\"run_id\")!, 10);\n const parent = gh.workflowRuns.get(runId);\n if (!parent || parent.repo_id !== repo.id) throw notFoundResponse();\n const wf = gh.workflows.get(parent.workflow_id);\n if (!wf) throw notFoundResponse();\n const now = timestamp();\n const runNumber = nextRunNumber(gh, wf.id, repo.id);\n const run = gh.workflowRuns.insert({\n node_id: \"\",\n repo_id: repo.id,\n workflow_id: wf.id,\n name: parent.name,\n head_branch: parent.head_branch,\n head_sha: parent.head_sha,\n run_number: runNumber,\n event: parent.event,\n status: \"queued\",\n conclusion: null,\n actor_id: parent.actor_id,\n run_attempt: parent.run_attempt + 1,\n run_started_at: now,\n } as Omit<GitHubWorkflowRun, \"id\" | \"created_at\" | \"updated_at\">);\n gh.workflowRuns.update(run.id, { node_id: generateNodeId(\"WorkflowRun\", run.id) });\n const created = gh.workflowRuns.get(run.id)!;\n seedStubJobs(gh, repo, created);\n const ownerLogin = ownerLoginOf(gh, repo);\n const actor = gh.users.get(created.actor_id);\n void webhooks.dispatch(\n \"workflow_run\",\n \"requested\",\n {\n workflow_run: formatWorkflowRun(created, repo, gh, baseUrl),\n repository: formatRepo(repo, gh, baseUrl),\n sender: actor ? formatUser(actor, baseUrl) : null,\n },\n ownerLogin,\n repo.name,\n );\n return c.json(formatWorkflowRun(created, repo, gh, baseUrl), 201);\n });\n\n app.delete(\"/repos/:owner/:repo/actions/runs/:run_id\", (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n assertRepoAdmin(gh, c.get(\"authUser\"), repo);\n const runId = parseInt(c.req.param(\"run_id\")!, 10);\n const run = gh.workflowRuns.get(runId);\n if (!run || run.repo_id !== repo.id) throw notFoundResponse();\n deleteArtifactsForRun(gh, run.id);\n deleteJobsForRun(gh, run.id);\n gh.workflowRuns.delete(run.id);\n return c.body(null, 204);\n });\n\n app.get(\"/repos/:owner/:repo/actions/runs/:run_id/logs\", (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n assertRepoRead(gh, c.get(\"authUser\"), repo);\n const runId = parseInt(c.req.param(\"run_id\")!, 10);\n const run = gh.workflowRuns.get(runId);\n if (!run || run.repo_id !== repo.id) throw notFoundResponse();\n return c.text(`2025-01-01T00:00:00.0000000Z Workflow run ${run.id} logs (stub)\\n${run.head_sha}\\n`, 200, {\n \"Content-Type\": \"text/plain; charset=utf-8\",\n });\n });\n\n app.get(\"/repos/:owner/:repo/actions/runs/:run_id/jobs\", (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n assertRepoRead(gh, c.get(\"authUser\"), repo);\n const runId = parseInt(c.req.param(\"run_id\")!, 10);\n const run = gh.workflowRuns.get(runId);\n if (!run || run.repo_id !== repo.id) throw notFoundResponse();\n const jobs = gh.jobs.findBy(\"run_id\", runId).filter((j) => j.repo_id === repo.id);\n return c.json({\n total_count: jobs.length,\n jobs: jobs.map((j) => formatJob(j, repo, gh, baseUrl)),\n });\n });\n\n app.get(\"/repos/:owner/:repo/actions/jobs/:job_id\", (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n assertRepoRead(gh, c.get(\"authUser\"), repo);\n const jobId = parseInt(c.req.param(\"job_id\")!, 10);\n const job = gh.jobs.get(jobId);\n if (!job || job.repo_id !== repo.id) throw notFoundResponse();\n return c.json(formatJob(job, repo, gh, baseUrl));\n });\n\n app.get(\"/repos/:owner/:repo/actions/jobs/:job_id/logs\", (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n assertRepoRead(gh, c.get(\"authUser\"), repo);\n const jobId = parseInt(c.req.param(\"job_id\")!, 10);\n const job = gh.jobs.get(jobId);\n if (!job || job.repo_id !== repo.id) throw notFoundResponse();\n return c.text(`2025-01-01T00:00:00.0000000Z Job ${job.id} logs (stub)\\n`, 200, {\n \"Content-Type\": \"text/plain; charset=utf-8\",\n });\n });\n\n app.get(\"/repos/:owner/:repo/actions/artifacts\", (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n assertRepoRead(gh, c.get(\"authUser\"), repo);\n const { page, per_page } = parsePagination(c);\n const all = gh.artifacts.findBy(\"repo_id\", repo.id).sort((a, b) => b.created_at.localeCompare(a.created_at));\n const total = all.length;\n const slice = all.slice((page - 1) * per_page, (page - 1) * per_page + per_page);\n setLinkHeader(c, total, page, per_page);\n return c.json({\n total_count: total,\n artifacts: slice.map((a) => formatArtifact(a, repo, gh, baseUrl)),\n });\n });\n\n app.get(\"/repos/:owner/:repo/actions/runs/:run_id/artifacts\", (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n assertRepoRead(gh, c.get(\"authUser\"), repo);\n const runId = parseInt(c.req.param(\"run_id\")!, 10);\n const run = gh.workflowRuns.get(runId);\n if (!run || run.repo_id !== repo.id) throw notFoundResponse();\n const arts = gh.artifacts.findBy(\"run_id\", runId).filter((a) => a.repo_id === repo.id);\n return c.json({\n total_count: arts.length,\n artifacts: arts.map((a) => formatArtifact(a, repo, gh, baseUrl)),\n });\n });\n\n app.get(\"/repos/:owner/:repo/actions/artifacts/:artifact_id\", (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n assertRepoRead(gh, c.get(\"authUser\"), repo);\n const artifactId = parseInt(c.req.param(\"artifact_id\")!, 10);\n const a = gh.artifacts.get(artifactId);\n if (!a || a.repo_id !== repo.id) throw notFoundResponse();\n return c.json(formatArtifact(a, repo, gh, baseUrl));\n });\n\n app.delete(\"/repos/:owner/:repo/actions/artifacts/:artifact_id\", (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n assertRepoAdmin(gh, c.get(\"authUser\"), repo);\n const artifactId = parseInt(c.req.param(\"artifact_id\")!, 10);\n const a = gh.artifacts.get(artifactId);\n if (!a || a.repo_id !== repo.id) throw notFoundResponse();\n gh.artifacts.delete(a.id);\n return c.body(null, 204);\n });\n\n app.get(\"/repos/:owner/:repo/actions/secrets\", (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n assertRepoRead(gh, c.get(\"authUser\"), repo);\n const secrets = listRepoSecrets(gh, repo.id).sort((a, b) => a.name.localeCompare(b.name));\n return c.json({\n total_count: secrets.length,\n secrets: secrets.map((s) => ({\n name: s.name,\n created_at: s.created_at,\n updated_at: s.updated_at,\n })),\n });\n });\n\n app.get(\"/repos/:owner/:repo/actions/secrets/:secret_name\", (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n assertRepoRead(gh, c.get(\"authUser\"), repo);\n const name = c.req.param(\"secret_name\")!;\n const s = findRepoSecret(gh, repo.id, name);\n if (!s) throw notFoundResponse();\n return c.json({\n name: s.name,\n visibility: s.visibility,\n created_at: s.created_at,\n updated_at: s.updated_at,\n });\n });\n\n app.put(\"/repos/:owner/:repo/actions/secrets/:secret_name\", async (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n assertRepoAdmin(gh, c.get(\"authUser\"), repo);\n await parseJsonBody(c);\n const name = c.req.param(\"secret_name\")!;\n const existing = findRepoSecret(gh, repo.id, name);\n if (existing) {\n gh.secrets.update(existing.id, { visibility: existing.visibility });\n return c.body(null, 204);\n }\n gh.secrets.insert({\n repo_id: repo.id,\n org_id: null,\n name,\n visibility: \"all\",\n } as Omit<GitHubSecret, \"id\" | \"created_at\" | \"updated_at\">);\n return c.body(null, 201);\n });\n\n app.delete(\"/repos/:owner/:repo/actions/secrets/:secret_name\", (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n assertRepoAdmin(gh, c.get(\"authUser\"), repo);\n const name = c.req.param(\"secret_name\")!;\n const s = findRepoSecret(gh, repo.id, name);\n if (!s) throw notFoundResponse();\n gh.secrets.delete(s.id);\n return c.body(null, 204);\n });\n\n app.get(\"/orgs/:org/actions/secrets\", (c) => {\n const orgLogin = c.req.param(\"org\")!;\n const org = getOrgByLogin(gh, orgLogin);\n if (!org) throw notFoundResponse();\n assertOrgAdmin(gh, c.get(\"authUser\"), org);\n const secrets = listOrgSecrets(gh, org.id).sort((a, b) => a.name.localeCompare(b.name));\n return c.json({\n total_count: secrets.length,\n secrets: secrets.map((s) => ({\n name: s.name,\n created_at: s.created_at,\n updated_at: s.updated_at,\n })),\n });\n });\n\n app.get(\"/orgs/:org/actions/secrets/:secret_name\", (c) => {\n const orgLogin = c.req.param(\"org\")!;\n const org = getOrgByLogin(gh, orgLogin);\n if (!org) throw notFoundResponse();\n assertOrgAdmin(gh, c.get(\"authUser\"), org);\n const name = c.req.param(\"secret_name\")!;\n const s = findOrgSecret(gh, org.id, name);\n if (!s) throw notFoundResponse();\n return c.json({\n name: s.name,\n visibility: s.visibility,\n created_at: s.created_at,\n updated_at: s.updated_at,\n });\n });\n\n app.put(\"/orgs/:org/actions/secrets/:secret_name\", async (c) => {\n const orgLogin = c.req.param(\"org\")!;\n const org = getOrgByLogin(gh, orgLogin);\n if (!org) throw notFoundResponse();\n assertOrgAdmin(gh, c.get(\"authUser\"), org);\n await parseJsonBody(c);\n const name = c.req.param(\"secret_name\")!;\n const existing = findOrgSecret(gh, org.id, name);\n if (existing) {\n gh.secrets.update(existing.id, { visibility: existing.visibility });\n return c.body(null, 204);\n }\n gh.secrets.insert({\n repo_id: null,\n org_id: org.id,\n name,\n visibility: \"all\",\n } as Omit<GitHubSecret, \"id\" | \"created_at\" | \"updated_at\">);\n return c.body(null, 201);\n });\n\n app.delete(\"/orgs/:org/actions/secrets/:secret_name\", (c) => {\n const orgLogin = c.req.param(\"org\")!;\n const org = getOrgByLogin(gh, orgLogin);\n if (!org) throw notFoundResponse();\n assertOrgAdmin(gh, c.get(\"authUser\"), org);\n const name = c.req.param(\"secret_name\")!;\n const s = findOrgSecret(gh, org.id, name);\n if (!s) throw notFoundResponse();\n gh.secrets.delete(s.id);\n return c.body(null, 204);\n });\n}\n","import type { RouteContext, WebhookDispatcher } from \"@emulators/core\";\nimport { ApiError, parseJsonBody, parsePagination, setLinkHeader } from \"@emulators/core\";\nimport { getGitHubStore } from \"../store.js\";\nimport type { GitHubStore } from \"../store.js\";\nimport type {\n GitHubCheckRun,\n GitHubCheckSuite,\n GitHubCommit,\n GitHubRepo,\n GitHubUser,\n GitHubCheckAnnotation,\n} from \"../entities.js\";\nimport { formatRepo, formatUser, generateNodeId, lookupRepo, timestamp } from \"../helpers.js\";\nimport { assertRepoRead, assertRepoWrite, notFoundResponse, ownerLoginOf } from \"../route-helpers.js\";\n\nconst CONCLUSION_RANK: Record<string, number> = {\n success: 0,\n neutral: 1,\n skipped: 2,\n cancelled: 3,\n timed_out: 4,\n action_required: 5,\n failure: 6,\n};\n\nfunction findCommitInRepo(gh: GitHubStore, repoId: number, shaParam: string): GitHubCommit | undefined {\n const want = shaParam.toLowerCase();\n const list = gh.commits.findBy(\"repo_id\", repoId);\n return list.find((c) => c.sha === shaParam || c.sha.toLowerCase() === want || c.sha.startsWith(shaParam));\n}\n\nfunction resolveRefToHeadSha(gh: GitHubStore, repo: GitHubRepo, refParam: string): string | undefined {\n const commit = findCommitInRepo(gh, repo.id, refParam);\n if (commit) return commit.sha;\n const branch = gh.branches.findBy(\"repo_id\", repo.id).find((b) => b.name === refParam);\n if (branch) return branch.sha;\n const fullRef = refParam.startsWith(\"refs/\") ? refParam : `refs/heads/${refParam}`;\n const r = gh.refs.findBy(\"repo_id\", repo.id).find((x) => x.ref === fullRef);\n if (r) return r.sha;\n return undefined;\n}\n\nfunction headBranchForSha(gh: GitHubStore, repo: GitHubRepo, headSha: string): string {\n const branch = gh.branches.findBy(\"repo_id\", repo.id).find((b) => b.sha === headSha);\n if (branch) return branch.name;\n return repo.default_branch;\n}\n\nfunction getOrCreateCheckSuite(\n gh: GitHubStore,\n repo: GitHubRepo,\n headSha: string,\n headBranch?: string | null,\n): GitHubCheckSuite {\n const existing = gh.checkSuites.findBy(\"repo_id\", repo.id).find((s) => s.head_sha === headSha);\n if (existing) return existing;\n\n const hb = headBranch?.trim() || headBranchForSha(gh, repo, headSha);\n const row = gh.checkSuites.insert({\n node_id: \"\",\n repo_id: repo.id,\n head_branch: hb,\n head_sha: headSha,\n status: \"queued\",\n conclusion: null,\n before: \"\",\n after: headSha,\n app_id: null,\n } as Omit<GitHubCheckSuite, \"id\" | \"created_at\" | \"updated_at\">);\n gh.checkSuites.update(row.id, { node_id: generateNodeId(\"CheckSuite\", row.id) });\n return gh.checkSuites.get(row.id)!;\n}\n\nfunction worstConclusion(\n conclusions: NonNullable<GitHubCheckRun[\"conclusion\"]>[],\n): NonNullable<GitHubCheckSuite[\"conclusion\"]> {\n let best: NonNullable<GitHubCheckSuite[\"conclusion\"]> = \"success\";\n let rank = -1;\n for (const c of conclusions) {\n const r = CONCLUSION_RANK[c] ?? 3;\n if (r > rank) {\n rank = r;\n best = c;\n }\n }\n return best;\n}\n\nfunction recomputeSuiteFromRuns(runs: GitHubCheckRun[]): {\n status: GitHubCheckSuite[\"status\"];\n conclusion: GitHubCheckSuite[\"conclusion\"];\n} {\n if (runs.length === 0) {\n return { status: \"completed\", conclusion: null };\n }\n const allDone = runs.every((r) => r.status === \"completed\");\n if (allDone) {\n const conclusions = runs.map((r) => r.conclusion).filter((c): c is NonNullable<typeof c> => c != null);\n return {\n status: \"completed\",\n conclusion: conclusions.length ? worstConclusion(conclusions) : null,\n };\n }\n const anyInProgress = runs.some((r) => r.status === \"in_progress\");\n if (anyInProgress) {\n return { status: \"in_progress\", conclusion: null };\n }\n const anyQueued = runs.some((r) => r.status === \"queued\");\n const anyCompleted = runs.some((r) => r.status === \"completed\");\n if (anyCompleted && anyQueued) {\n return { status: \"in_progress\", conclusion: null };\n }\n if (anyQueued) {\n return { status: \"queued\", conclusion: null };\n }\n return { status: \"in_progress\", conclusion: null };\n}\n\nfunction recomputeCheckSuite(gh: GitHubStore, suiteId: number) {\n const suite = gh.checkSuites.get(suiteId);\n if (!suite) return;\n const runs = gh.checkRuns.findBy(\"repo_id\", suite.repo_id).filter((r) => r.check_suite_id === suiteId);\n const { status, conclusion } = recomputeSuiteFromRuns(runs);\n gh.checkSuites.update(suiteId, { status, conclusion });\n}\n\nfunction parseConclusion(raw: unknown): GitHubCheckRun[\"conclusion\"] | undefined {\n if (raw === undefined) return undefined;\n if (raw === null) return null;\n if (typeof raw !== \"string\") throw new ApiError(422, \"Invalid conclusion\");\n const allowed = new Set([\"success\", \"failure\", \"neutral\", \"cancelled\", \"skipped\", \"timed_out\", \"action_required\"]);\n if (!allowed.has(raw)) throw new ApiError(422, \"Invalid conclusion\");\n return raw as GitHubCheckRun[\"conclusion\"];\n}\n\nfunction parseStatus(raw: unknown, fallback: GitHubCheckRun[\"status\"]): GitHubCheckRun[\"status\"] {\n if (raw === undefined || raw === null) return fallback;\n if (raw !== \"queued\" && raw !== \"in_progress\" && raw !== \"completed\") {\n throw new ApiError(422, \"Invalid status\");\n }\n return raw;\n}\n\nfunction normalizeAnnotations(raw: unknown): GitHubCheckAnnotation[] {\n if (raw === undefined || raw === null) return [];\n if (!Array.isArray(raw)) throw new ApiError(422, \"Invalid annotations\");\n const out: GitHubCheckAnnotation[] = [];\n for (const a of raw) {\n if (!a || typeof a !== \"object\") throw new ApiError(422, \"Invalid annotation\");\n const o = a as Record<string, unknown>;\n const path = typeof o.path === \"string\" ? o.path : null;\n const message = typeof o.message === \"string\" ? o.message : null;\n const start_line = typeof o.start_line === \"number\" ? o.start_line : parseInt(String(o.start_line), 10);\n const end_line = typeof o.end_line === \"number\" ? o.end_line : parseInt(String(o.end_line), 10);\n const annotation_level = typeof o.annotation_level === \"string\" ? o.annotation_level : \"notice\";\n if (!path || !message || !Number.isFinite(start_line) || !Number.isFinite(end_line)) {\n throw new ApiError(422, \"Invalid annotation fields\");\n }\n out.push({\n path,\n start_line,\n end_line,\n annotation_level,\n message,\n });\n }\n return out;\n}\n\nfunction formatCheckSuiteBrief(suite: GitHubCheckSuite, repo: GitHubRepo, baseUrl: string) {\n const repoUrl = `${baseUrl}/repos/${repo.full_name}`;\n return {\n id: suite.id,\n node_id: suite.node_id,\n head_branch: suite.head_branch,\n head_sha: suite.head_sha,\n url: `${repoUrl}/check-suites/${suite.id}`,\n };\n}\n\nfunction formatRepoBrief(repo: GitHubRepo, gh: GitHubStore, baseUrl: string) {\n const owner = formatRepo(repo, gh, baseUrl).owner;\n return {\n id: repo.id,\n node_id: repo.node_id,\n name: repo.name,\n full_name: repo.full_name,\n private: repo.private,\n owner,\n url: `${baseUrl}/repos/${repo.full_name}`,\n html_url: `${baseUrl}/${repo.full_name}`,\n };\n}\n\nfunction formatCheckRun(run: GitHubCheckRun, repo: GitHubRepo, gh: GitHubStore, baseUrl: string) {\n const repoUrl = `${baseUrl}/repos/${repo.full_name}`;\n const suite = run.check_suite_id ? gh.checkSuites.get(run.check_suite_id) : null;\n return {\n id: run.id,\n node_id: run.node_id,\n head_sha: run.head_sha,\n name: run.name,\n status: run.status,\n conclusion: run.conclusion,\n started_at: run.started_at,\n completed_at: run.completed_at,\n external_id: run.external_id,\n url: `${repoUrl}/check-runs/${run.id}`,\n html_url: `${baseUrl}/${repo.full_name}/commit/${run.head_sha}/checks/${run.id}`,\n details_url: run.details_url,\n output: {\n title: run.output.title,\n summary: run.output.summary,\n text: run.output.text,\n annotations_count: run.output.annotations_count,\n },\n check_suite: suite ? formatCheckSuiteBrief(suite, repo, baseUrl) : null,\n app: null,\n pull_requests: [] as unknown[],\n };\n}\n\nfunction formatCheckSuite(suite: GitHubCheckSuite, repo: GitHubRepo, gh: GitHubStore, baseUrl: string) {\n const repoUrl = `${baseUrl}/repos/${repo.full_name}`;\n return {\n id: suite.id,\n node_id: suite.node_id,\n head_branch: suite.head_branch,\n head_sha: suite.head_sha,\n status: suite.status,\n conclusion: suite.conclusion,\n url: `${repoUrl}/check-suites/${suite.id}`,\n before: suite.before,\n after: suite.after,\n pull_requests: [],\n app: null,\n repository: formatRepoBrief(repo, gh, baseUrl),\n created_at: suite.created_at,\n updated_at: suite.updated_at,\n };\n}\n\nfunction dispatchCheckRun(\n webhooks: WebhookDispatcher,\n gh: GitHubStore,\n repo: GitHubRepo,\n run: GitHubCheckRun,\n actor: GitHubUser,\n baseUrl: string,\n action: string | undefined,\n) {\n const ownerLogin = ownerLoginOf(gh, repo);\n void webhooks.dispatch(\n \"check_run\",\n action,\n {\n action,\n check_run: formatCheckRun(run, repo, gh, baseUrl),\n repository: formatRepo(repo, gh, baseUrl),\n sender: formatUser(actor, baseUrl),\n },\n ownerLogin,\n repo.name,\n );\n}\n\nfunction dispatchCheckSuite(\n webhooks: WebhookDispatcher,\n gh: GitHubStore,\n repo: GitHubRepo,\n suite: GitHubCheckSuite,\n actor: GitHubUser,\n baseUrl: string,\n action: string | undefined,\n) {\n const ownerLogin = ownerLoginOf(gh, repo);\n void webhooks.dispatch(\n \"check_suite\",\n action,\n {\n action,\n check_suite: formatCheckSuite(suite, repo, gh, baseUrl),\n repository: formatRepo(repo, gh, baseUrl),\n sender: formatUser(actor, baseUrl),\n },\n ownerLogin,\n repo.name,\n );\n}\n\nexport function checksRoutes({ app, store, webhooks, baseUrl }: RouteContext): void {\n const gh = getGitHubStore(store);\n\n // --- Preferences (static path before :check_suite_id) ---\n app.patch(\"/repos/:owner/:repo/check-suites/preferences\", async (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n assertRepoWrite(gh, c.get(\"authUser\"), repo);\n const body = await parseJsonBody(c);\n const auto =\n Array.isArray(body.auto_trigger_checks) && body.auto_trigger_checks.every((x) => x && typeof x === \"object\")\n ? body.auto_trigger_checks\n : [];\n return c.json({\n preferences: {\n auto_trigger_checks: auto,\n },\n });\n });\n\n app.post(\"/repos/:owner/:repo/check-suites\", async (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n const actor = assertRepoWrite(gh, c.get(\"authUser\"), repo);\n const body = await parseJsonBody(c);\n if (typeof body.head_sha !== \"string\" || !body.head_sha.trim()) {\n throw new ApiError(422, \"head_sha is required\");\n }\n const headSha = body.head_sha.trim();\n const headBranch = typeof body.head_branch === \"string\" && body.head_branch.trim() ? body.head_branch.trim() : null;\n\n const suite = getOrCreateCheckSuite(gh, repo, headSha, headBranch);\n if (headBranch && suite.head_branch !== headBranch) {\n gh.checkSuites.update(suite.id, { head_branch: headBranch });\n }\n const updated = gh.checkSuites.get(suite.id)!;\n dispatchCheckSuite(webhooks, gh, repo, updated, actor, baseUrl, \"requested\");\n return c.json(formatCheckSuite(updated, repo, gh, baseUrl), 201);\n });\n\n app.get(\"/repos/:owner/:repo/check-suites/:check_suite_id\", (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n assertRepoRead(gh, c.get(\"authUser\"), repo);\n const suiteId = parseInt(c.req.param(\"check_suite_id\")!, 10);\n const suite = gh.checkSuites.get(suiteId);\n if (!suite || suite.repo_id !== repo.id) throw notFoundResponse();\n return c.json(formatCheckSuite(suite, repo, gh, baseUrl));\n });\n\n app.get(\"/repos/:owner/:repo/check-suites/:check_suite_id/check-runs\", (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n assertRepoRead(gh, c.get(\"authUser\"), repo);\n const suiteId = parseInt(c.req.param(\"check_suite_id\")!, 10);\n const suite = gh.checkSuites.get(suiteId);\n if (!suite || suite.repo_id !== repo.id) throw notFoundResponse();\n const { page, per_page } = parsePagination(c);\n let runs = gh.checkRuns.findBy(\"repo_id\", repo.id).filter((r) => r.check_suite_id === suiteId);\n runs = runs.sort((a, b) => b.id - a.id);\n const total = runs.length;\n const slice = runs.slice((page - 1) * per_page, (page - 1) * per_page + per_page);\n setLinkHeader(c, total, page, per_page);\n return c.json({\n total_count: total,\n check_runs: slice.map((r) => formatCheckRun(r, repo, gh, baseUrl)),\n });\n });\n\n app.post(\"/repos/:owner/:repo/check-suites/:check_suite_id/rerequest\", (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n const actor = assertRepoWrite(gh, c.get(\"authUser\"), repo);\n const suiteId = parseInt(c.req.param(\"check_suite_id\")!, 10);\n const suite = gh.checkSuites.get(suiteId);\n if (!suite || suite.repo_id !== repo.id) throw notFoundResponse();\n\n const runs = gh.checkRuns.findBy(\"repo_id\", repo.id).filter((r) => r.check_suite_id === suiteId);\n const now = timestamp();\n for (const r of runs) {\n gh.checkRuns.update(r.id, {\n status: \"queued\",\n conclusion: null,\n completed_at: null,\n started_at: null,\n updated_at: now,\n });\n }\n gh.checkSuites.update(suiteId, { status: \"queued\", conclusion: null });\n const suiteAfter = gh.checkSuites.get(suiteId)!;\n dispatchCheckSuite(webhooks, gh, repo, suiteAfter, actor, baseUrl, \"rerequested\");\n return c.body(null, 201);\n });\n\n app.get(\"/repos/:owner/:repo/commits/:ref/check-suites\", (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n assertRepoRead(gh, c.get(\"authUser\"), repo);\n const ref = c.req.param(\"ref\")!;\n const headSha = resolveRefToHeadSha(gh, repo, ref);\n if (!headSha) throw notFoundResponse();\n const suites = gh.checkSuites\n .findBy(\"repo_id\", repo.id)\n .filter((s) => s.head_sha === headSha)\n .sort((a, b) => b.id - a.id);\n return c.json({\n total_count: suites.length,\n check_suites: suites.map((s) => formatCheckSuite(s, repo, gh, baseUrl)),\n });\n });\n\n // --- Check runs ---\n app.post(\"/repos/:owner/:repo/check-runs\", async (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n const actor = assertRepoWrite(gh, c.get(\"authUser\"), repo);\n const body = await parseJsonBody(c);\n\n if (typeof body.name !== \"string\" || !body.name.trim()) {\n throw new ApiError(422, \"name is required\");\n }\n if (typeof body.head_sha !== \"string\" || !body.head_sha.trim()) {\n throw new ApiError(422, \"head_sha is required\");\n }\n\n const name = body.name.trim();\n const headSha = body.head_sha.trim();\n const status = parseStatus(body.status, \"queued\");\n let conclusion = parseConclusion(body.conclusion);\n if (status === \"completed\" && (conclusion === undefined || conclusion === null)) {\n throw new ApiError(422, \"conclusion is required when status is completed\");\n }\n if (status !== \"completed\") {\n conclusion = null;\n }\n\n const details_url =\n typeof body.details_url === \"string\" || body.details_url === null ? (body.details_url as string | null) : null;\n const external_id =\n typeof body.external_id === \"string\"\n ? body.external_id\n : body.external_id == null\n ? \"\"\n : String(body.external_id);\n\n const started_at =\n body.started_at === undefined\n ? null\n : body.started_at === null\n ? null\n : typeof body.started_at === \"string\"\n ? body.started_at\n : null;\n let completed_at =\n body.completed_at === undefined\n ? null\n : body.completed_at === null\n ? null\n : typeof body.completed_at === \"string\"\n ? body.completed_at\n : null;\n\n if (status === \"completed\" && !completed_at) {\n completed_at = timestamp();\n }\n\n const outRaw = body.output && typeof body.output === \"object\" ? (body.output as Record<string, unknown>) : {};\n const annotations = normalizeAnnotations(outRaw.annotations);\n const output = {\n title: typeof outRaw.title === \"string\" ? outRaw.title : outRaw.title === null ? null : null,\n summary: typeof outRaw.summary === \"string\" ? outRaw.summary : outRaw.summary === null ? null : null,\n text: typeof outRaw.text === \"string\" ? outRaw.text : outRaw.text === null ? null : null,\n annotations_count: annotations.length,\n annotations,\n };\n\n let actions: GitHubCheckRun[\"actions\"] = null;\n if (Array.isArray(body.actions)) {\n actions = [];\n for (const act of body.actions) {\n if (!act || typeof act !== \"object\") continue;\n const a = act as Record<string, unknown>;\n if (typeof a.id === \"string\" && typeof a.label === \"string\" && typeof a.description === \"string\") {\n actions.push({ id: a.id, label: a.label, description: a.description });\n }\n }\n if (actions.length === 0) actions = null;\n }\n\n const suite = getOrCreateCheckSuite(gh, repo, headSha, null);\n\n const row = gh.checkRuns.insert({\n node_id: \"\",\n repo_id: repo.id,\n head_sha: headSha,\n name,\n status,\n conclusion: conclusion ?? null,\n started_at,\n completed_at,\n external_id,\n details_url,\n actions,\n output,\n check_suite_id: suite.id,\n app_id: typeof body.app_id === \"number\" ? body.app_id : null,\n } as Omit<GitHubCheckRun, \"id\" | \"created_at\" | \"updated_at\">);\n gh.checkRuns.update(row.id, { node_id: generateNodeId(\"CheckRun\", row.id) });\n const run = gh.checkRuns.get(row.id)!;\n\n recomputeCheckSuite(gh, suite.id);\n\n dispatchCheckRun(webhooks, gh, repo, run, actor, baseUrl, \"created\");\n return c.json(formatCheckRun(run, repo, gh, baseUrl), 201);\n });\n\n app.patch(\"/repos/:owner/:repo/check-runs/:check_run_id\", async (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n const actor = assertRepoWrite(gh, c.get(\"authUser\"), repo);\n const runId = parseInt(c.req.param(\"check_run_id\")!, 10);\n const prev = gh.checkRuns.get(runId);\n if (!prev || prev.repo_id !== repo.id) throw notFoundResponse();\n\n const body = await parseJsonBody(c);\n\n const patch: Partial<GitHubCheckRun> = {};\n\n if (body.name !== undefined) {\n if (typeof body.name !== \"string\" || !body.name.trim()) throw new ApiError(422, \"Invalid name\");\n patch.name = body.name.trim();\n }\n if (body.head_sha !== undefined) {\n if (typeof body.head_sha !== \"string\" || !body.head_sha.trim()) throw new ApiError(422, \"Invalid head_sha\");\n patch.head_sha = body.head_sha.trim();\n }\n if (body.status !== undefined) {\n patch.status = parseStatus(body.status, prev.status);\n }\n if (body.conclusion !== undefined) {\n const pc = parseConclusion(body.conclusion);\n patch.conclusion = pc === undefined ? null : pc;\n }\n if (body.details_url !== undefined) {\n patch.details_url =\n typeof body.details_url === \"string\" || body.details_url === null ? (body.details_url as string | null) : null;\n }\n if (body.external_id !== undefined) {\n patch.external_id = typeof body.external_id === \"string\" ? body.external_id : String(body.external_id ?? \"\");\n }\n if (body.started_at !== undefined) {\n patch.started_at = body.started_at === null ? null : typeof body.started_at === \"string\" ? body.started_at : null;\n }\n if (body.completed_at !== undefined) {\n patch.completed_at =\n body.completed_at === null ? null : typeof body.completed_at === \"string\" ? body.completed_at : null;\n }\n if (body.app_id !== undefined) {\n patch.app_id = typeof body.app_id === \"number\" ? body.app_id : null;\n }\n if (body.actions !== undefined) {\n if (body.actions === null) {\n patch.actions = null;\n } else if (Array.isArray(body.actions)) {\n const actions: NonNullable<GitHubCheckRun[\"actions\"]> = [];\n for (const act of body.actions) {\n if (!act || typeof act !== \"object\") continue;\n const a = act as Record<string, unknown>;\n if (typeof a.id === \"string\" && typeof a.label === \"string\" && typeof a.description === \"string\") {\n actions.push({ id: a.id, label: a.label, description: a.description });\n }\n }\n patch.actions = actions.length ? actions : null;\n }\n }\n\n if (body.output !== undefined && body.output !== null && typeof body.output === \"object\") {\n const outRaw = body.output as Record<string, unknown>;\n const annotations = normalizeAnnotations(outRaw.annotations);\n patch.output = {\n title: outRaw.title === undefined ? prev.output.title : typeof outRaw.title === \"string\" ? outRaw.title : null,\n summary:\n outRaw.summary === undefined\n ? prev.output.summary\n : typeof outRaw.summary === \"string\"\n ? outRaw.summary\n : null,\n text: outRaw.text === undefined ? prev.output.text : typeof outRaw.text === \"string\" ? outRaw.text : null,\n annotations_count: annotations.length,\n annotations,\n };\n }\n\n const nextStatus = patch.status ?? prev.status;\n const nextConclusion: GitHubCheckRun[\"conclusion\"] =\n patch.conclusion !== undefined ? patch.conclusion : prev.conclusion;\n\n if (patch.head_sha && patch.head_sha !== prev.head_sha) {\n const newSuite = getOrCreateCheckSuite(gh, repo, patch.head_sha, null);\n patch.check_suite_id = newSuite.id;\n }\n\n if (nextStatus === \"completed\") {\n if (nextConclusion === undefined || nextConclusion === null) {\n throw new ApiError(422, \"conclusion is required when status is completed\");\n }\n patch.conclusion = nextConclusion;\n const nextCompleted = patch.completed_at !== undefined ? patch.completed_at : prev.completed_at;\n if (!nextCompleted) {\n patch.completed_at = timestamp();\n }\n } else {\n patch.conclusion = null;\n patch.completed_at = null;\n }\n\n gh.checkRuns.update(runId, patch);\n const run = gh.checkRuns.get(runId)!;\n\n if (run.check_suite_id) {\n recomputeCheckSuite(gh, run.check_suite_id);\n }\n\n if (prev.status !== \"completed\" && run.status === \"completed\") {\n dispatchCheckRun(webhooks, gh, repo, run, actor, baseUrl, \"completed\");\n }\n\n return c.json(formatCheckRun(run, repo, gh, baseUrl));\n });\n\n app.get(\"/repos/:owner/:repo/check-runs/:check_run_id\", (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n assertRepoRead(gh, c.get(\"authUser\"), repo);\n const runId = parseInt(c.req.param(\"check_run_id\")!, 10);\n const run = gh.checkRuns.get(runId);\n if (!run || run.repo_id !== repo.id) throw notFoundResponse();\n return c.json(formatCheckRun(run, repo, gh, baseUrl));\n });\n\n app.get(\"/repos/:owner/:repo/check-runs/:check_run_id/annotations\", (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n assertRepoRead(gh, c.get(\"authUser\"), repo);\n const runId = parseInt(c.req.param(\"check_run_id\")!, 10);\n const run = gh.checkRuns.get(runId);\n if (!run || run.repo_id !== repo.id) throw notFoundResponse();\n\n const { page, per_page } = parsePagination(c);\n const annotations = run.output.annotations;\n const total = annotations.length;\n const slice = annotations.slice((page - 1) * per_page, (page - 1) * per_page + per_page);\n setLinkHeader(c, total, page, per_page);\n\n const check_annotations = slice.map((a, i) => ({\n path: a.path,\n blob_href: `${baseUrl}/${repo.full_name}/blob/${run.head_sha}/${a.path}`,\n start_line: a.start_line,\n end_line: a.end_line,\n message: a.message,\n title: null as string | null,\n raw_details: null as string | null,\n start_column: null as number | null,\n end_column: null as number | null,\n annotation_level: a.annotation_level,\n id: (page - 1) * per_page + i + 1,\n }));\n\n return c.json({\n total_count: total,\n check_annotations,\n });\n });\n\n app.post(\"/repos/:owner/:repo/check-runs/:check_run_id/rerequest\", (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n const actor = assertRepoWrite(gh, c.get(\"authUser\"), repo);\n const runId = parseInt(c.req.param(\"check_run_id\")!, 10);\n const prev = gh.checkRuns.get(runId);\n if (!prev || prev.repo_id !== repo.id) throw notFoundResponse();\n\n const now = timestamp();\n gh.checkRuns.update(runId, {\n status: \"queued\",\n conclusion: null,\n completed_at: null,\n started_at: null,\n updated_at: now,\n });\n const run = gh.checkRuns.get(runId)!;\n if (run.check_suite_id) {\n recomputeCheckSuite(gh, run.check_suite_id);\n }\n dispatchCheckRun(webhooks, gh, repo, run, actor, baseUrl, \"rerequested\");\n return c.body(null, 201);\n });\n\n app.get(\"/repos/:owner/:repo/commits/:ref/check-runs\", (c) => {\n const owner = c.req.param(\"owner\")!;\n const repoName = c.req.param(\"repo\")!;\n const repo = lookupRepo(gh, owner, repoName);\n if (!repo) throw notFoundResponse();\n assertRepoRead(gh, c.get(\"authUser\"), repo);\n const ref = c.req.param(\"ref\")!;\n const headSha = resolveRefToHeadSha(gh, repo, ref);\n if (!headSha) throw notFoundResponse();\n\n const check_name = c.req.query(\"check_name\")?.trim();\n const statusQ = c.req.query(\"status\")?.trim() as GitHubCheckRun[\"status\"] | undefined;\n const filter = (c.req.query(\"filter\") ?? \"latest\").toLowerCase();\n\n let runs = gh.checkRuns.findBy(\"repo_id\", repo.id).filter((r) => r.head_sha === headSha);\n if (check_name) {\n runs = runs.filter((r) => r.name === check_name);\n }\n if (statusQ && (statusQ === \"queued\" || statusQ === \"in_progress\" || statusQ === \"completed\")) {\n runs = runs.filter((r) => r.status === statusQ);\n }\n\n runs = runs.sort((a, b) => b.id - a.id);\n\n if (filter === \"latest\") {\n const byName = new Map<string, GitHubCheckRun>();\n for (const r of runs.sort((a, b) => a.id - b.id)) {\n byName.set(r.name, r);\n }\n runs = [...byName.values()].sort((a, b) => b.id - a.id);\n }\n\n return c.json({\n total_count: runs.length,\n check_runs: runs.map((r) => formatCheckRun(r, repo, gh, baseUrl)),\n });\n });\n}\n","import type { RouteContext } from \"@emulators/core\";\n\nexport function rateLimitRoutes({ app }: RouteContext): void {\n app.get(\"/rate_limit\", (c) => {\n const now = Math.floor(Date.now() / 1000);\n const reset = now + 3600;\n const rateLimit = {\n limit: 5000,\n remaining: 4999,\n reset,\n used: 1,\n resource: \"core\",\n };\n\n return c.json({\n resources: {\n core: rateLimit,\n search: { limit: 30, remaining: 29, reset, used: 1, resource: \"search\" },\n graphql: { limit: 5000, remaining: 4999, reset, used: 1, resource: \"graphql\" },\n integration_manifest: { limit: 5000, remaining: 4999, reset, used: 1, resource: \"integration_manifest\" },\n source_import: { limit: 100, remaining: 99, reset, used: 1, resource: \"source_import\" },\n code_scanning_upload: { limit: 500, remaining: 499, reset, used: 1, resource: \"code_scanning_upload\" },\n actions_runner_registration: {\n limit: 10000,\n remaining: 9999,\n reset,\n used: 1,\n resource: \"actions_runner_registration\",\n },\n scim: { limit: 15000, remaining: 14999, reset, used: 1, resource: \"scim\" },\n },\n rate: rateLimit,\n });\n });\n}\n","import type { RouteContext } from \"@emulators/core\";\n\nexport function metaRoutes({ app, baseUrl }: RouteContext): void {\n app.get(\"/meta\", (c) => {\n return c.json({\n verifiable_password_authentication: true,\n ssh_key_fingerprints: {\n SHA256_RSA: \"placeholder\",\n SHA256_DSA: \"placeholder\",\n SHA256_ECDSA: \"placeholder\",\n SHA256_ED25519: \"placeholder\",\n },\n ssh_keys: [\"ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIPlaceholder\"],\n hooks: [\"127.0.0.1/32\"],\n web: [\"127.0.0.1/32\"],\n api: [\"127.0.0.1/32\"],\n git: [\"127.0.0.1/32\"],\n github_enterprise_importer: [\"127.0.0.1/32\"],\n packages: [\"127.0.0.1/32\"],\n pages: [\"127.0.0.1/32\"],\n importer: [\"127.0.0.1/32\"],\n actions: [\"127.0.0.1/32\"],\n actions_macos: [\"127.0.0.1/32\"],\n dependabot: [\"127.0.0.1/32\"],\n copilot: [\"127.0.0.1/32\"],\n domains: {\n website: [\"localhost\"],\n codespaces: [\"localhost\"],\n copilot: [\"localhost\"],\n packages: [\"localhost\"],\n actions: [\"localhost\"],\n artifact_attestations: { trust_domain: \"localhost\" },\n },\n });\n });\n\n app.get(\"/octocat\", (c) => {\n const say = c.req.query(\"s\") ?? \"emulate says hello!\";\n const art = `\n MMM. .MMM\n MMMMMMMMMMMMMMMMMMM\n MMMMMMMMMMMMMMMMMMM ____________________________\n MMMMMMMMMMMMMMMMMMMMM | |\n MMMMMMMMMMMMMMMMMMMMMMM | ${say.padEnd(26)} |\n MMMMMMMMMMMMMMMMMMMMMMMM |_ ________________________|\n MMMM::- -:::::::- -::MMMM |/\n MM~:~ 00~:::::~ 00~:~MM\n .. .. :~M]:[~:M. . ..\n .MM. ~MM. MM~ .MM.\n MMMM. ~MM:~MM~ .MMMM\n MMMMMM. ~MMMMMMMM~ .MMMMMM\n MMMMMMMMMMMMMMMMMMMMMMMMMMMM\n .MMMMMMMMMMMMMMMMMMMMMM.\n MMMMMMMMMMMMMMMMMM\n ;MMMMMMMMMMMMMMM;\n :MMMMMMMMMMMM:\n .MMMMMMMMMMM.\n MMMMMMMMMMM\n MMMMMMMMM\n MMMMMMM\n MMMMM\n MMM\n M\n`;\n c.header(\"Content-Type\", \"application/octocat-stream\");\n return c.text(art.trim());\n });\n\n app.get(\"/emojis\", (c) => {\n return c.json({\n \"+1\": `${baseUrl}/emojis/+1.png`,\n \"-1\": `${baseUrl}/emojis/-1.png`,\n \"100\": `${baseUrl}/emojis/100.png`,\n tada: `${baseUrl}/emojis/tada.png`,\n rocket: `${baseUrl}/emojis/rocket.png`,\n heart: `${baseUrl}/emojis/heart.png`,\n eyes: `${baseUrl}/emojis/eyes.png`,\n thinking: `${baseUrl}/emojis/thinking.png`,\n thumbsup: `${baseUrl}/emojis/thumbsup.png`,\n thumbsdown: `${baseUrl}/emojis/thumbsdown.png`,\n });\n });\n\n app.get(\"/zen\", (c) => {\n const phrases = [\n \"Non-blocking is better than blocking.\",\n \"Design for failure.\",\n \"Half measures are as bad as nothing at all.\",\n \"Encourage flow.\",\n \"Anything added dilutes everything else.\",\n \"Approachable is better than simple.\",\n \"Mind your words, they are important.\",\n \"Speak like a human.\",\n \"It's not fully shipped until it's fast.\",\n \"Responsive is better than fast.\",\n \"Keep it logically awesome.\",\n \"Favor focus over features.\",\n \"Avoid administrative distraction.\",\n ];\n return c.text(phrases[Math.floor(Math.random() * phrases.length)]);\n });\n\n app.get(\"/versions\", (c) => {\n return c.json([\"2022-11-28\", \"2022-08-09\"]);\n });\n}\n","import { randomBytes } from \"crypto\";\nimport type { Context } from \"@emulators/core\";\nimport type { RouteContext, Store, AuthUser, AppEnv } from \"@emulators/core\";\nimport {\n unauthorized,\n escapeHtml,\n escapeAttr,\n renderCardPage,\n renderErrorPage,\n renderSettingsPage,\n renderUserButton,\n matchesRedirectUri,\n constantTimeSecretEqual,\n parseCookies,\n debug,\n} from \"@emulators/core\";\nimport { getGitHubStore } from \"../store.js\";\nimport { formatUser, formatUserFull } from \"../helpers.js\";\n\ntype PendingCode = {\n login: string;\n scope: string;\n redirectUri: string;\n clientId: string;\n created_at: number;\n};\n\nconst PENDING_CODE_TTL_MS = 10 * 60 * 1000;\n\nfunction getPendingCodes(store: Store): Map<string, PendingCode> {\n let map = store.getData<Map<string, PendingCode>>(\"github.oauth.pendingCodes\");\n if (!map) {\n map = new Map();\n store.setData(\"github.oauth.pendingCodes\", map);\n }\n return map;\n}\n\nfunction getTokenToClientId(store: Store): Map<string, string> {\n let map = store.getData<Map<string, string>>(\"github.oauth.tokenToClientId\");\n if (!map) {\n map = new Map();\n store.setData(\"github.oauth.tokenToClientId\", map);\n }\n return map;\n}\n\nfunction getSessionMap(store: Store): Map<string, string> {\n let map = store.getData<Map<string, string>>(\"github.oauth.sessionMap\");\n if (!map) {\n map = new Map();\n store.setData(\"github.oauth.sessionMap\", map);\n }\n return map;\n}\n\n/** On read: drops entries older than {@link PENDING_CODE_TTL_MS}. */\nfunction getPendingCodeIfValid(store: Store, code: string): PendingCode | undefined {\n const map = getPendingCodes(store);\n const pending = map.get(code);\n if (!pending) return undefined;\n if (Date.now() - pending.created_at > PENDING_CODE_TTL_MS) {\n map.delete(code);\n return undefined;\n }\n return pending;\n}\n\nconst SERVICE_LABEL = \"GitHub\";\n\nexport function oauthRoutes({ app, store, baseUrl, tokenMap }: RouteContext): void {\n const gh = getGitHubStore(store);\n\n function resolveSessionUser(c: Context<AppEnv>): { login: string; id: number } | null {\n const authUser = c.get(\"authUser\") as AuthUser | undefined;\n if (authUser) {\n const user = gh.users.findOneBy(\"login\", authUser.login);\n if (user) return { login: user.login, id: user.id };\n }\n const cookieHeader = c.req.header(\"Cookie\") ?? \"\";\n const cookies = parseCookies(cookieHeader);\n const sessionId = cookies[\"_emu_session\"];\n if (sessionId) {\n const login = getSessionMap(store).get(sessionId);\n if (login) {\n const user = gh.users.findOneBy(\"login\", login);\n if (user) return { login: user.login, id: user.id };\n }\n }\n return null;\n }\n\n // ---------- OAuth authorize page ----------\n\n app.get(\"/login/oauth/authorize\", (c) => {\n const client_id = c.req.query(\"client_id\") ?? \"\";\n const redirect_uri = c.req.query(\"redirect_uri\") ?? \"\";\n const scope = c.req.query(\"scope\") ?? \"\";\n const state = c.req.query(\"state\") ?? \"\";\n\n const oauthAppsConfigured = gh.oauthApps.all().length > 0;\n let oauthAppForSubtitle: { name: string } | undefined;\n if (oauthAppsConfigured) {\n const oauthApp = gh.oauthApps.findOneBy(\"client_id\", client_id);\n if (!oauthApp) {\n return c.html(\n renderErrorPage(\"Application not found\", `The client_id '${client_id}' is not registered.`, SERVICE_LABEL),\n 400,\n );\n }\n if (redirect_uri && !matchesRedirectUri(redirect_uri, oauthApp.redirect_uris)) {\n console.warn(\n `[OAuth] redirect_uri mismatch: got \"${redirect_uri}\", registered: ${JSON.stringify(oauthApp.redirect_uris)}`,\n );\n return c.html(\n renderErrorPage(\n \"Redirect URI mismatch\",\n \"The redirect_uri is not registered for this application.\",\n SERVICE_LABEL,\n ),\n 400,\n );\n }\n oauthAppForSubtitle = oauthApp;\n }\n\n const users = [...gh.users.all()].sort((a, b) => a.login.localeCompare(b.login));\n\n const subtitleText = oauthAppForSubtitle\n ? `Authorize <strong>${escapeHtml(oauthAppForSubtitle.name)}</strong> to access your account.`\n : \"Choose a seeded user to authorize this application.\";\n\n const userButtons = users\n .map((u) => {\n const brief = formatUser(u, baseUrl);\n const full = formatUserFull(u, baseUrl);\n return renderUserButton({\n letter: (brief.login[0] ?? \"?\").toUpperCase(),\n login: full.login,\n name: full.name ?? undefined,\n email: full.email ?? undefined,\n formAction: \"/login/oauth/callback\",\n hiddenFields: {\n login: u.login,\n redirect_uri,\n scope,\n state,\n client_id,\n },\n });\n })\n .join(\"\\n\");\n\n const body = users.length === 0 ? '<p class=\"empty\">No users in the emulator store.</p>' : userButtons;\n\n return c.html(renderCardPage(\"Sign in to GitHub\", subtitleText, body, SERVICE_LABEL));\n });\n\n // ---------- OAuth callback (user selection) ----------\n\n app.post(\"/login/oauth/callback\", async (c) => {\n const body = (await c.req.parseBody()) as Record<string, string>;\n const login = String(body.login ?? \"\");\n const redirect_uri = String(body.redirect_uri ?? \"\");\n const scope = String(body.scope ?? \"\");\n const state = String(body.state ?? \"\");\n const client_id = String(body.client_id ?? \"\");\n\n const code = randomBytes(20).toString(\"hex\");\n getPendingCodes(store).set(code, {\n login,\n scope,\n redirectUri: redirect_uri,\n clientId: client_id,\n created_at: Date.now(),\n });\n\n debug(\n \"github.oauth\",\n `[OAuth callback] generated code: ${code.slice(0, 8)}... for login=${login}, pendingCodes size: ${getPendingCodes(store).size}`,\n );\n\n const sessionId = randomBytes(24).toString(\"base64url\");\n getSessionMap(store).set(sessionId, login);\n c.header(\"Set-Cookie\", `_emu_session=${sessionId}; Path=/; HttpOnly; SameSite=Lax`);\n\n const sep = redirect_uri.includes(\"?\") ? \"&\" : \"?\";\n const target = `${redirect_uri}${sep}code=${encodeURIComponent(code)}&state=${encodeURIComponent(state)}`;\n debug(\"github.oauth\", `[OAuth callback] redirecting to: ${target.slice(0, 120)}...`);\n return c.redirect(target, 302);\n });\n\n // ---------- Token exchange ----------\n\n app.post(\"/login/oauth/access_token\", async (c) => {\n const contentType = c.req.header(\"Content-Type\") ?? \"\";\n const accept = c.req.header(\"Accept\") ?? \"\";\n debug(\"github.oauth\", `[OAuth token] Content-Type: ${contentType}`);\n debug(\"github.oauth\", `[OAuth token] Accept: ${accept}`);\n debug(\"github.oauth\", `[OAuth token] pendingCodes size: ${getPendingCodes(store).size}`);\n debug(\n \"github.oauth\",\n `[OAuth token] pendingCodes keys: ${[...getPendingCodes(store).keys()].map((k) => k.slice(0, 8) + \"...\").join(\", \")}`,\n );\n\n const rawText = await c.req.text();\n debug(\"github.oauth\", `[OAuth token] raw body: ${rawText.slice(0, 500)}`);\n\n let raw: Record<string, unknown>;\n if (contentType.includes(\"application/json\")) {\n try {\n raw = JSON.parse(rawText);\n } catch {\n raw = {};\n }\n } else {\n raw = Object.fromEntries(new URLSearchParams(rawText));\n }\n\n debug(\"github.oauth\", `[OAuth token] parsed keys: ${Object.keys(raw).join(\", \")}`);\n\n const code = String(raw.code ?? \"\");\n const bodyClientId = String(raw.client_id ?? \"\");\n const bodyClientSecret = String(raw.client_secret ?? \"\").slice(0, 4) + \"****\";\n\n debug(\"github.oauth\", `[OAuth token] code: ${code.slice(0, 8)}... (len=${code.length})`);\n debug(\"github.oauth\", `[OAuth token] client_id: ${bodyClientId}`);\n debug(\"github.oauth\", `[OAuth token] client_secret: ${bodyClientSecret}`);\n\n const actualSecret = String(raw.client_secret ?? \"\");\n\n const incorrectClientCredentials = () => {\n debug(\"github.oauth\", `[OAuth token] REJECTED: incorrect_client_credentials`);\n return c.json(\n {\n error: \"incorrect_client_credentials\",\n error_description: \"The client_id and/or client_secret passed are incorrect.\",\n },\n 200,\n );\n };\n\n const oauthAppsConfigured = gh.oauthApps.all().length > 0;\n if (oauthAppsConfigured) {\n const oauthApp = gh.oauthApps.findOneBy(\"client_id\", bodyClientId);\n if (!oauthApp) {\n debug(\"github.oauth\", `[OAuth token] REJECTED: client_id not found in oauthApps`);\n return incorrectClientCredentials();\n }\n if (!constantTimeSecretEqual(actualSecret, oauthApp.client_secret)) {\n debug(\"github.oauth\", `[OAuth token] REJECTED: client_secret mismatch`);\n return incorrectClientCredentials();\n }\n debug(\"github.oauth\", `[OAuth token] client credentials OK (app: ${oauthApp.name})`);\n } else {\n debug(\"github.oauth\", `[OAuth token] no oauth apps configured, skipping client validation`);\n }\n\n const pending = getPendingCodeIfValid(store, code);\n if (!pending) {\n debug(\"github.oauth\", `[OAuth token] REJECTED: code not found in pendingCodes or expired`);\n return c.json(\n { error: \"bad_verification_code\", error_description: \"The code passed is incorrect or expired.\" },\n 200,\n );\n }\n\n debug(\"github.oauth\", `[OAuth token] code valid, login=${pending.login}, scope=${pending.scope}`);\n getPendingCodes(store).delete(code);\n\n const user = gh.users.findOneBy(\"login\", pending.login);\n if (!user) {\n debug(\"github.oauth\", `[OAuth token] REJECTED: user \"${pending.login}\" not found in store`);\n return c.json(\n { error: \"bad_verification_code\", error_description: \"The code passed is incorrect or expired.\" },\n 200,\n );\n }\n\n const token = \"gho_\" + randomBytes(20).toString(\"base64url\");\n const scopes = pending.scope ? pending.scope.split(/[,\\s]+/).filter(Boolean) : [\"repo\", \"user\"];\n\n if (tokenMap) {\n tokenMap.set(token, { login: user.login, id: user.id, scopes });\n }\n\n const oauthApp = gh.oauthApps.findOneBy(\"client_id\", pending.clientId);\n if (oauthApp) {\n const existingGrant = gh.oauthGrants.all().find((g) => g.user_id === user.id && g.client_id === pending.clientId);\n const orgAccess: Record<string, \"granted\" | \"denied\" | \"requested\"> = {};\n for (const org of gh.orgs.all()) {\n const isMember = gh.teamMembers\n .all()\n .some((tm) => tm.user_id === user.id && gh.teams.get(tm.team_id)?.org_id === org.id);\n if (isMember) orgAccess[org.login] = \"granted\";\n }\n\n if (existingGrant) {\n gh.oauthGrants.update(existingGrant.id, { scopes, org_access: orgAccess });\n } else {\n gh.oauthGrants.insert({\n user_id: user.id,\n oauth_app_id: oauthApp.id,\n client_id: pending.clientId,\n scopes,\n org_access: orgAccess,\n });\n }\n getTokenToClientId(store).set(token, pending.clientId);\n }\n\n debug(\"github.oauth\", `[OAuth token] SUCCESS: issued token for ${user.login} (scopes: ${scopes.join(\",\")})`);\n\n const wantsFormEncoded = accept.includes(\"application/x-www-form-urlencoded\");\n const scopeOut = pending.scope;\n\n if (wantsFormEncoded) {\n const formBody = `access_token=${encodeURIComponent(token)}&token_type=bearer&scope=${encodeURIComponent(scopeOut)}`;\n c.header(\"Content-Type\", \"application/x-www-form-urlencoded\");\n return c.body(formBody, 200);\n }\n\n return c.json({\n access_token: token,\n token_type: \"bearer\",\n scope: scopeOut,\n });\n });\n\n // ---------- User emails ----------\n\n app.get(\"/user/emails\", (c) => {\n const authUser = c.get(\"authUser\");\n if (!authUser) {\n throw unauthorized();\n }\n const user = gh.users.findOneBy(\"login\", authUser.login);\n if (!user) {\n throw unauthorized();\n }\n const email = user.email || `${user.login}@users.noreply.localhost`;\n return c.json([\n {\n email,\n primary: true,\n verified: true,\n visibility: \"public\",\n },\n ]);\n });\n\n // ---------- Settings: list authorized apps ----------\n\n const SCOPE_LABELS: Record<string, string> = {\n repo: \"Full control of private repositories\",\n \"read:user\": \"Read all user profile data\",\n \"user:email\": \"Access user email addresses (read-only)\",\n user: \"Full control of user profile\",\n workflow: \"Update GitHub action workflows\",\n \"admin:org\": \"Full control of orgs and teams\",\n \"admin:repo_hook\": \"Full control of repository hooks\",\n \"read:org\": \"Read org and team membership\",\n \"write:repo_hook\": \"Write repository hooks\",\n \"read:repo_hook\": \"Read repository hooks\",\n delete_repo: \"Delete repositories\",\n gist: \"Create gists\",\n notifications: \"Access notifications\",\n \"write:packages\": \"Upload packages\",\n \"read:packages\": \"Download packages\",\n \"admin:gpg_key\": \"Full control of GPG keys\",\n \"admin:public_key\": \"Full control of public keys\",\n };\n\n function scopeLabel(scope: string): string {\n return SCOPE_LABELS[scope] ?? scope;\n }\n\n const sidebarHtml = `\n <a href=\"/settings/applications\" class=\"active\">Authorized Apps</a>`;\n\n app.get(\"/settings/applications\", (c) => {\n const sessionUser = resolveSessionUser(c);\n if (!sessionUser) {\n return c.html(\n renderErrorPage(\"Unauthorized\", \"You must be authenticated to view this page.\", SERVICE_LABEL),\n 401,\n );\n }\n\n const grants = gh.oauthGrants.findBy(\"user_id\", sessionUser.id);\n\n let bodyHtml: string;\n if (grants.length === 0) {\n bodyHtml = `\n <div class=\"section-heading\">Authorized OAuth Apps</div>\n <div class=\"s-card\">\n <p class=\"empty\">No authorized applications. Apps you authorize will appear here.</p>\n </div>`;\n } else {\n const appLinks = grants\n .map((grant) => {\n const oauthApp = gh.oauthApps.findOneBy(\"client_id\", grant.client_id);\n const name = oauthApp?.name ?? grant.client_id;\n const letter = escapeHtml((name[0] ?? \"?\").toUpperCase());\n const scopeText = grant.scopes.length > 0 ? grant.scopes.join(\", \") : \"No scopes\";\n return `<a href=\"/settings/connections/applications/${escapeAttr(grant.client_id)}\" class=\"app-link\">\n <div class=\"s-icon\">${letter}</div>\n <div>\n <div class=\"app-link-name\">${escapeHtml(name)}</div>\n <div class=\"app-link-scopes\">${escapeHtml(scopeText)}</div>\n </div>\n </a>`;\n })\n .join(\"\\n\");\n\n bodyHtml = `\n <div class=\"section-heading\">Authorized OAuth Apps</div>\n <div class=\"s-card\">${appLinks}</div>`;\n }\n\n return c.html(renderSettingsPage(\"Authorized OAuth Apps\", sidebarHtml, bodyHtml, SERVICE_LABEL));\n });\n\n // ---------- Settings: app detail ----------\n\n app.get(\"/settings/connections/applications/:client_id\", (c) => {\n const sessionUser = resolveSessionUser(c);\n if (!sessionUser) {\n return c.html(\n renderErrorPage(\"Unauthorized\", \"You must be authenticated to view this page.\", SERVICE_LABEL),\n 401,\n );\n }\n\n const clientId = c.req.param(\"client_id\");\n\n const grant = gh.oauthGrants.all().find((g) => g.user_id === sessionUser.id && g.client_id === clientId);\n if (!grant) {\n return c.html(renderErrorPage(\"Not Found\", \"No authorization found for this application.\", SERVICE_LABEL), 404);\n }\n\n const oauthApp = gh.oauthApps.findOneBy(\"client_id\", clientId);\n const appName = oauthApp?.name ?? clientId;\n const appLetter = escapeHtml((appName[0] ?? \"?\").toUpperCase());\n const lastUsed = new Date(grant.updated_at).toLocaleDateString(\"en-US\", {\n year: \"numeric\",\n month: \"long\",\n day: \"numeric\",\n });\n\n const permRows = grant.scopes\n .map((s) => `<li><span class=\"check\">✓</span> ${escapeHtml(scopeLabel(s))}</li>`)\n .join(\"\\n\");\n\n const orgRows = Object.entries(grant.org_access)\n .map(([org, status]) => {\n const letter = escapeHtml((org[0] ?? \"?\").toUpperCase());\n const badgeClass =\n status === \"granted\" ? \"badge-granted\" : status === \"denied\" ? \"badge-denied\" : \"badge-requested\";\n const icon = status === \"granted\" ? \"✓\" : status === \"denied\" ? \"✗\" : \"⋯\";\n return `<div class=\"org-row\">\n <div class=\"org-icon\">${letter}</div>\n <span class=\"org-name\">${escapeHtml(org)}</span>\n <span class=\"badge ${badgeClass}\">${icon}</span>\n </div>`;\n })\n .join(\"\\n\");\n\n const bodyHtml = `\n <div class=\"s-card\">\n <div class=\"s-card-header\">\n <div class=\"s-icon\">${appLetter}</div>\n <div>\n <div class=\"s-title\">${escapeHtml(appName)}</div>\n <div class=\"s-subtitle\">Last used: ${escapeHtml(lastUsed)}</div>\n </div>\n </div>\n </div>\n\n <div class=\"s-card\">\n <div class=\"section-heading\">\n <span>Permissions</span>\n <form method=\"post\" action=\"/settings/connections/applications/${escapeAttr(clientId)}/revoke\" style=\"display:inline\">\n <button type=\"submit\" class=\"btn-revoke\">Revoke access</button>\n </form>\n </div>\n <ul class=\"perm-list\">\n ${permRows || '<li style=\"color:#1a8c00\">No specific permissions granted.</li>'}\n </ul>\n </div>\n\n ${\n orgRows\n ? `<div class=\"s-card\">\n <div class=\"section-heading\">Organization access</div>\n ${orgRows}\n <p class=\"info-text\">Applications act on your behalf. Organizations control which apps may access their private data.</p>\n </div>`\n : \"\"\n }`;\n\n return c.html(renderSettingsPage(appName, sidebarHtml, bodyHtml, SERVICE_LABEL));\n });\n\n // ---------- Settings: revoke ----------\n\n app.post(\"/settings/connections/applications/:client_id/revoke\", (c) => {\n const sessionUser = resolveSessionUser(c);\n if (!sessionUser) {\n return c.html(\n renderErrorPage(\"Unauthorized\", \"You must be authenticated to perform this action.\", SERVICE_LABEL),\n 401,\n );\n }\n\n const clientId = c.req.param(\"client_id\");\n\n const grant = gh.oauthGrants.all().find((g) => g.user_id === sessionUser.id && g.client_id === clientId);\n if (grant) {\n gh.oauthGrants.delete(grant.id);\n }\n\n if (tokenMap) {\n for (const [token, tokenUser] of tokenMap.entries()) {\n if (tokenUser.login === sessionUser.login && getTokenToClientId(store).get(token) === clientId) {\n tokenMap.delete(token);\n getTokenToClientId(store).delete(token);\n }\n }\n }\n\n return c.redirect(\"/settings/applications\", 302);\n });\n}\n","import { randomBytes } from \"crypto\";\nimport type { RouteContext, AuthApp } from \"@emulators/core\";\nimport { getGitHubStore } from \"../store.js\";\nimport { generateNodeId } from \"../helpers.js\";\n\nexport function appsRoutes({ app, store, baseUrl, tokenMap }: RouteContext): void {\n const gh = getGitHubStore(store);\n\n function requireApp(c: any): AuthApp | null {\n const authApp = c.get(\"authApp\") as AuthApp | undefined;\n if (!authApp) {\n c.status(401);\n return null;\n }\n return authApp;\n }\n\n app.get(\"/app\", (c) => {\n const authApp = requireApp(c);\n if (!authApp) {\n return c.json(\n {\n message: \"A JSON web token could not be decoded\",\n documentation_url: \"https://docs.github.com/rest\",\n },\n 401,\n );\n }\n\n const ghApp = gh.apps.all().find((a) => a.app_id === authApp.appId);\n if (!ghApp) {\n return c.json({ message: \"Not Found\" }, 404);\n }\n\n const installations = gh.appInstallations.findBy(\"app_id\", ghApp.app_id);\n\n return c.json({\n id: ghApp.app_id,\n slug: ghApp.slug,\n node_id: generateNodeId(\"App\", ghApp.app_id),\n name: ghApp.name,\n description: ghApp.description,\n external_url: `${baseUrl}/apps/${ghApp.slug}`,\n html_url: `${baseUrl}/apps/${ghApp.slug}`,\n created_at: ghApp.created_at,\n updated_at: ghApp.updated_at,\n permissions: ghApp.permissions,\n events: ghApp.events,\n installations_count: installations.length,\n owner: null,\n });\n });\n\n app.get(\"/app/installations\", (c) => {\n const authApp = requireApp(c);\n if (!authApp) {\n return c.json(\n {\n message: \"A JSON web token could not be decoded\",\n documentation_url: \"https://docs.github.com/rest\",\n },\n 401,\n );\n }\n\n const installations = gh.appInstallations.findBy(\"app_id\", authApp.appId);\n const ghApp = gh.apps.all().find((a) => a.app_id === authApp.appId);\n\n return c.json(installations.map((inst) => formatInstallation(inst, ghApp, baseUrl)));\n });\n\n app.get(\"/app/installations/:installation_id\", (c) => {\n const authApp = requireApp(c);\n if (!authApp) {\n return c.json(\n {\n message: \"A JSON web token could not be decoded\",\n documentation_url: \"https://docs.github.com/rest\",\n },\n 401,\n );\n }\n\n const installationId = parseInt(c.req.param(\"installation_id\"), 10);\n const inst = gh.appInstallations\n .all()\n .find((i) => i.installation_id === installationId && i.app_id === authApp.appId);\n\n if (!inst) {\n return c.json({ message: \"Not Found\", documentation_url: \"https://docs.github.com/rest\" }, 404);\n }\n\n const ghApp = gh.apps.all().find((a) => a.app_id === authApp.appId);\n return c.json(formatInstallation(inst, ghApp, baseUrl));\n });\n\n app.post(\"/app/installations/:installation_id/access_tokens\", async (c) => {\n const authApp = requireApp(c);\n if (!authApp) {\n return c.json(\n {\n message: \"A JSON web token could not be decoded\",\n documentation_url: \"https://docs.github.com/rest\",\n },\n 401,\n );\n }\n\n const installationId = parseInt(c.req.param(\"installation_id\"), 10);\n const inst = gh.appInstallations\n .all()\n .find((i) => i.installation_id === installationId && i.app_id === authApp.appId);\n\n if (!inst) {\n return c.json({ message: \"Not Found\", documentation_url: \"https://docs.github.com/rest\" }, 404);\n }\n\n let requestedPermissions = inst.permissions;\n let requestedRepoIds = inst.repository_ids;\n\n try {\n const body = (await c.req.json()) as Record<string, unknown>;\n if (body.permissions && typeof body.permissions === \"object\") {\n requestedPermissions = body.permissions as Record<string, string>;\n }\n if (Array.isArray(body.repository_ids)) {\n requestedRepoIds = (body.repository_ids as number[]).filter(\n (id) => inst.repository_selection === \"all\" || inst.repository_ids.includes(id),\n );\n }\n } catch {\n // No body or invalid JSON, use installation defaults\n }\n\n const token = \"ghs_\" + randomBytes(20).toString(\"base64url\");\n const expiresAt = new Date(Date.now() + 60 * 60 * 1000).toISOString();\n\n if (tokenMap) {\n tokenMap.set(token, {\n login: inst.account_login,\n id: inst.account_id,\n scopes: Object.entries(requestedPermissions).map(([k, v]) => `${k}:${v}`),\n });\n }\n\n const repos = requestedRepoIds\n .map((id) => gh.repos.get(id))\n .filter(Boolean)\n .map((r) => ({\n id: r!.id,\n node_id: r!.node_id,\n name: r!.name,\n full_name: r!.full_name,\n private: r!.private,\n }));\n\n return c.json(\n {\n token,\n expires_at: expiresAt,\n permissions: requestedPermissions,\n repository_selection: inst.repository_selection,\n ...(inst.repository_selection === \"selected\" ? { repositories: repos } : {}),\n },\n 201,\n );\n });\n\n app.get(\"/repos/:owner/:repo/installation\", (c) => {\n const owner = c.req.param(\"owner\");\n const repoName = c.req.param(\"repo\");\n const fullName = `${owner}/${repoName}`;\n const repo = gh.repos.findOneBy(\"full_name\", fullName);\n if (!repo) {\n return c.json({ message: \"Not Found\", documentation_url: \"https://docs.github.com/rest\" }, 404);\n }\n\n const ownerEntity = gh.users.findOneBy(\"login\", owner) ?? gh.orgs.findOneBy(\"login\", owner);\n\n for (const inst of gh.appInstallations.all()) {\n if (inst.repository_selection === \"all\" && ownerEntity && inst.account_id === ownerEntity.id) {\n const ghApp = gh.apps.all().find((a) => a.app_id === inst.app_id);\n return c.json(formatInstallation(inst, ghApp, baseUrl));\n }\n if (inst.repository_selection === \"selected\" && inst.repository_ids.includes(repo.id)) {\n const ghApp = gh.apps.all().find((a) => a.app_id === inst.app_id);\n return c.json(formatInstallation(inst, ghApp, baseUrl));\n }\n }\n\n return c.json({ message: \"Not Found\", documentation_url: \"https://docs.github.com/rest\" }, 404);\n });\n\n app.get(\"/orgs/:org/installation\", (c) => {\n const orgLogin = c.req.param(\"org\");\n const org = gh.orgs.findOneBy(\"login\", orgLogin);\n if (!org) {\n return c.json({ message: \"Not Found\", documentation_url: \"https://docs.github.com/rest\" }, 404);\n }\n\n const inst = gh.appInstallations.all().find((i) => i.account_id === org.id && i.account_type === \"Organization\");\n if (!inst) {\n return c.json({ message: \"Not Found\", documentation_url: \"https://docs.github.com/rest\" }, 404);\n }\n\n const ghApp = gh.apps.all().find((a) => a.app_id === inst.app_id);\n return c.json(formatInstallation(inst, ghApp, baseUrl));\n });\n\n app.get(\"/users/:username/installation\", (c) => {\n const username = c.req.param(\"username\");\n const user = gh.users.findOneBy(\"login\", username);\n if (!user) {\n return c.json({ message: \"Not Found\", documentation_url: \"https://docs.github.com/rest\" }, 404);\n }\n\n const inst = gh.appInstallations.all().find((i) => i.account_id === user.id && i.account_type === \"User\");\n if (!inst) {\n return c.json({ message: \"Not Found\", documentation_url: \"https://docs.github.com/rest\" }, 404);\n }\n\n const ghApp = gh.apps.all().find((a) => a.app_id === inst.app_id);\n return c.json(formatInstallation(inst, ghApp, baseUrl));\n });\n\n function formatInstallation(inst: any, ghApp: any, baseUrl: string) {\n const account = inst.account_type === \"Organization\" ? gh.orgs.get(inst.account_id) : gh.users.get(inst.account_id);\n\n return {\n id: inst.installation_id,\n account: account\n ? {\n login: account.login,\n id: account.id,\n node_id: account.node_id,\n type: inst.account_type,\n avatar_url: `${baseUrl}/avatars/u/${account.login}`,\n url: `${baseUrl}/${inst.account_type === \"Organization\" ? \"orgs\" : \"users\"}/${account.login}`,\n }\n : null,\n repository_selection: inst.repository_selection,\n access_tokens_url: `${baseUrl}/app/installations/${inst.installation_id}/access_tokens`,\n repositories_url: `${baseUrl}/installation/repositories`,\n html_url: `${baseUrl}/settings/installations/${inst.installation_id}`,\n app_id: inst.app_id,\n app_slug: ghApp?.slug ?? null,\n target_type: inst.account_type,\n permissions: inst.permissions,\n events: inst.events,\n created_at: inst.created_at,\n updated_at: inst.updated_at,\n single_file_name: null,\n has_multiple_single_files: false,\n single_file_paths: [],\n suspended_by: null,\n suspended_at: inst.suspended_at,\n };\n }\n}\n"],"mappings":"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","names":["randomBytes","ownerLogin","c","adjustRepoOpenIssues","head","lookupUserByLogin","findPull","adjustPrReviewCommentCount","sortComments","parseCommentSort","findIssueByNumber","insertIssueEvent","getOrCreateLabel","cmp","m","r","blob","repoUrl","saved","notFound","teamsForOrg","listOrgMembersDeduped","orgRoleForUser","getOrgByLogin","s","assertOrgAdmin","findCommitInRepo","oauthApp","baseUrl"]}
|