{"version":3,"file":"github.mjs","names":[],"sources":["../../../src/oauth/providers/github.ts"],"sourcesContent":["/**\n * GitHub OAuth provider\n */\n\nimport { z } from \"zod\";\n\nimport type { OAuthProvider, OAuthProfile } from \"../types.js\";\n\nconst gitHubUserSchema = z.object({\n\tid: z.number(),\n\tlogin: z.string(),\n\tname: z.string().nullable(),\n\temail: z.string().nullable(),\n\tavatar_url: z.string(),\n});\n\nconst gitHubEmailSchema = z.object({\n\temail: z.string(),\n\tprimary: z.boolean(),\n\tverified: z.boolean(),\n});\n\nexport const github: OAuthProvider = {\n\tname: \"github\",\n\tauthorizeUrl: \"https://github.com/login/oauth/authorize\",\n\ttokenUrl: \"https://github.com/login/oauth/access_token\",\n\tuserInfoUrl: \"https://api.github.com/user\",\n\tscopes: [\"read:user\", \"user:email\"],\n\n\tparseProfile(data: unknown): OAuthProfile {\n\t\tconst user = gitHubUserSchema.parse(data);\n\t\treturn {\n\t\t\tid: String(user.id),\n\t\t\temail: user.email || \"\", // Will be fetched separately if needed\n\t\t\tname: user.name,\n\t\t\tavatarUrl: user.avatar_url,\n\t\t\temailVerified: true, // GitHub verifies emails\n\t\t};\n\t},\n};\n\n/**\n * Fetch the user's primary email from GitHub\n * (needed because email may not be returned in the basic user endpoint)\n */\nexport async function fetchGitHubEmail(accessToken: string): Promise<string> {\n\tconst response = await fetch(\"https://api.github.com/user/emails\", {\n\t\theaders: {\n\t\t\tAuthorization: `Bearer ${accessToken}`,\n\t\t\tAccept: \"application/vnd.github+json\",\n\t\t\t\"X-GitHub-Api-Version\": \"2022-11-28\",\n\t\t\t\"User-Agent\": \"emdash-cms\",\n\t\t},\n\t});\n\n\tif (!response.ok) {\n\t\tthrow new Error(`Failed to fetch GitHub emails: ${response.status}`);\n\t}\n\n\tconst json: unknown = await response.json();\n\tconst emails = z.array(gitHubEmailSchema).parse(json);\n\tconst primary = emails.find((e) => e.primary && e.verified);\n\n\tif (!primary) {\n\t\tthrow new Error(\"No verified primary email found on GitHub account\");\n\t}\n\n\treturn primary.email;\n}\n"],"mappings":";;;;;;AAQA,MAAM,mBAAmB,EAAE,OAAO;CACjC,IAAI,EAAE,QAAQ;CACd,OAAO,EAAE,QAAQ;CACjB,MAAM,EAAE,QAAQ,CAAC,UAAU;CAC3B,OAAO,EAAE,QAAQ,CAAC,UAAU;CAC5B,YAAY,EAAE,QAAQ;CACtB,CAAC;AAEF,MAAM,oBAAoB,EAAE,OAAO;CAClC,OAAO,EAAE,QAAQ;CACjB,SAAS,EAAE,SAAS;CACpB,UAAU,EAAE,SAAS;CACrB,CAAC;AAEF,MAAa,SAAwB;CACpC,MAAM;CACN,cAAc;CACd,UAAU;CACV,aAAa;CACb,QAAQ,CAAC,aAAa,aAAa;CAEnC,aAAa,MAA6B;EACzC,MAAM,OAAO,iBAAiB,MAAM,KAAK;AACzC,SAAO;GACN,IAAI,OAAO,KAAK,GAAG;GACnB,OAAO,KAAK,SAAS;GACrB,MAAM,KAAK;GACX,WAAW,KAAK;GAChB,eAAe;GACf;;CAEF;;;;;AAMD,eAAsB,iBAAiB,aAAsC;CAC5E,MAAM,WAAW,MAAM,MAAM,sCAAsC,EAClE,SAAS;EACR,eAAe,UAAU;EACzB,QAAQ;EACR,wBAAwB;EACxB,cAAc;EACd,EACD,CAAC;AAEF,KAAI,CAAC,SAAS,GACb,OAAM,IAAI,MAAM,kCAAkC,SAAS,SAAS;CAGrE,MAAM,OAAgB,MAAM,SAAS,MAAM;CAE3C,MAAM,UADS,EAAE,MAAM,kBAAkB,CAAC,MAAM,KAAK,CAC9B,MAAM,MAAM,EAAE,WAAW,EAAE,SAAS;AAE3D,KAAI,CAAC,QACJ,OAAM,IAAI,MAAM,oDAAoD;AAGrE,QAAO,QAAQ"}