emulate 0.2.0 → 0.3.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/dist/api.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../node_modules/.pnpm/hono@4.12.8/node_modules/hono/dist/compose.js","../../../node_modules/.pnpm/hono@4.12.8/node_modules/hono/dist/request/constants.js","../../../node_modules/.pnpm/hono@4.12.8/node_modules/hono/dist/utils/body.js","../../../node_modules/.pnpm/hono@4.12.8/node_modules/hono/dist/utils/url.js","../../../node_modules/.pnpm/hono@4.12.8/node_modules/hono/dist/request.js","../../../node_modules/.pnpm/hono@4.12.8/node_modules/hono/dist/utils/html.js","../../../node_modules/.pnpm/hono@4.12.8/node_modules/hono/dist/context.js","../../../node_modules/.pnpm/hono@4.12.8/node_modules/hono/dist/router.js","../../../node_modules/.pnpm/hono@4.12.8/node_modules/hono/dist/utils/constants.js","../../../node_modules/.pnpm/hono@4.12.8/node_modules/hono/dist/hono-base.js","../../../node_modules/.pnpm/hono@4.12.8/node_modules/hono/dist/router/reg-exp-router/matcher.js","../../../node_modules/.pnpm/hono@4.12.8/node_modules/hono/dist/router/reg-exp-router/node.js","../../../node_modules/.pnpm/hono@4.12.8/node_modules/hono/dist/router/reg-exp-router/trie.js","../../../node_modules/.pnpm/hono@4.12.8/node_modules/hono/dist/router/reg-exp-router/router.js","../../../node_modules/.pnpm/hono@4.12.8/node_modules/hono/dist/router/smart-router/router.js","../../../node_modules/.pnpm/hono@4.12.8/node_modules/hono/dist/router/trie-router/node.js","../../../node_modules/.pnpm/hono@4.12.8/node_modules/hono/dist/router/trie-router/router.js","../../../node_modules/.pnpm/hono@4.12.8/node_modules/hono/dist/hono.js","../../../node_modules/.pnpm/hono@4.12.8/node_modules/hono/dist/middleware/cors/index.js","../../@internal/core/src/store.ts","../../@internal/core/src/server.ts","../../@internal/core/src/webhooks.ts","../../@internal/core/src/middleware/error-handler.ts","../../@internal/core/src/middleware/auth.ts","../../@internal/core/src/debug.ts","../../@internal/core/src/fonts.ts","../../@internal/core/src/middleware/pagination.ts","../../@internal/core/src/ui.ts","../../@internal/core/src/oauth-helpers.ts","../../../node_modules/.pnpm/jose@6.2.2/node_modules/jose/dist/webapi/lib/buffer_utils.js","../../../node_modules/.pnpm/jose@6.2.2/node_modules/jose/dist/webapi/lib/base64.js","../../../node_modules/.pnpm/jose@6.2.2/node_modules/jose/dist/webapi/util/base64url.js","../../../node_modules/.pnpm/jose@6.2.2/node_modules/jose/dist/webapi/lib/crypto_key.js","../../../node_modules/.pnpm/jose@6.2.2/node_modules/jose/dist/webapi/lib/invalid_key_input.js","../../../node_modules/.pnpm/jose@6.2.2/node_modules/jose/dist/webapi/util/errors.js","../../../node_modules/.pnpm/jose@6.2.2/node_modules/jose/dist/webapi/lib/is_key_like.js","../../../node_modules/.pnpm/jose@6.2.2/node_modules/jose/dist/webapi/lib/helpers.js","../../../node_modules/.pnpm/jose@6.2.2/node_modules/jose/dist/webapi/lib/type_checks.js","../../../node_modules/.pnpm/jose@6.2.2/node_modules/jose/dist/webapi/lib/signing.js","../../../node_modules/.pnpm/jose@6.2.2/node_modules/jose/dist/webapi/lib/jwk_to_key.js","../../../node_modules/.pnpm/jose@6.2.2/node_modules/jose/dist/webapi/lib/normalize_key.js","../../../node_modules/.pnpm/jose@6.2.2/node_modules/jose/dist/webapi/lib/asn1.js","../../../node_modules/.pnpm/jose@6.2.2/node_modules/jose/dist/webapi/key/import.js","../../../node_modules/.pnpm/jose@6.2.2/node_modules/jose/dist/webapi/lib/validate_crit.js","../../../node_modules/.pnpm/jose@6.2.2/node_modules/jose/dist/webapi/lib/validate_algorithms.js","../../../node_modules/.pnpm/jose@6.2.2/node_modules/jose/dist/webapi/lib/check_key_type.js","../../../node_modules/.pnpm/jose@6.2.2/node_modules/jose/dist/webapi/jws/flattened/verify.js","../../../node_modules/.pnpm/jose@6.2.2/node_modules/jose/dist/webapi/jws/compact/verify.js","../../../node_modules/.pnpm/jose@6.2.2/node_modules/jose/dist/webapi/lib/jwt_claims_set.js","../../../node_modules/.pnpm/jose@6.2.2/node_modules/jose/dist/webapi/jwt/verify.js","../../../node_modules/.pnpm/jose@6.2.2/node_modules/jose/dist/webapi/jws/flattened/sign.js","../../../node_modules/.pnpm/jose@6.2.2/node_modules/jose/dist/webapi/jws/compact/sign.js","../../../node_modules/.pnpm/jose@6.2.2/node_modules/jose/dist/webapi/jwt/sign.js","../../@internal/vercel/src/store.ts","../../@internal/vercel/src/helpers.ts","../../@internal/vercel/src/routes/user.ts","../../@internal/vercel/src/routes/projects.ts","../../@internal/vercel/src/routes/deployments.ts","../../@internal/vercel/src/routes/domains.ts","../../@internal/vercel/src/routes/env.ts","../../@internal/vercel/src/routes/oauth.ts","../../@internal/vercel/src/routes/api-keys.ts","../../@internal/vercel/src/index.ts","../../@internal/github/src/store.ts","../../@internal/github/src/helpers.ts","../../@internal/github/src/routes/users.ts","../../@internal/github/src/route-helpers.ts","../../@internal/github/src/routes/repos.ts","../../@internal/github/src/routes/issues.ts","../../@internal/github/src/routes/pulls.ts","../../@internal/github/src/routes/comments.ts","../../@internal/github/src/routes/reviews.ts","../../@internal/github/src/routes/labels.ts","../../@internal/github/src/routes/branches.ts","../../@internal/github/src/routes/orgs.ts","../../@internal/github/src/routes/releases.ts","../../@internal/github/src/routes/webhooks.ts","../../@internal/github/src/routes/search.ts","../../@internal/github/src/routes/actions.ts","../../@internal/github/src/routes/checks.ts","../../@internal/github/src/routes/rate-limit.ts","../../@internal/github/src/routes/meta.ts","../../@internal/github/src/routes/oauth.ts","../../@internal/github/src/routes/apps.ts","../../@internal/github/src/index.ts","../../@internal/google/src/store.ts","../../@internal/google/src/helpers.ts","../../@internal/google/src/routes/oauth.ts","../../@internal/google/src/index.ts","../src/api.ts"],"sourcesContent":["// src/compose.ts\nvar compose = (middleware, onError, onNotFound) => {\n return (context, next) => {\n let index = -1;\n return dispatch(0);\n async function dispatch(i) {\n if (i <= index) {\n throw new Error(\"next() called multiple times\");\n }\n index = i;\n let res;\n let isError = false;\n let handler;\n if (middleware[i]) {\n handler = middleware[i][0][0];\n context.req.routeIndex = i;\n } else {\n handler = i === middleware.length && next || void 0;\n }\n if (handler) {\n try {\n res = await handler(context, () => dispatch(i + 1));\n } catch (err) {\n if (err instanceof Error && onError) {\n context.error = err;\n res = await onError(err, context);\n isError = true;\n } else {\n throw err;\n }\n }\n } else {\n if (context.finalized === false && onNotFound) {\n res = await onNotFound(context);\n }\n }\n if (res && (context.finalized === false || isError)) {\n context.res = res;\n }\n return context;\n }\n };\n};\nexport {\n compose\n};\n","// src/request/constants.ts\nvar GET_MATCH_RESULT = /* @__PURE__ */ Symbol();\nexport {\n GET_MATCH_RESULT\n};\n","// src/utils/body.ts\nimport { HonoRequest } from \"../request.js\";\nvar parseBody = async (request, options = /* @__PURE__ */ Object.create(null)) => {\n const { all = false, dot = false } = options;\n const headers = request instanceof HonoRequest ? request.raw.headers : request.headers;\n const contentType = headers.get(\"Content-Type\");\n if (contentType?.startsWith(\"multipart/form-data\") || contentType?.startsWith(\"application/x-www-form-urlencoded\")) {\n return parseFormData(request, { all, dot });\n }\n return {};\n};\nasync function parseFormData(request, options) {\n const formData = await request.formData();\n if (formData) {\n return convertFormDataToBodyData(formData, options);\n }\n return {};\n}\nfunction convertFormDataToBodyData(formData, options) {\n const form = /* @__PURE__ */ Object.create(null);\n formData.forEach((value, key) => {\n const shouldParseAllValues = options.all || key.endsWith(\"[]\");\n if (!shouldParseAllValues) {\n form[key] = value;\n } else {\n handleParsingAllValues(form, key, value);\n }\n });\n if (options.dot) {\n Object.entries(form).forEach(([key, value]) => {\n const shouldParseDotValues = key.includes(\".\");\n if (shouldParseDotValues) {\n handleParsingNestedValues(form, key, value);\n delete form[key];\n }\n });\n }\n return form;\n}\nvar handleParsingAllValues = (form, key, value) => {\n if (form[key] !== void 0) {\n if (Array.isArray(form[key])) {\n ;\n form[key].push(value);\n } else {\n form[key] = [form[key], value];\n }\n } else {\n if (!key.endsWith(\"[]\")) {\n form[key] = value;\n } else {\n form[key] = [value];\n }\n }\n};\nvar handleParsingNestedValues = (form, key, value) => {\n if (/(?:^|\\.)__proto__\\./.test(key)) {\n return;\n }\n let nestedForm = form;\n const keys = key.split(\".\");\n keys.forEach((key2, index) => {\n if (index === keys.length - 1) {\n nestedForm[key2] = value;\n } else {\n if (!nestedForm[key2] || typeof nestedForm[key2] !== \"object\" || Array.isArray(nestedForm[key2]) || nestedForm[key2] instanceof File) {\n nestedForm[key2] = /* @__PURE__ */ Object.create(null);\n }\n nestedForm = nestedForm[key2];\n }\n });\n};\nexport {\n parseBody\n};\n","// src/utils/url.ts\nvar splitPath = (path) => {\n const paths = path.split(\"/\");\n if (paths[0] === \"\") {\n paths.shift();\n }\n return paths;\n};\nvar splitRoutingPath = (routePath) => {\n const { groups, path } = extractGroupsFromPath(routePath);\n const paths = splitPath(path);\n return replaceGroupMarks(paths, groups);\n};\nvar extractGroupsFromPath = (path) => {\n const groups = [];\n path = path.replace(/\\{[^}]+\\}/g, (match, index) => {\n const mark = `@${index}`;\n groups.push([mark, match]);\n return mark;\n });\n return { groups, path };\n};\nvar replaceGroupMarks = (paths, groups) => {\n for (let i = groups.length - 1; i >= 0; i--) {\n const [mark] = groups[i];\n for (let j = paths.length - 1; j >= 0; j--) {\n if (paths[j].includes(mark)) {\n paths[j] = paths[j].replace(mark, groups[i][1]);\n break;\n }\n }\n }\n return paths;\n};\nvar patternCache = {};\nvar getPattern = (label, next) => {\n if (label === \"*\") {\n return \"*\";\n }\n const match = label.match(/^\\:([^\\{\\}]+)(?:\\{(.+)\\})?$/);\n if (match) {\n const cacheKey = `${label}#${next}`;\n if (!patternCache[cacheKey]) {\n if (match[2]) {\n patternCache[cacheKey] = next && next[0] !== \":\" && next[0] !== \"*\" ? [cacheKey, match[1], new RegExp(`^${match[2]}(?=/${next})`)] : [label, match[1], new RegExp(`^${match[2]}$`)];\n } else {\n patternCache[cacheKey] = [label, match[1], true];\n }\n }\n return patternCache[cacheKey];\n }\n return null;\n};\nvar tryDecode = (str, decoder) => {\n try {\n return decoder(str);\n } catch {\n return str.replace(/(?:%[0-9A-Fa-f]{2})+/g, (match) => {\n try {\n return decoder(match);\n } catch {\n return match;\n }\n });\n }\n};\nvar tryDecodeURI = (str) => tryDecode(str, decodeURI);\nvar getPath = (request) => {\n const url = request.url;\n const start = url.indexOf(\"/\", url.indexOf(\":\") + 4);\n let i = start;\n for (; i < url.length; i++) {\n const charCode = url.charCodeAt(i);\n if (charCode === 37) {\n const queryIndex = url.indexOf(\"?\", i);\n const hashIndex = url.indexOf(\"#\", i);\n const end = queryIndex === -1 ? hashIndex === -1 ? void 0 : hashIndex : hashIndex === -1 ? queryIndex : Math.min(queryIndex, hashIndex);\n const path = url.slice(start, end);\n return tryDecodeURI(path.includes(\"%25\") ? path.replace(/%25/g, \"%2525\") : path);\n } else if (charCode === 63 || charCode === 35) {\n break;\n }\n }\n return url.slice(start, i);\n};\nvar getQueryStrings = (url) => {\n const queryIndex = url.indexOf(\"?\", 8);\n return queryIndex === -1 ? \"\" : \"?\" + url.slice(queryIndex + 1);\n};\nvar getPathNoStrict = (request) => {\n const result = getPath(request);\n return result.length > 1 && result.at(-1) === \"/\" ? result.slice(0, -1) : result;\n};\nvar mergePath = (base, sub, ...rest) => {\n if (rest.length) {\n sub = mergePath(sub, ...rest);\n }\n return `${base?.[0] === \"/\" ? \"\" : \"/\"}${base}${sub === \"/\" ? \"\" : `${base?.at(-1) === \"/\" ? \"\" : \"/\"}${sub?.[0] === \"/\" ? sub.slice(1) : sub}`}`;\n};\nvar checkOptionalParameter = (path) => {\n if (path.charCodeAt(path.length - 1) !== 63 || !path.includes(\":\")) {\n return null;\n }\n const segments = path.split(\"/\");\n const results = [];\n let basePath = \"\";\n segments.forEach((segment) => {\n if (segment !== \"\" && !/\\:/.test(segment)) {\n basePath += \"/\" + segment;\n } else if (/\\:/.test(segment)) {\n if (/\\?/.test(segment)) {\n if (results.length === 0 && basePath === \"\") {\n results.push(\"/\");\n } else {\n results.push(basePath);\n }\n const optionalSegment = segment.replace(\"?\", \"\");\n basePath += \"/\" + optionalSegment;\n results.push(basePath);\n } else {\n basePath += \"/\" + segment;\n }\n }\n });\n return results.filter((v, i, a) => a.indexOf(v) === i);\n};\nvar _decodeURI = (value) => {\n if (!/[%+]/.test(value)) {\n return value;\n }\n if (value.indexOf(\"+\") !== -1) {\n value = value.replace(/\\+/g, \" \");\n }\n return value.indexOf(\"%\") !== -1 ? tryDecode(value, decodeURIComponent_) : value;\n};\nvar _getQueryParam = (url, key, multiple) => {\n let encoded;\n if (!multiple && key && !/[%+]/.test(key)) {\n let keyIndex2 = url.indexOf(\"?\", 8);\n if (keyIndex2 === -1) {\n return void 0;\n }\n if (!url.startsWith(key, keyIndex2 + 1)) {\n keyIndex2 = url.indexOf(`&${key}`, keyIndex2 + 1);\n }\n while (keyIndex2 !== -1) {\n const trailingKeyCode = url.charCodeAt(keyIndex2 + key.length + 1);\n if (trailingKeyCode === 61) {\n const valueIndex = keyIndex2 + key.length + 2;\n const endIndex = url.indexOf(\"&\", valueIndex);\n return _decodeURI(url.slice(valueIndex, endIndex === -1 ? void 0 : endIndex));\n } else if (trailingKeyCode == 38 || isNaN(trailingKeyCode)) {\n return \"\";\n }\n keyIndex2 = url.indexOf(`&${key}`, keyIndex2 + 1);\n }\n encoded = /[%+]/.test(url);\n if (!encoded) {\n return void 0;\n }\n }\n const results = {};\n encoded ??= /[%+]/.test(url);\n let keyIndex = url.indexOf(\"?\", 8);\n while (keyIndex !== -1) {\n const nextKeyIndex = url.indexOf(\"&\", keyIndex + 1);\n let valueIndex = url.indexOf(\"=\", keyIndex);\n if (valueIndex > nextKeyIndex && nextKeyIndex !== -1) {\n valueIndex = -1;\n }\n let name = url.slice(\n keyIndex + 1,\n valueIndex === -1 ? nextKeyIndex === -1 ? void 0 : nextKeyIndex : valueIndex\n );\n if (encoded) {\n name = _decodeURI(name);\n }\n keyIndex = nextKeyIndex;\n if (name === \"\") {\n continue;\n }\n let value;\n if (valueIndex === -1) {\n value = \"\";\n } else {\n value = url.slice(valueIndex + 1, nextKeyIndex === -1 ? void 0 : nextKeyIndex);\n if (encoded) {\n value = _decodeURI(value);\n }\n }\n if (multiple) {\n if (!(results[name] && Array.isArray(results[name]))) {\n results[name] = [];\n }\n ;\n results[name].push(value);\n } else {\n results[name] ??= value;\n }\n }\n return key ? results[key] : results;\n};\nvar getQueryParam = _getQueryParam;\nvar getQueryParams = (url, key) => {\n return _getQueryParam(url, key, true);\n};\nvar decodeURIComponent_ = decodeURIComponent;\nexport {\n checkOptionalParameter,\n decodeURIComponent_,\n getPath,\n getPathNoStrict,\n getPattern,\n getQueryParam,\n getQueryParams,\n getQueryStrings,\n mergePath,\n splitPath,\n splitRoutingPath,\n tryDecode,\n tryDecodeURI\n};\n","// src/request.ts\nimport { HTTPException } from \"./http-exception.js\";\nimport { GET_MATCH_RESULT } from \"./request/constants.js\";\nimport { parseBody } from \"./utils/body.js\";\nimport { decodeURIComponent_, getQueryParam, getQueryParams, tryDecode } from \"./utils/url.js\";\nvar tryDecodeURIComponent = (str) => tryDecode(str, decodeURIComponent_);\nvar HonoRequest = class {\n /**\n * `.raw` can get the raw Request object.\n *\n * @see {@link https://hono.dev/docs/api/request#raw}\n *\n * @example\n * ```ts\n * // For Cloudflare Workers\n * app.post('/', async (c) => {\n * const metadata = c.req.raw.cf?.hostMetadata?\n * ...\n * })\n * ```\n */\n raw;\n #validatedData;\n // Short name of validatedData\n #matchResult;\n routeIndex = 0;\n /**\n * `.path` can get the pathname of the request.\n *\n * @see {@link https://hono.dev/docs/api/request#path}\n *\n * @example\n * ```ts\n * app.get('/about/me', (c) => {\n * const pathname = c.req.path // `/about/me`\n * })\n * ```\n */\n path;\n bodyCache = {};\n constructor(request, path = \"/\", matchResult = [[]]) {\n this.raw = request;\n this.path = path;\n this.#matchResult = matchResult;\n this.#validatedData = {};\n }\n param(key) {\n return key ? this.#getDecodedParam(key) : this.#getAllDecodedParams();\n }\n #getDecodedParam(key) {\n const paramKey = this.#matchResult[0][this.routeIndex][1][key];\n const param = this.#getParamValue(paramKey);\n return param && /\\%/.test(param) ? tryDecodeURIComponent(param) : param;\n }\n #getAllDecodedParams() {\n const decoded = {};\n const keys = Object.keys(this.#matchResult[0][this.routeIndex][1]);\n for (const key of keys) {\n const value = this.#getParamValue(this.#matchResult[0][this.routeIndex][1][key]);\n if (value !== void 0) {\n decoded[key] = /\\%/.test(value) ? tryDecodeURIComponent(value) : value;\n }\n }\n return decoded;\n }\n #getParamValue(paramKey) {\n return this.#matchResult[1] ? this.#matchResult[1][paramKey] : paramKey;\n }\n query(key) {\n return getQueryParam(this.url, key);\n }\n queries(key) {\n return getQueryParams(this.url, key);\n }\n header(name) {\n if (name) {\n return this.raw.headers.get(name) ?? void 0;\n }\n const headerData = {};\n this.raw.headers.forEach((value, key) => {\n headerData[key] = value;\n });\n return headerData;\n }\n async parseBody(options) {\n return this.bodyCache.parsedBody ??= await parseBody(this, options);\n }\n #cachedBody = (key) => {\n const { bodyCache, raw } = this;\n const cachedBody = bodyCache[key];\n if (cachedBody) {\n return cachedBody;\n }\n const anyCachedKey = Object.keys(bodyCache)[0];\n if (anyCachedKey) {\n return bodyCache[anyCachedKey].then((body) => {\n if (anyCachedKey === \"json\") {\n body = JSON.stringify(body);\n }\n return new Response(body)[key]();\n });\n }\n return bodyCache[key] = raw[key]();\n };\n /**\n * `.json()` can parse Request body of type `application/json`\n *\n * @see {@link https://hono.dev/docs/api/request#json}\n *\n * @example\n * ```ts\n * app.post('/entry', async (c) => {\n * const body = await c.req.json()\n * })\n * ```\n */\n json() {\n return this.#cachedBody(\"text\").then((text) => JSON.parse(text));\n }\n /**\n * `.text()` can parse Request body of type `text/plain`\n *\n * @see {@link https://hono.dev/docs/api/request#text}\n *\n * @example\n * ```ts\n * app.post('/entry', async (c) => {\n * const body = await c.req.text()\n * })\n * ```\n */\n text() {\n return this.#cachedBody(\"text\");\n }\n /**\n * `.arrayBuffer()` parse Request body as an `ArrayBuffer`\n *\n * @see {@link https://hono.dev/docs/api/request#arraybuffer}\n *\n * @example\n * ```ts\n * app.post('/entry', async (c) => {\n * const body = await c.req.arrayBuffer()\n * })\n * ```\n */\n arrayBuffer() {\n return this.#cachedBody(\"arrayBuffer\");\n }\n /**\n * Parses the request body as a `Blob`.\n * @example\n * ```ts\n * app.post('/entry', async (c) => {\n * const body = await c.req.blob();\n * });\n * ```\n * @see https://hono.dev/docs/api/request#blob\n */\n blob() {\n return this.#cachedBody(\"blob\");\n }\n /**\n * Parses the request body as `FormData`.\n * @example\n * ```ts\n * app.post('/entry', async (c) => {\n * const body = await c.req.formData();\n * });\n * ```\n * @see https://hono.dev/docs/api/request#formdata\n */\n formData() {\n return this.#cachedBody(\"formData\");\n }\n /**\n * Adds validated data to the request.\n *\n * @param target - The target of the validation.\n * @param data - The validated data to add.\n */\n addValidatedData(target, data) {\n this.#validatedData[target] = data;\n }\n valid(target) {\n return this.#validatedData[target];\n }\n /**\n * `.url()` can get the request url strings.\n *\n * @see {@link https://hono.dev/docs/api/request#url}\n *\n * @example\n * ```ts\n * app.get('/about/me', (c) => {\n * const url = c.req.url // `http://localhost:8787/about/me`\n * ...\n * })\n * ```\n */\n get url() {\n return this.raw.url;\n }\n /**\n * `.method()` can get the method name of the request.\n *\n * @see {@link https://hono.dev/docs/api/request#method}\n *\n * @example\n * ```ts\n * app.get('/about/me', (c) => {\n * const method = c.req.method // `GET`\n * })\n * ```\n */\n get method() {\n return this.raw.method;\n }\n get [GET_MATCH_RESULT]() {\n return this.#matchResult;\n }\n /**\n * `.matchedRoutes()` can return a matched route in the handler\n *\n * @deprecated\n *\n * Use matchedRoutes helper defined in \"hono/route\" instead.\n *\n * @see {@link https://hono.dev/docs/api/request#matchedroutes}\n *\n * @example\n * ```ts\n * app.use('*', async function logger(c, next) {\n * await next()\n * c.req.matchedRoutes.forEach(({ handler, method, path }, i) => {\n * const name = handler.name || (handler.length < 2 ? '[handler]' : '[middleware]')\n * console.log(\n * method,\n * ' ',\n * path,\n * ' '.repeat(Math.max(10 - path.length, 0)),\n * name,\n * i === c.req.routeIndex ? '<- respond from here' : ''\n * )\n * })\n * })\n * ```\n */\n get matchedRoutes() {\n return this.#matchResult[0].map(([[, route]]) => route);\n }\n /**\n * `routePath()` can retrieve the path registered within the handler\n *\n * @deprecated\n *\n * Use routePath helper defined in \"hono/route\" instead.\n *\n * @see {@link https://hono.dev/docs/api/request#routepath}\n *\n * @example\n * ```ts\n * app.get('/posts/:id', (c) => {\n * return c.json({ path: c.req.routePath })\n * })\n * ```\n */\n get routePath() {\n return this.#matchResult[0].map(([[, route]]) => route)[this.routeIndex].path;\n }\n};\nvar cloneRawRequest = async (req) => {\n if (!req.raw.bodyUsed) {\n return req.raw.clone();\n }\n const cacheKey = Object.keys(req.bodyCache)[0];\n if (!cacheKey) {\n throw new HTTPException(500, {\n message: \"Cannot clone request: body was already consumed and not cached. Please use HonoRequest methods (e.g., req.json(), req.text()) instead of consuming req.raw directly.\"\n });\n }\n const requestInit = {\n body: await req[cacheKey](),\n cache: req.raw.cache,\n credentials: req.raw.credentials,\n headers: req.header(),\n integrity: req.raw.integrity,\n keepalive: req.raw.keepalive,\n method: req.method,\n mode: req.raw.mode,\n redirect: req.raw.redirect,\n referrer: req.raw.referrer,\n referrerPolicy: req.raw.referrerPolicy,\n signal: req.raw.signal\n };\n return new Request(req.url, requestInit);\n};\nexport {\n HonoRequest,\n cloneRawRequest\n};\n","// src/utils/html.ts\nvar HtmlEscapedCallbackPhase = {\n Stringify: 1,\n BeforeStream: 2,\n Stream: 3\n};\nvar raw = (value, callbacks) => {\n const escapedString = new String(value);\n escapedString.isEscaped = true;\n escapedString.callbacks = callbacks;\n return escapedString;\n};\nvar escapeRe = /[&<>'\"]/;\nvar stringBufferToString = async (buffer, callbacks) => {\n let str = \"\";\n callbacks ||= [];\n const resolvedBuffer = await Promise.all(buffer);\n for (let i = resolvedBuffer.length - 1; ; i--) {\n str += resolvedBuffer[i];\n i--;\n if (i < 0) {\n break;\n }\n let r = resolvedBuffer[i];\n if (typeof r === \"object\") {\n callbacks.push(...r.callbacks || []);\n }\n const isEscaped = r.isEscaped;\n r = await (typeof r === \"object\" ? r.toString() : r);\n if (typeof r === \"object\") {\n callbacks.push(...r.callbacks || []);\n }\n if (r.isEscaped ?? isEscaped) {\n str += r;\n } else {\n const buf = [str];\n escapeToBuffer(r, buf);\n str = buf[0];\n }\n }\n return raw(str, callbacks);\n};\nvar escapeToBuffer = (str, buffer) => {\n const match = str.search(escapeRe);\n if (match === -1) {\n buffer[0] += str;\n return;\n }\n let escape;\n let index;\n let lastIndex = 0;\n for (index = match; index < str.length; index++) {\n switch (str.charCodeAt(index)) {\n case 34:\n escape = \"&quot;\";\n break;\n case 39:\n escape = \"&#39;\";\n break;\n case 38:\n escape = \"&amp;\";\n break;\n case 60:\n escape = \"&lt;\";\n break;\n case 62:\n escape = \"&gt;\";\n break;\n default:\n continue;\n }\n buffer[0] += str.substring(lastIndex, index) + escape;\n lastIndex = index + 1;\n }\n buffer[0] += str.substring(lastIndex, index);\n};\nvar resolveCallbackSync = (str) => {\n const callbacks = str.callbacks;\n if (!callbacks?.length) {\n return str;\n }\n const buffer = [str];\n const context = {};\n callbacks.forEach((c) => c({ phase: HtmlEscapedCallbackPhase.Stringify, buffer, context }));\n return buffer[0];\n};\nvar resolveCallback = async (str, phase, preserveCallbacks, context, buffer) => {\n if (typeof str === \"object\" && !(str instanceof String)) {\n if (!(str instanceof Promise)) {\n str = str.toString();\n }\n if (str instanceof Promise) {\n str = await str;\n }\n }\n const callbacks = str.callbacks;\n if (!callbacks?.length) {\n return Promise.resolve(str);\n }\n if (buffer) {\n buffer[0] += str;\n } else {\n buffer = [str];\n }\n const resStr = Promise.all(callbacks.map((c) => c({ phase, buffer, context }))).then(\n (res) => Promise.all(\n res.filter(Boolean).map((str2) => resolveCallback(str2, phase, false, context, buffer))\n ).then(() => buffer[0])\n );\n if (preserveCallbacks) {\n return raw(await resStr, callbacks);\n } else {\n return resStr;\n }\n};\nexport {\n HtmlEscapedCallbackPhase,\n escapeToBuffer,\n raw,\n resolveCallback,\n resolveCallbackSync,\n stringBufferToString\n};\n","// src/context.ts\nimport { HonoRequest } from \"./request.js\";\nimport { HtmlEscapedCallbackPhase, resolveCallback } from \"./utils/html.js\";\nvar TEXT_PLAIN = \"text/plain; charset=UTF-8\";\nvar setDefaultContentType = (contentType, headers) => {\n return {\n \"Content-Type\": contentType,\n ...headers\n };\n};\nvar createResponseInstance = (body, init) => new Response(body, init);\nvar Context = class {\n #rawRequest;\n #req;\n /**\n * `.env` can get bindings (environment variables, secrets, KV namespaces, D1 database, R2 bucket etc.) in Cloudflare Workers.\n *\n * @see {@link https://hono.dev/docs/api/context#env}\n *\n * @example\n * ```ts\n * // Environment object for Cloudflare Workers\n * app.get('*', async c => {\n * const counter = c.env.COUNTER\n * })\n * ```\n */\n env = {};\n #var;\n finalized = false;\n /**\n * `.error` can get the error object from the middleware if the Handler throws an error.\n *\n * @see {@link https://hono.dev/docs/api/context#error}\n *\n * @example\n * ```ts\n * app.use('*', async (c, next) => {\n * await next()\n * if (c.error) {\n * // do something...\n * }\n * })\n * ```\n */\n error;\n #status;\n #executionCtx;\n #res;\n #layout;\n #renderer;\n #notFoundHandler;\n #preparedHeaders;\n #matchResult;\n #path;\n /**\n * Creates an instance of the Context class.\n *\n * @param req - The Request object.\n * @param options - Optional configuration options for the context.\n */\n constructor(req, options) {\n this.#rawRequest = req;\n if (options) {\n this.#executionCtx = options.executionCtx;\n this.env = options.env;\n this.#notFoundHandler = options.notFoundHandler;\n this.#path = options.path;\n this.#matchResult = options.matchResult;\n }\n }\n /**\n * `.req` is the instance of {@link HonoRequest}.\n */\n get req() {\n this.#req ??= new HonoRequest(this.#rawRequest, this.#path, this.#matchResult);\n return this.#req;\n }\n /**\n * @see {@link https://hono.dev/docs/api/context#event}\n * The FetchEvent associated with the current request.\n *\n * @throws Will throw an error if the context does not have a FetchEvent.\n */\n get event() {\n if (this.#executionCtx && \"respondWith\" in this.#executionCtx) {\n return this.#executionCtx;\n } else {\n throw Error(\"This context has no FetchEvent\");\n }\n }\n /**\n * @see {@link https://hono.dev/docs/api/context#executionctx}\n * The ExecutionContext associated with the current request.\n *\n * @throws Will throw an error if the context does not have an ExecutionContext.\n */\n get executionCtx() {\n if (this.#executionCtx) {\n return this.#executionCtx;\n } else {\n throw Error(\"This context has no ExecutionContext\");\n }\n }\n /**\n * @see {@link https://hono.dev/docs/api/context#res}\n * The Response object for the current request.\n */\n get res() {\n return this.#res ||= createResponseInstance(null, {\n headers: this.#preparedHeaders ??= new Headers()\n });\n }\n /**\n * Sets the Response object for the current request.\n *\n * @param _res - The Response object to set.\n */\n set res(_res) {\n if (this.#res && _res) {\n _res = createResponseInstance(_res.body, _res);\n for (const [k, v] of this.#res.headers.entries()) {\n if (k === \"content-type\") {\n continue;\n }\n if (k === \"set-cookie\") {\n const cookies = this.#res.headers.getSetCookie();\n _res.headers.delete(\"set-cookie\");\n for (const cookie of cookies) {\n _res.headers.append(\"set-cookie\", cookie);\n }\n } else {\n _res.headers.set(k, v);\n }\n }\n }\n this.#res = _res;\n this.finalized = true;\n }\n /**\n * `.render()` can create a response within a layout.\n *\n * @see {@link https://hono.dev/docs/api/context#render-setrenderer}\n *\n * @example\n * ```ts\n * app.get('/', (c) => {\n * return c.render('Hello!')\n * })\n * ```\n */\n render = (...args) => {\n this.#renderer ??= (content) => this.html(content);\n return this.#renderer(...args);\n };\n /**\n * Sets the layout for the response.\n *\n * @param layout - The layout to set.\n * @returns The layout function.\n */\n setLayout = (layout) => this.#layout = layout;\n /**\n * Gets the current layout for the response.\n *\n * @returns The current layout function.\n */\n getLayout = () => this.#layout;\n /**\n * `.setRenderer()` can set the layout in the custom middleware.\n *\n * @see {@link https://hono.dev/docs/api/context#render-setrenderer}\n *\n * @example\n * ```tsx\n * app.use('*', async (c, next) => {\n * c.setRenderer((content) => {\n * return c.html(\n * <html>\n * <body>\n * <p>{content}</p>\n * </body>\n * </html>\n * )\n * })\n * await next()\n * })\n * ```\n */\n setRenderer = (renderer) => {\n this.#renderer = renderer;\n };\n /**\n * `.header()` can set headers.\n *\n * @see {@link https://hono.dev/docs/api/context#header}\n *\n * @example\n * ```ts\n * app.get('/welcome', (c) => {\n * // Set headers\n * c.header('X-Message', 'Hello!')\n * c.header('Content-Type', 'text/plain')\n *\n * return c.body('Thank you for coming')\n * })\n * ```\n */\n header = (name, value, options) => {\n if (this.finalized) {\n this.#res = createResponseInstance(this.#res.body, this.#res);\n }\n const headers = this.#res ? this.#res.headers : this.#preparedHeaders ??= new Headers();\n if (value === void 0) {\n headers.delete(name);\n } else if (options?.append) {\n headers.append(name, value);\n } else {\n headers.set(name, value);\n }\n };\n status = (status) => {\n this.#status = status;\n };\n /**\n * `.set()` can set the value specified by the key.\n *\n * @see {@link https://hono.dev/docs/api/context#set-get}\n *\n * @example\n * ```ts\n * app.use('*', async (c, next) => {\n * c.set('message', 'Hono is hot!!')\n * await next()\n * })\n * ```\n */\n set = (key, value) => {\n this.#var ??= /* @__PURE__ */ new Map();\n this.#var.set(key, value);\n };\n /**\n * `.get()` can use the value specified by the key.\n *\n * @see {@link https://hono.dev/docs/api/context#set-get}\n *\n * @example\n * ```ts\n * app.get('/', (c) => {\n * const message = c.get('message')\n * return c.text(`The message is \"${message}\"`)\n * })\n * ```\n */\n get = (key) => {\n return this.#var ? this.#var.get(key) : void 0;\n };\n /**\n * `.var` can access the value of a variable.\n *\n * @see {@link https://hono.dev/docs/api/context#var}\n *\n * @example\n * ```ts\n * const result = c.var.client.oneMethod()\n * ```\n */\n // c.var.propName is a read-only\n get var() {\n if (!this.#var) {\n return {};\n }\n return Object.fromEntries(this.#var);\n }\n #newResponse(data, arg, headers) {\n const responseHeaders = this.#res ? new Headers(this.#res.headers) : this.#preparedHeaders ?? new Headers();\n if (typeof arg === \"object\" && \"headers\" in arg) {\n const argHeaders = arg.headers instanceof Headers ? arg.headers : new Headers(arg.headers);\n for (const [key, value] of argHeaders) {\n if (key.toLowerCase() === \"set-cookie\") {\n responseHeaders.append(key, value);\n } else {\n responseHeaders.set(key, value);\n }\n }\n }\n if (headers) {\n for (const [k, v] of Object.entries(headers)) {\n if (typeof v === \"string\") {\n responseHeaders.set(k, v);\n } else {\n responseHeaders.delete(k);\n for (const v2 of v) {\n responseHeaders.append(k, v2);\n }\n }\n }\n }\n const status = typeof arg === \"number\" ? arg : arg?.status ?? this.#status;\n return createResponseInstance(data, { status, headers: responseHeaders });\n }\n newResponse = (...args) => this.#newResponse(...args);\n /**\n * `.body()` can return the HTTP response.\n * You can set headers with `.header()` and set HTTP status code with `.status`.\n * This can also be set in `.text()`, `.json()` and so on.\n *\n * @see {@link https://hono.dev/docs/api/context#body}\n *\n * @example\n * ```ts\n * app.get('/welcome', (c) => {\n * // Set headers\n * c.header('X-Message', 'Hello!')\n * c.header('Content-Type', 'text/plain')\n * // Set HTTP status code\n * c.status(201)\n *\n * // Return the response body\n * return c.body('Thank you for coming')\n * })\n * ```\n */\n body = (data, arg, headers) => this.#newResponse(data, arg, headers);\n /**\n * `.text()` can render text as `Content-Type:text/plain`.\n *\n * @see {@link https://hono.dev/docs/api/context#text}\n *\n * @example\n * ```ts\n * app.get('/say', (c) => {\n * return c.text('Hello!')\n * })\n * ```\n */\n text = (text, arg, headers) => {\n return !this.#preparedHeaders && !this.#status && !arg && !headers && !this.finalized ? new Response(text) : this.#newResponse(\n text,\n arg,\n setDefaultContentType(TEXT_PLAIN, headers)\n );\n };\n /**\n * `.json()` can render JSON as `Content-Type:application/json`.\n *\n * @see {@link https://hono.dev/docs/api/context#json}\n *\n * @example\n * ```ts\n * app.get('/api', (c) => {\n * return c.json({ message: 'Hello!' })\n * })\n * ```\n */\n json = (object, arg, headers) => {\n return this.#newResponse(\n JSON.stringify(object),\n arg,\n setDefaultContentType(\"application/json\", headers)\n );\n };\n html = (html, arg, headers) => {\n const res = (html2) => this.#newResponse(html2, arg, setDefaultContentType(\"text/html; charset=UTF-8\", headers));\n return typeof html === \"object\" ? resolveCallback(html, HtmlEscapedCallbackPhase.Stringify, false, {}).then(res) : res(html);\n };\n /**\n * `.redirect()` can Redirect, default status code is 302.\n *\n * @see {@link https://hono.dev/docs/api/context#redirect}\n *\n * @example\n * ```ts\n * app.get('/redirect', (c) => {\n * return c.redirect('/')\n * })\n * app.get('/redirect-permanently', (c) => {\n * return c.redirect('/', 301)\n * })\n * ```\n */\n redirect = (location, status) => {\n const locationString = String(location);\n this.header(\n \"Location\",\n // Multibyes should be encoded\n // eslint-disable-next-line no-control-regex\n !/[^\\x00-\\xFF]/.test(locationString) ? locationString : encodeURI(locationString)\n );\n return this.newResponse(null, status ?? 302);\n };\n /**\n * `.notFound()` can return the Not Found Response.\n *\n * @see {@link https://hono.dev/docs/api/context#notfound}\n *\n * @example\n * ```ts\n * app.get('/notfound', (c) => {\n * return c.notFound()\n * })\n * ```\n */\n notFound = () => {\n this.#notFoundHandler ??= () => createResponseInstance();\n return this.#notFoundHandler(this);\n };\n};\nexport {\n Context,\n TEXT_PLAIN\n};\n","// src/router.ts\nvar METHOD_NAME_ALL = \"ALL\";\nvar METHOD_NAME_ALL_LOWERCASE = \"all\";\nvar METHODS = [\"get\", \"post\", \"put\", \"delete\", \"options\", \"patch\"];\nvar MESSAGE_MATCHER_IS_ALREADY_BUILT = \"Can not add a route since the matcher is already built.\";\nvar UnsupportedPathError = class extends Error {\n};\nexport {\n MESSAGE_MATCHER_IS_ALREADY_BUILT,\n METHODS,\n METHOD_NAME_ALL,\n METHOD_NAME_ALL_LOWERCASE,\n UnsupportedPathError\n};\n","// src/utils/constants.ts\nvar COMPOSED_HANDLER = \"__COMPOSED_HANDLER\";\nexport {\n COMPOSED_HANDLER\n};\n","// src/hono-base.ts\nimport { compose } from \"./compose.js\";\nimport { Context } from \"./context.js\";\nimport { METHODS, METHOD_NAME_ALL, METHOD_NAME_ALL_LOWERCASE } from \"./router.js\";\nimport { COMPOSED_HANDLER } from \"./utils/constants.js\";\nimport { getPath, getPathNoStrict, mergePath } from \"./utils/url.js\";\nvar notFoundHandler = (c) => {\n return c.text(\"404 Not Found\", 404);\n};\nvar errorHandler = (err, c) => {\n if (\"getResponse\" in err) {\n const res = err.getResponse();\n return c.newResponse(res.body, res);\n }\n console.error(err);\n return c.text(\"Internal Server Error\", 500);\n};\nvar Hono = class _Hono {\n get;\n post;\n put;\n delete;\n options;\n patch;\n all;\n on;\n use;\n /*\n This class is like an abstract class and does not have a router.\n To use it, inherit the class and implement router in the constructor.\n */\n router;\n getPath;\n // Cannot use `#` because it requires visibility at JavaScript runtime.\n _basePath = \"/\";\n #path = \"/\";\n routes = [];\n constructor(options = {}) {\n const allMethods = [...METHODS, METHOD_NAME_ALL_LOWERCASE];\n allMethods.forEach((method) => {\n this[method] = (args1, ...args) => {\n if (typeof args1 === \"string\") {\n this.#path = args1;\n } else {\n this.#addRoute(method, this.#path, args1);\n }\n args.forEach((handler) => {\n this.#addRoute(method, this.#path, handler);\n });\n return this;\n };\n });\n this.on = (method, path, ...handlers) => {\n for (const p of [path].flat()) {\n this.#path = p;\n for (const m of [method].flat()) {\n handlers.map((handler) => {\n this.#addRoute(m.toUpperCase(), this.#path, handler);\n });\n }\n }\n return this;\n };\n this.use = (arg1, ...handlers) => {\n if (typeof arg1 === \"string\") {\n this.#path = arg1;\n } else {\n this.#path = \"*\";\n handlers.unshift(arg1);\n }\n handlers.forEach((handler) => {\n this.#addRoute(METHOD_NAME_ALL, this.#path, handler);\n });\n return this;\n };\n const { strict, ...optionsWithoutStrict } = options;\n Object.assign(this, optionsWithoutStrict);\n this.getPath = strict ?? true ? options.getPath ?? getPath : getPathNoStrict;\n }\n #clone() {\n const clone = new _Hono({\n router: this.router,\n getPath: this.getPath\n });\n clone.errorHandler = this.errorHandler;\n clone.#notFoundHandler = this.#notFoundHandler;\n clone.routes = this.routes;\n return clone;\n }\n #notFoundHandler = notFoundHandler;\n // Cannot use `#` because it requires visibility at JavaScript runtime.\n errorHandler = errorHandler;\n /**\n * `.route()` allows grouping other Hono instance in routes.\n *\n * @see {@link https://hono.dev/docs/api/routing#grouping}\n *\n * @param {string} path - base Path\n * @param {Hono} app - other Hono instance\n * @returns {Hono} routed Hono instance\n *\n * @example\n * ```ts\n * const app = new Hono()\n * const app2 = new Hono()\n *\n * app2.get(\"/user\", (c) => c.text(\"user\"))\n * app.route(\"/api\", app2) // GET /api/user\n * ```\n */\n route(path, app) {\n const subApp = this.basePath(path);\n app.routes.map((r) => {\n let handler;\n if (app.errorHandler === errorHandler) {\n handler = r.handler;\n } else {\n handler = async (c, next) => (await compose([], app.errorHandler)(c, () => r.handler(c, next))).res;\n handler[COMPOSED_HANDLER] = r.handler;\n }\n subApp.#addRoute(r.method, r.path, handler);\n });\n return this;\n }\n /**\n * `.basePath()` allows base paths to be specified.\n *\n * @see {@link https://hono.dev/docs/api/routing#base-path}\n *\n * @param {string} path - base Path\n * @returns {Hono} changed Hono instance\n *\n * @example\n * ```ts\n * const api = new Hono().basePath('/api')\n * ```\n */\n basePath(path) {\n const subApp = this.#clone();\n subApp._basePath = mergePath(this._basePath, path);\n return subApp;\n }\n /**\n * `.onError()` handles an error and returns a customized Response.\n *\n * @see {@link https://hono.dev/docs/api/hono#error-handling}\n *\n * @param {ErrorHandler} handler - request Handler for error\n * @returns {Hono} changed Hono instance\n *\n * @example\n * ```ts\n * app.onError((err, c) => {\n * console.error(`${err}`)\n * return c.text('Custom Error Message', 500)\n * })\n * ```\n */\n onError = (handler) => {\n this.errorHandler = handler;\n return this;\n };\n /**\n * `.notFound()` allows you to customize a Not Found Response.\n *\n * @see {@link https://hono.dev/docs/api/hono#not-found}\n *\n * @param {NotFoundHandler} handler - request handler for not-found\n * @returns {Hono} changed Hono instance\n *\n * @example\n * ```ts\n * app.notFound((c) => {\n * return c.text('Custom 404 Message', 404)\n * })\n * ```\n */\n notFound = (handler) => {\n this.#notFoundHandler = handler;\n return this;\n };\n /**\n * `.mount()` allows you to mount applications built with other frameworks into your Hono application.\n *\n * @see {@link https://hono.dev/docs/api/hono#mount}\n *\n * @param {string} path - base Path\n * @param {Function} applicationHandler - other Request Handler\n * @param {MountOptions} [options] - options of `.mount()`\n * @returns {Hono} mounted Hono instance\n *\n * @example\n * ```ts\n * import { Router as IttyRouter } from 'itty-router'\n * import { Hono } from 'hono'\n * // Create itty-router application\n * const ittyRouter = IttyRouter()\n * // GET /itty-router/hello\n * ittyRouter.get('/hello', () => new Response('Hello from itty-router'))\n *\n * const app = new Hono()\n * app.mount('/itty-router', ittyRouter.handle)\n * ```\n *\n * @example\n * ```ts\n * const app = new Hono()\n * // Send the request to another application without modification.\n * app.mount('/app', anotherApp, {\n * replaceRequest: (req) => req,\n * })\n * ```\n */\n mount(path, applicationHandler, options) {\n let replaceRequest;\n let optionHandler;\n if (options) {\n if (typeof options === \"function\") {\n optionHandler = options;\n } else {\n optionHandler = options.optionHandler;\n if (options.replaceRequest === false) {\n replaceRequest = (request) => request;\n } else {\n replaceRequest = options.replaceRequest;\n }\n }\n }\n const getOptions = optionHandler ? (c) => {\n const options2 = optionHandler(c);\n return Array.isArray(options2) ? options2 : [options2];\n } : (c) => {\n let executionContext = void 0;\n try {\n executionContext = c.executionCtx;\n } catch {\n }\n return [c.env, executionContext];\n };\n replaceRequest ||= (() => {\n const mergedPath = mergePath(this._basePath, path);\n const pathPrefixLength = mergedPath === \"/\" ? 0 : mergedPath.length;\n return (request) => {\n const url = new URL(request.url);\n url.pathname = url.pathname.slice(pathPrefixLength) || \"/\";\n return new Request(url, request);\n };\n })();\n const handler = async (c, next) => {\n const res = await applicationHandler(replaceRequest(c.req.raw), ...getOptions(c));\n if (res) {\n return res;\n }\n await next();\n };\n this.#addRoute(METHOD_NAME_ALL, mergePath(path, \"*\"), handler);\n return this;\n }\n #addRoute(method, path, handler) {\n method = method.toUpperCase();\n path = mergePath(this._basePath, path);\n const r = { basePath: this._basePath, path, method, handler };\n this.router.add(method, path, [handler, r]);\n this.routes.push(r);\n }\n #handleError(err, c) {\n if (err instanceof Error) {\n return this.errorHandler(err, c);\n }\n throw err;\n }\n #dispatch(request, executionCtx, env, method) {\n if (method === \"HEAD\") {\n return (async () => new Response(null, await this.#dispatch(request, executionCtx, env, \"GET\")))();\n }\n const path = this.getPath(request, { env });\n const matchResult = this.router.match(method, path);\n const c = new Context(request, {\n path,\n matchResult,\n env,\n executionCtx,\n notFoundHandler: this.#notFoundHandler\n });\n if (matchResult[0].length === 1) {\n let res;\n try {\n res = matchResult[0][0][0][0](c, async () => {\n c.res = await this.#notFoundHandler(c);\n });\n } catch (err) {\n return this.#handleError(err, c);\n }\n return res instanceof Promise ? res.then(\n (resolved) => resolved || (c.finalized ? c.res : this.#notFoundHandler(c))\n ).catch((err) => this.#handleError(err, c)) : res ?? this.#notFoundHandler(c);\n }\n const composed = compose(matchResult[0], this.errorHandler, this.#notFoundHandler);\n return (async () => {\n try {\n const context = await composed(c);\n if (!context.finalized) {\n throw new Error(\n \"Context is not finalized. Did you forget to return a Response object or `await next()`?\"\n );\n }\n return context.res;\n } catch (err) {\n return this.#handleError(err, c);\n }\n })();\n }\n /**\n * `.fetch()` will be entry point of your app.\n *\n * @see {@link https://hono.dev/docs/api/hono#fetch}\n *\n * @param {Request} request - request Object of request\n * @param {Env} Env - env Object\n * @param {ExecutionContext} - context of execution\n * @returns {Response | Promise<Response>} response of request\n *\n */\n fetch = (request, ...rest) => {\n return this.#dispatch(request, rest[1], rest[0], request.method);\n };\n /**\n * `.request()` is a useful method for testing.\n * You can pass a URL or pathname to send a GET request.\n * app will return a Response object.\n * ```ts\n * test('GET /hello is ok', async () => {\n * const res = await app.request('/hello')\n * expect(res.status).toBe(200)\n * })\n * ```\n * @see https://hono.dev/docs/api/hono#request\n */\n request = (input, requestInit, Env, executionCtx) => {\n if (input instanceof Request) {\n return this.fetch(requestInit ? new Request(input, requestInit) : input, Env, executionCtx);\n }\n input = input.toString();\n return this.fetch(\n new Request(\n /^https?:\\/\\//.test(input) ? input : `http://localhost${mergePath(\"/\", input)}`,\n requestInit\n ),\n Env,\n executionCtx\n );\n };\n /**\n * `.fire()` automatically adds a global fetch event listener.\n * This can be useful for environments that adhere to the Service Worker API, such as non-ES module Cloudflare Workers.\n * @deprecated\n * Use `fire` from `hono/service-worker` instead.\n * ```ts\n * import { Hono } from 'hono'\n * import { fire } from 'hono/service-worker'\n *\n * const app = new Hono()\n * // ...\n * fire(app)\n * ```\n * @see https://hono.dev/docs/api/hono#fire\n * @see https://developer.mozilla.org/en-US/docs/Web/API/Service_Worker_API\n * @see https://developers.cloudflare.com/workers/reference/migrate-to-module-workers/\n */\n fire = () => {\n addEventListener(\"fetch\", (event) => {\n event.respondWith(this.#dispatch(event.request, event, void 0, event.request.method));\n });\n };\n};\nexport {\n Hono as HonoBase\n};\n","// src/router/reg-exp-router/matcher.ts\nimport { METHOD_NAME_ALL } from \"../../router.js\";\nvar emptyParam = [];\nfunction match(method, path) {\n const matchers = this.buildAllMatchers();\n const match2 = ((method2, path2) => {\n const matcher = matchers[method2] || matchers[METHOD_NAME_ALL];\n const staticMatch = matcher[2][path2];\n if (staticMatch) {\n return staticMatch;\n }\n const match3 = path2.match(matcher[0]);\n if (!match3) {\n return [[], emptyParam];\n }\n const index = match3.indexOf(\"\", 1);\n return [matcher[1][index], match3];\n });\n this.match = match2;\n return match2(method, path);\n}\nexport {\n emptyParam,\n match\n};\n","// src/router/reg-exp-router/node.ts\nvar LABEL_REG_EXP_STR = \"[^/]+\";\nvar ONLY_WILDCARD_REG_EXP_STR = \".*\";\nvar TAIL_WILDCARD_REG_EXP_STR = \"(?:|/.*)\";\nvar PATH_ERROR = /* @__PURE__ */ Symbol();\nvar regExpMetaChars = new Set(\".\\\\+*[^]$()\");\nfunction compareKey(a, b) {\n if (a.length === 1) {\n return b.length === 1 ? a < b ? -1 : 1 : -1;\n }\n if (b.length === 1) {\n return 1;\n }\n if (a === ONLY_WILDCARD_REG_EXP_STR || a === TAIL_WILDCARD_REG_EXP_STR) {\n return 1;\n } else if (b === ONLY_WILDCARD_REG_EXP_STR || b === TAIL_WILDCARD_REG_EXP_STR) {\n return -1;\n }\n if (a === LABEL_REG_EXP_STR) {\n return 1;\n } else if (b === LABEL_REG_EXP_STR) {\n return -1;\n }\n return a.length === b.length ? a < b ? -1 : 1 : b.length - a.length;\n}\nvar Node = class _Node {\n #index;\n #varIndex;\n #children = /* @__PURE__ */ Object.create(null);\n insert(tokens, index, paramMap, context, pathErrorCheckOnly) {\n if (tokens.length === 0) {\n if (this.#index !== void 0) {\n throw PATH_ERROR;\n }\n if (pathErrorCheckOnly) {\n return;\n }\n this.#index = index;\n return;\n }\n const [token, ...restTokens] = tokens;\n const pattern = token === \"*\" ? restTokens.length === 0 ? [\"\", \"\", ONLY_WILDCARD_REG_EXP_STR] : [\"\", \"\", LABEL_REG_EXP_STR] : token === \"/*\" ? [\"\", \"\", TAIL_WILDCARD_REG_EXP_STR] : token.match(/^\\:([^\\{\\}]+)(?:\\{(.+)\\})?$/);\n let node;\n if (pattern) {\n const name = pattern[1];\n let regexpStr = pattern[2] || LABEL_REG_EXP_STR;\n if (name && pattern[2]) {\n if (regexpStr === \".*\") {\n throw PATH_ERROR;\n }\n regexpStr = regexpStr.replace(/^\\((?!\\?:)(?=[^)]+\\)$)/, \"(?:\");\n if (/\\((?!\\?:)/.test(regexpStr)) {\n throw PATH_ERROR;\n }\n }\n node = this.#children[regexpStr];\n if (!node) {\n if (Object.keys(this.#children).some(\n (k) => k !== ONLY_WILDCARD_REG_EXP_STR && k !== TAIL_WILDCARD_REG_EXP_STR\n )) {\n throw PATH_ERROR;\n }\n if (pathErrorCheckOnly) {\n return;\n }\n node = this.#children[regexpStr] = new _Node();\n if (name !== \"\") {\n node.#varIndex = context.varIndex++;\n }\n }\n if (!pathErrorCheckOnly && name !== \"\") {\n paramMap.push([name, node.#varIndex]);\n }\n } else {\n node = this.#children[token];\n if (!node) {\n if (Object.keys(this.#children).some(\n (k) => k.length > 1 && k !== ONLY_WILDCARD_REG_EXP_STR && k !== TAIL_WILDCARD_REG_EXP_STR\n )) {\n throw PATH_ERROR;\n }\n if (pathErrorCheckOnly) {\n return;\n }\n node = this.#children[token] = new _Node();\n }\n }\n node.insert(restTokens, index, paramMap, context, pathErrorCheckOnly);\n }\n buildRegExpStr() {\n const childKeys = Object.keys(this.#children).sort(compareKey);\n const strList = childKeys.map((k) => {\n const c = this.#children[k];\n return (typeof c.#varIndex === \"number\" ? `(${k})@${c.#varIndex}` : regExpMetaChars.has(k) ? `\\\\${k}` : k) + c.buildRegExpStr();\n });\n if (typeof this.#index === \"number\") {\n strList.unshift(`#${this.#index}`);\n }\n if (strList.length === 0) {\n return \"\";\n }\n if (strList.length === 1) {\n return strList[0];\n }\n return \"(?:\" + strList.join(\"|\") + \")\";\n }\n};\nexport {\n Node,\n PATH_ERROR\n};\n","// src/router/reg-exp-router/trie.ts\nimport { Node } from \"./node.js\";\nvar Trie = class {\n #context = { varIndex: 0 };\n #root = new Node();\n insert(path, index, pathErrorCheckOnly) {\n const paramAssoc = [];\n const groups = [];\n for (let i = 0; ; ) {\n let replaced = false;\n path = path.replace(/\\{[^}]+\\}/g, (m) => {\n const mark = `@\\\\${i}`;\n groups[i] = [mark, m];\n i++;\n replaced = true;\n return mark;\n });\n if (!replaced) {\n break;\n }\n }\n const tokens = path.match(/(?::[^\\/]+)|(?:\\/\\*$)|./g) || [];\n for (let i = groups.length - 1; i >= 0; i--) {\n const [mark] = groups[i];\n for (let j = tokens.length - 1; j >= 0; j--) {\n if (tokens[j].indexOf(mark) !== -1) {\n tokens[j] = tokens[j].replace(mark, groups[i][1]);\n break;\n }\n }\n }\n this.#root.insert(tokens, index, paramAssoc, this.#context, pathErrorCheckOnly);\n return paramAssoc;\n }\n buildRegExp() {\n let regexp = this.#root.buildRegExpStr();\n if (regexp === \"\") {\n return [/^$/, [], []];\n }\n let captureIndex = 0;\n const indexReplacementMap = [];\n const paramReplacementMap = [];\n regexp = regexp.replace(/#(\\d+)|@(\\d+)|\\.\\*\\$/g, (_, handlerIndex, paramIndex) => {\n if (handlerIndex !== void 0) {\n indexReplacementMap[++captureIndex] = Number(handlerIndex);\n return \"$()\";\n }\n if (paramIndex !== void 0) {\n paramReplacementMap[Number(paramIndex)] = ++captureIndex;\n return \"\";\n }\n return \"\";\n });\n return [new RegExp(`^${regexp}`), indexReplacementMap, paramReplacementMap];\n }\n};\nexport {\n Trie\n};\n","// src/router/reg-exp-router/router.ts\nimport {\n MESSAGE_MATCHER_IS_ALREADY_BUILT,\n METHOD_NAME_ALL,\n UnsupportedPathError\n} from \"../../router.js\";\nimport { checkOptionalParameter } from \"../../utils/url.js\";\nimport { match, emptyParam } from \"./matcher.js\";\nimport { PATH_ERROR } from \"./node.js\";\nimport { Trie } from \"./trie.js\";\nvar nullMatcher = [/^$/, [], /* @__PURE__ */ Object.create(null)];\nvar wildcardRegExpCache = /* @__PURE__ */ Object.create(null);\nfunction buildWildcardRegExp(path) {\n return wildcardRegExpCache[path] ??= new RegExp(\n path === \"*\" ? \"\" : `^${path.replace(\n /\\/\\*$|([.\\\\+*[^\\]$()])/g,\n (_, metaChar) => metaChar ? `\\\\${metaChar}` : \"(?:|/.*)\"\n )}$`\n );\n}\nfunction clearWildcardRegExpCache() {\n wildcardRegExpCache = /* @__PURE__ */ Object.create(null);\n}\nfunction buildMatcherFromPreprocessedRoutes(routes) {\n const trie = new Trie();\n const handlerData = [];\n if (routes.length === 0) {\n return nullMatcher;\n }\n const routesWithStaticPathFlag = routes.map(\n (route) => [!/\\*|\\/:/.test(route[0]), ...route]\n ).sort(\n ([isStaticA, pathA], [isStaticB, pathB]) => isStaticA ? 1 : isStaticB ? -1 : pathA.length - pathB.length\n );\n const staticMap = /* @__PURE__ */ Object.create(null);\n for (let i = 0, j = -1, len = routesWithStaticPathFlag.length; i < len; i++) {\n const [pathErrorCheckOnly, path, handlers] = routesWithStaticPathFlag[i];\n if (pathErrorCheckOnly) {\n staticMap[path] = [handlers.map(([h]) => [h, /* @__PURE__ */ Object.create(null)]), emptyParam];\n } else {\n j++;\n }\n let paramAssoc;\n try {\n paramAssoc = trie.insert(path, j, pathErrorCheckOnly);\n } catch (e) {\n throw e === PATH_ERROR ? new UnsupportedPathError(path) : e;\n }\n if (pathErrorCheckOnly) {\n continue;\n }\n handlerData[j] = handlers.map(([h, paramCount]) => {\n const paramIndexMap = /* @__PURE__ */ Object.create(null);\n paramCount -= 1;\n for (; paramCount >= 0; paramCount--) {\n const [key, value] = paramAssoc[paramCount];\n paramIndexMap[key] = value;\n }\n return [h, paramIndexMap];\n });\n }\n const [regexp, indexReplacementMap, paramReplacementMap] = trie.buildRegExp();\n for (let i = 0, len = handlerData.length; i < len; i++) {\n for (let j = 0, len2 = handlerData[i].length; j < len2; j++) {\n const map = handlerData[i][j]?.[1];\n if (!map) {\n continue;\n }\n const keys = Object.keys(map);\n for (let k = 0, len3 = keys.length; k < len3; k++) {\n map[keys[k]] = paramReplacementMap[map[keys[k]]];\n }\n }\n }\n const handlerMap = [];\n for (const i in indexReplacementMap) {\n handlerMap[i] = handlerData[indexReplacementMap[i]];\n }\n return [regexp, handlerMap, staticMap];\n}\nfunction findMiddleware(middleware, path) {\n if (!middleware) {\n return void 0;\n }\n for (const k of Object.keys(middleware).sort((a, b) => b.length - a.length)) {\n if (buildWildcardRegExp(k).test(path)) {\n return [...middleware[k]];\n }\n }\n return void 0;\n}\nvar RegExpRouter = class {\n name = \"RegExpRouter\";\n #middleware;\n #routes;\n constructor() {\n this.#middleware = { [METHOD_NAME_ALL]: /* @__PURE__ */ Object.create(null) };\n this.#routes = { [METHOD_NAME_ALL]: /* @__PURE__ */ Object.create(null) };\n }\n add(method, path, handler) {\n const middleware = this.#middleware;\n const routes = this.#routes;\n if (!middleware || !routes) {\n throw new Error(MESSAGE_MATCHER_IS_ALREADY_BUILT);\n }\n if (!middleware[method]) {\n ;\n [middleware, routes].forEach((handlerMap) => {\n handlerMap[method] = /* @__PURE__ */ Object.create(null);\n Object.keys(handlerMap[METHOD_NAME_ALL]).forEach((p) => {\n handlerMap[method][p] = [...handlerMap[METHOD_NAME_ALL][p]];\n });\n });\n }\n if (path === \"/*\") {\n path = \"*\";\n }\n const paramCount = (path.match(/\\/:/g) || []).length;\n if (/\\*$/.test(path)) {\n const re = buildWildcardRegExp(path);\n if (method === METHOD_NAME_ALL) {\n Object.keys(middleware).forEach((m) => {\n middleware[m][path] ||= findMiddleware(middleware[m], path) || findMiddleware(middleware[METHOD_NAME_ALL], path) || [];\n });\n } else {\n middleware[method][path] ||= findMiddleware(middleware[method], path) || findMiddleware(middleware[METHOD_NAME_ALL], path) || [];\n }\n Object.keys(middleware).forEach((m) => {\n if (method === METHOD_NAME_ALL || method === m) {\n Object.keys(middleware[m]).forEach((p) => {\n re.test(p) && middleware[m][p].push([handler, paramCount]);\n });\n }\n });\n Object.keys(routes).forEach((m) => {\n if (method === METHOD_NAME_ALL || method === m) {\n Object.keys(routes[m]).forEach(\n (p) => re.test(p) && routes[m][p].push([handler, paramCount])\n );\n }\n });\n return;\n }\n const paths = checkOptionalParameter(path) || [path];\n for (let i = 0, len = paths.length; i < len; i++) {\n const path2 = paths[i];\n Object.keys(routes).forEach((m) => {\n if (method === METHOD_NAME_ALL || method === m) {\n routes[m][path2] ||= [\n ...findMiddleware(middleware[m], path2) || findMiddleware(middleware[METHOD_NAME_ALL], path2) || []\n ];\n routes[m][path2].push([handler, paramCount - len + i + 1]);\n }\n });\n }\n }\n match = match;\n buildAllMatchers() {\n const matchers = /* @__PURE__ */ Object.create(null);\n Object.keys(this.#routes).concat(Object.keys(this.#middleware)).forEach((method) => {\n matchers[method] ||= this.#buildMatcher(method);\n });\n this.#middleware = this.#routes = void 0;\n clearWildcardRegExpCache();\n return matchers;\n }\n #buildMatcher(method) {\n const routes = [];\n let hasOwnRoute = method === METHOD_NAME_ALL;\n [this.#middleware, this.#routes].forEach((r) => {\n const ownRoute = r[method] ? Object.keys(r[method]).map((path) => [path, r[method][path]]) : [];\n if (ownRoute.length !== 0) {\n hasOwnRoute ||= true;\n routes.push(...ownRoute);\n } else if (method !== METHOD_NAME_ALL) {\n routes.push(\n ...Object.keys(r[METHOD_NAME_ALL]).map((path) => [path, r[METHOD_NAME_ALL][path]])\n );\n }\n });\n if (!hasOwnRoute) {\n return null;\n } else {\n return buildMatcherFromPreprocessedRoutes(routes);\n }\n }\n};\nexport {\n RegExpRouter\n};\n","// src/router/smart-router/router.ts\nimport { MESSAGE_MATCHER_IS_ALREADY_BUILT, UnsupportedPathError } from \"../../router.js\";\nvar SmartRouter = class {\n name = \"SmartRouter\";\n #routers = [];\n #routes = [];\n constructor(init) {\n this.#routers = init.routers;\n }\n add(method, path, handler) {\n if (!this.#routes) {\n throw new Error(MESSAGE_MATCHER_IS_ALREADY_BUILT);\n }\n this.#routes.push([method, path, handler]);\n }\n match(method, path) {\n if (!this.#routes) {\n throw new Error(\"Fatal error\");\n }\n const routers = this.#routers;\n const routes = this.#routes;\n const len = routers.length;\n let i = 0;\n let res;\n for (; i < len; i++) {\n const router = routers[i];\n try {\n for (let i2 = 0, len2 = routes.length; i2 < len2; i2++) {\n router.add(...routes[i2]);\n }\n res = router.match(method, path);\n } catch (e) {\n if (e instanceof UnsupportedPathError) {\n continue;\n }\n throw e;\n }\n this.match = router.match.bind(router);\n this.#routers = [router];\n this.#routes = void 0;\n break;\n }\n if (i === len) {\n throw new Error(\"Fatal error\");\n }\n this.name = `SmartRouter + ${this.activeRouter.name}`;\n return res;\n }\n get activeRouter() {\n if (this.#routes || this.#routers.length !== 1) {\n throw new Error(\"No active router has been determined yet.\");\n }\n return this.#routers[0];\n }\n};\nexport {\n SmartRouter\n};\n","// src/router/trie-router/node.ts\nimport { METHOD_NAME_ALL } from \"../../router.js\";\nimport { getPattern, splitPath, splitRoutingPath } from \"../../utils/url.js\";\nvar emptyParams = /* @__PURE__ */ Object.create(null);\nvar hasChildren = (children) => {\n for (const _ in children) {\n return true;\n }\n return false;\n};\nvar Node = class _Node {\n #methods;\n #children;\n #patterns;\n #order = 0;\n #params = emptyParams;\n constructor(method, handler, children) {\n this.#children = children || /* @__PURE__ */ Object.create(null);\n this.#methods = [];\n if (method && handler) {\n const m = /* @__PURE__ */ Object.create(null);\n m[method] = { handler, possibleKeys: [], score: 0 };\n this.#methods = [m];\n }\n this.#patterns = [];\n }\n insert(method, path, handler) {\n this.#order = ++this.#order;\n let curNode = this;\n const parts = splitRoutingPath(path);\n const possibleKeys = [];\n for (let i = 0, len = parts.length; i < len; i++) {\n const p = parts[i];\n const nextP = parts[i + 1];\n const pattern = getPattern(p, nextP);\n const key = Array.isArray(pattern) ? pattern[0] : p;\n if (key in curNode.#children) {\n curNode = curNode.#children[key];\n if (pattern) {\n possibleKeys.push(pattern[1]);\n }\n continue;\n }\n curNode.#children[key] = new _Node();\n if (pattern) {\n curNode.#patterns.push(pattern);\n possibleKeys.push(pattern[1]);\n }\n curNode = curNode.#children[key];\n }\n curNode.#methods.push({\n [method]: {\n handler,\n possibleKeys: possibleKeys.filter((v, i, a) => a.indexOf(v) === i),\n score: this.#order\n }\n });\n return curNode;\n }\n #pushHandlerSets(handlerSets, node, method, nodeParams, params) {\n for (let i = 0, len = node.#methods.length; i < len; i++) {\n const m = node.#methods[i];\n const handlerSet = m[method] || m[METHOD_NAME_ALL];\n const processedSet = {};\n if (handlerSet !== void 0) {\n handlerSet.params = /* @__PURE__ */ Object.create(null);\n handlerSets.push(handlerSet);\n if (nodeParams !== emptyParams || params && params !== emptyParams) {\n for (let i2 = 0, len2 = handlerSet.possibleKeys.length; i2 < len2; i2++) {\n const key = handlerSet.possibleKeys[i2];\n const processed = processedSet[handlerSet.score];\n handlerSet.params[key] = params?.[key] && !processed ? params[key] : nodeParams[key] ?? params?.[key];\n processedSet[handlerSet.score] = true;\n }\n }\n }\n }\n }\n search(method, path) {\n const handlerSets = [];\n this.#params = emptyParams;\n const curNode = this;\n let curNodes = [curNode];\n const parts = splitPath(path);\n const curNodesQueue = [];\n const len = parts.length;\n let partOffsets = null;\n for (let i = 0; i < len; i++) {\n const part = parts[i];\n const isLast = i === len - 1;\n const tempNodes = [];\n for (let j = 0, len2 = curNodes.length; j < len2; j++) {\n const node = curNodes[j];\n const nextNode = node.#children[part];\n if (nextNode) {\n nextNode.#params = node.#params;\n if (isLast) {\n if (nextNode.#children[\"*\"]) {\n this.#pushHandlerSets(handlerSets, nextNode.#children[\"*\"], method, node.#params);\n }\n this.#pushHandlerSets(handlerSets, nextNode, method, node.#params);\n } else {\n tempNodes.push(nextNode);\n }\n }\n for (let k = 0, len3 = node.#patterns.length; k < len3; k++) {\n const pattern = node.#patterns[k];\n const params = node.#params === emptyParams ? {} : { ...node.#params };\n if (pattern === \"*\") {\n const astNode = node.#children[\"*\"];\n if (astNode) {\n this.#pushHandlerSets(handlerSets, astNode, method, node.#params);\n astNode.#params = params;\n tempNodes.push(astNode);\n }\n continue;\n }\n const [key, name, matcher] = pattern;\n if (!part && !(matcher instanceof RegExp)) {\n continue;\n }\n const child = node.#children[key];\n if (matcher instanceof RegExp) {\n if (partOffsets === null) {\n partOffsets = new Array(len);\n let offset = path[0] === \"/\" ? 1 : 0;\n for (let p = 0; p < len; p++) {\n partOffsets[p] = offset;\n offset += parts[p].length + 1;\n }\n }\n const restPathString = path.substring(partOffsets[i]);\n const m = matcher.exec(restPathString);\n if (m) {\n params[name] = m[0];\n this.#pushHandlerSets(handlerSets, child, method, node.#params, params);\n if (hasChildren(child.#children)) {\n child.#params = params;\n const componentCount = m[0].match(/\\//)?.length ?? 0;\n const targetCurNodes = curNodesQueue[componentCount] ||= [];\n targetCurNodes.push(child);\n }\n continue;\n }\n }\n if (matcher === true || matcher.test(part)) {\n params[name] = part;\n if (isLast) {\n this.#pushHandlerSets(handlerSets, child, method, params, node.#params);\n if (child.#children[\"*\"]) {\n this.#pushHandlerSets(\n handlerSets,\n child.#children[\"*\"],\n method,\n params,\n node.#params\n );\n }\n } else {\n child.#params = params;\n tempNodes.push(child);\n }\n }\n }\n }\n const shifted = curNodesQueue.shift();\n curNodes = shifted ? tempNodes.concat(shifted) : tempNodes;\n }\n if (handlerSets.length > 1) {\n handlerSets.sort((a, b) => {\n return a.score - b.score;\n });\n }\n return [handlerSets.map(({ handler, params }) => [handler, params])];\n }\n};\nexport {\n Node\n};\n","// src/router/trie-router/router.ts\nimport { checkOptionalParameter } from \"../../utils/url.js\";\nimport { Node } from \"./node.js\";\nvar TrieRouter = class {\n name = \"TrieRouter\";\n #node;\n constructor() {\n this.#node = new Node();\n }\n add(method, path, handler) {\n const results = checkOptionalParameter(path);\n if (results) {\n for (let i = 0, len = results.length; i < len; i++) {\n this.#node.insert(method, results[i], handler);\n }\n return;\n }\n this.#node.insert(method, path, handler);\n }\n match(method, path) {\n return this.#node.search(method, path);\n }\n};\nexport {\n TrieRouter\n};\n","// src/hono.ts\nimport { HonoBase } from \"./hono-base.js\";\nimport { RegExpRouter } from \"./router/reg-exp-router/index.js\";\nimport { SmartRouter } from \"./router/smart-router/index.js\";\nimport { TrieRouter } from \"./router/trie-router/index.js\";\nvar Hono = class extends HonoBase {\n /**\n * Creates an instance of the Hono class.\n *\n * @param options - Optional configuration options for the Hono instance.\n */\n constructor(options = {}) {\n super(options);\n this.router = options.router ?? new SmartRouter({\n routers: [new RegExpRouter(), new TrieRouter()]\n });\n }\n};\nexport {\n Hono\n};\n","// src/middleware/cors/index.ts\nvar cors = (options) => {\n const defaults = {\n origin: \"*\",\n allowMethods: [\"GET\", \"HEAD\", \"PUT\", \"POST\", \"DELETE\", \"PATCH\"],\n allowHeaders: [],\n exposeHeaders: []\n };\n const opts = {\n ...defaults,\n ...options\n };\n const findAllowOrigin = ((optsOrigin) => {\n if (typeof optsOrigin === \"string\") {\n if (optsOrigin === \"*\") {\n return () => optsOrigin;\n } else {\n return (origin) => optsOrigin === origin ? origin : null;\n }\n } else if (typeof optsOrigin === \"function\") {\n return optsOrigin;\n } else {\n return (origin) => optsOrigin.includes(origin) ? origin : null;\n }\n })(opts.origin);\n const findAllowMethods = ((optsAllowMethods) => {\n if (typeof optsAllowMethods === \"function\") {\n return optsAllowMethods;\n } else if (Array.isArray(optsAllowMethods)) {\n return () => optsAllowMethods;\n } else {\n return () => [];\n }\n })(opts.allowMethods);\n return async function cors2(c, next) {\n function set(key, value) {\n c.res.headers.set(key, value);\n }\n const allowOrigin = await findAllowOrigin(c.req.header(\"origin\") || \"\", c);\n if (allowOrigin) {\n set(\"Access-Control-Allow-Origin\", allowOrigin);\n }\n if (opts.credentials) {\n set(\"Access-Control-Allow-Credentials\", \"true\");\n }\n if (opts.exposeHeaders?.length) {\n set(\"Access-Control-Expose-Headers\", opts.exposeHeaders.join(\",\"));\n }\n if (c.req.method === \"OPTIONS\") {\n if (opts.origin !== \"*\") {\n set(\"Vary\", \"Origin\");\n }\n if (opts.maxAge != null) {\n set(\"Access-Control-Max-Age\", opts.maxAge.toString());\n }\n const allowMethods = await findAllowMethods(c.req.header(\"origin\") || \"\", c);\n if (allowMethods.length) {\n set(\"Access-Control-Allow-Methods\", allowMethods.join(\",\"));\n }\n let headers = opts.allowHeaders;\n if (!headers?.length) {\n const requestHeaders = c.req.header(\"Access-Control-Request-Headers\");\n if (requestHeaders) {\n headers = requestHeaders.split(/\\s*,\\s*/);\n }\n }\n if (headers?.length) {\n set(\"Access-Control-Allow-Headers\", headers.join(\",\"));\n c.res.headers.append(\"Vary\", \"Access-Control-Request-Headers\");\n }\n c.res.headers.delete(\"Content-Length\");\n c.res.headers.delete(\"Content-Type\");\n return new Response(null, {\n headers: c.res.headers,\n status: 204,\n statusText: \"No Content\"\n });\n }\n await next();\n if (opts.origin !== \"*\") {\n c.header(\"Vary\", \"Origin\", { append: true });\n }\n };\n};\nexport {\n cors\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 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).map((id) => this.items.get(id)!).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\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","import { Hono } from \"hono\";\nimport { cors } from \"hono/cors\";\nimport { Store } from \"./store.js\";\nimport { WebhookDispatcher } from \"./webhooks.js\";\nimport { createApiErrorHandler, createErrorHandler } from \"./middleware/error-handler.js\";\nimport { authMiddleware, type AuthFallback, type TokenMap, type AppKeyResolver, type AppEnv } 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 { 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(event: string, action: string | undefined, payload: unknown, owner: string, repo?: string): 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 (\n event === \"ping\" ||\n s.events.includes(\"*\") ||\n s.events.includes(event)\n );\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, ErrorHandler, MiddlewareHandler } from \"hono\";\nimport type { ContentfulStatusCode } from \"hono/utils/http-status\";\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(...)`. Hono routes handler throws to the app error handler, not to outer middleware try/catch.\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 \"hono\";\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 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(\n Buffer.from(payloadB64, \"base64url\").toString()\n );\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 = typeof process !== \"undefined\" && (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 \"hono\";\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\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","import type { Context } from \"hono\";\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(\n c: Context,\n totalCount: number,\n page: number,\n perPage: number\n): 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\n .replace(/&/g, \"&amp;\")\n .replace(/</g, \"&lt;\")\n .replace(/>/g, \"&gt;\")\n .replace(/\"/g, \"&quot;\");\n}\n\nexport function escapeAttr(s: string): string {\n return escapeHtml(s).replace(/'/g, \"&#39;\");\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\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<title>${escapeHtml(title)} | emulate</title>\n<style>${CSS}</style>\n</head>`;\n}\n\nexport function renderCardPage(\n title: string,\n subtitle: string,\n body: string,\n service?: string\n): 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(\n title: string,\n sidebarHtml: string,\n bodyHtml: string,\n service?: string\n): 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 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\n ? `<div class=\"user-meta\">${escapeHtml(opts.name)}</div>`\n : \"\";\n const emailLine = opts.email\n ? `<div class=\"user-email\">${escapeHtml(opts.email)}</div>`\n : \"\";\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","export const encoder = new TextEncoder();\nexport const decoder = new TextDecoder();\nconst MAX_INT32 = 2 ** 32;\nexport function concat(...buffers) {\n const size = buffers.reduce((acc, { length }) => acc + length, 0);\n const buf = new Uint8Array(size);\n let i = 0;\n for (const buffer of buffers) {\n buf.set(buffer, i);\n i += buffer.length;\n }\n return buf;\n}\nfunction writeUInt32BE(buf, value, offset) {\n if (value < 0 || value >= MAX_INT32) {\n throw new RangeError(`value must be >= 0 and <= ${MAX_INT32 - 1}. Received ${value}`);\n }\n buf.set([value >>> 24, value >>> 16, value >>> 8, value & 0xff], offset);\n}\nexport function uint64be(value) {\n const high = Math.floor(value / MAX_INT32);\n const low = value % MAX_INT32;\n const buf = new Uint8Array(8);\n writeUInt32BE(buf, high, 0);\n writeUInt32BE(buf, low, 4);\n return buf;\n}\nexport function uint32be(value) {\n const buf = new Uint8Array(4);\n writeUInt32BE(buf, value);\n return buf;\n}\nexport function encode(string) {\n const bytes = new Uint8Array(string.length);\n for (let i = 0; i < string.length; i++) {\n const code = string.charCodeAt(i);\n if (code > 127) {\n throw new TypeError('non-ASCII string encountered in encode()');\n }\n bytes[i] = code;\n }\n return bytes;\n}\n","export function encodeBase64(input) {\n if (Uint8Array.prototype.toBase64) {\n return input.toBase64();\n }\n const CHUNK_SIZE = 0x8000;\n const arr = [];\n for (let i = 0; i < input.length; i += CHUNK_SIZE) {\n arr.push(String.fromCharCode.apply(null, input.subarray(i, i + CHUNK_SIZE)));\n }\n return btoa(arr.join(''));\n}\nexport function decodeBase64(encoded) {\n if (Uint8Array.fromBase64) {\n return Uint8Array.fromBase64(encoded);\n }\n const binary = atob(encoded);\n const bytes = new Uint8Array(binary.length);\n for (let i = 0; i < binary.length; i++) {\n bytes[i] = binary.charCodeAt(i);\n }\n return bytes;\n}\n","import { encoder, decoder } from '../lib/buffer_utils.js';\nimport { encodeBase64, decodeBase64 } from '../lib/base64.js';\nexport function decode(input) {\n if (Uint8Array.fromBase64) {\n return Uint8Array.fromBase64(typeof input === 'string' ? input : decoder.decode(input), {\n alphabet: 'base64url',\n });\n }\n let encoded = input;\n if (encoded instanceof Uint8Array) {\n encoded = decoder.decode(encoded);\n }\n encoded = encoded.replace(/-/g, '+').replace(/_/g, '/');\n try {\n return decodeBase64(encoded);\n }\n catch {\n throw new TypeError('The input to be decoded is not correctly encoded.');\n }\n}\nexport function encode(input) {\n let unencoded = input;\n if (typeof unencoded === 'string') {\n unencoded = encoder.encode(unencoded);\n }\n if (Uint8Array.prototype.toBase64) {\n return unencoded.toBase64({ alphabet: 'base64url', omitPadding: true });\n }\n return encodeBase64(unencoded).replace(/=/g, '').replace(/\\+/g, '-').replace(/\\//g, '_');\n}\n","const unusable = (name, prop = 'algorithm.name') => new TypeError(`CryptoKey does not support this operation, its ${prop} must be ${name}`);\nconst isAlgorithm = (algorithm, name) => algorithm.name === name;\nfunction getHashLength(hash) {\n return parseInt(hash.name.slice(4), 10);\n}\nfunction checkHashLength(algorithm, expected) {\n const actual = getHashLength(algorithm.hash);\n if (actual !== expected)\n throw unusable(`SHA-${expected}`, 'algorithm.hash');\n}\nfunction getNamedCurve(alg) {\n switch (alg) {\n case 'ES256':\n return 'P-256';\n case 'ES384':\n return 'P-384';\n case 'ES512':\n return 'P-521';\n default:\n throw new Error('unreachable');\n }\n}\nfunction checkUsage(key, usage) {\n if (usage && !key.usages.includes(usage)) {\n throw new TypeError(`CryptoKey does not support this operation, its usages must include ${usage}.`);\n }\n}\nexport function checkSigCryptoKey(key, alg, usage) {\n switch (alg) {\n case 'HS256':\n case 'HS384':\n case 'HS512': {\n if (!isAlgorithm(key.algorithm, 'HMAC'))\n throw unusable('HMAC');\n checkHashLength(key.algorithm, parseInt(alg.slice(2), 10));\n break;\n }\n case 'RS256':\n case 'RS384':\n case 'RS512': {\n if (!isAlgorithm(key.algorithm, 'RSASSA-PKCS1-v1_5'))\n throw unusable('RSASSA-PKCS1-v1_5');\n checkHashLength(key.algorithm, parseInt(alg.slice(2), 10));\n break;\n }\n case 'PS256':\n case 'PS384':\n case 'PS512': {\n if (!isAlgorithm(key.algorithm, 'RSA-PSS'))\n throw unusable('RSA-PSS');\n checkHashLength(key.algorithm, parseInt(alg.slice(2), 10));\n break;\n }\n case 'Ed25519':\n case 'EdDSA': {\n if (!isAlgorithm(key.algorithm, 'Ed25519'))\n throw unusable('Ed25519');\n break;\n }\n case 'ML-DSA-44':\n case 'ML-DSA-65':\n case 'ML-DSA-87': {\n if (!isAlgorithm(key.algorithm, alg))\n throw unusable(alg);\n break;\n }\n case 'ES256':\n case 'ES384':\n case 'ES512': {\n if (!isAlgorithm(key.algorithm, 'ECDSA'))\n throw unusable('ECDSA');\n const expected = getNamedCurve(alg);\n const actual = key.algorithm.namedCurve;\n if (actual !== expected)\n throw unusable(expected, 'algorithm.namedCurve');\n break;\n }\n default:\n throw new TypeError('CryptoKey does not support this operation');\n }\n checkUsage(key, usage);\n}\nexport function checkEncCryptoKey(key, alg, usage) {\n switch (alg) {\n case 'A128GCM':\n case 'A192GCM':\n case 'A256GCM': {\n if (!isAlgorithm(key.algorithm, 'AES-GCM'))\n throw unusable('AES-GCM');\n const expected = parseInt(alg.slice(1, 4), 10);\n const actual = key.algorithm.length;\n if (actual !== expected)\n throw unusable(expected, 'algorithm.length');\n break;\n }\n case 'A128KW':\n case 'A192KW':\n case 'A256KW': {\n if (!isAlgorithm(key.algorithm, 'AES-KW'))\n throw unusable('AES-KW');\n const expected = parseInt(alg.slice(1, 4), 10);\n const actual = key.algorithm.length;\n if (actual !== expected)\n throw unusable(expected, 'algorithm.length');\n break;\n }\n case 'ECDH': {\n switch (key.algorithm.name) {\n case 'ECDH':\n case 'X25519':\n break;\n default:\n throw unusable('ECDH or X25519');\n }\n break;\n }\n case 'PBES2-HS256+A128KW':\n case 'PBES2-HS384+A192KW':\n case 'PBES2-HS512+A256KW':\n if (!isAlgorithm(key.algorithm, 'PBKDF2'))\n throw unusable('PBKDF2');\n break;\n case 'RSA-OAEP':\n case 'RSA-OAEP-256':\n case 'RSA-OAEP-384':\n case 'RSA-OAEP-512': {\n if (!isAlgorithm(key.algorithm, 'RSA-OAEP'))\n throw unusable('RSA-OAEP');\n checkHashLength(key.algorithm, parseInt(alg.slice(9), 10) || 1);\n break;\n }\n default:\n throw new TypeError('CryptoKey does not support this operation');\n }\n checkUsage(key, usage);\n}\n","function message(msg, actual, ...types) {\n types = types.filter(Boolean);\n if (types.length > 2) {\n const last = types.pop();\n msg += `one of type ${types.join(', ')}, or ${last}.`;\n }\n else if (types.length === 2) {\n msg += `one of type ${types[0]} or ${types[1]}.`;\n }\n else {\n msg += `of type ${types[0]}.`;\n }\n if (actual == null) {\n msg += ` Received ${actual}`;\n }\n else if (typeof actual === 'function' && actual.name) {\n msg += ` Received function ${actual.name}`;\n }\n else if (typeof actual === 'object' && actual != null) {\n if (actual.constructor?.name) {\n msg += ` Received an instance of ${actual.constructor.name}`;\n }\n }\n return msg;\n}\nexport const invalidKeyInput = (actual, ...types) => message('Key must be ', actual, ...types);\nexport const withAlg = (alg, actual, ...types) => message(`Key for the ${alg} algorithm must be `, actual, ...types);\n","export class JOSEError extends Error {\n static code = 'ERR_JOSE_GENERIC';\n code = 'ERR_JOSE_GENERIC';\n constructor(message, options) {\n super(message, options);\n this.name = this.constructor.name;\n Error.captureStackTrace?.(this, this.constructor);\n }\n}\nexport class JWTClaimValidationFailed extends JOSEError {\n static code = 'ERR_JWT_CLAIM_VALIDATION_FAILED';\n code = 'ERR_JWT_CLAIM_VALIDATION_FAILED';\n claim;\n reason;\n payload;\n constructor(message, payload, claim = 'unspecified', reason = 'unspecified') {\n super(message, { cause: { claim, reason, payload } });\n this.claim = claim;\n this.reason = reason;\n this.payload = payload;\n }\n}\nexport class JWTExpired extends JOSEError {\n static code = 'ERR_JWT_EXPIRED';\n code = 'ERR_JWT_EXPIRED';\n claim;\n reason;\n payload;\n constructor(message, payload, claim = 'unspecified', reason = 'unspecified') {\n super(message, { cause: { claim, reason, payload } });\n this.claim = claim;\n this.reason = reason;\n this.payload = payload;\n }\n}\nexport class JOSEAlgNotAllowed extends JOSEError {\n static code = 'ERR_JOSE_ALG_NOT_ALLOWED';\n code = 'ERR_JOSE_ALG_NOT_ALLOWED';\n}\nexport class JOSENotSupported extends JOSEError {\n static code = 'ERR_JOSE_NOT_SUPPORTED';\n code = 'ERR_JOSE_NOT_SUPPORTED';\n}\nexport class JWEDecryptionFailed extends JOSEError {\n static code = 'ERR_JWE_DECRYPTION_FAILED';\n code = 'ERR_JWE_DECRYPTION_FAILED';\n constructor(message = 'decryption operation failed', options) {\n super(message, options);\n }\n}\nexport class JWEInvalid extends JOSEError {\n static code = 'ERR_JWE_INVALID';\n code = 'ERR_JWE_INVALID';\n}\nexport class JWSInvalid extends JOSEError {\n static code = 'ERR_JWS_INVALID';\n code = 'ERR_JWS_INVALID';\n}\nexport class JWTInvalid extends JOSEError {\n static code = 'ERR_JWT_INVALID';\n code = 'ERR_JWT_INVALID';\n}\nexport class JWKInvalid extends JOSEError {\n static code = 'ERR_JWK_INVALID';\n code = 'ERR_JWK_INVALID';\n}\nexport class JWKSInvalid extends JOSEError {\n static code = 'ERR_JWKS_INVALID';\n code = 'ERR_JWKS_INVALID';\n}\nexport class JWKSNoMatchingKey extends JOSEError {\n static code = 'ERR_JWKS_NO_MATCHING_KEY';\n code = 'ERR_JWKS_NO_MATCHING_KEY';\n constructor(message = 'no applicable key found in the JSON Web Key Set', options) {\n super(message, options);\n }\n}\nexport class JWKSMultipleMatchingKeys extends JOSEError {\n [Symbol.asyncIterator];\n static code = 'ERR_JWKS_MULTIPLE_MATCHING_KEYS';\n code = 'ERR_JWKS_MULTIPLE_MATCHING_KEYS';\n constructor(message = 'multiple matching keys found in the JSON Web Key Set', options) {\n super(message, options);\n }\n}\nexport class JWKSTimeout extends JOSEError {\n static code = 'ERR_JWKS_TIMEOUT';\n code = 'ERR_JWKS_TIMEOUT';\n constructor(message = 'request timed out', options) {\n super(message, options);\n }\n}\nexport class JWSSignatureVerificationFailed extends JOSEError {\n static code = 'ERR_JWS_SIGNATURE_VERIFICATION_FAILED';\n code = 'ERR_JWS_SIGNATURE_VERIFICATION_FAILED';\n constructor(message = 'signature verification failed', options) {\n super(message, options);\n }\n}\n","export function assertCryptoKey(key) {\n if (!isCryptoKey(key)) {\n throw new Error('CryptoKey instance expected');\n }\n}\nexport const isCryptoKey = (key) => {\n if (key?.[Symbol.toStringTag] === 'CryptoKey')\n return true;\n try {\n return key instanceof CryptoKey;\n }\n catch {\n return false;\n }\n};\nexport const isKeyObject = (key) => key?.[Symbol.toStringTag] === 'KeyObject';\nexport const isKeyLike = (key) => isCryptoKey(key) || isKeyObject(key);\n","import { decode } from '../util/base64url.js';\nexport const unprotected = Symbol();\nexport function assertNotSet(value, name) {\n if (value) {\n throw new TypeError(`${name} can only be called once`);\n }\n}\nexport function decodeBase64url(value, label, ErrorClass) {\n try {\n return decode(value);\n }\n catch {\n throw new ErrorClass(`Failed to base64url decode the ${label}`);\n }\n}\nexport async function digest(algorithm, data) {\n const subtleDigest = `SHA-${algorithm.slice(-3)}`;\n return new Uint8Array(await crypto.subtle.digest(subtleDigest, data));\n}\n","const isObjectLike = (value) => typeof value === 'object' && value !== null;\nexport function isObject(input) {\n if (!isObjectLike(input) || Object.prototype.toString.call(input) !== '[object Object]') {\n return false;\n }\n if (Object.getPrototypeOf(input) === null) {\n return true;\n }\n let proto = input;\n while (Object.getPrototypeOf(proto) !== null) {\n proto = Object.getPrototypeOf(proto);\n }\n return Object.getPrototypeOf(input) === proto;\n}\nexport function isDisjoint(...headers) {\n const sources = headers.filter(Boolean);\n if (sources.length === 0 || sources.length === 1) {\n return true;\n }\n let acc;\n for (const header of sources) {\n const parameters = Object.keys(header);\n if (!acc || acc.size === 0) {\n acc = new Set(parameters);\n continue;\n }\n for (const parameter of parameters) {\n if (acc.has(parameter)) {\n return false;\n }\n acc.add(parameter);\n }\n }\n return true;\n}\nexport const isJWK = (key) => isObject(key) && typeof key.kty === 'string';\nexport const isPrivateJWK = (key) => key.kty !== 'oct' &&\n ((key.kty === 'AKP' && typeof key.priv === 'string') || typeof key.d === 'string');\nexport const isPublicJWK = (key) => key.kty !== 'oct' && key.d === undefined && key.priv === undefined;\nexport const isSecretJWK = (key) => key.kty === 'oct' && typeof key.k === 'string';\n","import { JOSENotSupported } from '../util/errors.js';\nimport { checkSigCryptoKey } from './crypto_key.js';\nimport { invalidKeyInput } from './invalid_key_input.js';\nexport function checkKeyLength(alg, key) {\n if (alg.startsWith('RS') || alg.startsWith('PS')) {\n const { modulusLength } = key.algorithm;\n if (typeof modulusLength !== 'number' || modulusLength < 2048) {\n throw new TypeError(`${alg} requires key modulusLength to be 2048 bits or larger`);\n }\n }\n}\nfunction subtleAlgorithm(alg, algorithm) {\n const hash = `SHA-${alg.slice(-3)}`;\n switch (alg) {\n case 'HS256':\n case 'HS384':\n case 'HS512':\n return { hash, name: 'HMAC' };\n case 'PS256':\n case 'PS384':\n case 'PS512':\n return { hash, name: 'RSA-PSS', saltLength: parseInt(alg.slice(-3), 10) >> 3 };\n case 'RS256':\n case 'RS384':\n case 'RS512':\n return { hash, name: 'RSASSA-PKCS1-v1_5' };\n case 'ES256':\n case 'ES384':\n case 'ES512':\n return { hash, name: 'ECDSA', namedCurve: algorithm.namedCurve };\n case 'Ed25519':\n case 'EdDSA':\n return { name: 'Ed25519' };\n case 'ML-DSA-44':\n case 'ML-DSA-65':\n case 'ML-DSA-87':\n return { name: alg };\n default:\n throw new JOSENotSupported(`alg ${alg} is not supported either by JOSE or your javascript runtime`);\n }\n}\nasync function getSigKey(alg, key, usage) {\n if (key instanceof Uint8Array) {\n if (!alg.startsWith('HS')) {\n throw new TypeError(invalidKeyInput(key, 'CryptoKey', 'KeyObject', 'JSON Web Key'));\n }\n return crypto.subtle.importKey('raw', key, { hash: `SHA-${alg.slice(-3)}`, name: 'HMAC' }, false, [usage]);\n }\n checkSigCryptoKey(key, alg, usage);\n return key;\n}\nexport async function sign(alg, key, data) {\n const cryptoKey = await getSigKey(alg, key, 'sign');\n checkKeyLength(alg, cryptoKey);\n const signature = await crypto.subtle.sign(subtleAlgorithm(alg, cryptoKey.algorithm), cryptoKey, data);\n return new Uint8Array(signature);\n}\nexport async function verify(alg, key, signature, data) {\n const cryptoKey = await getSigKey(alg, key, 'verify');\n checkKeyLength(alg, cryptoKey);\n const algorithm = subtleAlgorithm(alg, cryptoKey.algorithm);\n try {\n return await crypto.subtle.verify(algorithm, cryptoKey, signature, data);\n }\n catch {\n return false;\n }\n}\n","import { JOSENotSupported } from '../util/errors.js';\nconst unsupportedAlg = 'Invalid or unsupported JWK \"alg\" (Algorithm) Parameter value';\nfunction subtleMapping(jwk) {\n let algorithm;\n let keyUsages;\n switch (jwk.kty) {\n case 'AKP': {\n switch (jwk.alg) {\n case 'ML-DSA-44':\n case 'ML-DSA-65':\n case 'ML-DSA-87':\n algorithm = { name: jwk.alg };\n keyUsages = jwk.priv ? ['sign'] : ['verify'];\n break;\n default:\n throw new JOSENotSupported(unsupportedAlg);\n }\n break;\n }\n case 'RSA': {\n switch (jwk.alg) {\n case 'PS256':\n case 'PS384':\n case 'PS512':\n algorithm = { name: 'RSA-PSS', hash: `SHA-${jwk.alg.slice(-3)}` };\n keyUsages = jwk.d ? ['sign'] : ['verify'];\n break;\n case 'RS256':\n case 'RS384':\n case 'RS512':\n algorithm = { name: 'RSASSA-PKCS1-v1_5', hash: `SHA-${jwk.alg.slice(-3)}` };\n keyUsages = jwk.d ? ['sign'] : ['verify'];\n break;\n case 'RSA-OAEP':\n case 'RSA-OAEP-256':\n case 'RSA-OAEP-384':\n case 'RSA-OAEP-512':\n algorithm = {\n name: 'RSA-OAEP',\n hash: `SHA-${parseInt(jwk.alg.slice(-3), 10) || 1}`,\n };\n keyUsages = jwk.d ? ['decrypt', 'unwrapKey'] : ['encrypt', 'wrapKey'];\n break;\n default:\n throw new JOSENotSupported(unsupportedAlg);\n }\n break;\n }\n case 'EC': {\n switch (jwk.alg) {\n case 'ES256':\n case 'ES384':\n case 'ES512':\n algorithm = {\n name: 'ECDSA',\n namedCurve: { ES256: 'P-256', ES384: 'P-384', ES512: 'P-521' }[jwk.alg],\n };\n keyUsages = jwk.d ? ['sign'] : ['verify'];\n break;\n case 'ECDH-ES':\n case 'ECDH-ES+A128KW':\n case 'ECDH-ES+A192KW':\n case 'ECDH-ES+A256KW':\n algorithm = { name: 'ECDH', namedCurve: jwk.crv };\n keyUsages = jwk.d ? ['deriveBits'] : [];\n break;\n default:\n throw new JOSENotSupported(unsupportedAlg);\n }\n break;\n }\n case 'OKP': {\n switch (jwk.alg) {\n case 'Ed25519':\n case 'EdDSA':\n algorithm = { name: 'Ed25519' };\n keyUsages = jwk.d ? ['sign'] : ['verify'];\n break;\n case 'ECDH-ES':\n case 'ECDH-ES+A128KW':\n case 'ECDH-ES+A192KW':\n case 'ECDH-ES+A256KW':\n algorithm = { name: jwk.crv };\n keyUsages = jwk.d ? ['deriveBits'] : [];\n break;\n default:\n throw new JOSENotSupported(unsupportedAlg);\n }\n break;\n }\n default:\n throw new JOSENotSupported('Invalid or unsupported JWK \"kty\" (Key Type) Parameter value');\n }\n return { algorithm, keyUsages };\n}\nexport async function jwkToKey(jwk) {\n if (!jwk.alg) {\n throw new TypeError('\"alg\" argument is required when \"jwk.alg\" is not present');\n }\n const { algorithm, keyUsages } = subtleMapping(jwk);\n const keyData = { ...jwk };\n if (keyData.kty !== 'AKP') {\n delete keyData.alg;\n }\n delete keyData.use;\n return crypto.subtle.importKey('jwk', keyData, algorithm, jwk.ext ?? (jwk.d || jwk.priv ? false : true), jwk.key_ops ?? keyUsages);\n}\n","import { isJWK } from './type_checks.js';\nimport { decode } from '../util/base64url.js';\nimport { jwkToKey } from './jwk_to_key.js';\nimport { isCryptoKey, isKeyObject } from './is_key_like.js';\nconst unusableForAlg = 'given KeyObject instance cannot be used for this algorithm';\nlet cache;\nconst handleJWK = async (key, jwk, alg, freeze = false) => {\n cache ||= new WeakMap();\n let cached = cache.get(key);\n if (cached?.[alg]) {\n return cached[alg];\n }\n const cryptoKey = await jwkToKey({ ...jwk, alg });\n if (freeze)\n Object.freeze(key);\n if (!cached) {\n cache.set(key, { [alg]: cryptoKey });\n }\n else {\n cached[alg] = cryptoKey;\n }\n return cryptoKey;\n};\nconst handleKeyObject = (keyObject, alg) => {\n cache ||= new WeakMap();\n let cached = cache.get(keyObject);\n if (cached?.[alg]) {\n return cached[alg];\n }\n const isPublic = keyObject.type === 'public';\n const extractable = isPublic ? true : false;\n let cryptoKey;\n if (keyObject.asymmetricKeyType === 'x25519') {\n switch (alg) {\n case 'ECDH-ES':\n case 'ECDH-ES+A128KW':\n case 'ECDH-ES+A192KW':\n case 'ECDH-ES+A256KW':\n break;\n default:\n throw new TypeError(unusableForAlg);\n }\n cryptoKey = keyObject.toCryptoKey(keyObject.asymmetricKeyType, extractable, isPublic ? [] : ['deriveBits']);\n }\n if (keyObject.asymmetricKeyType === 'ed25519') {\n if (alg !== 'EdDSA' && alg !== 'Ed25519') {\n throw new TypeError(unusableForAlg);\n }\n cryptoKey = keyObject.toCryptoKey(keyObject.asymmetricKeyType, extractable, [\n isPublic ? 'verify' : 'sign',\n ]);\n }\n switch (keyObject.asymmetricKeyType) {\n case 'ml-dsa-44':\n case 'ml-dsa-65':\n case 'ml-dsa-87': {\n if (alg !== keyObject.asymmetricKeyType.toUpperCase()) {\n throw new TypeError(unusableForAlg);\n }\n cryptoKey = keyObject.toCryptoKey(keyObject.asymmetricKeyType, extractable, [\n isPublic ? 'verify' : 'sign',\n ]);\n }\n }\n if (keyObject.asymmetricKeyType === 'rsa') {\n let hash;\n switch (alg) {\n case 'RSA-OAEP':\n hash = 'SHA-1';\n break;\n case 'RS256':\n case 'PS256':\n case 'RSA-OAEP-256':\n hash = 'SHA-256';\n break;\n case 'RS384':\n case 'PS384':\n case 'RSA-OAEP-384':\n hash = 'SHA-384';\n break;\n case 'RS512':\n case 'PS512':\n case 'RSA-OAEP-512':\n hash = 'SHA-512';\n break;\n default:\n throw new TypeError(unusableForAlg);\n }\n if (alg.startsWith('RSA-OAEP')) {\n return keyObject.toCryptoKey({\n name: 'RSA-OAEP',\n hash,\n }, extractable, isPublic ? ['encrypt'] : ['decrypt']);\n }\n cryptoKey = keyObject.toCryptoKey({\n name: alg.startsWith('PS') ? 'RSA-PSS' : 'RSASSA-PKCS1-v1_5',\n hash,\n }, extractable, [isPublic ? 'verify' : 'sign']);\n }\n if (keyObject.asymmetricKeyType === 'ec') {\n const nist = new Map([\n ['prime256v1', 'P-256'],\n ['secp384r1', 'P-384'],\n ['secp521r1', 'P-521'],\n ]);\n const namedCurve = nist.get(keyObject.asymmetricKeyDetails?.namedCurve);\n if (!namedCurve) {\n throw new TypeError(unusableForAlg);\n }\n const expectedCurve = { ES256: 'P-256', ES384: 'P-384', ES512: 'P-521' };\n if (expectedCurve[alg] && namedCurve === expectedCurve[alg]) {\n cryptoKey = keyObject.toCryptoKey({\n name: 'ECDSA',\n namedCurve,\n }, extractable, [isPublic ? 'verify' : 'sign']);\n }\n if (alg.startsWith('ECDH-ES')) {\n cryptoKey = keyObject.toCryptoKey({\n name: 'ECDH',\n namedCurve,\n }, extractable, isPublic ? [] : ['deriveBits']);\n }\n }\n if (!cryptoKey) {\n throw new TypeError(unusableForAlg);\n }\n if (!cached) {\n cache.set(keyObject, { [alg]: cryptoKey });\n }\n else {\n cached[alg] = cryptoKey;\n }\n return cryptoKey;\n};\nexport async function normalizeKey(key, alg) {\n if (key instanceof Uint8Array) {\n return key;\n }\n if (isCryptoKey(key)) {\n return key;\n }\n if (isKeyObject(key)) {\n if (key.type === 'secret') {\n return key.export();\n }\n if ('toCryptoKey' in key && typeof key.toCryptoKey === 'function') {\n try {\n return handleKeyObject(key, alg);\n }\n catch (err) {\n if (err instanceof TypeError) {\n throw err;\n }\n }\n }\n let jwk = key.export({ format: 'jwk' });\n return handleJWK(key, jwk, alg);\n }\n if (isJWK(key)) {\n if (key.k) {\n return decode(key.k);\n }\n return handleJWK(key, key, alg, true);\n }\n throw new Error('unreachable');\n}\n","import { invalidKeyInput } from './invalid_key_input.js';\nimport { encodeBase64, decodeBase64 } from '../lib/base64.js';\nimport { JOSENotSupported } from '../util/errors.js';\nimport { isCryptoKey, isKeyObject } from './is_key_like.js';\nconst formatPEM = (b64, descriptor) => {\n const newlined = (b64.match(/.{1,64}/g) || []).join('\\n');\n return `-----BEGIN ${descriptor}-----\\n${newlined}\\n-----END ${descriptor}-----`;\n};\nconst genericExport = async (keyType, keyFormat, key) => {\n if (isKeyObject(key)) {\n if (key.type !== keyType) {\n throw new TypeError(`key is not a ${keyType} key`);\n }\n return key.export({ format: 'pem', type: keyFormat });\n }\n if (!isCryptoKey(key)) {\n throw new TypeError(invalidKeyInput(key, 'CryptoKey', 'KeyObject'));\n }\n if (!key.extractable) {\n throw new TypeError('CryptoKey is not extractable');\n }\n if (key.type !== keyType) {\n throw new TypeError(`key is not a ${keyType} key`);\n }\n return formatPEM(encodeBase64(new Uint8Array(await crypto.subtle.exportKey(keyFormat, key))), `${keyType.toUpperCase()} KEY`);\n};\nexport const toSPKI = (key) => genericExport('public', 'spki', key);\nexport const toPKCS8 = (key) => genericExport('private', 'pkcs8', key);\nconst bytesEqual = (a, b) => {\n if (a.byteLength !== b.length)\n return false;\n for (let i = 0; i < a.byteLength; i++) {\n if (a[i] !== b[i])\n return false;\n }\n return true;\n};\nconst createASN1State = (data) => ({ data, pos: 0 });\nconst parseLength = (state) => {\n const first = state.data[state.pos++];\n if (first & 0x80) {\n const lengthOfLen = first & 0x7f;\n let length = 0;\n for (let i = 0; i < lengthOfLen; i++) {\n length = (length << 8) | state.data[state.pos++];\n }\n return length;\n }\n return first;\n};\nconst skipElement = (state, count = 1) => {\n if (count <= 0)\n return;\n state.pos++;\n const length = parseLength(state);\n state.pos += length;\n if (count > 1) {\n skipElement(state, count - 1);\n }\n};\nconst expectTag = (state, expectedTag, errorMessage) => {\n if (state.data[state.pos++] !== expectedTag) {\n throw new Error(errorMessage);\n }\n};\nconst getSubarray = (state, length) => {\n const result = state.data.subarray(state.pos, state.pos + length);\n state.pos += length;\n return result;\n};\nconst parseAlgorithmOID = (state) => {\n expectTag(state, 0x06, 'Expected algorithm OID');\n const oidLen = parseLength(state);\n return getSubarray(state, oidLen);\n};\nfunction parsePKCS8Header(state) {\n expectTag(state, 0x30, 'Invalid PKCS#8 structure');\n parseLength(state);\n expectTag(state, 0x02, 'Expected version field');\n const verLen = parseLength(state);\n state.pos += verLen;\n expectTag(state, 0x30, 'Expected algorithm identifier');\n const algIdLen = parseLength(state);\n const algIdStart = state.pos;\n return { algIdStart, algIdLength: algIdLen };\n}\nfunction parseSPKIHeader(state) {\n expectTag(state, 0x30, 'Invalid SPKI structure');\n parseLength(state);\n expectTag(state, 0x30, 'Expected algorithm identifier');\n const algIdLen = parseLength(state);\n const algIdStart = state.pos;\n return { algIdStart, algIdLength: algIdLen };\n}\nconst parseECAlgorithmIdentifier = (state) => {\n const algOid = parseAlgorithmOID(state);\n if (bytesEqual(algOid, [0x2b, 0x65, 0x6e])) {\n return 'X25519';\n }\n if (!bytesEqual(algOid, [0x2a, 0x86, 0x48, 0xce, 0x3d, 0x02, 0x01])) {\n throw new Error('Unsupported key algorithm');\n }\n expectTag(state, 0x06, 'Expected curve OID');\n const curveOidLen = parseLength(state);\n const curveOid = getSubarray(state, curveOidLen);\n for (const { name, oid } of [\n { name: 'P-256', oid: [0x2a, 0x86, 0x48, 0xce, 0x3d, 0x03, 0x01, 0x07] },\n { name: 'P-384', oid: [0x2b, 0x81, 0x04, 0x00, 0x22] },\n { name: 'P-521', oid: [0x2b, 0x81, 0x04, 0x00, 0x23] },\n ]) {\n if (bytesEqual(curveOid, oid)) {\n return name;\n }\n }\n throw new Error('Unsupported named curve');\n};\nconst genericImport = async (keyFormat, keyData, alg, options) => {\n let algorithm;\n let keyUsages;\n const isPublic = keyFormat === 'spki';\n const getSigUsages = () => (isPublic ? ['verify'] : ['sign']);\n const getEncUsages = () => isPublic ? ['encrypt', 'wrapKey'] : ['decrypt', 'unwrapKey'];\n switch (alg) {\n case 'PS256':\n case 'PS384':\n case 'PS512':\n algorithm = { name: 'RSA-PSS', hash: `SHA-${alg.slice(-3)}` };\n keyUsages = getSigUsages();\n break;\n case 'RS256':\n case 'RS384':\n case 'RS512':\n algorithm = { name: 'RSASSA-PKCS1-v1_5', hash: `SHA-${alg.slice(-3)}` };\n keyUsages = getSigUsages();\n break;\n case 'RSA-OAEP':\n case 'RSA-OAEP-256':\n case 'RSA-OAEP-384':\n case 'RSA-OAEP-512':\n algorithm = {\n name: 'RSA-OAEP',\n hash: `SHA-${parseInt(alg.slice(-3), 10) || 1}`,\n };\n keyUsages = getEncUsages();\n break;\n case 'ES256':\n case 'ES384':\n case 'ES512': {\n const curveMap = { ES256: 'P-256', ES384: 'P-384', ES512: 'P-521' };\n algorithm = { name: 'ECDSA', namedCurve: curveMap[alg] };\n keyUsages = getSigUsages();\n break;\n }\n case 'ECDH-ES':\n case 'ECDH-ES+A128KW':\n case 'ECDH-ES+A192KW':\n case 'ECDH-ES+A256KW': {\n try {\n const namedCurve = options.getNamedCurve(keyData);\n algorithm = namedCurve === 'X25519' ? { name: 'X25519' } : { name: 'ECDH', namedCurve };\n }\n catch (cause) {\n throw new JOSENotSupported('Invalid or unsupported key format');\n }\n keyUsages = isPublic ? [] : ['deriveBits'];\n break;\n }\n case 'Ed25519':\n case 'EdDSA':\n algorithm = { name: 'Ed25519' };\n keyUsages = getSigUsages();\n break;\n case 'ML-DSA-44':\n case 'ML-DSA-65':\n case 'ML-DSA-87':\n algorithm = { name: alg };\n keyUsages = getSigUsages();\n break;\n default:\n throw new JOSENotSupported('Invalid or unsupported \"alg\" (Algorithm) value');\n }\n return crypto.subtle.importKey(keyFormat, keyData, algorithm, options?.extractable ?? (isPublic ? true : false), keyUsages);\n};\nconst processPEMData = (pem, pattern) => {\n return decodeBase64(pem.replace(pattern, ''));\n};\nexport const fromPKCS8 = (pem, alg, options) => {\n const keyData = processPEMData(pem, /(?:-----(?:BEGIN|END) PRIVATE KEY-----|\\s)/g);\n let opts = options;\n if (alg?.startsWith?.('ECDH-ES')) {\n opts ||= {};\n opts.getNamedCurve = (keyData) => {\n const state = createASN1State(keyData);\n parsePKCS8Header(state);\n return parseECAlgorithmIdentifier(state);\n };\n }\n return genericImport('pkcs8', keyData, alg, opts);\n};\nexport const fromSPKI = (pem, alg, options) => {\n const keyData = processPEMData(pem, /(?:-----(?:BEGIN|END) PUBLIC KEY-----|\\s)/g);\n let opts = options;\n if (alg?.startsWith?.('ECDH-ES')) {\n opts ||= {};\n opts.getNamedCurve = (keyData) => {\n const state = createASN1State(keyData);\n parseSPKIHeader(state);\n return parseECAlgorithmIdentifier(state);\n };\n }\n return genericImport('spki', keyData, alg, opts);\n};\nfunction spkiFromX509(buf) {\n const state = createASN1State(buf);\n expectTag(state, 0x30, 'Invalid certificate structure');\n parseLength(state);\n expectTag(state, 0x30, 'Invalid tbsCertificate structure');\n parseLength(state);\n if (buf[state.pos] === 0xa0) {\n skipElement(state, 6);\n }\n else {\n skipElement(state, 5);\n }\n const spkiStart = state.pos;\n expectTag(state, 0x30, 'Invalid SPKI structure');\n const spkiContentLen = parseLength(state);\n return buf.subarray(spkiStart, spkiStart + spkiContentLen + (state.pos - spkiStart));\n}\nfunction extractX509SPKI(x509) {\n const derBytes = processPEMData(x509, /(?:-----(?:BEGIN|END) CERTIFICATE-----|\\s)/g);\n return spkiFromX509(derBytes);\n}\nexport const fromX509 = (pem, alg, options) => {\n let spki;\n try {\n spki = extractX509SPKI(pem);\n }\n catch (cause) {\n throw new TypeError('Failed to parse the X.509 certificate', { cause });\n }\n return fromSPKI(formatPEM(encodeBase64(spki), 'PUBLIC KEY'), alg, options);\n};\n","import { decode as decodeBase64URL } from '../util/base64url.js';\nimport { fromSPKI, fromPKCS8, fromX509 } from '../lib/asn1.js';\nimport { jwkToKey } from '../lib/jwk_to_key.js';\nimport { JOSENotSupported } from '../util/errors.js';\nimport { isObject } from '../lib/type_checks.js';\nexport async function importSPKI(spki, alg, options) {\n if (typeof spki !== 'string' || spki.indexOf('-----BEGIN PUBLIC KEY-----') !== 0) {\n throw new TypeError('\"spki\" must be SPKI formatted string');\n }\n return fromSPKI(spki, alg, options);\n}\nexport async function importX509(x509, alg, options) {\n if (typeof x509 !== 'string' || x509.indexOf('-----BEGIN CERTIFICATE-----') !== 0) {\n throw new TypeError('\"x509\" must be X.509 formatted string');\n }\n return fromX509(x509, alg, options);\n}\nexport async function importPKCS8(pkcs8, alg, options) {\n if (typeof pkcs8 !== 'string' || pkcs8.indexOf('-----BEGIN PRIVATE KEY-----') !== 0) {\n throw new TypeError('\"pkcs8\" must be PKCS#8 formatted string');\n }\n return fromPKCS8(pkcs8, alg, options);\n}\nexport async function importJWK(jwk, alg, options) {\n if (!isObject(jwk)) {\n throw new TypeError('JWK must be an object');\n }\n let ext;\n alg ??= jwk.alg;\n ext ??= options?.extractable ?? jwk.ext;\n switch (jwk.kty) {\n case 'oct':\n if (typeof jwk.k !== 'string' || !jwk.k) {\n throw new TypeError('missing \"k\" (Key Value) Parameter value');\n }\n return decodeBase64URL(jwk.k);\n case 'RSA':\n if ('oth' in jwk && jwk.oth !== undefined) {\n throw new JOSENotSupported('RSA JWK \"oth\" (Other Primes Info) Parameter value is not supported');\n }\n return jwkToKey({ ...jwk, alg, ext });\n case 'AKP': {\n if (typeof jwk.alg !== 'string' || !jwk.alg) {\n throw new TypeError('missing \"alg\" (Algorithm) Parameter value');\n }\n if (alg !== undefined && alg !== jwk.alg) {\n throw new TypeError('JWK alg and alg option value mismatch');\n }\n return jwkToKey({ ...jwk, ext });\n }\n case 'EC':\n case 'OKP':\n return jwkToKey({ ...jwk, alg, ext });\n default:\n throw new JOSENotSupported('Unsupported \"kty\" (Key Type) Parameter value');\n }\n}\n","import { JOSENotSupported, JWEInvalid, JWSInvalid } from '../util/errors.js';\nexport function validateCrit(Err, recognizedDefault, recognizedOption, protectedHeader, joseHeader) {\n if (joseHeader.crit !== undefined && protectedHeader?.crit === undefined) {\n throw new Err('\"crit\" (Critical) Header Parameter MUST be integrity protected');\n }\n if (!protectedHeader || protectedHeader.crit === undefined) {\n return new Set();\n }\n if (!Array.isArray(protectedHeader.crit) ||\n protectedHeader.crit.length === 0 ||\n protectedHeader.crit.some((input) => typeof input !== 'string' || input.length === 0)) {\n throw new Err('\"crit\" (Critical) Header Parameter MUST be an array of non-empty strings when present');\n }\n let recognized;\n if (recognizedOption !== undefined) {\n recognized = new Map([...Object.entries(recognizedOption), ...recognizedDefault.entries()]);\n }\n else {\n recognized = recognizedDefault;\n }\n for (const parameter of protectedHeader.crit) {\n if (!recognized.has(parameter)) {\n throw new JOSENotSupported(`Extension Header Parameter \"${parameter}\" is not recognized`);\n }\n if (joseHeader[parameter] === undefined) {\n throw new Err(`Extension Header Parameter \"${parameter}\" is missing`);\n }\n if (recognized.get(parameter) && protectedHeader[parameter] === undefined) {\n throw new Err(`Extension Header Parameter \"${parameter}\" MUST be integrity protected`);\n }\n }\n return new Set(protectedHeader.crit);\n}\n","export function validateAlgorithms(option, algorithms) {\n if (algorithms !== undefined &&\n (!Array.isArray(algorithms) || algorithms.some((s) => typeof s !== 'string'))) {\n throw new TypeError(`\"${option}\" option must be an array of strings`);\n }\n if (!algorithms) {\n return undefined;\n }\n return new Set(algorithms);\n}\n","import { withAlg as invalidKeyInput } from './invalid_key_input.js';\nimport { isKeyLike } from './is_key_like.js';\nimport * as jwk from './type_checks.js';\nconst tag = (key) => key?.[Symbol.toStringTag];\nconst jwkMatchesOp = (alg, key, usage) => {\n if (key.use !== undefined) {\n let expected;\n switch (usage) {\n case 'sign':\n case 'verify':\n expected = 'sig';\n break;\n case 'encrypt':\n case 'decrypt':\n expected = 'enc';\n break;\n }\n if (key.use !== expected) {\n throw new TypeError(`Invalid key for this operation, its \"use\" must be \"${expected}\" when present`);\n }\n }\n if (key.alg !== undefined && key.alg !== alg) {\n throw new TypeError(`Invalid key for this operation, its \"alg\" must be \"${alg}\" when present`);\n }\n if (Array.isArray(key.key_ops)) {\n let expectedKeyOp;\n switch (true) {\n case usage === 'sign' || usage === 'verify':\n case alg === 'dir':\n case alg.includes('CBC-HS'):\n expectedKeyOp = usage;\n break;\n case alg.startsWith('PBES2'):\n expectedKeyOp = 'deriveBits';\n break;\n case /^A\\d{3}(?:GCM)?(?:KW)?$/.test(alg):\n if (!alg.includes('GCM') && alg.endsWith('KW')) {\n expectedKeyOp = usage === 'encrypt' ? 'wrapKey' : 'unwrapKey';\n }\n else {\n expectedKeyOp = usage;\n }\n break;\n case usage === 'encrypt' && alg.startsWith('RSA'):\n expectedKeyOp = 'wrapKey';\n break;\n case usage === 'decrypt':\n expectedKeyOp = alg.startsWith('RSA') ? 'unwrapKey' : 'deriveBits';\n break;\n }\n if (expectedKeyOp && key.key_ops?.includes?.(expectedKeyOp) === false) {\n throw new TypeError(`Invalid key for this operation, its \"key_ops\" must include \"${expectedKeyOp}\" when present`);\n }\n }\n return true;\n};\nconst symmetricTypeCheck = (alg, key, usage) => {\n if (key instanceof Uint8Array)\n return;\n if (jwk.isJWK(key)) {\n if (jwk.isSecretJWK(key) && jwkMatchesOp(alg, key, usage))\n return;\n throw new TypeError(`JSON Web Key for symmetric algorithms must have JWK \"kty\" (Key Type) equal to \"oct\" and the JWK \"k\" (Key Value) present`);\n }\n if (!isKeyLike(key)) {\n throw new TypeError(invalidKeyInput(alg, key, 'CryptoKey', 'KeyObject', 'JSON Web Key', 'Uint8Array'));\n }\n if (key.type !== 'secret') {\n throw new TypeError(`${tag(key)} instances for symmetric algorithms must be of type \"secret\"`);\n }\n};\nconst asymmetricTypeCheck = (alg, key, usage) => {\n if (jwk.isJWK(key)) {\n switch (usage) {\n case 'decrypt':\n case 'sign':\n if (jwk.isPrivateJWK(key) && jwkMatchesOp(alg, key, usage))\n return;\n throw new TypeError(`JSON Web Key for this operation must be a private JWK`);\n case 'encrypt':\n case 'verify':\n if (jwk.isPublicJWK(key) && jwkMatchesOp(alg, key, usage))\n return;\n throw new TypeError(`JSON Web Key for this operation must be a public JWK`);\n }\n }\n if (!isKeyLike(key)) {\n throw new TypeError(invalidKeyInput(alg, key, 'CryptoKey', 'KeyObject', 'JSON Web Key'));\n }\n if (key.type === 'secret') {\n throw new TypeError(`${tag(key)} instances for asymmetric algorithms must not be of type \"secret\"`);\n }\n if (key.type === 'public') {\n switch (usage) {\n case 'sign':\n throw new TypeError(`${tag(key)} instances for asymmetric algorithm signing must be of type \"private\"`);\n case 'decrypt':\n throw new TypeError(`${tag(key)} instances for asymmetric algorithm decryption must be of type \"private\"`);\n }\n }\n if (key.type === 'private') {\n switch (usage) {\n case 'verify':\n throw new TypeError(`${tag(key)} instances for asymmetric algorithm verifying must be of type \"public\"`);\n case 'encrypt':\n throw new TypeError(`${tag(key)} instances for asymmetric algorithm encryption must be of type \"public\"`);\n }\n }\n};\nexport function checkKeyType(alg, key, usage) {\n switch (alg.substring(0, 2)) {\n case 'A1':\n case 'A2':\n case 'di':\n case 'HS':\n case 'PB':\n symmetricTypeCheck(alg, key, usage);\n break;\n default:\n asymmetricTypeCheck(alg, key, usage);\n }\n}\n","import { decode as b64u } from '../../util/base64url.js';\nimport { verify } from '../../lib/signing.js';\nimport { JOSEAlgNotAllowed, JWSInvalid, JWSSignatureVerificationFailed } from '../../util/errors.js';\nimport { concat, encoder, decoder, encode } from '../../lib/buffer_utils.js';\nimport { decodeBase64url } from '../../lib/helpers.js';\nimport { isDisjoint } from '../../lib/type_checks.js';\nimport { isObject } from '../../lib/type_checks.js';\nimport { checkKeyType } from '../../lib/check_key_type.js';\nimport { validateCrit } from '../../lib/validate_crit.js';\nimport { validateAlgorithms } from '../../lib/validate_algorithms.js';\nimport { normalizeKey } from '../../lib/normalize_key.js';\nexport async function flattenedVerify(jws, key, options) {\n if (!isObject(jws)) {\n throw new JWSInvalid('Flattened JWS must be an object');\n }\n if (jws.protected === undefined && jws.header === undefined) {\n throw new JWSInvalid('Flattened JWS must have either of the \"protected\" or \"header\" members');\n }\n if (jws.protected !== undefined && typeof jws.protected !== 'string') {\n throw new JWSInvalid('JWS Protected Header incorrect type');\n }\n if (jws.payload === undefined) {\n throw new JWSInvalid('JWS Payload missing');\n }\n if (typeof jws.signature !== 'string') {\n throw new JWSInvalid('JWS Signature missing or incorrect type');\n }\n if (jws.header !== undefined && !isObject(jws.header)) {\n throw new JWSInvalid('JWS Unprotected Header incorrect type');\n }\n let parsedProt = {};\n if (jws.protected) {\n try {\n const protectedHeader = b64u(jws.protected);\n parsedProt = JSON.parse(decoder.decode(protectedHeader));\n }\n catch {\n throw new JWSInvalid('JWS Protected Header is invalid');\n }\n }\n if (!isDisjoint(parsedProt, jws.header)) {\n throw new JWSInvalid('JWS Protected and JWS Unprotected Header Parameter names must be disjoint');\n }\n const joseHeader = {\n ...parsedProt,\n ...jws.header,\n };\n const extensions = validateCrit(JWSInvalid, new Map([['b64', true]]), options?.crit, parsedProt, joseHeader);\n let b64 = true;\n if (extensions.has('b64')) {\n b64 = parsedProt.b64;\n if (typeof b64 !== 'boolean') {\n throw new JWSInvalid('The \"b64\" (base64url-encode payload) Header Parameter must be a boolean');\n }\n }\n const { alg } = joseHeader;\n if (typeof alg !== 'string' || !alg) {\n throw new JWSInvalid('JWS \"alg\" (Algorithm) Header Parameter missing or invalid');\n }\n const algorithms = options && validateAlgorithms('algorithms', options.algorithms);\n if (algorithms && !algorithms.has(alg)) {\n throw new JOSEAlgNotAllowed('\"alg\" (Algorithm) Header Parameter value not allowed');\n }\n if (b64) {\n if (typeof jws.payload !== 'string') {\n throw new JWSInvalid('JWS Payload must be a string');\n }\n }\n else if (typeof jws.payload !== 'string' && !(jws.payload instanceof Uint8Array)) {\n throw new JWSInvalid('JWS Payload must be a string or an Uint8Array instance');\n }\n let resolvedKey = false;\n if (typeof key === 'function') {\n key = await key(parsedProt, jws);\n resolvedKey = true;\n }\n checkKeyType(alg, key, 'verify');\n const data = concat(jws.protected !== undefined ? encode(jws.protected) : new Uint8Array(), encode('.'), typeof jws.payload === 'string'\n ? b64\n ? encode(jws.payload)\n : encoder.encode(jws.payload)\n : jws.payload);\n const signature = decodeBase64url(jws.signature, 'signature', JWSInvalid);\n const k = await normalizeKey(key, alg);\n const verified = await verify(alg, k, signature, data);\n if (!verified) {\n throw new JWSSignatureVerificationFailed();\n }\n let payload;\n if (b64) {\n payload = decodeBase64url(jws.payload, 'payload', JWSInvalid);\n }\n else if (typeof jws.payload === 'string') {\n payload = encoder.encode(jws.payload);\n }\n else {\n payload = jws.payload;\n }\n const result = { payload };\n if (jws.protected !== undefined) {\n result.protectedHeader = parsedProt;\n }\n if (jws.header !== undefined) {\n result.unprotectedHeader = jws.header;\n }\n if (resolvedKey) {\n return { ...result, key: k };\n }\n return result;\n}\n","import { flattenedVerify } from '../flattened/verify.js';\nimport { JWSInvalid } from '../../util/errors.js';\nimport { decoder } from '../../lib/buffer_utils.js';\nexport async function compactVerify(jws, key, options) {\n if (jws instanceof Uint8Array) {\n jws = decoder.decode(jws);\n }\n if (typeof jws !== 'string') {\n throw new JWSInvalid('Compact JWS must be a string or Uint8Array');\n }\n const { 0: protectedHeader, 1: payload, 2: signature, length } = jws.split('.');\n if (length !== 3) {\n throw new JWSInvalid('Invalid Compact JWS');\n }\n const verified = await flattenedVerify({ payload, protected: protectedHeader, signature }, key, options);\n const result = { payload: verified.payload, protectedHeader: verified.protectedHeader };\n if (typeof key === 'function') {\n return { ...result, key: verified.key };\n }\n return result;\n}\n","import { JWTClaimValidationFailed, JWTExpired, JWTInvalid } from '../util/errors.js';\nimport { encoder, decoder } from './buffer_utils.js';\nimport { isObject } from './type_checks.js';\nconst epoch = (date) => Math.floor(date.getTime() / 1000);\nconst minute = 60;\nconst hour = minute * 60;\nconst day = hour * 24;\nconst week = day * 7;\nconst year = day * 365.25;\nconst REGEX = /^(\\+|\\-)? ?(\\d+|\\d+\\.\\d+) ?(seconds?|secs?|s|minutes?|mins?|m|hours?|hrs?|h|days?|d|weeks?|w|years?|yrs?|y)(?: (ago|from now))?$/i;\nexport function secs(str) {\n const matched = REGEX.exec(str);\n if (!matched || (matched[4] && matched[1])) {\n throw new TypeError('Invalid time period format');\n }\n const value = parseFloat(matched[2]);\n const unit = matched[3].toLowerCase();\n let numericDate;\n switch (unit) {\n case 'sec':\n case 'secs':\n case 'second':\n case 'seconds':\n case 's':\n numericDate = Math.round(value);\n break;\n case 'minute':\n case 'minutes':\n case 'min':\n case 'mins':\n case 'm':\n numericDate = Math.round(value * minute);\n break;\n case 'hour':\n case 'hours':\n case 'hr':\n case 'hrs':\n case 'h':\n numericDate = Math.round(value * hour);\n break;\n case 'day':\n case 'days':\n case 'd':\n numericDate = Math.round(value * day);\n break;\n case 'week':\n case 'weeks':\n case 'w':\n numericDate = Math.round(value * week);\n break;\n default:\n numericDate = Math.round(value * year);\n break;\n }\n if (matched[1] === '-' || matched[4] === 'ago') {\n return -numericDate;\n }\n return numericDate;\n}\nfunction validateInput(label, input) {\n if (!Number.isFinite(input)) {\n throw new TypeError(`Invalid ${label} input`);\n }\n return input;\n}\nconst normalizeTyp = (value) => {\n if (value.includes('/')) {\n return value.toLowerCase();\n }\n return `application/${value.toLowerCase()}`;\n};\nconst checkAudiencePresence = (audPayload, audOption) => {\n if (typeof audPayload === 'string') {\n return audOption.includes(audPayload);\n }\n if (Array.isArray(audPayload)) {\n return audOption.some(Set.prototype.has.bind(new Set(audPayload)));\n }\n return false;\n};\nexport function validateClaimsSet(protectedHeader, encodedPayload, options = {}) {\n let payload;\n try {\n payload = JSON.parse(decoder.decode(encodedPayload));\n }\n catch {\n }\n if (!isObject(payload)) {\n throw new JWTInvalid('JWT Claims Set must be a top-level JSON object');\n }\n const { typ } = options;\n if (typ &&\n (typeof protectedHeader.typ !== 'string' ||\n normalizeTyp(protectedHeader.typ) !== normalizeTyp(typ))) {\n throw new JWTClaimValidationFailed('unexpected \"typ\" JWT header value', payload, 'typ', 'check_failed');\n }\n const { requiredClaims = [], issuer, subject, audience, maxTokenAge } = options;\n const presenceCheck = [...requiredClaims];\n if (maxTokenAge !== undefined)\n presenceCheck.push('iat');\n if (audience !== undefined)\n presenceCheck.push('aud');\n if (subject !== undefined)\n presenceCheck.push('sub');\n if (issuer !== undefined)\n presenceCheck.push('iss');\n for (const claim of new Set(presenceCheck.reverse())) {\n if (!(claim in payload)) {\n throw new JWTClaimValidationFailed(`missing required \"${claim}\" claim`, payload, claim, 'missing');\n }\n }\n if (issuer &&\n !(Array.isArray(issuer) ? issuer : [issuer]).includes(payload.iss)) {\n throw new JWTClaimValidationFailed('unexpected \"iss\" claim value', payload, 'iss', 'check_failed');\n }\n if (subject && payload.sub !== subject) {\n throw new JWTClaimValidationFailed('unexpected \"sub\" claim value', payload, 'sub', 'check_failed');\n }\n if (audience &&\n !checkAudiencePresence(payload.aud, typeof audience === 'string' ? [audience] : audience)) {\n throw new JWTClaimValidationFailed('unexpected \"aud\" claim value', payload, 'aud', 'check_failed');\n }\n let tolerance;\n switch (typeof options.clockTolerance) {\n case 'string':\n tolerance = secs(options.clockTolerance);\n break;\n case 'number':\n tolerance = options.clockTolerance;\n break;\n case 'undefined':\n tolerance = 0;\n break;\n default:\n throw new TypeError('Invalid clockTolerance option type');\n }\n const { currentDate } = options;\n const now = epoch(currentDate || new Date());\n if ((payload.iat !== undefined || maxTokenAge) && typeof payload.iat !== 'number') {\n throw new JWTClaimValidationFailed('\"iat\" claim must be a number', payload, 'iat', 'invalid');\n }\n if (payload.nbf !== undefined) {\n if (typeof payload.nbf !== 'number') {\n throw new JWTClaimValidationFailed('\"nbf\" claim must be a number', payload, 'nbf', 'invalid');\n }\n if (payload.nbf > now + tolerance) {\n throw new JWTClaimValidationFailed('\"nbf\" claim timestamp check failed', payload, 'nbf', 'check_failed');\n }\n }\n if (payload.exp !== undefined) {\n if (typeof payload.exp !== 'number') {\n throw new JWTClaimValidationFailed('\"exp\" claim must be a number', payload, 'exp', 'invalid');\n }\n if (payload.exp <= now - tolerance) {\n throw new JWTExpired('\"exp\" claim timestamp check failed', payload, 'exp', 'check_failed');\n }\n }\n if (maxTokenAge) {\n const age = now - payload.iat;\n const max = typeof maxTokenAge === 'number' ? maxTokenAge : secs(maxTokenAge);\n if (age - tolerance > max) {\n throw new JWTExpired('\"iat\" claim timestamp check failed (too far in the past)', payload, 'iat', 'check_failed');\n }\n if (age < 0 - tolerance) {\n throw new JWTClaimValidationFailed('\"iat\" claim timestamp check failed (it should be in the past)', payload, 'iat', 'check_failed');\n }\n }\n return payload;\n}\nexport class JWTClaimsBuilder {\n #payload;\n constructor(payload) {\n if (!isObject(payload)) {\n throw new TypeError('JWT Claims Set MUST be an object');\n }\n this.#payload = structuredClone(payload);\n }\n data() {\n return encoder.encode(JSON.stringify(this.#payload));\n }\n get iss() {\n return this.#payload.iss;\n }\n set iss(value) {\n this.#payload.iss = value;\n }\n get sub() {\n return this.#payload.sub;\n }\n set sub(value) {\n this.#payload.sub = value;\n }\n get aud() {\n return this.#payload.aud;\n }\n set aud(value) {\n this.#payload.aud = value;\n }\n set jti(value) {\n this.#payload.jti = value;\n }\n set nbf(value) {\n if (typeof value === 'number') {\n this.#payload.nbf = validateInput('setNotBefore', value);\n }\n else if (value instanceof Date) {\n this.#payload.nbf = validateInput('setNotBefore', epoch(value));\n }\n else {\n this.#payload.nbf = epoch(new Date()) + secs(value);\n }\n }\n set exp(value) {\n if (typeof value === 'number') {\n this.#payload.exp = validateInput('setExpirationTime', value);\n }\n else if (value instanceof Date) {\n this.#payload.exp = validateInput('setExpirationTime', epoch(value));\n }\n else {\n this.#payload.exp = epoch(new Date()) + secs(value);\n }\n }\n set iat(value) {\n if (value === undefined) {\n this.#payload.iat = epoch(new Date());\n }\n else if (value instanceof Date) {\n this.#payload.iat = validateInput('setIssuedAt', epoch(value));\n }\n else if (typeof value === 'string') {\n this.#payload.iat = validateInput('setIssuedAt', epoch(new Date()) + secs(value));\n }\n else {\n this.#payload.iat = validateInput('setIssuedAt', value);\n }\n }\n}\n","import { compactVerify } from '../jws/compact/verify.js';\nimport { validateClaimsSet } from '../lib/jwt_claims_set.js';\nimport { JWTInvalid } from '../util/errors.js';\nexport async function jwtVerify(jwt, key, options) {\n const verified = await compactVerify(jwt, key, options);\n if (verified.protectedHeader.crit?.includes('b64') && verified.protectedHeader.b64 === false) {\n throw new JWTInvalid('JWTs MUST NOT use unencoded payload');\n }\n const payload = validateClaimsSet(verified.protectedHeader, verified.payload, options);\n const result = { payload, protectedHeader: verified.protectedHeader };\n if (typeof key === 'function') {\n return { ...result, key: verified.key };\n }\n return result;\n}\n","import { encode as b64u } from '../../util/base64url.js';\nimport { sign } from '../../lib/signing.js';\nimport { isDisjoint } from '../../lib/type_checks.js';\nimport { JWSInvalid } from '../../util/errors.js';\nimport { concat, encode } from '../../lib/buffer_utils.js';\nimport { checkKeyType } from '../../lib/check_key_type.js';\nimport { validateCrit } from '../../lib/validate_crit.js';\nimport { normalizeKey } from '../../lib/normalize_key.js';\nimport { assertNotSet } from '../../lib/helpers.js';\nexport class FlattenedSign {\n #payload;\n #protectedHeader;\n #unprotectedHeader;\n constructor(payload) {\n if (!(payload instanceof Uint8Array)) {\n throw new TypeError('payload must be an instance of Uint8Array');\n }\n this.#payload = payload;\n }\n setProtectedHeader(protectedHeader) {\n assertNotSet(this.#protectedHeader, 'setProtectedHeader');\n this.#protectedHeader = protectedHeader;\n return this;\n }\n setUnprotectedHeader(unprotectedHeader) {\n assertNotSet(this.#unprotectedHeader, 'setUnprotectedHeader');\n this.#unprotectedHeader = unprotectedHeader;\n return this;\n }\n async sign(key, options) {\n if (!this.#protectedHeader && !this.#unprotectedHeader) {\n throw new JWSInvalid('either setProtectedHeader or setUnprotectedHeader must be called before #sign()');\n }\n if (!isDisjoint(this.#protectedHeader, this.#unprotectedHeader)) {\n throw new JWSInvalid('JWS Protected and JWS Unprotected Header Parameter names must be disjoint');\n }\n const joseHeader = {\n ...this.#protectedHeader,\n ...this.#unprotectedHeader,\n };\n const extensions = validateCrit(JWSInvalid, new Map([['b64', true]]), options?.crit, this.#protectedHeader, joseHeader);\n let b64 = true;\n if (extensions.has('b64')) {\n b64 = this.#protectedHeader.b64;\n if (typeof b64 !== 'boolean') {\n throw new JWSInvalid('The \"b64\" (base64url-encode payload) Header Parameter must be a boolean');\n }\n }\n const { alg } = joseHeader;\n if (typeof alg !== 'string' || !alg) {\n throw new JWSInvalid('JWS \"alg\" (Algorithm) Header Parameter missing or invalid');\n }\n checkKeyType(alg, key, 'sign');\n let payloadS;\n let payloadB;\n if (b64) {\n payloadS = b64u(this.#payload);\n payloadB = encode(payloadS);\n }\n else {\n payloadB = this.#payload;\n payloadS = '';\n }\n let protectedHeaderString;\n let protectedHeaderBytes;\n if (this.#protectedHeader) {\n protectedHeaderString = b64u(JSON.stringify(this.#protectedHeader));\n protectedHeaderBytes = encode(protectedHeaderString);\n }\n else {\n protectedHeaderString = '';\n protectedHeaderBytes = new Uint8Array();\n }\n const data = concat(protectedHeaderBytes, encode('.'), payloadB);\n const k = await normalizeKey(key, alg);\n const signature = await sign(alg, k, data);\n const jws = {\n signature: b64u(signature),\n payload: payloadS,\n };\n if (this.#unprotectedHeader) {\n jws.header = this.#unprotectedHeader;\n }\n if (this.#protectedHeader) {\n jws.protected = protectedHeaderString;\n }\n return jws;\n }\n}\n","import { FlattenedSign } from '../flattened/sign.js';\nexport class CompactSign {\n #flattened;\n constructor(payload) {\n this.#flattened = new FlattenedSign(payload);\n }\n setProtectedHeader(protectedHeader) {\n this.#flattened.setProtectedHeader(protectedHeader);\n return this;\n }\n async sign(key, options) {\n const jws = await this.#flattened.sign(key, options);\n if (jws.payload === undefined) {\n throw new TypeError('use the flattened module for creating JWS with b64: false');\n }\n return `${jws.protected}.${jws.payload}.${jws.signature}`;\n }\n}\n","import { CompactSign } from '../jws/compact/sign.js';\nimport { JWTInvalid } from '../util/errors.js';\nimport { JWTClaimsBuilder } from '../lib/jwt_claims_set.js';\nexport class SignJWT {\n #protectedHeader;\n #jwt;\n constructor(payload = {}) {\n this.#jwt = new JWTClaimsBuilder(payload);\n }\n setIssuer(issuer) {\n this.#jwt.iss = issuer;\n return this;\n }\n setSubject(subject) {\n this.#jwt.sub = subject;\n return this;\n }\n setAudience(audience) {\n this.#jwt.aud = audience;\n return this;\n }\n setJti(jwtId) {\n this.#jwt.jti = jwtId;\n return this;\n }\n setNotBefore(input) {\n this.#jwt.nbf = input;\n return this;\n }\n setExpirationTime(input) {\n this.#jwt.exp = input;\n return this;\n }\n setIssuedAt(input) {\n this.#jwt.iat = input;\n return this;\n }\n setProtectedHeader(protectedHeader) {\n this.#protectedHeader = protectedHeader;\n return this;\n }\n async sign(key, options) {\n const sig = new CompactSign(this.#jwt.data());\n sig.setProtectedHeader(this.#protectedHeader);\n if (Array.isArray(this.#protectedHeader?.crit) &&\n this.#protectedHeader.crit.includes('b64') &&\n this.#protectedHeader.b64 === false) {\n throw new JWTInvalid('JWTs MUST NOT use unencoded payload');\n }\n return sig.sign(key, options);\n }\n}\n","import { Store, type Collection } from \"@internal/core\";\nimport type {\n VercelUser, VercelTeam, VercelTeamMember, VercelProject, VercelDeployment,\n VercelDeploymentAlias, VercelBuild, VercelDeploymentEvent, VercelFile,\n VercelDeploymentFile, VercelDomain, VercelEnvVar, VercelProtectionBypass, VercelIntegration, VercelApiKey,\n} from \"./entities.js\";\n\nexport interface VercelStore {\n users: Collection<VercelUser>;\n teams: Collection<VercelTeam>;\n teamMembers: Collection<VercelTeamMember>;\n projects: Collection<VercelProject>;\n deployments: Collection<VercelDeployment>;\n deploymentAliases: Collection<VercelDeploymentAlias>;\n builds: Collection<VercelBuild>;\n deploymentEvents: Collection<VercelDeploymentEvent>;\n files: Collection<VercelFile>;\n deploymentFiles: Collection<VercelDeploymentFile>;\n domains: Collection<VercelDomain>;\n envVars: Collection<VercelEnvVar>;\n protectionBypasses: Collection<VercelProtectionBypass>;\n apiKeys: Collection<VercelApiKey>;\n integrations: Collection<VercelIntegration>;\n}\n\nexport function getVercelStore(store: Store): VercelStore {\n return {\n users: store.collection<VercelUser>(\"vercel.users\", [\"uid\", \"username\"]),\n teams: store.collection<VercelTeam>(\"vercel.teams\", [\"uid\", \"slug\"]),\n teamMembers: store.collection<VercelTeamMember>(\"vercel.team_members\", [\"teamId\", \"userId\"]),\n projects: store.collection<VercelProject>(\"vercel.projects\", [\"uid\", \"name\", \"accountId\"]),\n deployments: store.collection<VercelDeployment>(\"vercel.deployments\", [\"uid\", \"projectId\", \"url\"]),\n deploymentAliases: store.collection<VercelDeploymentAlias>(\"vercel.deployment_aliases\", [\"deploymentId\", \"projectId\"]),\n builds: store.collection<VercelBuild>(\"vercel.builds\", [\"deploymentId\"]),\n deploymentEvents: store.collection<VercelDeploymentEvent>(\"vercel.deployment_events\", [\"deploymentId\"]),\n files: store.collection<VercelFile>(\"vercel.files\", [\"digest\"]),\n deploymentFiles: store.collection<VercelDeploymentFile>(\"vercel.deployment_files\", [\"deploymentId\"]),\n domains: store.collection<VercelDomain>(\"vercel.domains\", [\"projectId\", \"name\"]),\n envVars: store.collection<VercelEnvVar>(\"vercel.env_vars\", [\"projectId\", \"uid\"]),\n protectionBypasses: store.collection<VercelProtectionBypass>(\"vercel.protection_bypasses\", [\"projectId\"]),\n apiKeys: store.collection<VercelApiKey>(\"vercel.api_keys\", [\"uid\", \"teamId\", \"userId\"]),\n integrations: store.collection<VercelIntegration>(\"vercel.integrations\", [\"client_id\"]),\n };\n}\n","import { randomBytes } from \"crypto\";\nimport type { Context } from \"hono\";\nimport type { VercelUser, VercelTeam, VercelProject, VercelDeployment, VercelDomain, VercelEnvVar, VercelDeploymentAlias, VercelBuild } from \"./entities.js\";\nimport type { VercelStore } from \"./store.js\";\n\nexport function generateUid(prefix = \"\"): string {\n const id = randomBytes(12).toString(\"base64url\").slice(0, 20);\n return prefix ? `${prefix}_${id}` : id;\n}\n\nexport function generateSecret(): string {\n return randomBytes(32).toString(\"base64url\");\n}\n\nexport function nowMs(): number {\n return Date.now();\n}\n\nexport function resolveTeamScope(c: Context, vs: VercelStore): { accountId: string; team: VercelTeam | null } | null {\n const teamId = c.req.query(\"teamId\");\n const slug = c.req.query(\"slug\");\n\n if (teamId) {\n const team = vs.teams.findOneBy(\"uid\", teamId);\n if (!team) return null;\n return { accountId: team.uid, team };\n }\n\n if (slug) {\n const team = vs.teams.findOneBy(\"slug\", slug);\n if (!team) return null;\n return { accountId: team.uid, team };\n }\n\n const authUser = c.get(\"authUser\") as { login: string; id: number } | undefined;\n if (!authUser) return null;\n\n const user = vs.users.findOneBy(\"username\", authUser.login);\n if (!user) return null;\n\n return { accountId: user.uid, team: null };\n}\n\nexport function lookupProject(vs: VercelStore, idOrName: string, accountId: string): VercelProject | undefined {\n let project = vs.projects.findOneBy(\"uid\", idOrName);\n if (project && project.accountId === accountId) return project;\n\n const byName = vs.projects.findBy(\"name\", idOrName);\n return byName.find((p) => p.accountId === accountId);\n}\n\nexport interface CursorPagination {\n limit: number;\n since?: number;\n until?: number;\n from?: number;\n}\n\nexport function parseCursorPagination(c: Context): CursorPagination {\n return {\n limit: Math.min(100, Math.max(1, parseInt(c.req.query(\"limit\") ?? \"20\", 10) || 20)),\n since: c.req.query(\"since\") ? parseInt(c.req.query(\"since\")!, 10) : undefined,\n until: c.req.query(\"until\") ? parseInt(c.req.query(\"until\")!, 10) : undefined,\n from: c.req.query(\"from\") ? parseInt(c.req.query(\"from\")!, 10) : undefined,\n };\n}\n\nexport function applyCursorPagination<T extends { created_at: string }>(\n items: T[],\n pagination: CursorPagination\n): { items: T[]; pagination: { count: number; next: number | null; prev: number | null } } {\n let filtered = [...items].sort((a, b) => new Date(b.created_at).getTime() - new Date(a.created_at).getTime());\n\n if (pagination.since !== undefined) {\n filtered = filtered.filter((i) => new Date(i.created_at).getTime() > pagination.since!);\n }\n if (pagination.until !== undefined) {\n filtered = filtered.filter((i) => new Date(i.created_at).getTime() <= pagination.until!);\n }\n\n const total = filtered.length;\n const limited = filtered.slice(0, pagination.limit);\n const hasNext = total > pagination.limit;\n\n return {\n items: limited,\n pagination: {\n count: limited.length,\n next: hasNext && limited.length > 0 ? new Date(limited[limited.length - 1].created_at).getTime() : null,\n prev: limited.length > 0 ? new Date(limited[0].created_at).getTime() : null,\n },\n };\n}\n\nexport function formatUser(user: VercelUser) {\n return {\n id: user.uid,\n email: user.email,\n name: user.name,\n username: user.username,\n avatar: user.avatar,\n defaultTeamId: user.defaultTeamId,\n version: user.version,\n createdAt: new Date(user.created_at).getTime(),\n softBlock: user.softBlock,\n billing: user.billing,\n resourceConfig: user.resourceConfig,\n stagingPrefix: user.stagingPrefix,\n };\n}\n\nexport function formatTeam(team: VercelTeam) {\n return {\n id: team.uid,\n slug: team.slug,\n name: team.name,\n avatar: team.avatar,\n description: team.description,\n creatorId: team.creatorId,\n createdAt: new Date(team.created_at).getTime(),\n updatedAt: new Date(team.updated_at).getTime(),\n membership: team.membership,\n billing: team.billing,\n resourceConfig: team.resourceConfig,\n stagingPrefix: team.stagingPrefix,\n };\n}\n\nexport function formatProject(project: VercelProject, baseUrl: string) {\n return {\n accountId: project.accountId,\n autoAssignCustomDomains: project.autoAssignCustomDomains,\n autoAssignCustomDomainsUpdatedBy: project.autoAssignCustomDomainsUpdatedBy,\n buildCommand: project.buildCommand,\n createdAt: new Date(project.created_at).getTime(),\n devCommand: project.devCommand,\n directoryListing: false,\n framework: project.framework,\n gitForkProtection: project.gitForkProtection,\n gitComments: project.gitComments,\n id: project.uid,\n installCommand: project.installCommand,\n name: project.name,\n nodeVersion: project.nodeVersion,\n outputDirectory: project.outputDirectory,\n publicSource: project.publicSource,\n rootDirectory: project.rootDirectory,\n commandForIgnoringBuildStep: project.commandForIgnoringBuildStep,\n serverlessFunctionRegion: project.serverlessFunctionRegion,\n sourceFilesOutsideRootDirectory: project.sourceFilesOutsideRootDirectory,\n updatedAt: new Date(project.updated_at).getTime(),\n live: project.live,\n link: project.link,\n latestDeployments: project.latestDeployments,\n targets: project.targets,\n protectionBypass: project.protectionBypass,\n passwordProtection: project.passwordProtection,\n ssoProtection: project.ssoProtection,\n trustedIps: project.trustedIps,\n connectConfigurationId: project.connectConfigurationId,\n webAnalytics: project.webAnalytics,\n speedInsights: project.speedInsights,\n oidcTokenConfig: project.oidcTokenConfig,\n tier: project.tier,\n };\n}\n\nexport function formatDeployment(dep: VercelDeployment, vs: VercelStore, baseUrl: string) {\n const project = vs.projects.findOneBy(\"uid\", dep.projectId);\n const creator = vs.users.findOneBy(\"uid\", dep.creatorId);\n const aliases = vs.deploymentAliases.findBy(\"deploymentId\", dep.uid);\n\n return {\n uid: dep.uid,\n id: dep.uid,\n name: dep.name,\n url: dep.url,\n created: new Date(dep.created_at).getTime(),\n createdAt: new Date(dep.created_at).getTime(),\n source: dep.source,\n state: dep.state,\n readyState: dep.readyState,\n readySubstate: dep.readySubstate,\n type: \"LAMBDAS\",\n creator: creator ? { uid: creator.uid, email: creator.email, username: creator.username } : null,\n inspectorUrl: dep.inspectorUrl,\n meta: dep.meta,\n target: dep.target,\n aliasAssigned: dep.aliasAssigned,\n aliasError: dep.aliasError,\n buildingAt: dep.buildingAt,\n readyAt: dep.readyAt,\n bootedAt: dep.bootedAt,\n canceledAt: dep.canceledAt,\n errorCode: dep.errorCode,\n errorMessage: dep.errorMessage,\n regions: dep.regions,\n functions: dep.functions,\n routes: dep.routes,\n plan: dep.plan,\n projectId: dep.projectId,\n gitSource: dep.gitSource,\n alias: aliases.map((a) => a.alias),\n };\n}\n\nexport function formatDeploymentBrief(dep: VercelDeployment, vs: VercelStore) {\n const creator = vs.users.findOneBy(\"uid\", dep.creatorId);\n return {\n uid: dep.uid,\n name: dep.name,\n url: dep.url,\n created: new Date(dep.created_at).getTime(),\n state: dep.state,\n readyState: dep.readyState,\n type: \"LAMBDAS\",\n creator: creator ? { uid: creator.uid, email: creator.email, username: creator.username } : null,\n meta: dep.meta,\n target: dep.target,\n aliasAssigned: dep.aliasAssigned,\n projectId: dep.projectId,\n };\n}\n\nexport function formatDomain(domain: VercelDomain) {\n return {\n name: domain.name,\n apexName: domain.apexName,\n projectId: domain.projectId,\n redirect: domain.redirect,\n redirectStatusCode: domain.redirectStatusCode,\n gitBranch: domain.gitBranch,\n customEnvironmentId: domain.customEnvironmentId,\n updatedAt: new Date(domain.updated_at).getTime(),\n createdAt: new Date(domain.created_at).getTime(),\n verified: domain.verified,\n verification: domain.verified ? [] : domain.verification,\n };\n}\n\nexport function formatEnvVar(env: VercelEnvVar, decrypt = false) {\n return {\n type: env.type,\n id: env.uid,\n key: env.key,\n value: decrypt || env.type === \"plain\" ? env.value : \"\",\n target: env.target,\n gitBranch: env.gitBranch,\n customEnvironmentIds: env.customEnvironmentIds,\n configurationId: null,\n createdAt: new Date(env.created_at).getTime(),\n updatedAt: new Date(env.updated_at).getTime(),\n createdBy: null,\n updatedBy: null,\n comment: env.comment ?? \"\",\n };\n}\n","import type { Context } from \"hono\";\nimport type { ContentfulStatusCode } from \"hono/utils/http-status\";\nimport type { RouteContext } from \"@internal/core\";\nimport { ApiError, parseJsonBody } from \"@internal/core\";\nexport { ApiError };\nimport { getVercelStore } from \"../store.js\";\nimport type { VercelStore } from \"../store.js\";\nimport type { VercelTeam, VercelTeamMember, VercelUser } from \"../entities.js\";\nimport {\n applyCursorPagination,\n formatTeam,\n formatUser,\n generateUid,\n parseCursorPagination,\n resolveTeamScope,\n} from \"../helpers.js\";\n\nfunction vercelErr(c: Context, status: ContentfulStatusCode, code: string, message: string) {\n return c.json({ error: { code, message } }, status);\n}\n\nfunction resolveTeamByIdOrSlug(vs: VercelStore, teamIdOrSlug: string): VercelTeam | undefined {\n return (\n vs.teams.findOneBy(\"uid\", teamIdOrSlug as VercelTeam[\"uid\"]) ??\n vs.teams.findOneBy(\"slug\", teamIdOrSlug as VercelTeam[\"slug\"])\n );\n}\n\nfunction getTeamMember(vs: VercelStore, teamUid: string, userUid: string): VercelTeamMember | undefined {\n return vs.teamMembers.findBy(\"teamId\", teamUid as VercelTeamMember[\"teamId\"]).find((m) => m.userId === userUid);\n}\n\nfunction formatTeamForViewer(team: VercelTeam, member: VercelTeamMember | undefined) {\n return {\n ...formatTeam(team),\n membership: member\n ? { confirmed: member.confirmed, role: member.role }\n : { confirmed: false, role: \"VIEWER\" as const },\n };\n}\n\nfunction formatMemberRow(vs: VercelStore, m: VercelTeamMember) {\n const user = vs.users.findOneBy(\"uid\", m.userId as VercelUser[\"uid\"]);\n return {\n id: String(m.id),\n role: m.role,\n confirmed: m.confirmed,\n joinedFrom: m.joinedFrom,\n user: user ? formatUser(user) : null,\n };\n}\n\nconst TEAM_ROLES: VercelTeamMember[\"role\"][] = [\"OWNER\", \"MEMBER\", \"DEVELOPER\", \"VIEWER\"];\n\nfunction parseRole(value: unknown, fallback: VercelTeamMember[\"role\"]): VercelTeamMember[\"role\"] | null {\n if (value === undefined || value === null) return fallback;\n if (typeof value !== \"string\") return null;\n return TEAM_ROLES.includes(value as VercelTeamMember[\"role\"]) ? (value as VercelTeamMember[\"role\"]) : null;\n}\n\nfunction defaultTeamBilling(): VercelTeam[\"billing\"] {\n return { plan: \"hobby\", period: null, trial: null, cancelation: null, addons: null };\n}\n\nfunction defaultTeamResourceConfig(): VercelTeam[\"resourceConfig\"] {\n return { nodeType: \"standard\", concurrentBuilds: 1 };\n}\n\nexport function userRoutes({ app, store }: RouteContext): void {\n const vs = getVercelStore(store);\n\n app.get(\"/registration\", (c) => c.json({ registration: false }));\n\n app.get(\"/v2/user\", (c) => {\n const auth = c.get(\"authUser\");\n if (!auth) {\n return vercelErr(c, 401, \"not_authenticated\", \"Authentication required\");\n }\n const user = vs.users.findOneBy(\"username\", auth.login as VercelUser[\"username\"]);\n if (!user) {\n return vercelErr(c, 403, \"forbidden\", \"User not found\");\n }\n return c.json({ user: formatUser(user) });\n });\n\n app.patch(\"/v2/user\", async (c) => {\n const auth = c.get(\"authUser\");\n if (!auth) {\n return vercelErr(c, 401, \"not_authenticated\", \"Authentication required\");\n }\n const existing = vs.users.findOneBy(\"username\", auth.login as VercelUser[\"username\"]);\n if (!existing) {\n return vercelErr(c, 403, \"forbidden\", \"User not found\");\n }\n\n const body = await parseJsonBody(c);\n const patch: Partial<Pick<VercelUser, \"name\" | \"email\">> = {};\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 && typeof body.email === \"string\") {\n patch.email = body.email;\n }\n\n const updated = vs.users.update(existing.id, patch);\n if (!updated) {\n return vercelErr(c, 500, \"internal_error\", \"Failed to update user\");\n }\n return c.json({ user: formatUser(updated) });\n });\n\n app.get(\"/v2/teams\", (c) => {\n const auth = c.get(\"authUser\");\n if (!auth) {\n return vercelErr(c, 401, \"not_authenticated\", \"Authentication required\");\n }\n const user = vs.users.findOneBy(\"username\", auth.login as VercelUser[\"username\"]);\n if (!user) {\n return vercelErr(c, 403, \"forbidden\", \"User not found\");\n }\n\n const pagination = parseCursorPagination(c);\n const memberships = vs.teamMembers.findBy(\"userId\", user.uid as VercelTeamMember[\"userId\"]);\n let teams = memberships\n .map((m) => vs.teams.findOneBy(\"uid\", m.teamId as VercelTeam[\"uid\"]))\n .filter((t): t is VercelTeam => Boolean(t));\n\n if (c.req.query(\"teamId\") || c.req.query(\"slug\")) {\n const scope = resolveTeamScope(c, vs);\n const scopedTeam = scope?.team;\n if (!scopedTeam) {\n return vercelErr(c, 404, \"not_found\", \"Team not found\");\n }\n teams = teams.filter((t) => t.uid === scopedTeam.uid);\n }\n\n const { items, pagination: pageMeta } = applyCursorPagination(teams, pagination);\n const formatted = items.map((team) => {\n const member = getTeamMember(vs, team.uid, user.uid);\n return formatTeamForViewer(team, member);\n });\n\n return c.json({\n teams: formatted,\n pagination: pageMeta,\n });\n });\n\n app.get(\"/v2/teams/:teamId\", (c) => {\n const auth = c.get(\"authUser\");\n if (!auth) {\n return vercelErr(c, 401, \"not_authenticated\", \"Authentication required\");\n }\n const user = vs.users.findOneBy(\"username\", auth.login as VercelUser[\"username\"]);\n if (!user) {\n return vercelErr(c, 403, \"forbidden\", \"User not found\");\n }\n\n const team = resolveTeamByIdOrSlug(vs, c.req.param(\"teamId\"));\n if (!team) {\n return vercelErr(c, 404, \"not_found\", \"Team not found\");\n }\n const member = getTeamMember(vs, team.uid, user.uid);\n return c.json({ team: formatTeamForViewer(team, member) });\n });\n\n app.post(\"/v2/teams\", async (c) => {\n const auth = c.get(\"authUser\");\n if (!auth) {\n return vercelErr(c, 401, \"not_authenticated\", \"Authentication required\");\n }\n const creator = vs.users.findOneBy(\"username\", auth.login as VercelUser[\"username\"]);\n if (!creator) {\n return vercelErr(c, 403, \"forbidden\", \"User not found\");\n }\n\n const body = await parseJsonBody(c);\n const slug = typeof body.slug === \"string\" ? body.slug.trim() : \"\";\n if (!slug) {\n return vercelErr(c, 400, \"bad_request\", \"Missing required field: slug\");\n }\n\n if (vs.teams.findOneBy(\"slug\", slug as VercelTeam[\"slug\"])) {\n return vercelErr(c, 409, \"team_slug_already_exists\", \"A team with this slug already exists\");\n }\n\n const name = typeof body.name === \"string\" && body.name.trim() ? body.name.trim() : slug;\n\n const team = vs.teams.insert({\n uid: generateUid(\"team\"),\n slug,\n name,\n avatar: null,\n description: null,\n creatorId: creator.uid,\n membership: { confirmed: true, role: \"OWNER\" },\n billing: defaultTeamBilling(),\n resourceConfig: defaultTeamResourceConfig(),\n stagingPrefix: \"\",\n });\n\n vs.teamMembers.insert({\n teamId: team.uid,\n userId: creator.uid,\n role: \"OWNER\",\n confirmed: true,\n joinedFrom: \"cli\",\n });\n\n const member = getTeamMember(vs, team.uid, creator.uid);\n return c.json({ team: formatTeamForViewer(team, member) });\n });\n\n app.patch(\"/v2/teams/:teamId\", async (c) => {\n const auth = c.get(\"authUser\");\n if (!auth) {\n return vercelErr(c, 401, \"not_authenticated\", \"Authentication required\");\n }\n const user = vs.users.findOneBy(\"username\", auth.login as VercelUser[\"username\"]);\n if (!user) {\n return vercelErr(c, 403, \"forbidden\", \"User not found\");\n }\n\n const team = resolveTeamByIdOrSlug(vs, c.req.param(\"teamId\"));\n if (!team) {\n return vercelErr(c, 404, \"not_found\", \"Team not found\");\n }\n\n const member = getTeamMember(vs, team.uid, user.uid);\n if (!member || member.role !== \"OWNER\") {\n return vercelErr(c, 403, \"forbidden\", \"Insufficient permissions to update this team\");\n }\n\n const body = await parseJsonBody(c);\n const patch: Partial<Pick<VercelTeam, \"name\" | \"description\" | \"slug\">> = {};\n\n if (\"name\" in body && typeof body.name === \"string\") patch.name = body.name;\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 (\"slug\" in body && typeof body.slug === \"string\") {\n const nextSlug = body.slug.trim();\n if (nextSlug && nextSlug !== team.slug) {\n const taken = vs.teams.findOneBy(\"slug\", nextSlug as VercelTeam[\"slug\"]);\n if (taken && taken.id !== team.id) {\n return vercelErr(c, 409, \"team_slug_already_exists\", \"A team with this slug already exists\");\n }\n patch.slug = nextSlug;\n }\n }\n\n const updated = vs.teams.update(team.id, patch);\n if (!updated) {\n return vercelErr(c, 500, \"internal_error\", \"Failed to update team\");\n }\n const viewer = getTeamMember(vs, updated.uid, user.uid);\n return c.json({ team: formatTeamForViewer(updated, viewer) });\n });\n\n app.get(\"/v2/teams/:teamId/members\", (c) => {\n const auth = c.get(\"authUser\");\n if (!auth) {\n return vercelErr(c, 401, \"not_authenticated\", \"Authentication required\");\n }\n const user = vs.users.findOneBy(\"username\", auth.login as VercelUser[\"username\"]);\n if (!user) {\n return vercelErr(c, 403, \"forbidden\", \"User not found\");\n }\n\n const team = resolveTeamByIdOrSlug(vs, c.req.param(\"teamId\"));\n if (!team) {\n return vercelErr(c, 404, \"not_found\", \"Team not found\");\n }\n\n if (!getTeamMember(vs, team.uid, user.uid)) {\n return vercelErr(c, 403, \"forbidden\", \"Not a member of this team\");\n }\n\n const pagination = parseCursorPagination(c);\n const members = vs.teamMembers.findBy(\"teamId\", team.uid as VercelTeamMember[\"teamId\"]);\n const { items, pagination: pageMeta } = applyCursorPagination(members, pagination);\n return c.json({\n members: items.map((m) => formatMemberRow(vs, m)),\n pagination: pageMeta,\n });\n });\n\n app.post(\"/v2/teams/:teamId/members\", async (c) => {\n const auth = c.get(\"authUser\");\n if (!auth) {\n return vercelErr(c, 401, \"not_authenticated\", \"Authentication required\");\n }\n const actor = vs.users.findOneBy(\"username\", auth.login as VercelUser[\"username\"]);\n if (!actor) {\n return vercelErr(c, 403, \"forbidden\", \"User not found\");\n }\n\n const team = resolveTeamByIdOrSlug(vs, c.req.param(\"teamId\"));\n if (!team) {\n return vercelErr(c, 404, \"not_found\", \"Team not found\");\n }\n\n const actorMember = getTeamMember(vs, team.uid, actor.uid);\n if (!actorMember || actorMember.role !== \"OWNER\") {\n return vercelErr(c, 403, \"forbidden\", \"Insufficient permissions to add members\");\n }\n\n const body = await parseJsonBody(c);\n const email = typeof body.email === \"string\" ? body.email.trim() : undefined;\n const uid = typeof body.uid === \"string\" ? body.uid.trim() : undefined;\n\n let target: VercelUser | undefined;\n if (uid) {\n target = vs.users.findOneBy(\"uid\", uid as VercelUser[\"uid\"]);\n } else if (email) {\n target = vs.users.findOneBy(\"email\", email as VercelUser[\"email\"]);\n } else {\n return vercelErr(c, 400, \"bad_request\", \"Provide uid or email\");\n }\n\n if (!target) {\n return vercelErr(c, 404, \"not_found\", \"User not found\");\n }\n\n const role = parseRole(body.role, \"MEMBER\");\n if (role === null) {\n return vercelErr(c, 400, \"bad_request\", \"Invalid role\");\n }\n\n if (getTeamMember(vs, team.uid, target.uid)) {\n return vercelErr(c, 409, \"member_already_exists\", \"User is already a member of this team\");\n }\n\n const row = vs.teamMembers.insert({\n teamId: team.uid,\n userId: target.uid,\n role,\n confirmed: true,\n joinedFrom: email ? \"email\" : \"invite\",\n });\n\n return c.json({ member: formatMemberRow(vs, row) });\n });\n}\n","import type { Context } from \"hono\";\nimport type { ContentfulStatusCode } from \"hono/utils/http-status\";\nimport type { RouteContext } from \"@internal/core\";\nimport { ApiError, parseJsonBody } from \"@internal/core\";\nexport { ApiError };\nimport { getVercelStore } from \"../store.js\";\nimport type { VercelStore } from \"../store.js\";\nimport type {\n VercelDeployment,\n VercelDeploymentAlias,\n VercelDeploymentEvent,\n VercelDeploymentFile,\n VercelDomain,\n VercelEnvVar,\n VercelProject,\n VercelProtectionBypass,\n VercelBuild,\n VercelUser,\n} from \"../entities.js\";\nimport {\n applyCursorPagination,\n formatEnvVar,\n formatProject,\n generateSecret,\n generateUid,\n lookupProject,\n nowMs,\n parseCursorPagination,\n resolveTeamScope,\n} from \"../helpers.js\";\n\nfunction vercelErr(c: Context, status: ContentfulStatusCode, code: string, message: string) {\n return c.json({ error: { code, message } }, status);\n}\n\nfunction parseGitLink(body: Record<string, unknown>): VercelProject[\"link\"] {\n const gr = body.gitRepository;\n if (!gr || typeof gr !== \"object\") return null;\n const g = gr as Record<string, unknown>;\n const repo = typeof g.repo === \"string\" ? g.repo : \"\";\n if (!repo) return null;\n const t = nowMs();\n return {\n type: typeof g.type === \"string\" ? g.type : \"github\",\n repo,\n repoId: typeof g.repoId === \"number\" ? g.repoId : 0,\n org: typeof g.org === \"string\" ? g.org : \"\",\n gitCredentialId: typeof g.gitCredentialId === \"string\" ? g.gitCredentialId : \"\",\n productionBranch: typeof g.productionBranch === \"string\" ? g.productionBranch : \"main\",\n createdAt: t,\n updatedAt: t,\n deployHooks: [],\n };\n}\n\nfunction deleteProjectCascade(vs: VercelStore, project: VercelProject): void {\n const projectUid = project.uid;\n\n const deps = vs.deployments.findBy(\"projectId\", projectUid as VercelDeployment[\"projectId\"]);\n for (const dep of deps) {\n for (const b of vs.builds.findBy(\"deploymentId\", dep.uid as VercelBuild[\"deploymentId\"])) {\n vs.builds.delete(b.id);\n }\n for (const e of vs.deploymentEvents.findBy(\"deploymentId\", dep.uid as VercelDeploymentEvent[\"deploymentId\"])) {\n vs.deploymentEvents.delete(e.id);\n }\n for (const f of vs.deploymentFiles.findBy(\"deploymentId\", dep.uid as VercelDeploymentFile[\"deploymentId\"])) {\n vs.deploymentFiles.delete(f.id);\n }\n for (const a of vs.deploymentAliases.findBy(\"deploymentId\", dep.uid as VercelDeploymentAlias[\"deploymentId\"])) {\n vs.deploymentAliases.delete(a.id);\n }\n vs.deployments.delete(dep.id);\n }\n\n for (const d of vs.domains.findBy(\"projectId\", projectUid as VercelDomain[\"projectId\"])) {\n vs.domains.delete(d.id);\n }\n for (const ev of vs.envVars.findBy(\"projectId\", projectUid as VercelEnvVar[\"projectId\"])) {\n vs.envVars.delete(ev.id);\n }\n for (const pb of vs.protectionBypasses.findBy(\"projectId\", projectUid as VercelProtectionBypass[\"projectId\"])) {\n vs.protectionBypasses.delete(pb.id);\n }\n vs.projects.delete(project.id);\n}\n\nfunction protectionMetaForRow(\n row: VercelProtectionBypass\n): { createdAt: number; createdBy: string; scope: string } {\n return {\n createdAt: new Date(row.created_at).getTime(),\n createdBy: row.createdBy,\n scope: row.scope,\n };\n}\n\nfunction syncProtectionRecordFromCollection(vs: VercelStore, project: VercelProject): VercelProject {\n const rows = vs.protectionBypasses.findBy(\"projectId\", project.uid as VercelProtectionBypass[\"projectId\"]);\n const record: VercelProject[\"protectionBypass\"] = {};\n for (const row of rows) {\n record[row.secret] = protectionMetaForRow(row);\n }\n const updated = vs.projects.update(project.id, { protectionBypass: record });\n return updated ?? { ...project, protectionBypass: record };\n}\n\nexport function projectsRoutes({ app, store, baseUrl }: RouteContext): void {\n const vs = getVercelStore(store);\n\n app.post(\"/v11/projects\", async (c) => {\n const auth = c.get(\"authUser\");\n if (!auth) {\n return vercelErr(c, 401, \"not_authenticated\", \"Authentication required\");\n }\n\n const scope = resolveTeamScope(c, vs);\n if (!scope) {\n return vercelErr(c, 400, \"bad_request\", \"Could not resolve team or account scope\");\n }\n\n const body = await parseJsonBody(c);\n const name = typeof body.name === \"string\" ? body.name.trim() : \"\";\n if (!name) {\n return vercelErr(c, 400, \"bad_request\", \"Missing required field: name\");\n }\n\n const existing = vs.projects.findBy(\"name\", name as VercelProject[\"name\"]).filter((p) => p.accountId === scope.accountId);\n if (existing.length > 0) {\n return vercelErr(c, 409, \"project_already_exists\", \"A project with this name already exists\");\n }\n\n const link = parseGitLink(body);\n\n const project = vs.projects.insert({\n uid: generateUid(\"prj\"),\n name,\n accountId: scope.accountId,\n framework: typeof body.framework === \"string\" ? body.framework : null,\n buildCommand: typeof body.buildCommand === \"string\" ? body.buildCommand : null,\n devCommand: typeof body.devCommand === \"string\" ? body.devCommand : null,\n installCommand: typeof body.installCommand === \"string\" ? body.installCommand : null,\n outputDirectory: typeof body.outputDirectory === \"string\" ? body.outputDirectory : null,\n rootDirectory: typeof body.rootDirectory === \"string\" ? body.rootDirectory : null,\n commandForIgnoringBuildStep: null,\n nodeVersion: typeof body.nodeVersion === \"string\" ? body.nodeVersion : \"20.x\",\n serverlessFunctionRegion:\n typeof body.serverlessFunctionRegion === \"string\" ? body.serverlessFunctionRegion : null,\n publicSource: typeof body.publicSource === \"boolean\" ? body.publicSource : false,\n autoAssignCustomDomains: true,\n autoAssignCustomDomainsUpdatedBy: null,\n gitForkProtection: true,\n sourceFilesOutsideRootDirectory: false,\n live: true,\n link,\n latestDeployments: [],\n targets: {},\n protectionBypass: {},\n passwordProtection: null,\n ssoProtection: null,\n trustedIps: null,\n connectConfigurationId: null,\n gitComments: { onPullRequest: true, onCommit: false },\n webAnalytics: null,\n speedInsights: null,\n oidcTokenConfig: null,\n tier: \"hobby\",\n });\n\n const envIn = body.environmentVariables;\n if (Array.isArray(envIn)) {\n for (const raw of envIn) {\n if (!raw || typeof raw !== \"object\") continue;\n const ev = raw as Record<string, unknown>;\n const key = typeof ev.key === \"string\" ? ev.key : \"\";\n if (!key) continue;\n vs.envVars.insert({\n uid: generateUid(\"env\"),\n projectId: project.uid,\n key,\n value: typeof ev.value === \"string\" ? ev.value : String(ev.value ?? \"\"),\n type:\n ev.type === \"system\" ||\n ev.type === \"encrypted\" ||\n ev.type === \"plain\" ||\n ev.type === \"secret\" ||\n ev.type === \"sensitive\"\n ? ev.type\n : \"encrypted\",\n target: Array.isArray(ev.target)\n ? (ev.target.filter((t) => t === \"production\" || t === \"preview\" || t === \"development\") as VercelEnvVar[\"target\"])\n : [\"production\", \"preview\", \"development\"],\n gitBranch: typeof ev.gitBranch === \"string\" ? ev.gitBranch : null,\n customEnvironmentIds: Array.isArray(ev.customEnvironmentIds) ? (ev.customEnvironmentIds as string[]) : [],\n comment: typeof ev.comment === \"string\" ? ev.comment : null,\n decrypted: false,\n });\n }\n }\n\n return c.json(formatProject(project, baseUrl));\n });\n\n app.get(\"/v10/projects\", (c) => {\n const scope = resolveTeamScope(c, vs);\n if (!scope) {\n return vercelErr(c, 401, \"not_authenticated\", \"Authentication required\");\n }\n\n const pagination = parseCursorPagination(c);\n const search = (c.req.query(\"search\") ?? \"\").trim().toLowerCase();\n\n let list = vs.projects.all().filter((p) => p.accountId === scope.accountId);\n if (search) {\n list = list.filter((p) => p.name.toLowerCase().includes(search));\n }\n\n const { items, pagination: pageMeta } = applyCursorPagination(list, pagination);\n return c.json({\n projects: items.map((p) => formatProject(p, baseUrl)),\n pagination: pageMeta,\n });\n });\n\n app.get(\"/v9/projects/:idOrName\", (c) => {\n const scope = resolveTeamScope(c, vs);\n if (!scope) {\n return vercelErr(c, 401, \"not_authenticated\", \"Authentication required\");\n }\n\n const project = lookupProject(vs, c.req.param(\"idOrName\"), scope.accountId);\n if (!project) {\n return vercelErr(c, 404, \"not_found\", \"Project not found\");\n }\n\n const envs = vs.envVars.findBy(\"projectId\", project.uid as VercelEnvVar[\"projectId\"]);\n return c.json({\n ...formatProject(project, baseUrl),\n env: envs.map((e) => formatEnvVar(e)),\n });\n });\n\n app.patch(\"/v9/projects/:idOrName\", async (c) => {\n const auth = c.get(\"authUser\");\n if (!auth) {\n return vercelErr(c, 401, \"not_authenticated\", \"Authentication required\");\n }\n\n const scope = resolveTeamScope(c, vs);\n if (!scope) {\n return vercelErr(c, 400, \"bad_request\", \"Could not resolve team or account scope\");\n }\n\n const project = lookupProject(vs, c.req.param(\"idOrName\"), scope.accountId);\n if (!project) {\n return vercelErr(c, 404, \"not_found\", \"Project not found\");\n }\n\n const body = await parseJsonBody(c);\n const patch: Partial<VercelProject> = {};\n\n if (\"name\" in body && typeof body.name === \"string\") patch.name = body.name.trim();\n if (\"buildCommand\" in body) {\n patch.buildCommand = body.buildCommand === null ? null : typeof body.buildCommand === \"string\" ? body.buildCommand : project.buildCommand;\n }\n if (\"devCommand\" in body) {\n patch.devCommand = body.devCommand === null ? null : typeof body.devCommand === \"string\" ? body.devCommand : project.devCommand;\n }\n if (\"installCommand\" in body) {\n patch.installCommand =\n body.installCommand === null ? null : typeof body.installCommand === \"string\" ? body.installCommand : project.installCommand;\n }\n if (\"outputDirectory\" in body) {\n patch.outputDirectory =\n body.outputDirectory === null ? null : typeof body.outputDirectory === \"string\" ? body.outputDirectory : project.outputDirectory;\n }\n if (\"framework\" in body) {\n patch.framework = body.framework === null ? null : typeof body.framework === \"string\" ? body.framework : project.framework;\n }\n if (\"rootDirectory\" in body) {\n patch.rootDirectory =\n body.rootDirectory === null ? null : typeof body.rootDirectory === \"string\" ? body.rootDirectory : project.rootDirectory;\n }\n if (\"gitForkProtection\" in body && typeof body.gitForkProtection === \"boolean\") {\n patch.gitForkProtection = body.gitForkProtection;\n }\n if (\"publicSource\" in body && typeof body.publicSource === \"boolean\") {\n patch.publicSource = body.publicSource;\n }\n if (\"nodeVersion\" in body && typeof body.nodeVersion === \"string\") {\n patch.nodeVersion = body.nodeVersion;\n }\n if (\"serverlessFunctionRegion\" in body) {\n patch.serverlessFunctionRegion =\n body.serverlessFunctionRegion === null\n ? null\n : typeof body.serverlessFunctionRegion === \"string\"\n ? body.serverlessFunctionRegion\n : project.serverlessFunctionRegion;\n }\n if (\"autoAssignCustomDomains\" in body && typeof body.autoAssignCustomDomains === \"boolean\") {\n patch.autoAssignCustomDomains = body.autoAssignCustomDomains;\n }\n if (\"commandForIgnoringBuildStep\" in body) {\n patch.commandForIgnoringBuildStep =\n body.commandForIgnoringBuildStep === null\n ? null\n : typeof body.commandForIgnoringBuildStep === \"string\"\n ? body.commandForIgnoringBuildStep\n : project.commandForIgnoringBuildStep;\n }\n\n const updated = vs.projects.update(project.id, patch);\n if (!updated) {\n return vercelErr(c, 500, \"internal_error\", \"Failed to update project\");\n }\n return c.json(formatProject(updated, baseUrl));\n });\n\n app.delete(\"/v9/projects/:idOrName\", (c) => {\n const auth = c.get(\"authUser\");\n if (!auth) {\n return vercelErr(c, 401, \"not_authenticated\", \"Authentication required\");\n }\n\n const scope = resolveTeamScope(c, vs);\n if (!scope) {\n return vercelErr(c, 400, \"bad_request\", \"Could not resolve team or account scope\");\n }\n\n const project = lookupProject(vs, c.req.param(\"idOrName\"), scope.accountId);\n if (!project) {\n return vercelErr(c, 404, \"not_found\", \"Project not found\");\n }\n\n deleteProjectCascade(vs, project);\n return c.body(null, 204);\n });\n\n app.get(\"/v1/projects/:projectId/promote/aliases\", (c) => {\n const scope = resolveTeamScope(c, vs);\n if (!scope) {\n return vercelErr(c, 401, \"not_authenticated\", \"Authentication required\");\n }\n\n const project = lookupProject(vs, c.req.param(\"projectId\"), scope.accountId);\n if (!project) {\n return vercelErr(c, 404, \"not_found\", \"Project not found\");\n }\n\n const deployments = vs.deployments.findBy(\"projectId\", project.uid as VercelDeployment[\"projectId\"]);\n const production = deployments\n .filter((d) => d.target === \"production\")\n .sort((a, b) => new Date(b.created_at).getTime() - new Date(a.created_at).getTime())[0];\n\n if (!production) {\n return c.json({\n status: \"PENDING\",\n alias: [] as string[],\n });\n }\n\n const aliases = vs.deploymentAliases\n .findBy(\"deploymentId\", production.uid as VercelDeploymentAlias[\"deploymentId\"])\n .map((a) => a.alias);\n\n const status =\n production.readySubstate === \"PROMOTED\" || production.readyState === \"READY\" ? \"PROMOTED\" : \"PENDING\";\n\n return c.json({\n status,\n alias: aliases,\n });\n });\n\n app.patch(\"/v1/projects/:idOrName/protection-bypass\", async (c) => {\n const auth = c.get(\"authUser\");\n if (!auth) {\n return vercelErr(c, 401, \"not_authenticated\", \"Authentication required\");\n }\n\n const scope = resolveTeamScope(c, vs);\n if (!scope) {\n return vercelErr(c, 400, \"bad_request\", \"Could not resolve team or account scope\");\n }\n\n let project = lookupProject(vs, c.req.param(\"idOrName\"), scope.accountId);\n if (!project) {\n return vercelErr(c, 404, \"not_found\", \"Project not found\");\n }\n\n const user = vs.users.findOneBy(\"username\", auth.login as VercelUser[\"username\"]);\n const createdBy = user?.uid ?? auth.login;\n\n const body = await parseJsonBody(c);\n\n if (body.generate && typeof body.generate === \"object\" && body.generate !== null) {\n const g = body.generate as Record<string, unknown>;\n const secret = generateSecret();\n vs.protectionBypasses.insert({\n projectId: project.uid,\n secret,\n note: typeof g.note === \"string\" ? g.note : null,\n scope: typeof g.scope === \"string\" ? g.scope : \"deployment\",\n createdBy,\n });\n project = syncProtectionRecordFromCollection(vs, project);\n }\n\n if (Array.isArray(body.revoke)) {\n for (const secret of body.revoke) {\n if (typeof secret !== \"string\") continue;\n const row = vs.protectionBypasses\n .findBy(\"projectId\", project.uid as VercelProtectionBypass[\"projectId\"])\n .find((r) => r.secret === secret);\n if (row) {\n vs.protectionBypasses.delete(row.id);\n }\n }\n project = syncProtectionRecordFromCollection(vs, project);\n }\n\n if (Array.isArray(body.regenerate)) {\n for (const oldSecret of body.regenerate) {\n if (typeof oldSecret !== \"string\") continue;\n const row = vs.protectionBypasses\n .findBy(\"projectId\", project.uid as VercelProtectionBypass[\"projectId\"])\n .find((r) => r.secret === oldSecret);\n if (!row) continue;\n const note = row.note;\n const scopeVal = row.scope;\n vs.protectionBypasses.delete(row.id);\n vs.protectionBypasses.insert({\n projectId: project.uid,\n secret: generateSecret(),\n note,\n scope: scopeVal,\n createdBy,\n });\n }\n project = syncProtectionRecordFromCollection(vs, project);\n }\n\n const fresh = vs.projects.get(project.id) ?? project;\n return c.json({ protectionBypass: fresh.protectionBypass });\n });\n}\n","import type { Context } from \"hono\";\nimport type { ContentfulStatusCode } from \"hono/utils/http-status\";\nimport type { RouteContext } from \"@internal/core\";\nimport { ApiError, parseJsonBody } from \"@internal/core\";\nexport { ApiError };\nimport { getVercelStore } from \"../store.js\";\nimport type { VercelStore } from \"../store.js\";\nimport type {\n VercelBuild,\n VercelDeployment,\n VercelDeploymentAlias,\n VercelDeploymentEvent,\n VercelDeploymentFile,\n VercelFile,\n VercelProject,\n VercelUser,\n} from \"../entities.js\";\nimport {\n applyCursorPagination,\n formatDeployment,\n formatDeploymentBrief,\n generateUid,\n lookupProject,\n nowMs,\n parseCursorPagination,\n resolveTeamScope,\n} from \"../helpers.js\";\n\nfunction vercelErr(c: Context, status: ContentfulStatusCode, code: string, message: string) {\n return c.json({ error: { code, message } }, status);\n}\n\nfunction normalizeUrlParam(raw: string): string {\n const s = raw.trim();\n if (s.startsWith(\"http://\") || s.startsWith(\"https://\")) {\n try {\n return new URL(s).hostname;\n } catch {\n return s;\n }\n }\n return s;\n}\n\nfunction primaryHostFromBaseUrl(baseUrl: string): string {\n try {\n const u = new URL(baseUrl);\n if (u.hostname && u.hostname !== \"localhost\" && u.hostname !== \"127.0.0.1\") {\n return u.hostname;\n }\n } catch {\n /* ignore */\n }\n return \"vercel.app\";\n}\n\nfunction deploymentHostname(name: string, uid: string, baseUrl: string): string {\n const slug = `${name}-${uid.slice(4, 12)}`;\n return `${slug}.${primaryHostFromBaseUrl(baseUrl)}`;\n}\n\nfunction productionProjectAlias(projectName: string, baseUrl: string): string {\n return `${projectName}.${primaryHostFromBaseUrl(baseUrl)}`;\n}\n\nfunction findDeploymentByIdOrUrl(vs: VercelStore, idOrUrl: string): VercelDeployment | undefined {\n const raw = idOrUrl.trim();\n const byUid = vs.deployments.findOneBy(\"uid\", raw as VercelDeployment[\"uid\"]);\n if (byUid) return byUid;\n const host = normalizeUrlParam(raw);\n return (\n vs.deployments.findOneBy(\"url\", host as VercelDeployment[\"url\"]) ??\n vs.deployments.findOneBy(\"url\", raw as VercelDeployment[\"url\"])\n );\n}\n\nfunction assertDeploymentAccess(\n vs: VercelStore,\n dep: VercelDeployment,\n accountId: string\n): boolean {\n const project = vs.projects.findOneBy(\"uid\", dep.projectId as VercelProject[\"uid\"]);\n return !!project && project.accountId === accountId;\n}\n\nfunction defaultProjectPayload(name: string, accountId: string): Omit<VercelProject, \"id\" | \"created_at\" | \"updated_at\"> {\n return {\n uid: generateUid(\"prj\"),\n name,\n accountId,\n framework: null,\n buildCommand: null,\n devCommand: null,\n installCommand: null,\n outputDirectory: null,\n rootDirectory: null,\n commandForIgnoringBuildStep: null,\n nodeVersion: \"20.x\",\n serverlessFunctionRegion: null,\n publicSource: false,\n autoAssignCustomDomains: true,\n autoAssignCustomDomainsUpdatedBy: null,\n gitForkProtection: true,\n sourceFilesOutsideRootDirectory: false,\n live: true,\n link: null,\n latestDeployments: [],\n targets: {},\n protectionBypass: {},\n passwordProtection: null,\n ssoProtection: null,\n trustedIps: null,\n connectConfigurationId: null,\n gitComments: { onPullRequest: true, onCommit: false },\n webAnalytics: null,\n speedInsights: null,\n oidcTokenConfig: null,\n tier: \"hobby\",\n };\n}\n\nfunction resolveOrCreateProject(\n vs: VercelStore,\n accountId: string,\n name: string,\n projectField: unknown\n): VercelProject {\n if (typeof projectField === \"string\" && projectField.trim()) {\n const byId = lookupProject(vs, projectField.trim(), accountId);\n if (byId) return byId;\n }\n const existing = vs.projects\n .findBy(\"name\", name as VercelProject[\"name\"])\n .find((p) => p.accountId === accountId);\n if (existing) return existing;\n return vs.projects.insert(defaultProjectPayload(name, accountId));\n}\n\nfunction targetKey(target: VercelDeployment[\"target\"]): \"production\" | \"preview\" | \"staging\" {\n if (target === \"production\") return \"production\";\n if (target === \"staging\") return \"staging\";\n return \"preview\";\n}\n\nfunction upsertProjectDeploymentRefs(vs: VercelStore, projectId: number, dep: VercelDeployment): void {\n const project = vs.projects.get(projectId);\n if (!project) return;\n const createdAt = new Date(dep.created_at).getTime();\n const entry = { id: dep.uid, url: dep.url, state: dep.state, createdAt };\n const latest = [{ ...entry }, ...project.latestDeployments.filter((d) => d.id !== dep.uid)];\n const targets = { ...project.targets };\n targets[targetKey(dep.target)] = { ...entry };\n vs.projects.update(project.id, { latestDeployments: latest, targets });\n}\n\nfunction parseGitSource(raw: unknown): VercelDeployment[\"gitSource\"] {\n if (!raw || typeof raw !== \"object\") return null;\n const g = raw as Record<string, unknown>;\n return {\n type: typeof g.type === \"string\" ? g.type : \"github\",\n ref: typeof g.ref === \"string\" ? g.ref : \"\",\n sha: typeof g.sha === \"string\" ? g.sha : \"\",\n repoId:\n typeof g.repoId === \"string\" ? g.repoId : typeof g.repoId === \"number\" ? String(g.repoId) : \"\",\n org: typeof g.org === \"string\" ? g.org : \"\",\n repo: typeof g.repo === \"string\" ? g.repo : \"\",\n message: typeof g.message === \"string\" ? g.message : \"\",\n authorName: typeof g.authorName === \"string\" ? g.authorName : \"\",\n commitAuthorName: typeof g.commitAuthorName === \"string\" ? g.commitAuthorName : \"\",\n };\n}\n\ntype FileTreeNode = {\n uid: string;\n name: string;\n type: \"file\" | \"directory\";\n mode: number;\n size: number;\n contentType: string | null;\n children: FileTreeNode[];\n};\n\nfunction buildFileTreeFromRows(rows: VercelDeploymentFile[], genUid: () => string): FileTreeNode[] {\n if (rows.length === 0) {\n return [\n {\n uid: genUid(),\n name: \"/\",\n type: \"directory\",\n mode: 0o40755,\n size: 0,\n contentType: null,\n children: [],\n },\n ];\n }\n\n const root: FileTreeNode = {\n uid: genUid(),\n name: \"/\",\n type: \"directory\",\n mode: 0o40755,\n size: 0,\n contentType: null,\n children: [],\n };\n\n for (const row of rows) {\n if (row.type !== \"file\") continue;\n const parts = row.name.split(\"/\").filter(Boolean);\n if (parts.length === 0) continue;\n const fileName = parts.pop()!;\n let current = root;\n for (const part of parts) {\n let dir = current.children.find((c) => c.name === part && c.type === \"directory\");\n if (!dir) {\n dir = {\n uid: genUid(),\n name: part,\n type: \"directory\",\n mode: 0o40755,\n size: 0,\n contentType: null,\n children: [],\n };\n current.children.push(dir);\n }\n current = dir;\n }\n current.children.push({\n uid: row.uid,\n name: fileName,\n type: \"file\",\n mode: row.mode,\n size: row.size,\n contentType: row.contentType,\n children: [],\n });\n }\n\n return [root];\n}\n\nfunction deleteDeploymentCascade(vs: VercelStore, dep: VercelDeployment): void {\n const uid = dep.uid;\n for (const b of vs.builds.findBy(\"deploymentId\", uid as VercelBuild[\"deploymentId\"])) {\n vs.builds.delete(b.id);\n }\n for (const e of vs.deploymentEvents.findBy(\"deploymentId\", uid as VercelDeploymentEvent[\"deploymentId\"])) {\n vs.deploymentEvents.delete(e.id);\n }\n for (const f of vs.deploymentFiles.findBy(\"deploymentId\", uid as VercelDeploymentFile[\"deploymentId\"])) {\n vs.deploymentFiles.delete(f.id);\n }\n for (const a of vs.deploymentAliases.findBy(\"deploymentId\", uid as VercelDeploymentAlias[\"deploymentId\"])) {\n vs.deploymentAliases.delete(a.id);\n }\n vs.deployments.delete(dep.id);\n\n const project = vs.projects.findOneBy(\"uid\", dep.projectId as VercelProject[\"uid\"]);\n if (project) {\n const latestDeployments = project.latestDeployments.filter((d) => d.id !== uid);\n const targets = { ...project.targets };\n for (const k of Object.keys(targets) as (keyof typeof targets)[]) {\n if (targets[k]?.id === uid) {\n delete targets[k];\n }\n }\n vs.projects.update(project.id, { latestDeployments, targets });\n }\n}\n\nexport function deploymentsRoutes({ app, store, baseUrl }: RouteContext): void {\n const vs = getVercelStore(store);\n\n app.patch(\"/v12/deployments/:id/cancel\", async (c) => {\n const auth = c.get(\"authUser\");\n if (!auth) {\n return vercelErr(c, 401, \"not_authenticated\", \"Authentication required\");\n }\n\n const scope = resolveTeamScope(c, vs);\n if (!scope) {\n return vercelErr(c, 400, \"bad_request\", \"Could not resolve team or account scope\");\n }\n\n const dep = vs.deployments.findOneBy(\"uid\", c.req.param(\"id\") as VercelDeployment[\"uid\"]);\n if (!dep || !assertDeploymentAccess(vs, dep, scope.accountId)) {\n return vercelErr(c, 404, \"not_found\", \"Deployment not found\");\n }\n\n if (dep.readyState !== \"QUEUED\" && dep.readyState !== \"BUILDING\") {\n return vercelErr(c, 400, \"bad_request\", \"Deployment cannot be canceled in its current state\");\n }\n\n const t = nowMs();\n const updated =\n vs.deployments.update(dep.id, {\n readyState: \"CANCELED\",\n state: \"CANCELED\",\n canceledAt: t,\n }) ?? dep;\n\n vs.deploymentEvents.insert({\n deploymentId: updated.uid,\n type: \"canceled\",\n payload: { text: \"Deployment canceled\" },\n date: t,\n serial: String(t),\n });\n\n return c.json(formatDeployment(updated, vs, baseUrl));\n });\n\n app.get(\"/v2/deployments/:id/aliases\", (c) => {\n const scope = resolveTeamScope(c, vs);\n if (!scope) {\n return vercelErr(c, 401, \"not_authenticated\", \"Authentication required\");\n }\n\n const dep = vs.deployments.findOneBy(\"uid\", c.req.param(\"id\") as VercelDeployment[\"uid\"]);\n if (!dep || !assertDeploymentAccess(vs, dep, scope.accountId)) {\n return vercelErr(c, 404, \"not_found\", \"Deployment not found\");\n }\n\n const aliases = vs.deploymentAliases.findBy(\"deploymentId\", dep.uid as VercelDeploymentAlias[\"deploymentId\"]);\n return c.json({\n aliases: aliases.map((a) => ({\n uid: a.uid,\n alias: a.alias,\n deploymentId: a.deploymentId,\n projectId: a.projectId,\n })),\n });\n });\n\n app.get(\"/v3/deployments/:idOrUrl/events\", (c) => {\n const scope = resolveTeamScope(c, vs);\n if (!scope) {\n return vercelErr(c, 401, \"not_authenticated\", \"Authentication required\");\n }\n\n const dep = findDeploymentByIdOrUrl(vs, c.req.param(\"idOrUrl\"));\n if (!dep || !assertDeploymentAccess(vs, dep, scope.accountId)) {\n return vercelErr(c, 404, \"not_found\", \"Deployment not found\");\n }\n\n void c.req.query(\"follow\");\n\n const direction = (c.req.query(\"direction\") ?? \"backward\").toLowerCase();\n const limit = Math.min(100, Math.max(1, parseInt(c.req.query(\"limit\") ?? \"20\", 10) || 20));\n\n let list = [...vs.deploymentEvents.findBy(\"deploymentId\", dep.uid as VercelDeploymentEvent[\"deploymentId\"])];\n list.sort((a, b) => a.date - b.date);\n if (direction === \"backward\") {\n list.reverse();\n }\n list = list.slice(0, limit);\n\n return c.json(\n list.map((e) => ({\n type: e.type,\n payload: e.payload,\n date: e.date,\n serial: e.serial,\n }))\n );\n });\n\n app.get(\"/v6/deployments/:id/files\", (c) => {\n const scope = resolveTeamScope(c, vs);\n if (!scope) {\n return vercelErr(c, 401, \"not_authenticated\", \"Authentication required\");\n }\n\n const dep = vs.deployments.findOneBy(\"uid\", c.req.param(\"id\") as VercelDeployment[\"uid\"]);\n if (!dep || !assertDeploymentAccess(vs, dep, scope.accountId)) {\n return vercelErr(c, 404, \"not_found\", \"Deployment not found\");\n }\n\n const rows = vs.deploymentFiles.findBy(\"deploymentId\", dep.uid as VercelDeploymentFile[\"deploymentId\"]);\n const tree = buildFileTreeFromRows(rows, () => generateUid(\"file\"));\n return c.json({ files: tree });\n });\n\n app.post(\"/v13/deployments\", async (c) => {\n const auth = c.get(\"authUser\");\n if (!auth) {\n return vercelErr(c, 401, \"not_authenticated\", \"Authentication required\");\n }\n\n const scope = resolveTeamScope(c, vs);\n if (!scope) {\n return vercelErr(c, 400, \"bad_request\", \"Could not resolve team or account scope\");\n }\n\n const body = await parseJsonBody(c);\n const name = typeof body.name === \"string\" ? body.name.trim() : \"\";\n if (!name) {\n return vercelErr(c, 400, \"bad_request\", \"Missing required field: name\");\n }\n\n const user = vs.users.findOneBy(\"username\", auth.login as VercelUser[\"username\"]);\n if (!user) {\n return vercelErr(c, 400, \"bad_request\", \"User not found in Vercel store\");\n }\n\n const project = resolveOrCreateProject(vs, scope.accountId, name, body.project);\n\n const uid = generateUid(\"dpl\");\n const url = deploymentHostname(name, uid, baseUrl);\n const inspectorUrl = `${baseUrl.replace(/\\/$/, \"\")}/deployments/${uid}`;\n\n const targetRaw = body.target;\n const target: VercelDeployment[\"target\"] =\n targetRaw === \"production\" || targetRaw === \"preview\" || targetRaw === \"staging\"\n ? targetRaw\n : \"preview\";\n\n const meta: Record<string, string> = {};\n if (body.meta && typeof body.meta === \"object\" && body.meta !== null) {\n for (const [k, v] of Object.entries(body.meta as Record<string, unknown>)) {\n if (typeof v === \"string\") meta[k] = v;\n }\n }\n\n const regions =\n Array.isArray(body.regions) && body.regions.every((r) => typeof r === \"string\")\n ? (body.regions as string[])\n : [\"iad1\"];\n\n const t = nowMs();\n const gitSource = parseGitSource(body.gitSource);\n const source = gitSource ? \"git\" : \"cli\";\n\n const dep = vs.deployments.insert({\n uid,\n name,\n url,\n projectId: project.uid,\n source,\n target,\n readyState: \"READY\",\n readySubstate: null,\n state: \"READY\",\n creatorId: user.uid,\n inspectorUrl,\n meta,\n gitSource,\n buildingAt: t,\n readyAt: t,\n canceledAt: null,\n errorCode: null,\n errorMessage: null,\n regions,\n functions: null,\n routes: null,\n plan: \"hobby\",\n aliasAssigned: true,\n aliasError: null,\n bootedAt: t,\n });\n\n vs.deploymentAliases.insert({\n uid: generateUid(\"als\"),\n alias: url,\n deploymentId: dep.uid,\n projectId: project.uid,\n });\n\n if (target === \"production\") {\n vs.deploymentAliases.insert({\n uid: generateUid(\"als\"),\n alias: productionProjectAlias(project.name, baseUrl),\n deploymentId: dep.uid,\n projectId: project.uid,\n });\n }\n\n upsertProjectDeploymentRefs(vs, project.id, dep);\n\n vs.builds.insert({\n uid: generateUid(\"bld\"),\n deploymentId: dep.uid,\n entrypoint: \"api/index.ts\",\n readyState: \"READY\",\n output: [],\n readyStateAt: t,\n fingerprint: generateUid(\"fgp\"),\n });\n\n let serial = 0;\n const pushEvent = (type: string, text: string) => {\n serial += 1;\n vs.deploymentEvents.insert({\n deploymentId: dep.uid,\n type,\n payload: { text },\n date: t,\n serial: String(serial),\n });\n };\n pushEvent(\"created\", \"Deployment created\");\n pushEvent(\"building\", \"Building\");\n pushEvent(\"ready\", \"Deployment ready\");\n\n const filesIn = body.files;\n if (Array.isArray(filesIn)) {\n for (const raw of filesIn) {\n if (!raw || typeof raw !== \"object\") continue;\n const f = raw as Record<string, unknown>;\n const filePath = typeof f.file === \"string\" ? f.file : \"\";\n const sha = typeof f.sha === \"string\" ? f.sha : \"\";\n const size = typeof f.size === \"number\" ? f.size : 0;\n if (!filePath || !sha) continue;\n\n if (!vs.files.findOneBy(\"digest\", sha as VercelFile[\"digest\"])) {\n vs.files.insert({\n digest: sha,\n size,\n contentType: \"application/octet-stream\",\n });\n }\n\n vs.deploymentFiles.insert({\n deploymentId: dep.uid,\n name: filePath,\n type: \"file\",\n uid: generateUid(\"f\"),\n children: [],\n contentType: \"application/octet-stream\",\n mode: 0o644,\n size,\n });\n }\n }\n\n return c.json(formatDeployment(dep, vs, baseUrl));\n });\n\n app.get(\"/v6/deployments\", (c) => {\n const scope = resolveTeamScope(c, vs);\n if (!scope) {\n return vercelErr(c, 401, \"not_authenticated\", \"Authentication required\");\n }\n\n const appName = (c.req.query(\"app\") ?? \"\").trim();\n const projectIdFilter = (c.req.query(\"projectId\") ?? \"\").trim();\n const targetFilter = c.req.query(\"target\");\n const stateFilter = c.req.query(\"state\");\n\n let list = vs.deployments.all().filter((d) => {\n const proj = vs.projects.findOneBy(\"uid\", d.projectId as VercelProject[\"uid\"]);\n return proj && proj.accountId === scope.accountId;\n });\n\n if (appName) {\n list = list.filter((d) => {\n const proj = vs.projects.findOneBy(\"uid\", d.projectId as VercelProject[\"uid\"]);\n return proj?.name === appName;\n });\n }\n\n if (projectIdFilter) {\n list = list.filter((d) => d.projectId === projectIdFilter);\n }\n\n if (targetFilter === \"production\" || targetFilter === \"preview\" || targetFilter === \"staging\") {\n list = list.filter((d) => d.target === targetFilter);\n }\n\n if (stateFilter) {\n list = list.filter((d) => d.state === stateFilter || d.readyState === stateFilter);\n }\n\n const pagination = parseCursorPagination(c);\n const { items, pagination: pageMeta } = applyCursorPagination(list, pagination);\n\n return c.json({\n deployments: items.map((d) => formatDeploymentBrief(d, vs)),\n pagination: pageMeta,\n });\n });\n\n app.delete(\"/v13/deployments/:id\", (c) => {\n const auth = c.get(\"authUser\");\n if (!auth) {\n return vercelErr(c, 401, \"not_authenticated\", \"Authentication required\");\n }\n\n const scope = resolveTeamScope(c, vs);\n if (!scope) {\n return vercelErr(c, 400, \"bad_request\", \"Could not resolve team or account scope\");\n }\n\n const dep = vs.deployments.findOneBy(\"uid\", c.req.param(\"id\") as VercelDeployment[\"uid\"]);\n if (!dep || !assertDeploymentAccess(vs, dep, scope.accountId)) {\n return vercelErr(c, 404, \"not_found\", \"Deployment not found\");\n }\n\n const uid = dep.uid;\n deleteDeploymentCascade(vs, dep);\n\n return c.json({ uid, state: \"DELETED\" });\n });\n\n app.get(\"/v13/deployments/:idOrUrl\", (c) => {\n const scope = resolveTeamScope(c, vs);\n if (!scope) {\n return vercelErr(c, 401, \"not_authenticated\", \"Authentication required\");\n }\n\n const dep = findDeploymentByIdOrUrl(vs, c.req.param(\"idOrUrl\"));\n if (!dep || !assertDeploymentAccess(vs, dep, scope.accountId)) {\n return vercelErr(c, 404, \"not_found\", \"Deployment not found\");\n }\n\n return c.json(formatDeployment(dep, vs, baseUrl));\n });\n\n app.post(\"/v2/files\", async (c) => {\n const auth = c.get(\"authUser\");\n if (!auth) {\n return vercelErr(c, 401, \"not_authenticated\", \"Authentication required\");\n }\n\n const digest = c.req.header(\"x-vercel-digest\") ?? \"\";\n if (!digest) {\n return vercelErr(c, 400, \"bad_request\", \"Missing x-vercel-digest header\");\n }\n\n const lenRaw = c.req.header(\"Content-Length\");\n const size = lenRaw ? parseInt(lenRaw, 10) : 0;\n if (!Number.isFinite(size) || size < 0) {\n return vercelErr(c, 400, \"bad_request\", \"Invalid Content-Length\");\n }\n\n await c.req.arrayBuffer();\n\n const contentType = c.req.header(\"Content-Type\") ?? \"application/octet-stream\";\n\n if (!vs.files.findOneBy(\"digest\", digest as VercelFile[\"digest\"])) {\n vs.files.insert({\n digest,\n size,\n contentType,\n });\n }\n\n return c.json([]);\n });\n}\n","import type { Context } from \"hono\";\nimport type { ContentfulStatusCode } from \"hono/utils/http-status\";\nimport type { RouteContext } from \"@internal/core\";\nimport { ApiError, parseJsonBody } from \"@internal/core\";\nexport { ApiError };\nimport { getVercelStore } from \"../store.js\";\nimport type { VercelStore } from \"../store.js\";\nimport type { VercelDomain } from \"../entities.js\";\nimport {\n applyCursorPagination,\n formatDomain,\n generateUid,\n lookupProject,\n parseCursorPagination,\n resolveTeamScope,\n} from \"../helpers.js\";\n\nfunction vercelErr(c: Context, status: ContentfulStatusCode, code: string, message: string) {\n return c.json({ error: { code, message } }, status);\n}\n\nfunction extractApexName(domain: string): string {\n const parts = domain.toLowerCase().split(\".\").filter((p) => p.length > 0);\n if (parts.length === 0) return domain;\n if (parts.length === 1) return parts[0];\n return parts.slice(-2).join(\".\");\n}\n\nfunction isVercelAppDomain(domain: string): boolean {\n const d = domain.toLowerCase();\n return d === \"vercel.app\" || d.endsWith(\".vercel.app\");\n}\n\nfunction normalizeDomainName(raw: string): string {\n return raw.trim().toLowerCase();\n}\n\nfunction parseRedirectStatusCode(raw: unknown): 301 | 302 | 307 | 308 | null | \"invalid\" {\n if (raw === undefined || raw === null) return null;\n if (typeof raw !== \"number\" || !Number.isInteger(raw)) return \"invalid\";\n if (raw === 301 || raw === 302 || raw === 307 || raw === 308) return raw;\n return \"invalid\";\n}\n\nfunction findDomainInProject(\n vs: VercelStore,\n projectUid: string,\n domainName: string\n): VercelDomain | undefined {\n const normalized = normalizeDomainName(domainName);\n return vs.domains\n .findBy(\"projectId\", projectUid as VercelDomain[\"projectId\"])\n .find((d) => d.name.toLowerCase() === normalized);\n}\n\nfunction decodeDomainParam(raw: string): string {\n try {\n return decodeURIComponent(raw);\n } catch {\n return raw;\n }\n}\n\nexport function domainsRoutes({ app, store }: RouteContext): void {\n const vs = getVercelStore(store);\n\n app.post(\"/v10/projects/:idOrName/domains\", async (c) => {\n const auth = c.get(\"authUser\");\n if (!auth) {\n return vercelErr(c, 401, \"not_authenticated\", \"Authentication required\");\n }\n\n const scope = resolveTeamScope(c, vs);\n if (!scope) {\n return vercelErr(c, 400, \"bad_request\", \"Could not resolve team or account scope\");\n }\n\n const project = lookupProject(vs, c.req.param(\"idOrName\"), scope.accountId);\n if (!project) {\n return vercelErr(c, 404, \"not_found\", \"Project not found\");\n }\n\n const body = await parseJsonBody(c);\n const nameRaw = typeof body.name === \"string\" ? body.name.trim() : \"\";\n if (!nameRaw) {\n return vercelErr(c, 400, \"bad_request\", \"Missing required field: name\");\n }\n\n const name = normalizeDomainName(nameRaw);\n const apexName = extractApexName(name);\n\n if (findDomainInProject(vs, project.uid, name)) {\n return vercelErr(c, 409, \"domain_already_exists\", \"A domain with this name already exists on the project\");\n }\n\n const redirect =\n body.redirect === null ? null : typeof body.redirect === \"string\" ? body.redirect.trim() || null : null;\n const redirectStatusCode = parseRedirectStatusCode(body.redirectStatusCode);\n if (redirectStatusCode === \"invalid\") {\n return vercelErr(c, 400, \"bad_request\", \"Invalid redirectStatusCode\");\n }\n\n const gitBranch =\n body.gitBranch === null ? null : typeof body.gitBranch === \"string\" ? body.gitBranch : null;\n const customEnvironmentId =\n body.customEnvironmentId === null\n ? null\n : typeof body.customEnvironmentId === \"string\"\n ? body.customEnvironmentId\n : null;\n\n const uid = generateUid();\n const autoVerified = isVercelAppDomain(name);\n const verified = autoVerified;\n const verification: VercelDomain[\"verification\"] = autoVerified\n ? []\n : [\n {\n type: \"TXT\",\n domain: `_vercel.${apexName}`,\n value: `vc-domain-verify=${name},${uid}`,\n reason: \"Add the TXT record above to verify domain ownership\",\n },\n ];\n\n const row = vs.domains.insert({\n uid,\n projectId: project.uid,\n name,\n apexName,\n redirect,\n redirectStatusCode,\n gitBranch,\n customEnvironmentId,\n verified,\n verification,\n });\n\n return c.json(formatDomain(row));\n });\n\n app.get(\"/v9/projects/:idOrName/domains\", (c) => {\n const scope = resolveTeamScope(c, vs);\n if (!scope) {\n return vercelErr(c, 401, \"not_authenticated\", \"Authentication required\");\n }\n\n const project = lookupProject(vs, c.req.param(\"idOrName\"), scope.accountId);\n if (!project) {\n return vercelErr(c, 404, \"not_found\", \"Project not found\");\n }\n\n const pagination = parseCursorPagination(c);\n const list = vs.domains.findBy(\"projectId\", project.uid as VercelDomain[\"projectId\"]);\n const { items, pagination: pageMeta } = applyCursorPagination(list, pagination);\n return c.json({\n domains: items.map((d) => formatDomain(d)),\n pagination: pageMeta,\n });\n });\n\n app.post(\"/v9/projects/:idOrName/domains/:domain/verify\", (c) => {\n const auth = c.get(\"authUser\");\n if (!auth) {\n return vercelErr(c, 401, \"not_authenticated\", \"Authentication required\");\n }\n\n const scope = resolveTeamScope(c, vs);\n if (!scope) {\n return vercelErr(c, 400, \"bad_request\", \"Could not resolve team or account scope\");\n }\n\n const project = lookupProject(vs, c.req.param(\"idOrName\"), scope.accountId);\n if (!project) {\n return vercelErr(c, 404, \"not_found\", \"Project not found\");\n }\n\n const domainName = decodeDomainParam(c.req.param(\"domain\"));\n const existing = findDomainInProject(vs, project.uid, domainName);\n if (!existing) {\n return vercelErr(c, 404, \"not_found\", \"Domain not found\");\n }\n\n const updated = vs.domains.update(existing.id, {\n verified: true,\n verification: [],\n });\n if (!updated) {\n return vercelErr(c, 500, \"internal_error\", \"Failed to update domain\");\n }\n return c.json(formatDomain(updated));\n });\n\n app.get(\"/v9/projects/:idOrName/domains/:domain\", (c) => {\n const scope = resolveTeamScope(c, vs);\n if (!scope) {\n return vercelErr(c, 401, \"not_authenticated\", \"Authentication required\");\n }\n\n const project = lookupProject(vs, c.req.param(\"idOrName\"), scope.accountId);\n if (!project) {\n return vercelErr(c, 404, \"not_found\", \"Project not found\");\n }\n\n const domainName = decodeDomainParam(c.req.param(\"domain\"));\n const existing = findDomainInProject(vs, project.uid, domainName);\n if (!existing) {\n return vercelErr(c, 404, \"not_found\", \"Domain not found\");\n }\n\n return c.json(formatDomain(existing));\n });\n\n app.patch(\"/v9/projects/:idOrName/domains/:domain\", async (c) => {\n const auth = c.get(\"authUser\");\n if (!auth) {\n return vercelErr(c, 401, \"not_authenticated\", \"Authentication required\");\n }\n\n const scope = resolveTeamScope(c, vs);\n if (!scope) {\n return vercelErr(c, 400, \"bad_request\", \"Could not resolve team or account scope\");\n }\n\n const project = lookupProject(vs, c.req.param(\"idOrName\"), scope.accountId);\n if (!project) {\n return vercelErr(c, 404, \"not_found\", \"Project not found\");\n }\n\n const domainName = decodeDomainParam(c.req.param(\"domain\"));\n const existing = findDomainInProject(vs, project.uid, domainName);\n if (!existing) {\n return vercelErr(c, 404, \"not_found\", \"Domain not found\");\n }\n\n const body = await parseJsonBody(c);\n const patch: Partial<Omit<VercelDomain, \"id\" | \"created_at\" | \"updated_at\">> = {};\n\n if (\"gitBranch\" in body) {\n patch.gitBranch =\n body.gitBranch === null ? null : typeof body.gitBranch === \"string\" ? body.gitBranch : existing.gitBranch;\n }\n if (\"redirect\" in body) {\n patch.redirect =\n body.redirect === null ? null : typeof body.redirect === \"string\" ? body.redirect.trim() || null : existing.redirect;\n }\n if (\"redirectStatusCode\" in body) {\n const code = parseRedirectStatusCode(body.redirectStatusCode);\n if (code === \"invalid\") {\n return vercelErr(c, 400, \"bad_request\", \"Invalid redirectStatusCode\");\n }\n patch.redirectStatusCode = code;\n }\n if (\"customEnvironmentId\" in body) {\n patch.customEnvironmentId =\n body.customEnvironmentId === null\n ? null\n : typeof body.customEnvironmentId === \"string\"\n ? body.customEnvironmentId\n : existing.customEnvironmentId;\n }\n\n const updated = vs.domains.update(existing.id, patch);\n if (!updated) {\n return vercelErr(c, 500, \"internal_error\", \"Failed to update domain\");\n }\n return c.json(formatDomain(updated));\n });\n\n app.delete(\"/v9/projects/:idOrName/domains/:domain\", (c) => {\n const auth = c.get(\"authUser\");\n if (!auth) {\n return vercelErr(c, 401, \"not_authenticated\", \"Authentication required\");\n }\n\n const scope = resolveTeamScope(c, vs);\n if (!scope) {\n return vercelErr(c, 400, \"bad_request\", \"Could not resolve team or account scope\");\n }\n\n const project = lookupProject(vs, c.req.param(\"idOrName\"), scope.accountId);\n if (!project) {\n return vercelErr(c, 404, \"not_found\", \"Project not found\");\n }\n\n const domainName = decodeDomainParam(c.req.param(\"domain\"));\n const existing = findDomainInProject(vs, project.uid, domainName);\n if (!existing) {\n return vercelErr(c, 404, \"not_found\", \"Domain not found\");\n }\n\n vs.domains.delete(existing.id);\n return c.json({}, 200);\n });\n}\n","import type { Context } from \"hono\";\nimport type { ContentfulStatusCode } from \"hono/utils/http-status\";\nimport type { RouteContext } from \"@internal/core\";\nimport { ApiError, parseJsonBody } from \"@internal/core\";\nexport { ApiError };\nimport { getVercelStore } from \"../store.js\";\nimport type { VercelStore } from \"../store.js\";\nimport type { VercelEnvVar } from \"../entities.js\";\nimport {\n applyCursorPagination,\n formatEnvVar,\n generateUid,\n lookupProject,\n parseCursorPagination,\n resolveTeamScope,\n} from \"../helpers.js\";\n\nconst ENV_TYPES = new Set<VercelEnvVar[\"type\"]>([\"system\", \"encrypted\", \"plain\", \"secret\", \"sensitive\"]);\n\nconst TARGET_ENVS: readonly VercelEnvVar[\"target\"][number][] = [\"production\", \"preview\", \"development\"];\n\nfunction isTargetEnv(t: string): t is VercelEnvVar[\"target\"][number] {\n return (TARGET_ENVS as readonly string[]).includes(t);\n}\n\nfunction vercelErr(c: Context, status: ContentfulStatusCode, code: string, message: string) {\n return c.json({ error: { code, message } }, status);\n}\n\nfunction parseQueryBoolean(raw: string | undefined): boolean {\n if (raw === undefined) return false;\n const v = raw.toLowerCase();\n return v === \"true\" || v === \"1\" || v === \"yes\";\n}\n\nfunction targetsOverlap(\n a: VercelEnvVar[\"target\"],\n b: VercelEnvVar[\"target\"]\n): boolean {\n const set = new Set(a);\n return b.some((t) => set.has(t));\n}\n\nfunction findEnvByKeyAndTargetsOverlap(\n vs: VercelStore,\n projectUid: string,\n key: string,\n targets: VercelEnvVar[\"target\"],\n excludeId?: number\n): VercelEnvVar | undefined {\n const list = vs.envVars.findBy(\"projectId\", projectUid as VercelEnvVar[\"projectId\"]);\n return list.find(\n (e) =>\n e.key === key &&\n (excludeId === undefined || e.id !== excludeId) &&\n targetsOverlap(e.target, targets)\n );\n}\n\nfunction parseTarget(raw: unknown): VercelEnvVar[\"target\"] | \"invalid\" {\n if (!Array.isArray(raw) || raw.length === 0) return \"invalid\";\n const out: VercelEnvVar[\"target\"] = [];\n for (const t of raw) {\n if (typeof t !== \"string\" || !isTargetEnv(t)) return \"invalid\";\n out.push(t);\n }\n return out;\n}\n\nfunction parseType(raw: unknown): VercelEnvVar[\"type\"] | \"invalid\" {\n if (typeof raw !== \"string\" || !ENV_TYPES.has(raw as VercelEnvVar[\"type\"])) return \"invalid\";\n return raw as VercelEnvVar[\"type\"];\n}\n\nfunction parseCustomEnvironmentIds(raw: unknown): string[] | \"invalid\" {\n if (raw === undefined || raw === null) return [];\n if (!Array.isArray(raw)) return \"invalid\";\n const ids: string[] = [];\n for (const x of raw) {\n if (typeof x !== \"string\") return \"invalid\";\n ids.push(x);\n }\n return ids;\n}\n\nfunction parseEnvRow(\n body: Record<string, unknown>\n): { row: Omit<VercelEnvVar, \"id\" | \"uid\" | \"projectId\" | \"created_at\" | \"updated_at\">; error: string | null } {\n const key = typeof body.key === \"string\" ? body.key : \"\";\n if (!key.trim()) {\n return { row: {} as never, error: \"Missing required field: key\" };\n }\n\n if (body.value === undefined) {\n return { row: {} as never, error: \"Missing required field: value\" };\n }\n if (typeof body.value !== \"string\") {\n return { row: {} as never, error: \"Invalid value: value must be a string\" };\n }\n\n const type = parseType(body.type);\n if (type === \"invalid\") {\n return { row: {} as never, error: \"Invalid value: type must be one of system, encrypted, plain, secret, sensitive\" };\n }\n\n const target = parseTarget(body.target);\n if (target === \"invalid\") {\n return { row: {} as never, error: \"Invalid value: target must be a non-empty array of production, preview, development\" };\n }\n\n const customEnvironmentIds = parseCustomEnvironmentIds(body.customEnvironmentIds);\n if (customEnvironmentIds === \"invalid\") {\n return { row: {} as never, error: \"Invalid value: customEnvironmentIds must be an array of strings\" };\n }\n\n let gitBranch: string | null;\n if (!(\"gitBranch\" in body)) {\n gitBranch = null;\n } else if (body.gitBranch === null) {\n gitBranch = null;\n } else if (typeof body.gitBranch === \"string\") {\n gitBranch = body.gitBranch;\n } else {\n return { row: {} as never, error: \"Invalid value: gitBranch must be a string or null\" };\n }\n\n let comment: string | null;\n if (!(\"comment\" in body)) {\n comment = null;\n } else if (body.comment === null) {\n comment = null;\n } else if (typeof body.comment === \"string\") {\n comment = body.comment;\n } else {\n return { row: {} as never, error: \"Invalid value: comment must be a string or null\" };\n }\n\n return {\n row: {\n key,\n value: body.value,\n type,\n target,\n gitBranch,\n customEnvironmentIds,\n comment,\n decrypted: false,\n },\n error: null,\n };\n}\n\nfunction findEnvByUidInProject(\n vs: VercelStore,\n projectUid: string,\n uid: string\n): VercelEnvVar | undefined {\n const list = vs.envVars.findBy(\"projectId\", projectUid as VercelEnvVar[\"projectId\"]);\n return list.find((e) => e.uid === uid);\n}\n\nexport function envRoutes({ app, store }: RouteContext): void {\n const vs = getVercelStore(store);\n\n app.get(\"/v10/projects/:idOrName/env\", (c) => {\n const scope = resolveTeamScope(c, vs);\n if (!scope) {\n return vercelErr(c, 401, \"not_authenticated\", \"Authentication required\");\n }\n\n const project = lookupProject(vs, c.req.param(\"idOrName\"), scope.accountId);\n if (!project) {\n return vercelErr(c, 404, \"not_found\", \"Project not found\");\n }\n\n const decrypt = parseQueryBoolean(c.req.query(\"decrypt\"));\n const gitBranchQ = c.req.query(\"gitBranch\");\n const customEnvironmentId = c.req.query(\"customEnvironmentId\");\n const customEnvironmentSlug = c.req.query(\"customEnvironmentSlug\");\n\n let list = vs.envVars.findBy(\"projectId\", project.uid as VercelEnvVar[\"projectId\"]);\n\n if (gitBranchQ !== undefined) {\n list = list.filter((e) => e.gitBranch === gitBranchQ);\n }\n if (customEnvironmentId !== undefined && customEnvironmentId !== \"\") {\n list = list.filter((e) => e.customEnvironmentIds.includes(customEnvironmentId));\n }\n if (customEnvironmentSlug !== undefined && customEnvironmentSlug !== \"\") {\n list = list.filter((e) => e.customEnvironmentIds.includes(customEnvironmentSlug));\n }\n\n const pagination = parseCursorPagination(c);\n const { items, pagination: pageMeta } = applyCursorPagination(list, pagination);\n return c.json({\n envs: items.map((i) => formatEnvVar(i, decrypt)),\n pagination: pageMeta,\n });\n });\n\n app.post(\"/v10/projects/:idOrName/env\", async (c) => {\n const auth = c.get(\"authUser\");\n if (!auth) {\n return vercelErr(c, 401, \"not_authenticated\", \"Authentication required\");\n }\n\n const scope = resolveTeamScope(c, vs);\n if (!scope) {\n return vercelErr(c, 400, \"bad_request\", \"Could not resolve team or account scope\");\n }\n\n const project = lookupProject(vs, c.req.param(\"idOrName\"), scope.accountId);\n if (!project) {\n return vercelErr(c, 404, \"not_found\", \"Project not found\");\n }\n\n const upsert = parseQueryBoolean(c.req.query(\"upsert\"));\n const rawBody = await c.req.json().catch(() => null);\n\n let items: Record<string, unknown>[] = [];\n if (Array.isArray(rawBody)) {\n items = rawBody as Record<string, unknown>[];\n } else if (rawBody && typeof rawBody === \"object\" && !Array.isArray(rawBody)) {\n items = [rawBody as Record<string, unknown>];\n } else {\n return vercelErr(c, 400, \"bad_request\", \"Invalid JSON body\");\n }\n\n const created: VercelEnvVar[] = [];\n const pending: VercelEnvVar[] = [];\n\n for (const body of items) {\n const parsed = parseEnvRow(body);\n if (parsed.error) {\n return vercelErr(c, 400, \"bad_request\", parsed.error);\n }\n const { row } = parsed;\n\n const existingDb = findEnvByKeyAndTargetsOverlap(vs, project.uid, row.key, row.target);\n const existingPending = pending.find(\n (e) => e.key === row.key && targetsOverlap(e.target, row.target)\n );\n\n if (upsert) {\n const toUpdate = existingDb ?? existingPending;\n if (toUpdate) {\n const updated = vs.envVars.update(toUpdate.id, {\n key: row.key,\n value: row.value,\n type: row.type,\n target: row.target,\n gitBranch: row.gitBranch,\n customEnvironmentIds: row.customEnvironmentIds,\n comment: row.comment,\n });\n if (!updated) {\n return vercelErr(c, 500, \"internal_error\", \"Failed to update environment variable\");\n }\n const idx = pending.findIndex((p) => p.id === updated.id);\n if (idx >= 0) pending[idx] = updated;\n else pending.push(updated);\n created.push(updated);\n continue;\n }\n } else {\n if (existingDb || existingPending) {\n return vercelErr(\n c,\n 409,\n \"env_already_exists\",\n `An environment variable with key \"${row.key}\" and overlapping targets already exists`\n );\n }\n }\n\n const inserted = vs.envVars.insert({\n uid: generateUid(\"env\"),\n projectId: project.uid,\n key: row.key,\n value: row.value,\n type: row.type,\n target: row.target,\n gitBranch: row.gitBranch,\n customEnvironmentIds: row.customEnvironmentIds,\n comment: row.comment,\n decrypted: row.decrypted,\n });\n pending.push(inserted);\n created.push(inserted);\n }\n\n return c.json({ envs: created.map((e) => formatEnvVar(e, true)) });\n });\n\n app.get(\"/v10/projects/:idOrName/env/:id\", (c) => {\n const scope = resolveTeamScope(c, vs);\n if (!scope) {\n return vercelErr(c, 401, \"not_authenticated\", \"Authentication required\");\n }\n\n const project = lookupProject(vs, c.req.param(\"idOrName\"), scope.accountId);\n if (!project) {\n return vercelErr(c, 404, \"not_found\", \"Project not found\");\n }\n\n const env = findEnvByUidInProject(vs, project.uid, c.req.param(\"id\"));\n if (!env) {\n return vercelErr(c, 404, \"not_found\", \"Environment variable not found\");\n }\n\n const decrypt = parseQueryBoolean(c.req.query(\"decrypt\"));\n return c.json(formatEnvVar(env, decrypt));\n });\n\n app.patch(\"/v9/projects/:idOrName/env/:id\", async (c) => {\n const auth = c.get(\"authUser\");\n if (!auth) {\n return vercelErr(c, 401, \"not_authenticated\", \"Authentication required\");\n }\n\n const scope = resolveTeamScope(c, vs);\n if (!scope) {\n return vercelErr(c, 400, \"bad_request\", \"Could not resolve team or account scope\");\n }\n\n const project = lookupProject(vs, c.req.param(\"idOrName\"), scope.accountId);\n if (!project) {\n return vercelErr(c, 404, \"not_found\", \"Project not found\");\n }\n\n const existing = findEnvByUidInProject(vs, project.uid, c.req.param(\"id\"));\n if (!existing) {\n return vercelErr(c, 404, \"not_found\", \"Environment variable not found\");\n }\n\n const body = await parseJsonBody(c);\n const patch: Partial<\n Pick<VercelEnvVar, \"key\" | \"value\" | \"type\" | \"target\" | \"gitBranch\" | \"customEnvironmentIds\" | \"comment\">\n > = {};\n\n if (\"key\" in body) {\n if (typeof body.key !== \"string\" || !body.key.trim()) {\n return vercelErr(c, 400, \"bad_request\", \"Invalid value: key must be a non-empty string\");\n }\n patch.key = body.key;\n }\n if (\"value\" in body) {\n if (typeof body.value !== \"string\") {\n return vercelErr(c, 400, \"bad_request\", \"Invalid value: value must be a string\");\n }\n patch.value = body.value;\n }\n if (\"type\" in body) {\n const t = parseType(body.type);\n if (t === \"invalid\") {\n return vercelErr(c, 400, \"bad_request\", \"Invalid value: type must be one of system, encrypted, plain, secret, sensitive\");\n }\n patch.type = t;\n }\n if (\"target\" in body) {\n const t = parseTarget(body.target);\n if (t === \"invalid\") {\n return vercelErr(c, 400, \"bad_request\", \"Invalid value: target must be a non-empty array of production, preview, development\");\n }\n patch.target = t;\n }\n if (\"gitBranch\" in body) {\n if (body.gitBranch === null) {\n patch.gitBranch = null;\n } else if (typeof body.gitBranch === \"string\") {\n patch.gitBranch = body.gitBranch;\n } else {\n return vercelErr(c, 400, \"bad_request\", \"Invalid value: gitBranch must be a string or null\");\n }\n }\n if (\"customEnvironmentIds\" in body) {\n const ids = parseCustomEnvironmentIds(body.customEnvironmentIds);\n if (ids === \"invalid\") {\n return vercelErr(c, 400, \"bad_request\", \"Invalid value: customEnvironmentIds must be an array of strings\");\n }\n patch.customEnvironmentIds = ids;\n }\n if (\"comment\" in body) {\n if (body.comment === null) {\n patch.comment = null;\n } else if (typeof body.comment === \"string\") {\n patch.comment = body.comment;\n } else {\n return vercelErr(c, 400, \"bad_request\", \"Invalid value: comment must be a string or null\");\n }\n }\n\n const nextKey = patch.key ?? existing.key;\n const nextTarget = patch.target ?? existing.target;\n\n const conflict = findEnvByKeyAndTargetsOverlap(vs, project.uid, nextKey, nextTarget, existing.id);\n if (conflict) {\n return vercelErr(\n c,\n 409,\n \"env_already_exists\",\n `An environment variable with key \"${nextKey}\" and overlapping targets already exists`\n );\n }\n\n const updated = vs.envVars.update(existing.id, patch);\n if (!updated) {\n return vercelErr(c, 500, \"internal_error\", \"Failed to update environment variable\");\n }\n return c.json(formatEnvVar(updated, true));\n });\n\n app.delete(\"/v9/projects/:idOrName/env/:id\", (c) => {\n const auth = c.get(\"authUser\");\n if (!auth) {\n return vercelErr(c, 401, \"not_authenticated\", \"Authentication required\");\n }\n\n const scope = resolveTeamScope(c, vs);\n if (!scope) {\n return vercelErr(c, 400, \"bad_request\", \"Could not resolve team or account scope\");\n }\n\n const project = lookupProject(vs, c.req.param(\"idOrName\"), scope.accountId);\n if (!project) {\n return vercelErr(c, 404, \"not_found\", \"Project not found\");\n }\n\n const existing = findEnvByUidInProject(vs, project.uid, c.req.param(\"id\"));\n if (!existing) {\n return vercelErr(c, 404, \"not_found\", \"Environment variable not found\");\n }\n\n const snapshot = formatEnvVar(existing, true);\n vs.envVars.delete(existing.id);\n return c.json(snapshot, 200);\n });\n}\n","import { createHash, randomBytes } from \"crypto\";\nimport type { RouteContext } from \"@internal/core\";\nimport {\n escapeHtml,\n escapeAttr,\n renderCardPage,\n renderErrorPage,\n renderUserButton,\n matchesRedirectUri,\n constantTimeSecretEqual,\n bodyStr,\n debug,\n} from \"@internal/core\";\nimport { getVercelStore } from \"../store.js\";\nimport { formatUser } from \"../helpers.js\";\nimport type { VercelUser } from \"../entities.js\";\n\ntype PendingCode = {\n username: string;\n scope: string;\n redirectUri: string;\n clientId: string;\n codeChallenge: string | null;\n codeChallengeMethod: string | null;\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>>(\"vercel.oauth.pendingCodes\");\n if (!map) {\n map = new Map();\n store.setData(\"vercel.oauth.pendingCodes\", map);\n }\n return map;\n}\n\nfunction isPendingCodeExpired(p: PendingCode): boolean {\n return Date.now() - p.created_at > PENDING_CODE_TTL_MS;\n}\n\nconst SERVICE_LABEL = \"Vercel\";\n\nexport function oauthRoutes({ app, store, tokenMap }: RouteContext): void {\n const vs = getVercelStore(store);\n\n // ---------- OAuth authorize page ----------\n\n app.get(\"/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 const code_challenge = c.req.query(\"code_challenge\") ?? \"\";\n const code_challenge_method = c.req.query(\"code_challenge_method\") ?? \"\";\n\n const integrationsConfigured = vs.integrations.all().length > 0;\n let integrationName = \"\";\n if (integrationsConfigured) {\n const integration = vs.integrations.findOneBy(\"client_id\", client_id);\n if (!integration) {\n return c.html(renderErrorPage(\"Application not found\", `The client_id '${client_id}' is not registered.`, SERVICE_LABEL), 400);\n }\n if (redirect_uri && !matchesRedirectUri(redirect_uri, integration.redirect_uris)) {\n console.warn(`[OAuth] redirect_uri mismatch: got \"${redirect_uri}\", registered: ${JSON.stringify(integration.redirect_uris)}`);\n return c.html(renderErrorPage(\"Redirect URI mismatch\", \"The redirect_uri is not registered for this application.\", SERVICE_LABEL), 400);\n }\n integrationName = integration.name;\n }\n\n const subtitleText = integrationName\n ? `Authorize <strong>${escapeHtml(integrationName)}</strong> to access your account.`\n : \"Choose a seeded user to continue.\";\n\n const users = vs.users.all();\n const userButtons = users\n .map((user) => {\n const u = formatUser(user);\n return renderUserButton({\n letter: (u.username[0] ?? \"?\").toUpperCase(),\n login: u.username,\n name: u.name ?? undefined,\n email: u.email,\n formAction: \"/oauth/authorize/callback\",\n hiddenFields: {\n username: u.username,\n redirect_uri,\n scope,\n state,\n client_id,\n code_challenge,\n code_challenge_method,\n },\n });\n })\n .join(\"\\n\");\n\n const body = users.length === 0\n ? '<p class=\"empty\">No users in the emulator store.</p>'\n : userButtons;\n\n return c.html(renderCardPage(\"Sign in to Vercel\", subtitleText, body, SERVICE_LABEL));\n });\n\n // ---------- OAuth callback ----------\n\n app.post(\"/oauth/authorize/callback\", async (c) => {\n const body = await c.req.parseBody();\n const username = bodyStr(body.username);\n const redirect_uri = bodyStr(body.redirect_uri);\n const scope = bodyStr(body.scope);\n const state = bodyStr(body.state);\n const client_id = bodyStr(body.client_id);\n\n const code = randomBytes(20).toString(\"hex\");\n const code_challenge = bodyStr(body.code_challenge);\n const code_challenge_method = bodyStr(body.code_challenge_method);\n\n const pendingCodes = getPendingCodes(store);\n pendingCodes.set(code, {\n username,\n scope,\n redirectUri: redirect_uri,\n clientId: client_id,\n codeChallenge: code_challenge || null,\n codeChallengeMethod: code_challenge_method || null,\n created_at: Date.now(),\n });\n\n debug(\"vercel.oauth\", `[Vercel callback] generated code: ${code.slice(0, 8)}... for username=${username}, challenge=${code_challenge ? \"present\" : \"none\"}, pendingCodes size: ${pendingCodes.size}`);\n\n const url = new URL(redirect_uri);\n url.searchParams.set(\"code\", code);\n if (state !== \"\") url.searchParams.set(\"state\", state);\n\n debug(\"vercel.oauth\", `[Vercel callback] redirecting to: ${url.toString().slice(0, 120)}...`);\n return c.redirect(url.toString(), 302);\n });\n\n // ---------- Token exchange ----------\n\n app.post(\"/login/oauth/token\", async (c) => {\n const contentType = c.req.header(\"Content-Type\") ?? \"\";\n const pendingCodes = getPendingCodes(store);\n debug(\"vercel.oauth\", `[Vercel token] Content-Type: ${contentType}`);\n debug(\"vercel.oauth\", `[Vercel token] pendingCodes size: ${pendingCodes.size}`);\n debug(\"vercel.oauth\", `[Vercel token] pendingCodes keys: ${[...pendingCodes.keys()].map(k => k.slice(0, 8) + \"...\").join(\", \")}`);\n\n const rawText = await c.req.text();\n debug(\"vercel.oauth\", `[Vercel token] raw body: ${rawText.slice(0, 500)}`);\n\n let body: Record<string, unknown>;\n if (contentType.includes(\"application/json\")) {\n try { body = JSON.parse(rawText); } catch { body = {}; }\n } else {\n body = Object.fromEntries(new URLSearchParams(rawText));\n }\n\n debug(\"vercel.oauth\", `[Vercel token] parsed keys: ${Object.keys(body).join(\", \")}`);\n\n const code = typeof body.code === \"string\" ? body.code : \"\";\n const redirect_uri = typeof body.redirect_uri === \"string\" ? body.redirect_uri : \"\";\n const code_verifier = typeof body.code_verifier === \"string\" ? body.code_verifier : undefined;\n const bodyClientId = typeof body.client_id === \"string\" ? body.client_id : \"\";\n const bodyClientSecret = typeof body.client_secret === \"string\" ? body.client_secret : \"\";\n\n debug(\"vercel.oauth\", `[Vercel token] code: ${code.slice(0, 8)}... (len=${code.length})`);\n debug(\"vercel.oauth\", `[Vercel token] client_id: ${bodyClientId}`);\n debug(\"vercel.oauth\", `[Vercel token] client_secret: ${bodyClientSecret.slice(0, 4)}****`);\n debug(\"vercel.oauth\", `[Vercel token] code_verifier: ${code_verifier ? code_verifier.slice(0, 8) + \"...\" : \"undefined\"}`);\n\n const integrationsConfigured = vs.integrations.all().length > 0;\n if (integrationsConfigured) {\n const integration = vs.integrations.findOneBy(\"client_id\", bodyClientId);\n if (!integration) {\n debug(\"vercel.oauth\", `[Vercel token] REJECTED: client_id not found`);\n return c.json({ error: \"invalid_client\", error_description: \"The client_id and/or client_secret passed are incorrect.\" }, 401);\n }\n if (!constantTimeSecretEqual(bodyClientSecret, integration.client_secret)) {\n debug(\"vercel.oauth\", `[Vercel token] REJECTED: client_secret mismatch`);\n return c.json({ error: \"invalid_client\", error_description: \"The client_id and/or client_secret passed are incorrect.\" }, 401);\n }\n debug(\"vercel.oauth\", `[Vercel token] client credentials OK (${integration.name})`);\n }\n\n const pending = pendingCodes.get(code);\n if (!pending) {\n debug(\"vercel.oauth\", `[Vercel token] REJECTED: code not found in pendingCodes`);\n return c.json(\n { error: \"invalid_grant\", error_description: \"The code passed is incorrect or expired.\" },\n 400\n );\n }\n if (isPendingCodeExpired(pending)) {\n debug(\"vercel.oauth\", `[Vercel token] REJECTED: code expired`);\n pendingCodes.delete(code);\n return c.json(\n { error: \"invalid_grant\", error_description: \"The code passed is incorrect or expired.\" },\n 400\n );\n }\n debug(\"vercel.oauth\", `[Vercel token] code valid, username=${pending.username}, scope=${pending.scope}`);\n\n if (redirect_uri && pending.redirectUri && redirect_uri !== pending.redirectUri) {\n debug(\"vercel.oauth\", `[Vercel token] REJECTED: redirect_uri mismatch (got \"${redirect_uri}\", expected \"${pending.redirectUri}\")`);\n pendingCodes.delete(code);\n return c.json(\n { error: \"invalid_grant\", error_description: \"The redirect_uri does not match the one used during authorization.\" },\n 400\n );\n }\n\n if (pending.codeChallenge != null) {\n if (code_verifier === undefined) {\n return c.json(\n { error: \"invalid_grant\", error_description: \"PKCE verification failed.\" },\n 400\n );\n }\n const method = (pending.codeChallengeMethod ?? \"plain\").toLowerCase();\n if (method === \"s256\") {\n const expected = createHash(\"sha256\").update(code_verifier).digest(\"base64url\");\n if (expected !== pending.codeChallenge) {\n return c.json(\n { error: \"invalid_grant\", error_description: \"PKCE verification failed.\" },\n 400\n );\n }\n } else if (method === \"plain\") {\n if (code_verifier !== pending.codeChallenge) {\n return c.json(\n { error: \"invalid_grant\", error_description: \"PKCE verification failed.\" },\n 400\n );\n }\n } else {\n return c.json(\n { error: \"invalid_grant\", error_description: \"PKCE verification failed.\" },\n 400\n );\n }\n }\n\n debug(\"vercel.oauth\", `[Vercel token] PKCE OK (challenge=${pending.codeChallenge ? \"present\" : \"none\"})`);\n pendingCodes.delete(code);\n\n const user = vs.users.findOneBy(\"username\", pending.username as VercelUser[\"username\"]);\n if (!user) {\n debug(\"vercel.oauth\", `[Vercel token] REJECTED: user \"${pending.username}\" not found`);\n return c.json(\n { error: \"invalid_grant\", error_description: \"The user associated with this code was not found.\" },\n 400\n );\n }\n\n const token = \"vercel_\" + randomBytes(20).toString(\"base64url\");\n const scopes = pending.scope ? pending.scope.split(/[,\\s]+/).filter(Boolean) : [];\n\n if (tokenMap) {\n tokenMap.set(token, { login: user.username, id: user.id, scopes });\n }\n\n debug(\"vercel.oauth\", `[Vercel token] SUCCESS: issued token for ${user.username} (scopes: ${scopes.join(\",\") || \"none\"})`);\n\n return c.json({\n access_token: token,\n token_type: \"Bearer\",\n scope: pending.scope || \"\",\n });\n });\n\n // ---------- User info ----------\n\n app.get(\"/login/oauth/userinfo\", (c) => {\n const authUser = c.get(\"authUser\");\n if (!authUser) {\n return c.json({ error: { code: \"unauthorized\", message: \"Authentication required\" } }, 401);\n }\n\n const user = vs.users.findOneBy(\"username\", authUser.login as VercelUser[\"username\"]);\n if (!user) {\n return c.json({ error: { code: \"unauthorized\", message: \"Authentication required\" } }, 401);\n }\n\n return c.json({\n sub: user.uid,\n email: user.email,\n name: user.name,\n preferred_username: user.username,\n email_verified: true,\n picture: user.avatar,\n });\n });\n}\n","import { randomBytes } from \"crypto\";\nimport type { Context } from \"hono\";\nimport type { RouteContext } from \"@internal/core\";\nimport { parseJsonBody } from \"@internal/core\";\nimport type { ContentfulStatusCode } from \"hono/utils/http-status\";\nimport { getVercelStore } from \"../store.js\";\nimport { generateUid } from \"../helpers.js\";\nimport type { VercelUser } from \"../entities.js\";\n\nfunction vercelErr(c: Context, status: ContentfulStatusCode, code: string, message: string) {\n return c.json({ error: { code, message } }, status);\n}\n\nexport function apiKeysRoutes({ app, store, tokenMap }: RouteContext): void {\n const vs = getVercelStore(store);\n\n app.post(\"/v1/api-keys\", async (c) => {\n const auth = c.get(\"authUser\");\n if (!auth) {\n return vercelErr(c, 401, \"not_authenticated\", \"Authentication required\");\n }\n const user = vs.users.findOneBy(\"username\", auth.login as VercelUser[\"username\"]);\n if (!user) {\n return vercelErr(c, 403, \"forbidden\", \"User not found\");\n }\n\n const teamId = c.req.query(\"teamId\") ?? null;\n const body = await parseJsonBody(c);\n const name = typeof body.name === \"string\" ? body.name : \"API Key\";\n\n const tokenString = `vercel_api_${randomBytes(24).toString(\"base64url\")}`;\n const uid = generateUid(\"ak\");\n\n vs.apiKeys.insert({\n uid,\n name,\n teamId,\n userId: user.uid,\n tokenString,\n });\n\n if (tokenMap) {\n tokenMap.set(tokenString, { login: user.username, id: user.id, scopes: [] });\n }\n\n return c.json({\n apiKeyString: tokenString,\n apiKey: {\n id: uid,\n name,\n teamId,\n createdAt: Date.now(),\n },\n });\n });\n\n app.get(\"/v1/api-keys\", (c) => {\n const auth = c.get(\"authUser\");\n if (!auth) {\n return vercelErr(c, 401, \"not_authenticated\", \"Authentication required\");\n }\n const user = vs.users.findOneBy(\"username\", auth.login as VercelUser[\"username\"]);\n if (!user) {\n return vercelErr(c, 403, \"forbidden\", \"User not found\");\n }\n\n const teamId = c.req.query(\"teamId\") ?? null;\n const keys = vs.apiKeys.all().filter((k) => {\n if (k.userId !== user.uid) return false;\n if (teamId && k.teamId !== teamId) return false;\n return true;\n });\n\n return c.json({\n keys: keys.map((k) => ({\n id: k.uid,\n name: k.name,\n teamId: k.teamId,\n createdAt: k.created_at,\n })),\n });\n });\n\n app.delete(\"/v1/api-keys/:keyId\", (c) => {\n const auth = c.get(\"authUser\");\n if (!auth) {\n return vercelErr(c, 401, \"not_authenticated\", \"Authentication required\");\n }\n const user = vs.users.findOneBy(\"username\", auth.login as VercelUser[\"username\"]);\n if (!user) {\n return vercelErr(c, 403, \"forbidden\", \"User not found\");\n }\n\n const keyId = c.req.param(\"keyId\");\n const key = vs.apiKeys.findOneBy(\"uid\", keyId);\n if (!key) {\n return vercelErr(c, 404, \"not_found\", \"API key not found\");\n }\n\n if (key.userId !== user.uid) {\n return vercelErr(c, 403, \"forbidden\", \"Not authorized to delete this API key\");\n }\n\n if (tokenMap) {\n tokenMap.delete(key.tokenString);\n }\n\n vs.apiKeys.delete(key.id);\n return c.json({});\n });\n}\n","import type { Hono } from \"hono\";\nimport type { AppEnv, RouteContext, ServicePlugin, Store, WebhookDispatcher, TokenMap } from \"@internal/core\";\nimport type { VercelEnvVar } from \"./entities.js\";\nimport { getVercelStore } from \"./store.js\";\nimport { generateUid, nowMs } from \"./helpers.js\";\nimport { userRoutes } from \"./routes/user.js\";\nimport { projectsRoutes } from \"./routes/projects.js\";\nimport { deploymentsRoutes } from \"./routes/deployments.js\";\nimport { domainsRoutes } from \"./routes/domains.js\";\nimport { envRoutes } from \"./routes/env.js\";\nimport { oauthRoutes } from \"./routes/oauth.js\";\nimport { apiKeysRoutes } from \"./routes/api-keys.js\";\n\nexport { getVercelStore, type VercelStore } from \"./store.js\";\nexport * from \"./entities.js\";\n\nexport interface VercelSeedConfig {\n port?: number;\n users?: Array<{\n username: string;\n email?: string;\n name?: string;\n }>;\n teams?: Array<{\n slug: string;\n name?: string;\n description?: string;\n }>;\n projects?: Array<{\n name: string;\n team?: string;\n framework?: string;\n buildCommand?: string;\n outputDirectory?: string;\n rootDirectory?: string;\n nodeVersion?: string;\n envVars?: Array<{\n key: string;\n value: string;\n type?: string;\n target?: string[];\n }>;\n }>;\n integrations?: Array<{\n client_id: string;\n client_secret: string;\n name: string;\n redirect_uris: string[];\n }>;\n}\n\nfunction seedDefaults(store: Store, _baseUrl: string): void {\n const vs = getVercelStore(store);\n\n vs.users.insert({\n uid: generateUid(\"user\"),\n email: \"admin@localhost\",\n username: \"admin\",\n name: \"Admin\",\n avatar: null,\n defaultTeamId: null,\n softBlock: null,\n billing: { plan: \"hobby\", period: null, trial: null, cancelation: null, addons: null },\n resourceConfig: { nodeType: \"Edge Functions\", concurrentBuilds: 1 },\n stagingPrefix: \"staging\",\n version: null,\n });\n}\n\nexport function seedFromConfig(store: Store, baseUrl: string, config: VercelSeedConfig): void {\n const vs = getVercelStore(store);\n\n if (config.users) {\n for (const u of config.users) {\n const existing = vs.users.findOneBy(\"username\", u.username);\n if (existing) continue;\n vs.users.insert({\n uid: generateUid(\"user\"),\n email: u.email ?? `${u.username}@localhost`,\n username: u.username,\n name: u.name ?? null,\n avatar: null,\n defaultTeamId: null,\n softBlock: null,\n billing: { plan: \"hobby\", period: null, trial: null, cancelation: null, addons: null },\n resourceConfig: { nodeType: \"Edge Functions\", concurrentBuilds: 1 },\n stagingPrefix: \"staging\",\n version: null,\n });\n }\n }\n\n if (config.teams) {\n for (const t of config.teams) {\n const existing = vs.teams.findOneBy(\"slug\", t.slug);\n if (existing) continue;\n\n const firstUser = vs.users.all()[0];\n const creatorId = firstUser?.uid ?? \"unknown\";\n\n const team = vs.teams.insert({\n uid: generateUid(\"team\"),\n slug: t.slug,\n name: t.name ?? t.slug,\n avatar: null,\n description: t.description ?? null,\n creatorId,\n membership: { confirmed: true, role: \"OWNER\" },\n billing: { plan: \"pro\", period: null, trial: null, cancelation: null, addons: null },\n resourceConfig: { nodeType: \"Edge Functions\", concurrentBuilds: 1 },\n stagingPrefix: \"staging\",\n });\n\n for (const u of vs.users.all()) {\n const role = u.uid === creatorId ? \"OWNER\" : \"MEMBER\";\n vs.teamMembers.insert({\n teamId: team.uid,\n userId: u.uid,\n role,\n confirmed: true,\n joinedFrom: \"seed\",\n });\n }\n }\n }\n\n if (config.projects) {\n for (const p of config.projects) {\n let accountId: string;\n if (p.team) {\n const team = vs.teams.findOneBy(\"slug\", p.team);\n if (!team) continue;\n accountId = team.uid;\n } else {\n const user = vs.users.all()[0];\n if (!user) continue;\n accountId = user.uid;\n }\n\n const existingByName = vs.projects.findBy(\"name\", p.name);\n if (existingByName.some((proj) => proj.accountId === accountId)) continue;\n\n const project = vs.projects.insert({\n uid: generateUid(\"prj\"),\n name: p.name,\n accountId,\n framework: p.framework ?? null,\n buildCommand: p.buildCommand ?? null,\n devCommand: null,\n installCommand: null,\n outputDirectory: p.outputDirectory ?? null,\n rootDirectory: p.rootDirectory ?? null,\n commandForIgnoringBuildStep: null,\n nodeVersion: p.nodeVersion ?? \"20.x\",\n serverlessFunctionRegion: null,\n publicSource: false,\n autoAssignCustomDomains: true,\n autoAssignCustomDomainsUpdatedBy: null,\n gitForkProtection: true,\n sourceFilesOutsideRootDirectory: false,\n live: true,\n link: null,\n latestDeployments: [],\n targets: {},\n protectionBypass: {},\n passwordProtection: null,\n ssoProtection: null,\n trustedIps: null,\n connectConfigurationId: null,\n gitComments: { onPullRequest: true, onCommit: false },\n webAnalytics: null,\n speedInsights: null,\n oidcTokenConfig: null,\n tier: \"hobby\",\n });\n\n if (p.envVars) {\n for (const ev of p.envVars) {\n vs.envVars.insert({\n uid: generateUid(\"env\"),\n projectId: project.uid,\n key: ev.key,\n value: ev.value,\n type: (ev.type ?? \"encrypted\") as VercelEnvVar[\"type\"],\n target: (ev.target ?? [\"production\", \"preview\", \"development\"]) as VercelEnvVar[\"target\"],\n gitBranch: null,\n customEnvironmentIds: [],\n comment: null,\n decrypted: false,\n });\n }\n }\n }\n }\n\n if (config.integrations) {\n for (const integ of config.integrations) {\n const existing = vs.integrations.findOneBy(\"client_id\", integ.client_id);\n if (existing) continue;\n vs.integrations.insert({\n client_id: integ.client_id,\n client_secret: integ.client_secret,\n name: integ.name,\n redirect_uris: integ.redirect_uris,\n });\n }\n }\n}\n\nexport const vercelPlugin: ServicePlugin = {\n name: \"vercel\",\n register(app: Hono<AppEnv>, store: Store, webhooks: WebhookDispatcher, baseUrl: string, tokenMap?: TokenMap): void {\n const ctx: RouteContext = { app, store, webhooks, baseUrl, tokenMap };\n oauthRoutes(ctx);\n userRoutes(ctx);\n projectsRoutes(ctx);\n deploymentsRoutes(ctx);\n domainsRoutes(ctx);\n envRoutes(ctx);\n apiKeysRoutes(ctx);\n },\n seed(store: Store, baseUrl: string): void {\n seedDefaults(store, baseUrl);\n },\n};\n\nexport default vercelPlugin;\n","import { Store, type Collection } from \"@internal/core\";\nimport type {\n GitHubUser, GitHubOrg, GitHubTeam, GitHubTeamMember, GitHubTeamRepo, GitHubRepo, GitHubCollaborator,\n GitHubIssue, GitHubPullRequest, GitHubLabel, GitHubMilestone, GitHubComment,\n GitHubReview, GitHubIssueEvent, GitHubBranch, GitHubBranchProtection, GitHubRef,\n GitHubCommit, GitHubTree, GitHubBlob, GitHubTag, GitHubRelease, GitHubReleaseAsset,\n GitHubWebhook, GitHubWorkflow, GitHubWorkflowRun, GitHubJob, GitHubArtifact,\n GitHubSecret, GitHubCheckRun, GitHubCheckSuite,\n GitHubOAuthApp, GitHubApp, GitHubAppInstallation, 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\", [\"app_id\", \"installation_id\"]),\n oauthGrants: store.collection<GitHubOAuthGrant>(\"github.oauth_grants\", [\"user_id\", \"client_id\"]),\n };\n}\n","import { randomBytes } from \"crypto\";\nimport type { GitHubUser, GitHubOrg, GitHubRepo, GitHubIssue, GitHubPullRequest, GitHubLabel, GitHubMilestone, GitHubComment, GitHubRelease, GitHubTeam, GitHubBranch, GitHubCommit, GitHubCheckRun, GitHubCheckSuite, GitHubReview, GitHubWorkflow, GitHubWorkflowRun, GitHubJob, GitHubArtifact, GitHubReleaseAsset, GitHubWebhook, GitHubRef, GitHubTag, GitHubBlob, GitHubTree } 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(\n issue: GitHubIssue,\n store: GitHubStore,\n baseUrl: string\n) {\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(\n pr: GitHubPullRequest,\n store: GitHubStore,\n baseUrl: string\n) {\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(\n m: GitHubMilestone,\n repo: GitHubRepo,\n store: GitHubStore,\n baseUrl: string\n) {\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(\n comment: GitHubComment,\n store: GitHubStore,\n baseUrl: string\n) {\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(\n review: GitHubReview,\n store: GitHubStore,\n baseUrl: string\n) {\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(\n release: GitHubRelease,\n store: GitHubStore,\n baseUrl: string\n) {\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","import type { RouteContext } from \"@internal/core\";\nimport {\n ApiError,\n parseJsonBody,\n parsePagination,\n setLinkHeader,\n unauthorized,\n} from \"@internal/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(\n gh: GitHubStore,\n user: GitHubUser,\n type: \"all\" | \"owner\" | \"member\"\n): GitHubRepo[] {\n const owned = gh.repos.all().filter(\n (r) => r.owner_id === user.id && r.owner_type === \"User\"\n );\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 =\n sort === \"created\"\n ? \"created_at\"\n : sort === \"updated\"\n ? \"updated_at\"\n : \"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]\n .map((id) => gh.orgs.get(id))\n .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 (\n sortRaw !== \"created\" &&\n sortRaw !== \"updated\" &&\n sortRaw !== \"pushed\" &&\n sortRaw !== \"full_name\"\n ) {\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(\n 100,\n Math.max(1, parseInt(c.req.query(\"per_page\") ?? \"30\", 10) || 30)\n );\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 (\n sortRaw !== \"created\" &&\n sortRaw !== \"updated\" &&\n sortRaw !== \"pushed\" &&\n sortRaw !== \"full_name\"\n ) {\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 { AuthUser } from \"@internal/core\";\nimport { notFound, unauthorized, forbidden } from \"@internal/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\n .findBy(\"team_id\", team.id)\n .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(\n gh.collaborators.findBy(\"repo_id\", repo.id).find((c) => c.user_id === user.id)\n );\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\n .findBy(\"repo_id\", repo.id)\n .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 \"@internal/core\";\nimport {\n ApiError,\n forbidden,\n parseJsonBody,\n parsePagination,\n setLinkHeader,\n} from \"@internal/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 \"@internal/core\";\nimport {\n formatRepo,\n formatUser,\n generateNodeId,\n generateSha,\n lookupOwner,\n lookupRepo,\n timestamp,\n} 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(\n gh: GitHubStore,\n repo: GitHubRepo,\n actor: GitHubUser | null,\n readmeTitle?: string\n) {\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(\n gh: GitHubStore,\n params: CreateRepoRecordParams,\n actor: GitHubUser\n): 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\n ? \"private\"\n : (\"public\" as GitHubRepo[\"visibility\"]);\n\n const license =\n typeof params.license_template === \"string\"\n ? resolveLicenseTemplate(params.license_template)\n : 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(\n raw: unknown\n): \"pull\" | \"triage\" | \"push\" | \"maintain\" | \"admin\" | undefined {\n if (raw === undefined) return undefined;\n if (\n raw === \"pull\" ||\n raw === \"triage\" ||\n raw === \"push\" ||\n raw === \"maintain\" ||\n raw === \"admin\"\n ) {\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:\n typeof body.license_template === \"string\" ? body.license_template : undefined,\n gitignore_template:\n 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:\n typeof body.allow_rebase_merge === \"boolean\" ? body.allow_rebase_merge : undefined,\n allow_squash_merge:\n typeof body.allow_squash_merge === \"boolean\" ? body.allow_squash_merge : undefined,\n allow_merge_commit:\n 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:\n typeof body.license_template === \"string\" ? body.license_template : undefined,\n gitignore_template:\n 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:\n typeof body.allow_rebase_merge === \"boolean\" ? body.allow_rebase_merge : undefined,\n allow_squash_merge:\n typeof body.allow_squash_merge === \"boolean\" ? body.allow_squash_merge : undefined,\n allow_merge_commit:\n 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 (\n typeof L.key === \"string\" &&\n typeof L.name === \"string\" &&\n typeof L.spdx_id === \"string\"\n ) {\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)\n ? body.names.filter((n): n is string => typeof n === \"string\")\n : [];\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 =\n 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 let forkName =\n typeof body.name === \"string\" && body.name.trim()\n ? validateRepoName(body.name)\n : 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\"] } =>\n Boolean(x)\n )\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\n .findBy(\"repo_id\", repo.id)\n .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\n .findBy(\"repo_id\", repo.id)\n .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\n .findBy(\"repo_id\", repo.id)\n .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) =>\n a.tag.localeCompare(b.tag)\n );\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 \"hono\";\nimport type { RouteContext } from \"@internal/core\";\nimport { ApiError, parseJsonBody, parsePagination, setLinkHeader } from \"@internal/core\";\nimport { getGitHubStore } from \"../store.js\";\nimport {\n assertIssueWrite,\n assertRepoRead,\n notFoundResponse,\n ownerLoginOf,\n} 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(\n gh: GitHubStore,\n repoId: number,\n issueNumber: number\n): GitHubIssue | undefined {\n return gh.issues\n .findBy(\"repo_id\", repoId)\n .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(\n gh: GitHubStore,\n repo: GitHubRepo,\n raw: unknown,\n createMissing: boolean\n): 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<\n GitHubIssueEvent,\n \"commit_id\" | \"commit_url\" | \"label_name\" | \"assignee_id\" | \"milestone_title\" | \"rename\"\n >\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\n .findBy(\"repo_id\", repo.id)\n .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 } =\n 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 =\n typeof body.milestone === \"number\"\n ? body.milestone\n : 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\n .findBy(\"repo_id\", repo.id)\n .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 \"@internal/core\";\nimport { ApiError, parseJsonBody, parsePagination, setLinkHeader } from \"@internal/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\n .findBy(\"repo_id\", repoId)\n .find((p) => p.number === pullNumber);\n}\n\nfunction findPrIssue(gh: GitHubStore, repoId: number, number: number): GitHubIssue | undefined {\n return gh.issues\n .findBy(\"repo_id\", repoId)\n .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\n .findBy(\"repo_id\", repo.id)\n .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(\n gh: GitHubStore,\n repo: GitHubRepo,\n branchName: string,\n sha: string\n): 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\n .findBy(\"repo_id\", repo.id)\n .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\n .all()\n .find((r) => {\n if (r.forked_from_id !== baseRepo.id) return false;\n const login =\n r.owner_type === \"User\"\n ? gh.users.get(r.owner_id)?.login\n : 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(\n gh: GitHubStore,\n repo: GitHubRepo,\n headSha: string,\n baseSha: string\n): number {\n const chain = walkCommitsToBase(gh, repo, headSha, baseSha);\n return chain.length;\n}\n\nfunction walkCommitsToBase(\n gh: GitHubStore,\n repo: GitHubRepo,\n headSha: string,\n baseSha: string\n): 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\n .findBy(\"repo_id\", baseRepo.id)\n .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\n .findBy(\"repo_id\", baseRepo.id)\n .filter((r) => r.head_sha === pr.head_sha);\n for (const ctx of checks.contexts) {\n const ok = runs.some(\n (r) =>\n r.name === ctx && r.status === \"completed\" && r.conclusion === \"success\"\n );\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\n .findBy(\"repo_id\", repo.id)\n .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\n .findBy(\"org_id\", orgId)\n .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\"\n ? sortRaw\n : \"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 (\n typeof body.title === \"string\" ||\n typeof body.body === \"string\" ||\n body.body === null\n ) {\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 =\n body.merge_method === \"squash\" || body.merge_method === \"rebase\"\n ? body.merge_method\n : \"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\n .findBy(\"repo_id\", baseRepo.id)\n .find((x) => x.sha === pr.base_sha);\n const headCommit = gh.commits\n .findBy(\"repo_id\", headRepo.id)\n .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()\n ? body.commit_message.trim()\n : \"\";\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(\n filename\n )}?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\n .findBy(\"repo_id\", headRepo.id)\n .find((x) => x.sha === pr.head_sha);\n const baseCommit = gh.commits\n .findBy(\"repo_id\", baseRepo.id)\n .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 \"hono\";\nimport type { RouteContext } from \"@internal/core\";\nimport { ApiError, parseJsonBody, parsePagination, setLinkHeader } from \"@internal/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 {\n assertRepoRead,\n assertRepoWrite,\n notFoundResponse,\n ownerLoginOf,\n} 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\n .findBy(\"repo_id\", repoId)\n .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\" =\n 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 =\n 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\n .findBy(\"repo_id\", repo.id)\n .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 =\n 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 =\n 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\n .findBy(\"repo_id\", repo.id)\n .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\n .findBy(\"repo_id\", repo.id)\n .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 =\n typeof raw.commit_id === \"string\" && raw.commit_id.trim()\n ? raw.commit_id.trim()\n : 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 = 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 =\n raw.path === undefined || raw.path === null\n ? null\n : typeof raw.path === \"string\"\n ? raw.path\n : 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 =\n raw.path === undefined || raw.path === null\n ? null\n : typeof raw.path === \"string\"\n ? raw.path\n : 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 \"hono\";\nimport type { RouteContext, WebhookDispatcher } from \"@internal/core\";\nimport { ApiError, parseJsonBody, parsePagination, setLinkHeader } from \"@internal/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 {\n assertRepoRead,\n assertRepoWrite,\n notFoundResponse,\n ownerLoginOf,\n} from \"../route-helpers.js\";\n\nfunction findPull(gh: GitHubStore, repoId: number, pullNumber: number): GitHubPullRequest | undefined {\n return gh.pullRequests\n .findBy(\"repo_id\", repoId)\n .find((p) => p.number === pullNumber);\n}\n\nfunction findReview(\n gh: GitHubStore,\n repo: GitHubRepo,\n pullNumber: number,\n reviewId: number\n): 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\" =\n 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 let list = gh.reviews\n .findBy(\"repo_id\", repo.id)\n .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 =\n 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()\n ? raw.commit_id.trim()\n : 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)\n ? o.position\n : 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(\n (x) =>\n x.comment_type === \"review\" &&\n x.pull_number === pullNumber &&\n x.review_id === reviewId\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","import type { Context } from \"hono\";\nimport type { RouteContext } from \"@internal/core\";\nimport { ApiError, parseJsonBody, parsePagination, setLinkHeader } from \"@internal/core\";\nimport { getGitHubStore } from \"../store.js\";\nimport type { GitHubStore } from \"../store.js\";\nimport type { GitHubIssue, GitHubIssueEvent, GitHubLabel, GitHubMilestone, GitHubRepo, GitHubUser } 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 {\n assertIssueWrite,\n assertRepoRead,\n notFoundResponse,\n ownerLoginOf,\n} 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(\n gh: GitHubStore,\n issue: GitHubIssue,\n current: GitHubIssue,\n baseUrl: string\n) {\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<\n GitHubIssueEvent,\n \"commit_id\" | \"commit_url\" | \"label_name\" | \"assignee_id\" | \"milestone_title\" | \"rename\"\n >\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 let 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 let 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 =\n body.color !== undefined && body.color !== null\n ? normalizeColor(body.color)\n : 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\n ? (body.description as string | null)\n : 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 let 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\n ? (body.description as string | null)\n : 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 let labels = [...labelIdSet]\n .map((id) => gh.labels.get(id))\n .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 \"@internal/core\";\nimport { ApiError, parseJsonBody, parsePagination, setLinkHeader } from \"@internal/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(\n gh: GitHubStore,\n repoId: number,\n ancestorSha: string,\n descendantSha: string\n): 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(\n gh: GitHubStore,\n repoId: number,\n sha: string\n): \"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(\n gh: GitHubStore,\n repo: GitHubRepo,\n fullRef: string,\n sha: string,\n baseUrl: string\n) {\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(\n gh: GitHubStore,\n repo: GitHubRepo,\n bp: GitHubBranchProtection,\n baseUrl: string\n) {\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:\n 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(body: Record<string, unknown>): Omit<\n GitHubBranchProtection,\n \"id\" | \"repo_id\" | \"branch_name\" | \"created_at\" | \"updated_at\"\n> {\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\n .findBy(\"repo_id\", repo.id)\n .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\n .findBy(\"repo_id\", repo.id)\n .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\n .findBy(\"repo_id\", repo.id)\n .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\n .findBy(\"repo_id\", repo.id)\n .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\n .findBy(\"repo_id\", repo.id)\n .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\"\n ? body.dismiss_stale_reviews\n : 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\n .findBy(\"repo_id\", repo.id)\n .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\n .findBy(\"repo_id\", repo.id)\n .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\n .findBy(\"repo_id\", repo.id)\n .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\n .findBy(\"repo_id\", repo.id)\n .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\n .findBy(\"repo_id\", repo.id)\n .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) =>\n a.name.localeCompare(b.name)\n );\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 (typeof raw.path !== \"string\" || typeof raw.mode !== \"string\" || (raw.type !== \"blob\" && raw.type !== \"tree\")) {\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 =\n blob.encoding === \"base64\"\n ? blob.content\n : 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(\n repo,\n baseUrl,\n resolveGitObjectType(gh, repo.id, tag.object_sha),\n tag.object_sha\n ),\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(\n repo,\n baseUrl,\n resolveGitObjectType(gh, repo.id, saved.object_sha),\n saved.object_sha\n ),\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 \"@internal/core\";\nimport {\n ApiError,\n parseJsonBody,\n parsePagination,\n setLinkHeader,\n unauthorized,\n forbidden,\n} from \"@internal/core\";\nimport { getGitHubStore } from \"../store.js\";\nimport type { GitHubStore } from \"../store.js\";\nimport type {\n GitHubOrg,\n GitHubRepo,\n GitHubTeam,\n GitHubUser,\n} 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(\n gh: GitHubStore,\n org: GitHubOrg,\n slug: string\n): 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) =>\n 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]\n .map((id) => gh.orgs.get(id))\n .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\n .findBy(\"team_id\", team.id)\n .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(\n 100,\n Math.max(1, parseInt(c.req.query(\"per_page\") ?? \"30\", 10) || 30)\n );\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\n .findBy(\"team_id\", membersTeam.id)\n .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 =\n 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\" =\n body.role === \"maintainer\" ? \"maintainer\" : \"member\";\n\n const existing = gh.teamMembers\n .findBy(\"team_id\", team.id)\n .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\n .findBy(\"team_id\", team.id)\n .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\n .findBy(\"team_id\", team.id)\n .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 \"@internal/core\";\nimport { ApiError, parseJsonBody, parsePagination, setLinkHeader } from \"@internal/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 {\n assertRepoRead,\n assertRepoWrite,\n getActorUser,\n notFoundResponse,\n ownerLoginOf,\n} 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(\n gh: GitHubStore,\n authUser: AuthUser | undefined,\n release: GitHubRelease\n) {\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\n .map((r) => formatRelease(r, gh, baseUrl))\n .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 =\n typeof body.target_commitish === \"string\" ? body.target_commitish : undefined;\n const prev =\n 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(\n (r) => !r.draft && !r.prerelease && r.published_at\n );\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 =\n 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 =\n releaseBody ??\n `## 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 =\n 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 \"@internal/core\";\nimport {\n ApiError,\n forbidden,\n parseJsonBody,\n parsePagination,\n setLinkHeader,\n unauthorized,\n} from \"@internal/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 {\n assertRepoAdmin,\n getActorUser,\n notFoundResponse,\n ownerLoginOf,\n} from \"../route-helpers.js\";\n\nfunction teamsForOrg(gh: GitHubStore, orgId: number) {\n return gh.teams.findBy(\"org_id\", orgId);\n}\n\nfunction listOrgMembersDeduped(\n gh: GitHubStore,\n orgId: number\n): { 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(\n raw: unknown,\n existing?: GitHubWebhook[\"config\"]\n): 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\n ? o.content_type\n : 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(\n d: WebhookDelivery,\n baseUrl: string,\n pathPrefix: string,\n hookId: number\n) {\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 =\n 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 =\n 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 =\n 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 \"@internal/core\";\nimport { ApiError, parsePagination, setLinkHeader } from \"@internal/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 {\n formatIssue,\n formatOrgBrief,\n formatPullRequest,\n formatRepo,\n formatUser,\n lookupRepo,\n} 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(\n raw: string\n): { 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 =\n inScopes.length > 0\n ? inScopes.map((s) => s.toLowerCase())\n : [\"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(gh: GitHubStore, login: string, commit: GitHubCommit, role: \"author\" | \"committer\"): 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\"\n ? b.stargazers_count - a.stargazers_count\n : a.stargazers_count - b.stargazers_count\n );\n } else if (sortRaw === \"forks\") {\n list.sort((a, b) =>\n order === \"desc\" ? b.forks_count - a.forks_count : a.forks_count - b.forks_count\n );\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\n .findBy(\"repo_id\", issue.repo_id)\n .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 =\n 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 let 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 let 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) =>\n h.kind === \"user\" ? formatUser(h.u, baseUrl) : formatOrgBrief(h.o, baseUrl)\n );\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) =>\n l.name.toLowerCase().includes(text) ||\n (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 \"@internal/core\";\nimport {\n ApiError,\n forbidden,\n parseJsonBody,\n parsePagination,\n setLinkHeader,\n unauthorized,\n} from \"@internal/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 {\n formatRepo,\n formatUser,\n generateNodeId,\n generateSha,\n lookupRepo,\n timestamp,\n} from \"../helpers.js\";\nimport {\n assertAuthenticatedUser,\n assertRepoAdmin,\n assertRepoRead,\n getActorUser,\n notFoundResponse,\n ownerLoginOf,\n} from \"../route-helpers.js\";\n\nfunction listOrgMembersDeduped(\n gh: GitHubStore,\n orgId: number\n): { 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(\n gh: GitHubStore,\n repo: GitHubRepo,\n ref: string\n): { 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\n .findBy(\"workflow_id\", workflowId)\n .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\n .all()\n .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\n .all()\n .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(\n a: GitHubArtifact,\n repo: GitHubRepo,\n gh: GitHubStore,\n baseUrl: string\n) {\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 ? { id: run.id, repository_id: repo.id, head_repository_id: repo.id, head_branch: run.head_branch, head_sha: run.head_sha } : 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\n .findBy(\"repo_id\", repo.id)\n .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 { workflow_run: formatWorkflowRun(created, repo, gh, baseUrl), repository: formatRepo(repo, gh, baseUrl), sender: formatUser(actor, baseUrl) },\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\n .findBy(\"repo_id\", repo.id)\n .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(\n `2025-01-01T00:00:00.0000000Z Workflow run ${run.id} logs (stub)\\n${run.head_sha}\\n`,\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\n .findBy(\"repo_id\", repo.id)\n .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 \"@internal/core\";\nimport { ApiError, parseJsonBody, parsePagination, setLinkHeader } from \"@internal/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 {\n formatRepo,\n formatUser,\n generateNodeId,\n lookupRepo,\n timestamp,\n} from \"../helpers.js\";\nimport {\n assertRepoRead,\n assertRepoWrite,\n notFoundResponse,\n ownerLoginOf,\n} 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\n .findBy(\"repo_id\", repo.id)\n .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\n .map((r) => r.conclusion)\n .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\n .findBy(\"repo_id\", suite.repo_id)\n .filter((r) => r.check_suite_id === suiteId);\n const { status, conclusion } = recomputeSuiteFromRuns(runs);\n gh.checkSuites.update(suiteId, { status, conclusion });\n}\n\nfunction parseConclusion(\n raw: unknown\n): 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([\n \"success\",\n \"failure\",\n \"neutral\",\n \"cancelled\",\n \"skipped\",\n \"timed_out\",\n \"action_required\",\n ]);\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 =\n 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(\n suite: GitHubCheckSuite,\n repo: GitHubRepo,\n baseUrl: string\n) {\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(\n run: GitHubCheckRun,\n repo: GitHubRepo,\n gh: GitHubStore,\n baseUrl: string\n) {\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(\n suite: GitHubCheckSuite,\n repo: GitHubRepo,\n gh: GitHubStore,\n baseUrl: string\n) {\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 =\n 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\n .findBy(\"repo_id\", repo.id)\n .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\n .findBy(\"repo_id\", repo.id)\n .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\" ? body.external_id : body.external_id == null ? \"\" : 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 (\n typeof a.id === \"string\" &&\n typeof a.label === \"string\" &&\n typeof a.description === \"string\"\n ) {\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 =\n typeof body.external_id === \"string\" ? body.external_id : String(body.external_id ?? \"\");\n }\n if (body.started_at !== undefined) {\n patch.started_at =\n body.started_at === null\n ? null\n : typeof body.started_at === \"string\"\n ? body.started_at\n : null;\n }\n if (body.completed_at !== undefined) {\n patch.completed_at =\n body.completed_at === null\n ? null\n : typeof body.completed_at === \"string\"\n ? body.completed_at\n : 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 (\n typeof a.id === \"string\" &&\n typeof a.label === \"string\" &&\n typeof a.description === \"string\"\n ) {\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:\n outRaw.title === undefined\n ? prev.output.title\n : typeof outRaw.title === \"string\"\n ? outRaw.title\n : null,\n summary:\n outRaw.summary === undefined\n ? prev.output.summary\n : typeof outRaw.summary === \"string\"\n ? outRaw.summary\n : null,\n text:\n outRaw.text === undefined\n ? prev.output.text\n : typeof outRaw.text === \"string\"\n ? outRaw.text\n : null,\n annotations_count: annotations.length,\n annotations,\n };\n }\n\n const nextStatus = patch.status ?? prev.status;\n let 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 let 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 \"@internal/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: { limit: 10000, remaining: 9999, reset, used: 1, resource: \"actions_runner_registration\" },\n scim: { limit: 15000, remaining: 14999, reset, used: 1, resource: \"scim\" },\n },\n rate: rateLimit,\n });\n });\n}\n","import type { RouteContext } from \"@internal/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 \"hono\";\nimport type { RouteContext, Store, AuthUser, AppEnv } from \"@internal/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 \"@internal/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(`[OAuth] redirect_uri mismatch: got \"${redirect_uri}\", registered: ${JSON.stringify(oauthApp.redirect_uris)}`);\n return c.html(\n renderErrorPage(\"Redirect URI mismatch\", \"The redirect_uri is not registered for this application.\", SERVICE_LABEL),\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\n ? '<p class=\"empty\">No users in the emulator store.</p>'\n : 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(\"github.oauth\", `[OAuth callback] generated code: ${code.slice(0, 8)}... for login=${login}, pendingCodes size: ${getPendingCodes(store).size}`);\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(\"github.oauth\", `[OAuth token] pendingCodes keys: ${[...getPendingCodes(store).keys()].map(k => k.slice(0, 8) + \"...\").join(\", \")}`);\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\n ? pending.scope.split(/[,\\s]+/).filter(Boolean)\n : [\"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(\n (g) => g.user_id === user.id && g.client_id === pending.clientId\n );\n const orgAccess: Record<string, \"granted\" | \"denied\" | \"requested\"> = {};\n for (const org of gh.orgs.all()) {\n const isMember = gh.teamMembers.all().some(\n (tm) => tm.user_id === user.id && gh.teams.get(tm.team_id)?.org_id === org.id\n );\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 =\n `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(renderErrorPage(\"Unauthorized\", \"You must be authenticated to view this page.\", SERVICE_LABEL), 401);\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.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 }).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(renderErrorPage(\"Unauthorized\", \"You must be authenticated to view this page.\", SERVICE_LABEL), 401);\n }\n\n const clientId = c.req.param(\"client_id\");\n\n const grant = gh.oauthGrants.all().find(\n (g) => g.user_id === sessionUser.id && g.client_id === clientId\n );\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\", month: \"long\", day: \"numeric\",\n });\n\n const permRows = grant.scopes.map((s) =>\n `<li><span class=\"check\">&#10003;</span> ${escapeHtml(scopeLabel(s))}</li>`\n ).join(\"\\n\");\n\n const orgRows = Object.entries(grant.org_access).map(([org, status]) => {\n const letter = escapeHtml((org[0] ?? \"?\").toUpperCase());\n const badgeClass = status === \"granted\" ? \"badge-granted\"\n : status === \"denied\" ? \"badge-denied\"\n : \"badge-requested\";\n const icon = status === \"granted\" ? \"&#10003;\" : status === \"denied\" ? \"&#10007;\" : \"&#8943;\";\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 }).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 ${orgRows ? `<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 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(renderErrorPage(\"Unauthorized\", \"You must be authenticated to perform this action.\", SERVICE_LABEL), 401);\n }\n\n const clientId = c.req.param(\"client_id\");\n\n const grant = gh.oauthGrants.all().find(\n (g) => g.user_id === sessionUser.id && g.client_id === clientId\n );\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 \"@internal/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 message: \"A JSON web token could not be decoded\",\n documentation_url: \"https://docs.github.com/rest\",\n }, 401);\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 message: \"A JSON web token could not be decoded\",\n documentation_url: \"https://docs.github.com/rest\",\n }, 401);\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(\n installations.map((inst) => formatInstallation(inst, ghApp, baseUrl))\n );\n });\n\n app.get(\"/app/installations/:installation_id\", (c) => {\n const authApp = requireApp(c);\n if (!authApp) {\n return c.json({\n message: \"A JSON web token could not be decoded\",\n documentation_url: \"https://docs.github.com/rest\",\n }, 401);\n }\n\n const installationId = parseInt(c.req.param(\"installation_id\"), 10);\n const inst = gh.appInstallations.all().find(\n (i) => i.installation_id === installationId && i.app_id === authApp.appId\n );\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 message: \"A JSON web token could not be decoded\",\n documentation_url: \"https://docs.github.com/rest\",\n }, 401);\n }\n\n const installationId = parseInt(c.req.param(\"installation_id\"), 10);\n const inst = gh.appInstallations.all().find(\n (i) => i.installation_id === installationId && i.app_id === authApp.appId\n );\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 token,\n expires_at: expiresAt,\n permissions: requestedPermissions,\n repository_selection: inst.repository_selection,\n ...(inst.repository_selection === \"selected\" ? { repositories: repos } : {}),\n }, 201);\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)\n ?? 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(\n (i) => i.account_id === org.id && i.account_type === \"Organization\"\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 === 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(\n (i) => i.account_id === user.id && i.account_type === \"User\"\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 === 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\"\n ? gh.orgs.get(inst.account_id)\n : gh.users.get(inst.account_id);\n\n return {\n id: inst.installation_id,\n account: account ? {\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 } : 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","import type { Hono } from \"hono\";\nimport type { ServicePlugin, Store, WebhookDispatcher, TokenMap, AppEnv, RouteContext } from \"@internal/core\";\nimport { getGitHubStore } from \"./store.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 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 description: a.description ?? null,\n });\n\n if (a.installations) {\n for (const inst of a.installations) {\n const account =\n gh.users.findOneBy(\"login\", inst.account) ??\n gh.orgs.findOneBy(\"login\", inst.account);\n if (!account) continue;\n\n const accountType = gh.users.findOneBy(\"login\", inst.account)\n ? \"User\" as const\n : \"Organization\" as const;\n\n const repoIds: number[] = [];\n if (inst.repositories) {\n for (const repoFullName of inst.repositories) {\n const fullName = repoFullName.includes(\"/\")\n ? repoFullName\n : `${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\nexport const githubPlugin: ServicePlugin = {\n name: \"github\",\n register(app: Hono<AppEnv>, store: Store, webhooks: WebhookDispatcher, baseUrl: string, tokenMap?: TokenMap): void {\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 \"@internal/core\";\nimport type { GoogleUser, GoogleOAuthClient } from \"./entities.js\";\n\nexport interface GoogleStore {\n users: Collection<GoogleUser>;\n oauthClients: Collection<GoogleOAuthClient>;\n}\n\nexport function getGoogleStore(store: Store): GoogleStore {\n return {\n users: store.collection<GoogleUser>(\"google.users\", [\"uid\", \"email\"]),\n oauthClients: store.collection<GoogleOAuthClient>(\"google.oauth_clients\", [\"client_id\"]),\n };\n}\n","import { randomBytes } from \"crypto\";\n\nexport function generateUid(prefix = \"\"): string {\n const id = randomBytes(12).toString(\"base64url\").slice(0, 20);\n return prefix ? `${prefix}_${id}` : id;\n}\n","import { createHash, randomBytes } from \"crypto\";\nimport { SignJWT } from \"jose\";\nimport type { RouteContext } from \"@internal/core\";\nimport {\n escapeHtml,\n escapeAttr,\n renderCardPage,\n renderErrorPage,\n renderUserButton,\n matchesRedirectUri,\n constantTimeSecretEqual,\n bodyStr,\n debug,\n} from \"@internal/core\";\nimport { getGoogleStore } from \"../store.js\";\nimport type { GoogleUser } from \"../entities.js\";\n\nconst JWT_SECRET = new TextEncoder().encode(\"emulate-google-jwt-secret\");\n\ntype PendingCode = {\n email: string;\n scope: string;\n redirectUri: string;\n clientId: string;\n nonce: string | null;\n codeChallenge: string | null;\n codeChallengeMethod: string | null;\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>>(\"google.oauth.pendingCodes\");\n if (!map) {\n map = new Map();\n store.setData(\"google.oauth.pendingCodes\", map);\n }\n return map;\n}\n\nfunction isPendingCodeExpired(p: PendingCode): boolean {\n return Date.now() - p.created_at > PENDING_CODE_TTL_MS;\n}\n\nconst SERVICE_LABEL = \"Google\";\n\nasync function createIdToken(\n user: GoogleUser,\n clientId: string,\n nonce: string | null,\n baseUrl: string\n): Promise<string> {\n const builder = new SignJWT({\n sub: user.uid,\n email: user.email,\n email_verified: user.email_verified,\n name: user.name,\n given_name: user.given_name,\n family_name: user.family_name,\n picture: user.picture,\n locale: user.locale,\n ...(nonce ? { nonce } : {}),\n })\n .setProtectedHeader({ alg: \"HS256\", typ: \"JWT\" })\n .setIssuer(baseUrl)\n .setAudience(clientId)\n .setIssuedAt()\n .setExpirationTime(\"1h\");\n\n return builder.sign(JWT_SECRET);\n}\n\nexport function oauthRoutes({ app, store, baseUrl, tokenMap }: RouteContext): void {\n const gs = getGoogleStore(store);\n\n // ---------- OIDC Discovery ----------\n\n app.get(\"/.well-known/openid-configuration\", (c) => {\n return c.json({\n issuer: baseUrl,\n authorization_endpoint: `${baseUrl}/o/oauth2/v2/auth`,\n token_endpoint: `${baseUrl}/oauth2/token`,\n userinfo_endpoint: `${baseUrl}/oauth2/v2/userinfo`,\n revocation_endpoint: `${baseUrl}/oauth2/revoke`,\n jwks_uri: `${baseUrl}/oauth2/v3/certs`,\n response_types_supported: [\"code\"],\n subject_types_supported: [\"public\"],\n id_token_signing_alg_values_supported: [\"HS256\"],\n scopes_supported: [\"openid\", \"email\", \"profile\"],\n token_endpoint_auth_methods_supported: [\"client_secret_post\", \"client_secret_basic\"],\n claims_supported: [\n \"sub\", \"email\", \"email_verified\", \"name\",\n \"given_name\", \"family_name\", \"picture\", \"locale\",\n ],\n code_challenge_methods_supported: [\"plain\", \"S256\"],\n });\n });\n\n // ---------- JWKS (stub) ----------\n\n app.get(\"/oauth2/v3/certs\", (c) => {\n return c.json({ keys: [] });\n });\n\n // ---------- Authorization page ----------\n\n app.get(\"/o/oauth2/v2/auth\", (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 const nonce = c.req.query(\"nonce\") ?? \"\";\n const code_challenge = c.req.query(\"code_challenge\") ?? \"\";\n const code_challenge_method = c.req.query(\"code_challenge_method\") ?? \"\";\n\n const clientsConfigured = gs.oauthClients.all().length > 0;\n let clientName = \"\";\n if (clientsConfigured) {\n const client = gs.oauthClients.findOneBy(\"client_id\", client_id);\n if (!client) {\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, client.redirect_uris)) {\n return c.html(\n renderErrorPage(\"Redirect URI mismatch\", \"The redirect_uri is not registered for this application.\", SERVICE_LABEL),\n 400\n );\n }\n clientName = client.name;\n }\n\n const subtitleText = clientName\n ? `Sign in to <strong>${escapeHtml(clientName)}</strong> with your Google account.`\n : \"Choose a seeded user to continue.\";\n\n const users = gs.users.all();\n const userButtons = users\n .map((user) => {\n return renderUserButton({\n letter: (user.email[0] ?? \"?\").toUpperCase(),\n login: user.email,\n name: user.name,\n email: user.email,\n formAction: \"/o/oauth2/v2/auth/callback\",\n hiddenFields: {\n email: user.email,\n redirect_uri,\n scope,\n state,\n nonce,\n client_id,\n code_challenge,\n code_challenge_method,\n },\n });\n })\n .join(\"\\n\");\n\n const body = users.length === 0\n ? '<p class=\"empty\">No users in the emulator store.</p>'\n : userButtons;\n\n return c.html(renderCardPage(\"Sign in to Google\", subtitleText, body, SERVICE_LABEL));\n });\n\n // ---------- Authorization callback ----------\n\n app.post(\"/o/oauth2/v2/auth/callback\", async (c) => {\n const body = await c.req.parseBody();\n const email = bodyStr(body.email);\n const redirect_uri = bodyStr(body.redirect_uri);\n const scope = bodyStr(body.scope);\n const state = bodyStr(body.state);\n const client_id = bodyStr(body.client_id);\n const nonce = bodyStr(body.nonce);\n const code_challenge = bodyStr(body.code_challenge);\n const code_challenge_method = bodyStr(body.code_challenge_method);\n\n const code = randomBytes(20).toString(\"hex\");\n\n getPendingCodes(store).set(code, {\n email,\n scope,\n redirectUri: redirect_uri,\n clientId: client_id,\n nonce: nonce || null,\n codeChallenge: code_challenge || null,\n codeChallengeMethod: code_challenge_method || null,\n created_at: Date.now(),\n });\n\n debug(\"google.oauth\", `[Google callback] code=${code.slice(0, 8)}... email=${email}`);\n\n const url = new URL(redirect_uri);\n url.searchParams.set(\"code\", code);\n if (state) url.searchParams.set(\"state\", state);\n\n return c.redirect(url.toString(), 302);\n });\n\n // ---------- Token exchange ----------\n\n app.post(\"/oauth2/token\", async (c) => {\n const contentType = c.req.header(\"Content-Type\") ?? \"\";\n const rawText = await c.req.text();\n\n let body: Record<string, unknown>;\n if (contentType.includes(\"application/json\")) {\n try { body = JSON.parse(rawText); } catch { body = {}; }\n } else {\n body = Object.fromEntries(new URLSearchParams(rawText));\n }\n\n const code = typeof body.code === \"string\" ? body.code : \"\";\n const redirect_uri = typeof body.redirect_uri === \"string\" ? body.redirect_uri : \"\";\n const grant_type = typeof body.grant_type === \"string\" ? body.grant_type : \"\";\n const code_verifier = typeof body.code_verifier === \"string\" ? body.code_verifier : undefined;\n const bodyClientId = typeof body.client_id === \"string\" ? body.client_id : \"\";\n const bodyClientSecret = typeof body.client_secret === \"string\" ? body.client_secret : \"\";\n\n if (grant_type !== \"authorization_code\") {\n return c.json({ error: \"unsupported_grant_type\", error_description: \"Only authorization_code is supported.\" }, 400);\n }\n\n const clientsConfigured = gs.oauthClients.all().length > 0;\n if (clientsConfigured) {\n const client = gs.oauthClients.findOneBy(\"client_id\", bodyClientId);\n if (!client) {\n return c.json({ error: \"invalid_client\", error_description: \"The client_id is incorrect.\" }, 401);\n }\n if (!constantTimeSecretEqual(bodyClientSecret, client.client_secret)) {\n return c.json({ error: \"invalid_client\", error_description: \"The client_secret is incorrect.\" }, 401);\n }\n }\n\n const pendingMap = getPendingCodes(store);\n const pending = pendingMap.get(code);\n if (!pending) {\n return c.json({ error: \"invalid_grant\", error_description: \"The code is incorrect or expired.\" }, 400);\n }\n if (isPendingCodeExpired(pending)) {\n pendingMap.delete(code);\n return c.json({ error: \"invalid_grant\", error_description: \"The code is incorrect or expired.\" }, 400);\n }\n\n if (pending.codeChallenge != null) {\n if (code_verifier === undefined) {\n return c.json({ error: \"invalid_grant\", error_description: \"PKCE verification failed.\" }, 400);\n }\n const method = (pending.codeChallengeMethod ?? \"plain\").toLowerCase();\n if (method === \"s256\") {\n const expected = createHash(\"sha256\").update(code_verifier).digest(\"base64url\");\n if (expected !== pending.codeChallenge) {\n return c.json({ error: \"invalid_grant\", error_description: \"PKCE verification failed.\" }, 400);\n }\n } else if (method === \"plain\") {\n if (code_verifier !== pending.codeChallenge) {\n return c.json({ error: \"invalid_grant\", error_description: \"PKCE verification failed.\" }, 400);\n }\n } else {\n return c.json({ error: \"invalid_grant\", error_description: \"PKCE verification failed.\" }, 400);\n }\n }\n\n pendingMap.delete(code);\n\n const user = gs.users.findOneBy(\"email\", pending.email as GoogleUser[\"email\"]);\n if (!user) {\n return c.json({ error: \"invalid_grant\", error_description: \"User not found.\" }, 400);\n }\n\n const accessToken = \"google_\" + randomBytes(20).toString(\"base64url\");\n const scopes = pending.scope ? pending.scope.split(/\\s+/).filter(Boolean) : [];\n\n if (tokenMap) {\n tokenMap.set(accessToken, { login: user.email, id: user.id, scopes });\n }\n\n const idToken = await createIdToken(user, pending.clientId, pending.nonce, baseUrl);\n\n debug(\"google.oauth\", `[Google token] issued token for ${user.email}`);\n\n return c.json({\n access_token: accessToken,\n id_token: idToken,\n token_type: \"Bearer\",\n expires_in: 3600,\n scope: pending.scope || \"openid email profile\",\n });\n });\n\n // ---------- User info ----------\n\n app.get(\"/oauth2/v2/userinfo\", (c) => {\n const authUser = c.get(\"authUser\");\n if (!authUser) {\n return c.json({ error: \"invalid_token\", error_description: \"Authentication required.\" }, 401);\n }\n\n const user = gs.users.findOneBy(\"email\", authUser.login as GoogleUser[\"email\"]);\n if (!user) {\n return c.json({ error: \"invalid_token\", error_description: \"User not found.\" }, 401);\n }\n\n return c.json({\n sub: user.uid,\n email: user.email,\n email_verified: user.email_verified,\n name: user.name,\n given_name: user.given_name,\n family_name: user.family_name,\n picture: user.picture,\n locale: user.locale,\n });\n });\n\n // ---------- Token revocation ----------\n\n app.post(\"/oauth2/revoke\", async (c) => {\n const contentType = c.req.header(\"Content-Type\") ?? \"\";\n const rawText = await c.req.text();\n\n let token: string;\n if (contentType.includes(\"application/json\")) {\n try {\n const parsed = JSON.parse(rawText);\n token = typeof parsed.token === \"string\" ? parsed.token : \"\";\n } catch {\n token = \"\";\n }\n } else {\n const params = new URLSearchParams(rawText);\n token = params.get(\"token\") ?? \"\";\n }\n\n if (token && tokenMap) {\n tokenMap.delete(token);\n }\n\n return c.body(null, 200);\n });\n}\n","import type { Hono } from \"hono\";\nimport type { ServicePlugin, Store, WebhookDispatcher, TokenMap, AppEnv, RouteContext } from \"@internal/core\";\nimport { getGoogleStore } from \"./store.js\";\nimport { generateUid } from \"./helpers.js\";\nimport { oauthRoutes } from \"./routes/oauth.js\";\n\nexport { getGoogleStore, type GoogleStore } from \"./store.js\";\nexport * from \"./entities.js\";\n\nexport interface GoogleSeedConfig {\n port?: number;\n users?: Array<{\n email: string;\n name?: string;\n given_name?: string;\n family_name?: string;\n picture?: string;\n locale?: string;\n }>;\n oauth_clients?: Array<{\n client_id: string;\n client_secret: string;\n name: string;\n redirect_uris: string[];\n }>;\n}\n\nfunction seedDefaults(store: Store, _baseUrl: string): void {\n const gs = getGoogleStore(store);\n\n gs.users.insert({\n uid: generateUid(\"goog\"),\n email: \"testuser@gmail.com\",\n name: \"Test User\",\n given_name: \"Test\",\n family_name: \"User\",\n picture: null,\n email_verified: true,\n locale: \"en\",\n });\n}\n\nexport function seedFromConfig(store: Store, _baseUrl: string, config: GoogleSeedConfig): void {\n const gs = getGoogleStore(store);\n\n if (config.users) {\n for (const u of config.users) {\n const existing = gs.users.findOneBy(\"email\", u.email);\n if (existing) continue;\n\n const nameParts = (u.name ?? \"\").split(/\\s+/);\n gs.users.insert({\n uid: generateUid(\"goog\"),\n email: u.email,\n name: u.name ?? u.email.split(\"@\")[0],\n given_name: u.given_name ?? nameParts[0] ?? \"\",\n family_name: u.family_name ?? nameParts.slice(1).join(\" \") ?? \"\",\n picture: u.picture ?? null,\n email_verified: true,\n locale: u.locale ?? \"en\",\n });\n }\n }\n\n if (config.oauth_clients) {\n for (const client of config.oauth_clients) {\n const existing = gs.oauthClients.findOneBy(\"client_id\", client.client_id);\n if (existing) continue;\n gs.oauthClients.insert({\n client_id: client.client_id,\n client_secret: client.client_secret,\n name: client.name,\n redirect_uris: client.redirect_uris,\n });\n }\n }\n}\n\nexport const googlePlugin: ServicePlugin = {\n name: \"google\",\n register(app: Hono<AppEnv>, store: Store, webhooks: WebhookDispatcher, baseUrl: string, tokenMap?: TokenMap): void {\n const ctx: RouteContext = { app, store, webhooks, baseUrl, tokenMap };\n oauthRoutes(ctx);\n },\n seed(store: Store, baseUrl: string): void {\n seedDefaults(store, baseUrl);\n },\n};\n\nexport default googlePlugin;\n","import { createServer, type AppKeyResolver, type AuthFallback, type Store } from \"@internal/core\";\nimport { vercelPlugin, seedFromConfig as seedVercel, type VercelSeedConfig } from \"@internal/vercel\";\nimport { githubPlugin, seedFromConfig as seedGitHub, getGitHubStore, type GitHubSeedConfig } from \"@internal/github\";\nimport { googlePlugin, seedFromConfig as seedGoogle, type GoogleSeedConfig } from \"@internal/google\";\nimport { serve } from \"@hono/node-server\";\n\nconst SERVICE_PLUGINS = {\n vercel: vercelPlugin,\n github: githubPlugin,\n google: googlePlugin,\n} as const;\n\nexport type ServiceName = keyof typeof SERVICE_PLUGINS;\n\nexport interface SeedConfig {\n tokens?: Record<string, { login: string; scopes?: string[] }>;\n vercel?: VercelSeedConfig;\n github?: GitHubSeedConfig;\n google?: GoogleSeedConfig;\n}\n\nexport interface EmulatorOptions {\n service: ServiceName;\n port?: number;\n seed?: SeedConfig;\n}\n\nexport interface Emulator {\n url: string;\n reset(): void;\n close(): Promise<void>;\n}\n\nexport async function createEmulator(options: EmulatorOptions): Promise<Emulator> {\n const { service, port = 4000, seed: seedConfig } = options;\n\n const plugin = SERVICE_PLUGINS[service];\n if (!plugin) {\n throw new Error(`Unknown service: ${service}`);\n }\n\n const tokens: Record<string, { login: string; id: number; scopes?: string[] }> = {};\n if (seedConfig?.tokens) {\n let tokenId = 100;\n for (const [token, user] of Object.entries(seedConfig.tokens)) {\n tokens[token] = { login: user.login, id: tokenId++, scopes: user.scopes };\n }\n } else {\n tokens[\"gho_test_token_admin\"] = { login: \"admin\", id: 2, scopes: [\"repo\", \"user\", \"admin:org\", \"admin:repo_hook\"] };\n }\n\n const baseUrl = `http://localhost:${port}`;\n\n let serverStore: Store | undefined;\n const appKeyResolver: AppKeyResolver | undefined =\n service === \"github\"\n ? (appId: number) => {\n try {\n const gh = getGitHubStore(serverStore!);\n const ghApp = gh.apps.all().find((a) => a.app_id === appId);\n if (!ghApp) return null;\n return { privateKey: ghApp.private_key, slug: ghApp.slug, name: ghApp.name };\n } catch {\n return null;\n }\n }\n : undefined;\n\n let fallbackUser: AuthFallback | undefined;\n if (service === \"vercel\") {\n const firstLogin = seedConfig?.vercel?.users?.[0]?.username ?? \"admin\";\n fallbackUser = { login: firstLogin, id: 1, scopes: [] };\n } else if (service === \"github\") {\n const firstLogin = seedConfig?.github?.users?.[0]?.login ?? \"admin\";\n fallbackUser = { login: firstLogin, id: 1, scopes: [\"repo\", \"user\", \"admin:org\", \"admin:repo_hook\"] };\n } else if (service === \"google\") {\n const firstEmail = seedConfig?.google?.users?.[0]?.email ?? \"testuser@gmail.com\";\n fallbackUser = { login: firstEmail, id: 1, scopes: [\"openid\", \"email\", \"profile\"] };\n }\n\n const { app, store } = createServer(plugin, { port, baseUrl, tokens, appKeyResolver, fallbackUser });\n serverStore = store;\n\n const seed = () => {\n plugin.seed?.(store, baseUrl);\n if (service === \"vercel\" && seedConfig?.vercel) seedVercel(store, baseUrl, seedConfig.vercel);\n if (service === \"github\" && seedConfig?.github) seedGitHub(store, baseUrl, seedConfig.github);\n if (service === \"google\" && seedConfig?.google) seedGoogle(store, baseUrl, seedConfig.google);\n };\n seed();\n\n const httpServer = serve({ fetch: app.fetch, port });\n\n return {\n url: baseUrl,\n reset() {\n store.reset();\n seed();\n },\n close(): Promise<void> {\n return new Promise((resolve, reject) => {\n httpServer.close((err) => {\n if (err) reject(err);\n else resolve();\n });\n });\n },\n };\n}\n"],"mappings":"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","names":["match","decoder","raw","Node","_Node","Node","Hono","encode","message","message","keyData","encode","message","errorHandler","Hono","message","randomBytes","randomBytes","message","vercelErr","parseJsonBody","raw","randomBytes","randomBytes","randomBytes","randomBytes","formatUser","ownerLogin","unauthorized","ApiError","tag","raw","parseJsonBody","forbidden","parsePagination","setLinkHeader","c","adjustRepoOpenIssues","head","lookupUserByLogin","findPull","adjustPrReviewCommentCount","sortComments","parseCommentSort","message","findIssueByNumber","insertIssueEvent","getOrCreateLabel","cmp","m","r","blob","repoUrl","saved","notFound","teamsForOrg","listOrgMembersDeduped","orgRoleForUser","getOrgByLogin","s","assertOrgAdmin","findCommitInRepo","PENDING_CODE_TTL_MS","getPendingCodes","SERVICE_LABEL","oauthRoutes","oauthApp","baseUrl","seedDefaults","seedFromConfig","randomBytes","createHash","generateUid","randomBytes","PENDING_CODE_TTL_MS","getPendingCodes","isPendingCodeExpired","SERVICE_LABEL","oauthRoutes","createHash","seedDefaults","seedFromConfig","seedFromConfig"]}
1
+ {"version":3,"sources":["../../@emulators/core/src/store.ts","../../@emulators/core/src/server.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/middleware/pagination.ts","../../@emulators/core/src/ui.ts","../../@emulators/core/src/oauth-helpers.ts","../src/registry.ts","../src/api.ts"],"sourcesContent":["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 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).map((id) => this.items.get(id)!).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\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","import { Hono } from \"hono\";\nimport { cors } from \"hono/cors\";\nimport { Store } from \"./store.js\";\nimport { WebhookDispatcher } from \"./webhooks.js\";\nimport { createApiErrorHandler, createErrorHandler } from \"./middleware/error-handler.js\";\nimport { authMiddleware, type AuthFallback, type TokenMap, type AppKeyResolver, type AppEnv } 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 { 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(event: string, action: string | undefined, payload: unknown, owner: string, repo?: string): 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 (\n event === \"ping\" ||\n s.events.includes(\"*\") ||\n s.events.includes(event)\n );\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, ErrorHandler, MiddlewareHandler } from \"hono\";\nimport type { ContentfulStatusCode } from \"hono/utils/http-status\";\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(...)`. Hono routes handler throws to the app error handler, not to outer middleware try/catch.\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 \"hono\";\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 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(\n Buffer.from(payloadB64, \"base64url\").toString()\n );\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 = typeof process !== \"undefined\" && (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 \"hono\";\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\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","import type { Context } from \"hono\";\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(\n c: Context,\n totalCount: number,\n page: number,\n perPage: number\n): 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\n .replace(/&/g, \"&amp;\")\n .replace(/</g, \"&lt;\")\n .replace(/>/g, \"&gt;\")\n .replace(/\"/g, \"&quot;\");\n}\n\nexport function escapeAttr(s: string): string {\n return escapeHtml(s).replace(/'/g, \"&#39;\");\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\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<title>${escapeHtml(title)} | emulate</title>\n<style>${CSS}</style>\n</head>`;\n}\n\nexport function renderCardPage(\n title: string,\n subtitle: string,\n body: string,\n service?: string\n): 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(\n title: string,\n sidebarHtml: string,\n bodyHtml: string,\n service?: string\n): 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 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\n ? `<div class=\"user-meta\">${escapeHtml(opts.name)}</div>`\n : \"\";\n const emailLine = opts.email\n ? `<div class=\"user-email\">${escapeHtml(opts.email)}</div>`\n : \"\";\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 type { ServicePlugin, Store, AppKeyResolver, AuthFallback } from \"@emulators/core\";\n\nexport interface LoadedService {\n plugin: ServicePlugin;\n seedFromConfig?(store: Store, baseUrl: string, config: unknown): void;\n createAppKeyResolver?(store: Store): AppKeyResolver;\n}\n\nexport interface ServiceEntry {\n label: string;\n endpoints: string;\n load(): Promise<LoadedService>;\n defaultFallback(svcSeedConfig?: Record<string, unknown>): AuthFallback;\n initConfig: Record<string, unknown>;\n}\n\nconst SERVICE_NAME_LIST = [\"vercel\", \"github\", \"google\", \"slack\", \"apple\", \"microsoft\", \"aws\"] as const;\nexport type ServiceName = (typeof SERVICE_NAME_LIST)[number];\nexport const SERVICE_NAMES: readonly ServiceName[] = SERVICE_NAME_LIST;\n\nexport const SERVICE_REGISTRY: Record<ServiceName, ServiceEntry> = {\n vercel: {\n label: \"Vercel REST API emulator\",\n endpoints: \"projects, deployments, domains, env vars, users, teams, file uploads, protection bypass\",\n async load() {\n const mod = await import(\"@emulators/vercel\");\n return { plugin: mod.vercelPlugin, seedFromConfig: mod.seedFromConfig };\n },\n defaultFallback(cfg) {\n const firstLogin = (cfg?.users as Array<{ username?: string }> | undefined)?.[0]?.username ?? \"admin\";\n return { login: firstLogin, id: 1, scopes: [] };\n },\n initConfig: {\n vercel: {\n users: [{ username: \"developer\", name: \"Developer\", email: \"dev@example.com\" }],\n teams: [{ slug: \"my-team\", name: \"My Team\" }],\n projects: [{ name: \"my-app\", team: \"my-team\", framework: \"nextjs\" }],\n integrations: [{\n client_id: \"oac_example_client_id\",\n client_secret: \"example_client_secret\",\n name: \"My Vercel App\",\n redirect_uris: [\"http://localhost:3000/api/auth/callback/vercel\"],\n }],\n },\n },\n },\n\n github: {\n label: \"GitHub REST API emulator\",\n endpoints: \"users, repos, issues, PRs, comments, reviews, labels, milestones, branches, git data, orgs, teams, releases, webhooks, search, actions, checks, rate limit\",\n async load() {\n const mod = await import(\"@emulators/github\");\n return {\n plugin: mod.githubPlugin,\n seedFromConfig: mod.seedFromConfig,\n createAppKeyResolver(store: Store): AppKeyResolver {\n return (appId: number) => {\n try {\n const gh = mod.getGitHubStore(store);\n const ghApp = gh.apps.all().find((a) => a.app_id === appId);\n if (!ghApp) return null;\n return { privateKey: ghApp.private_key, slug: ghApp.slug, name: ghApp.name };\n } catch {\n return null;\n }\n };\n },\n };\n },\n defaultFallback(cfg) {\n const firstLogin = (cfg?.users as Array<{ login?: string }> | undefined)?.[0]?.login ?? \"admin\";\n return { login: firstLogin, id: 1, scopes: [\"repo\", \"user\", \"admin:org\", \"admin:repo_hook\"] };\n },\n initConfig: {\n github: {\n users: [{\n login: \"octocat\", name: \"The Octocat\", email: \"octocat@github.com\",\n bio: \"I am the Octocat\", company: \"GitHub\", location: \"San Francisco\",\n }],\n orgs: [{ login: \"my-org\", name: \"My Organization\", description: \"A test organization\" }],\n repos: [\n { owner: \"octocat\", name: \"hello-world\", description: \"My first repository\", language: \"JavaScript\", topics: [\"hello\", \"world\"], auto_init: true },\n { owner: \"my-org\", name: \"org-repo\", description: \"An organization repository\", language: \"TypeScript\", auto_init: true },\n ],\n oauth_apps: [{\n client_id: \"Iv1.example_client_id\", client_secret: \"example_client_secret\",\n name: \"My App\", redirect_uris: [\"http://localhost:3000/api/auth/callback/github\"],\n }],\n },\n },\n },\n\n google: {\n label: \"Google OAuth 2.0 / OpenID Connect + Gmail, Calendar, and Drive emulator\",\n endpoints: \"OAuth authorize, token exchange, userinfo, OIDC discovery, token revocation, Gmail messages/drafts/threads/labels/history/settings, Calendar lists/events/freebusy, Drive files/uploads\",\n async load() {\n const mod = await import(\"@emulators/google\");\n return { plugin: mod.googlePlugin, seedFromConfig: mod.seedFromConfig };\n },\n defaultFallback(cfg) {\n const firstEmail = (cfg?.users as Array<{ email?: string }> | undefined)?.[0]?.email ?? \"testuser@gmail.com\";\n return { login: firstEmail, id: 1, scopes: [\"openid\", \"email\", \"profile\"] };\n },\n initConfig: {\n google: {\n users: [{ email: \"testuser@example.com\", name: \"Test User\", picture: \"https://lh3.googleusercontent.com/a/default-user\", email_verified: true }],\n oauth_clients: [{\n client_id: \"example-client-id.apps.googleusercontent.com\", client_secret: \"GOCSPX-example_secret\",\n name: \"Code App (Google)\", redirect_uris: [\"http://localhost:3000/api/auth/callback/google\"],\n }],\n labels: [{ id: \"Label_ops\", user_email: \"testuser@example.com\", name: \"Ops/Review\", color_background: \"#DDEEFF\", color_text: \"#111111\" }],\n messages: [{\n id: \"msg_welcome\", user_email: \"testuser@example.com\", from: \"welcome@example.com\", to: \"testuser@example.com\",\n subject: \"Welcome to the Gmail emulator\", body_text: \"You can now test Gmail, Calendar, and Drive flows locally.\",\n label_ids: [\"INBOX\", \"UNREAD\", \"CATEGORY_UPDATES\"], date: \"2025-01-04T10:00:00.000Z\",\n }],\n calendars: [{ id: \"primary\", user_email: \"testuser@example.com\", summary: \"testuser@example.com\", primary: true, selected: true, time_zone: \"UTC\" }],\n calendar_events: [{\n id: \"evt_kickoff\", user_email: \"testuser@example.com\", calendar_id: \"primary\",\n summary: \"Project Kickoff\", start_date_time: \"2025-01-10T09:00:00.000Z\", end_date_time: \"2025-01-10T09:30:00.000Z\",\n }],\n drive_items: [{ id: \"drv_docs\", user_email: \"testuser@example.com\", name: \"Docs\", mime_type: \"application/vnd.google-apps.folder\", parent_ids: [\"root\"] }],\n },\n },\n },\n\n slack: {\n label: \"Slack API emulator\",\n endpoints: \"auth, chat, conversations, users, reactions, team, OAuth, incoming webhooks\",\n async load() {\n const mod = await import(\"@emulators/slack\");\n return { plugin: mod.slackPlugin, seedFromConfig: mod.seedFromConfig };\n },\n defaultFallback() {\n return { login: \"U000000001\", id: 1, scopes: [\"chat:write\", \"channels:read\", \"users:read\", \"reactions:write\"] };\n },\n initConfig: {\n slack: {\n team: { name: \"My Workspace\", domain: \"my-workspace\" },\n users: [{ name: \"developer\", real_name: \"Developer\", email: \"dev@example.com\" }],\n channels: [{ name: \"general\", topic: \"General discussion\" }, { name: \"random\", topic: \"Random stuff\" }],\n bots: [{ name: \"my-bot\" }],\n oauth_apps: [{\n client_id: \"12345.67890\", client_secret: \"example_client_secret\",\n name: \"My Slack App\", redirect_uris: [\"http://localhost:3000/api/auth/callback/slack\"],\n }],\n },\n },\n },\n\n apple: {\n label: \"Apple Sign In / OAuth emulator\",\n endpoints: \"OAuth authorize, token exchange, JWKS\",\n async load() {\n const mod = await import(\"@emulators/apple\");\n return { plugin: mod.applePlugin, seedFromConfig: mod.seedFromConfig };\n },\n defaultFallback(cfg) {\n const firstEmail = (cfg?.users as Array<{ email?: string }> | undefined)?.[0]?.email ?? \"testuser@icloud.com\";\n return { login: firstEmail, id: 1, scopes: [\"openid\", \"email\", \"name\"] };\n },\n initConfig: {\n apple: {\n users: [{ email: \"testuser@icloud.com\", name: \"Test User\" }],\n oauth_clients: [{\n client_id: \"com.example.app\", team_id: \"TEAM001\",\n name: \"My Apple App\", redirect_uris: [\"http://localhost:3000/api/auth/callback/apple\"],\n }],\n },\n },\n },\n\n microsoft: {\n label: \"Microsoft Entra ID OAuth 2.0 / OpenID Connect emulator\",\n endpoints: \"OAuth authorize, token exchange, userinfo, OIDC discovery, Graph /me, logout, token revocation\",\n async load() {\n const mod = await import(\"@emulators/microsoft\");\n return { plugin: mod.microsoftPlugin, seedFromConfig: mod.seedFromConfig };\n },\n defaultFallback(cfg) {\n const firstEmail = (cfg?.users as Array<{ email?: string }> | undefined)?.[0]?.email ?? \"testuser@outlook.com\";\n return { login: firstEmail, id: 1, scopes: [\"openid\", \"email\", \"profile\", \"User.Read\"] };\n },\n initConfig: {\n microsoft: {\n users: [{ email: \"testuser@outlook.com\", name: \"Test User\" }],\n oauth_clients: [{\n client_id: \"example-client-id\", client_secret: \"example-client-secret\",\n name: \"My Microsoft App\", redirect_uris: [\"http://localhost:3000/api/auth/callback/microsoft-entra-id\"],\n }],\n },\n },\n },\n\n aws: {\n label: \"AWS cloud service emulator\",\n endpoints: \"S3 (buckets, objects), SQS (queues, messages), IAM (users, roles, access keys), STS (assume role, caller identity)\",\n async load() {\n const mod = await import(\"@emulators/aws\");\n return { plugin: mod.awsPlugin, seedFromConfig: mod.seedFromConfig };\n },\n defaultFallback() {\n return { login: \"admin\", id: 1, scopes: [\"s3:*\", \"sqs:*\", \"iam:*\", \"sts:*\"] };\n },\n initConfig: {\n aws: {\n region: \"us-east-1\",\n s3: { buckets: [{ name: \"my-app-bucket\" }, { name: \"my-app-uploads\" }] },\n sqs: { queues: [{ name: \"my-app-events\" }, { name: \"my-app-dlq\" }] },\n iam: {\n users: [{ user_name: \"developer\", create_access_key: true }],\n roles: [{ role_name: \"lambda-execution-role\", description: \"Role for Lambda function execution\" }],\n },\n },\n },\n },\n};\n\nexport const DEFAULT_TOKENS = {\n tokens: {\n \"test_token_admin\": {\n login: \"admin\",\n scopes: [\"repo\", \"user\", \"admin:org\", \"admin:repo_hook\"],\n },\n \"test_token_user1\": {\n login: \"octocat\",\n scopes: [\"repo\", \"user\"],\n },\n },\n};\n","import { createServer, type AppKeyResolver, type Store } from \"@emulators/core\";\nimport { SERVICE_REGISTRY } from \"./registry.js\";\nexport type { ServiceName } from \"./registry.js\";\nimport type { ServiceName } from \"./registry.js\";\nimport { serve } from \"@hono/node-server\";\n\nexport interface SeedConfig {\n tokens?: Record<string, { login: string; scopes?: string[] }>;\n [service: string]: unknown;\n}\n\nexport interface EmulatorOptions {\n service: ServiceName;\n port?: number;\n seed?: SeedConfig;\n}\n\nexport interface Emulator {\n url: string;\n reset(): void;\n close(): Promise<void>;\n}\n\nexport async function createEmulator(options: EmulatorOptions): Promise<Emulator> {\n const { service, port = 4000, seed: seedConfig } = options;\n\n const entry = SERVICE_REGISTRY[service];\n if (!entry) {\n throw new Error(`Unknown service: ${service}`);\n }\n\n const loaded = await entry.load();\n\n const tokens: Record<string, { login: string; id: number; scopes?: string[] }> = {};\n if (seedConfig?.tokens) {\n let tokenId = 100;\n for (const [token, user] of Object.entries(seedConfig.tokens)) {\n tokens[token] = { login: user.login, id: tokenId++, scopes: user.scopes };\n }\n } else {\n tokens[\"test_token_admin\"] = { login: \"admin\", id: 2, scopes: [\"repo\", \"user\", \"admin:org\", \"admin:repo_hook\"] };\n }\n\n const baseUrl = `http://localhost:${port}`;\n\n let cachedResolver: AppKeyResolver | undefined;\n const appKeyResolver: AppKeyResolver | undefined = loaded.createAppKeyResolver\n ? (appId) => cachedResolver!(appId)\n : undefined;\n\n const svcSeedConfig = seedConfig?.[service] as Record<string, unknown> | undefined;\n const fallbackUser = entry.defaultFallback(svcSeedConfig);\n\n const { app, store } = createServer(loaded.plugin, { port, baseUrl, tokens, appKeyResolver, fallbackUser });\n cachedResolver = loaded.createAppKeyResolver?.(store);\n\n const seed = () => {\n loaded.plugin.seed?.(store, baseUrl);\n if (svcSeedConfig && loaded.seedFromConfig) {\n loaded.seedFromConfig(store, baseUrl, svcSeedConfig);\n }\n };\n seed();\n\n const httpServer = serve({ fetch: app.fetch, port });\n\n return {\n url: baseUrl,\n reset() {\n store.reset();\n seed();\n },\n close(): Promise<void> {\n return new Promise((resolve, reject) => {\n httpServer.close((err) => {\n if (err) reject(err);\n else resolve();\n });\n });\n },\n };\n}\n"],"mappings":"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","names":[]}