diff --git a/api/package.json b/api/package.json index ec5c4830..fb36c3d2 100644 --- a/api/package.json +++ b/api/package.json @@ -22,6 +22,7 @@ "jsonwebtoken": "^8.5.1", "nanoid": "^3.0.0", "nanoid-dictionary": "^4.3.0", + "octokit": "^2.0.14", "prisma": "4.3.1", "stompjs": "^2.3.3", "uuid": "^9.0.0", diff --git a/api/prisma/migrations/20230202100030_add_github_access_token/migration.sql b/api/prisma/migrations/20230202100030_add_github_access_token/migration.sql new file mode 100644 index 00000000..4d4252cd --- /dev/null +++ b/api/prisma/migrations/20230202100030_add_github_access_token/migration.sql @@ -0,0 +1,2 @@ +-- AlterTable +ALTER TABLE "User" ADD COLUMN "githubAccessToken" TEXT; diff --git a/api/prisma/migrations/20230203014843_add_linked_github_repo/migration.sql b/api/prisma/migrations/20230203014843_add_linked_github_repo/migration.sql new file mode 100644 index 00000000..8c46b7fc --- /dev/null +++ b/api/prisma/migrations/20230203014843_add_linked_github_repo/migration.sql @@ -0,0 +1,2 @@ +-- AlterTable +ALTER TABLE "Repo" ADD COLUMN "githubRepo" TEXT; diff --git a/api/prisma/schema.prisma b/api/prisma/schema.prisma index c2aca7c4..a49a9c68 100755 --- a/api/prisma/schema.prisma +++ b/api/prisma/schema.prisma @@ -34,18 +34,19 @@ model Profile { } model User { - id String @id - email String @unique + id String @id + email String @unique // username is an optional value, because it might create barrier when user signup. - username String? @unique - firstname String - lastname String + username String? @unique + firstname String + lastname String // A user might not have a password, if they login via OAuth. - hashedPassword String? - posts Post[] - profile Profile? - Repo Repo[] @relation("OWNER") - sharedRepos Repo[] @relation("COLLABORATOR") + hashedPassword String? + posts Post[] + profile Profile? + Repo Repo[] @relation("OWNER") + sharedRepos Repo[] @relation("COLLABORATOR") + githubAccessToken String? } model Repo { @@ -58,6 +59,7 @@ model Repo { podsId String[] public Boolean @default(false) collaborators User[] @relation("COLLABORATOR") + githubRepo String? } enum PodType { diff --git a/api/src/resolver.ts b/api/src/resolver.ts index 2ae2be7e..ff3b524a 100644 --- a/api/src/resolver.ts +++ b/api/src/resolver.ts @@ -39,6 +39,16 @@ import { loopKillInactiveRoutes as loopKillInactiveRoutes_k8s, initRoutes as initRoutes_k8s, } from "./spawner-k8s"; +import { + deleteGitHubAccessToken, + getGitHubAccessToken, + getMyGitHubRepos, + githubExport, + linkedGitHubRepo, + linkGitHubRepo, + setGitHubAccessToken, + unlinkGitHubRepo, +} from "./resolver_git"; export const resolvers = { Query: { @@ -62,6 +72,10 @@ export const resolvers = { : { infoRuntime: infoRuntime_docker, }), + // TODO this query is redundant, could just use /get/user + getGitHubAccessToken, + linkedGitHubRepo, + getMyGitHubRepos, }, Mutation: { signup, @@ -86,6 +100,11 @@ export const resolvers = { spawnRuntime: spawnRuntime_docker, killRuntime: killRuntime_docker, }), + githubExport, + setGitHubAccessToken, + deleteGitHubAccessToken, + linkGitHubRepo, + unlinkGitHubRepo, }, }; diff --git a/api/src/resolver_git.ts b/api/src/resolver_git.ts new file mode 100644 index 00000000..f116b7dd --- /dev/null +++ b/api/src/resolver_git.ts @@ -0,0 +1,448 @@ +import fs from "fs"; +import fsp from "fs/promises"; +import util from "util"; +import * as child from "child_process"; + +import Prisma from "@prisma/client"; +import { ensureRepoEditAccess } from "./resolver_repo"; +import { Octokit } from "octokit"; + +const { PrismaClient } = Prisma; + +const prisma = new PrismaClient(); + +async function exportFS({ repoId, pods }) { + let path = `/srv/git/${repoId}`; + + if (fs.existsSync(`${path}/src`)) { + await fs.promises.rm(`${path}/src`, { recursive: true }); + } + await fs.promises.mkdir(`${path}/src`); + let d = normalize(pods); + let config = normalize_cp_config(d); + + // export + // start from ROOT, do dfs + async function dfs(id, parentDir) { + let deck = d[id]; + // let dir = deck.id === "ROOT" ? parentDir : `${parentDir}/${deck.id}`; + let dir = `${parentDir}/${deck.name || deck.id}`; + console.log("mkdir", dir); + // if (!fs.existsSync(dir)) { + await fs.promises.mkdir(dir); + // } + // console.log("deck", deck); + let gen = gen_default("python"); + let suffix = "py"; + + let content = gen(deck, d); + if (content) { + console.log("writing to", `${dir}/main.${suffix}`); + // console.log(name, "content", content); + await fs.promises.writeFile(`${dir}/main.${suffix}`, content); + } + + for (const { id } of deck.children.filter(({ type }) => type === "DECK")) { + console.log("DFS on ", id); + await dfs(id, dir); + } + } + // let decks = pods.filter((pod) => pod.type === "DECK"); + await dfs("ROOT", `${path}/src`); +} + +async function gitExport({ repo, pods }) { + // put everything into the folder + // console.log("=== repo", JSON.stringify(repo, null, 2)); + // console.log("=== pods", pods); + // 1. write all pods into /path/to/folder/pods/[uuid].json + // 1. if repo does not exist, create it + let path = `/srv/git/${repo.id}`; + // find the user name + // FIXME this should be done at some level up + + const exec = util.promisify(child.exec); + if (!fs.existsSync(path)) { + // FIXME init git repository + // await NodeGit.Repository.init(path, 0); + await exec( + `mkdir -p /srv/git/${repo.id} && cd /srv/git/${repo.id} && git init` + ); + } + // I actually want to update it every time so that people can change their name and email + // config user name + await exec( + `cd ${path} && git config user.name "CodePod" && git config user.email "bot@codepod.io"` + ); + // 2. write file + // remove + if (fs.existsSync(`${path}/.pods`)) { + await fs.promises.rm(`${path}/.pods`, { recursive: true }); + } + if (!fs.existsSync(`${path}/.pods`)) { + await fs.promises.mkdir(`${path}/.pods`); + } + for (const pod of pods) { + // delete pod.githead; + // delete pod.staged; + // delete pod.result; + // delete pod.stdout; + // delete pod.error; + const { githead, staged, result, stdout, error, ...cleanPod } = pod; + await fs.promises.writeFile( + `${path}/.pods/${cleanPod.id}.json`, + // FIXME this will put string into quoted + JSON.stringify(cleanPod, null, 2) + ); + } + + await exportFS({ repoId: repo.id, pods }); + await exec(`cd ${path} && git add .`); + return true; +} + +function normalize(pods) { + // build a id=>pod map + let d = {}; + for (const pod of pods) { + d[pod.id] = pod; + pod.children = []; + pod.content = JSON.parse(pod.content); + } + d["ROOT"] = { + id: "ROOT", + type: "DECK", + ns: "ROOT", + children: [], + }; + // construct .children + for (const pod of pods) { + pod.parentId = pod.parentId || "ROOT"; + d[pod.parentId].children.push({ + id: pod.id, + type: pod.type, + lang: pod.lang, + name: pod.name, + }); + } + return d; +} + +function normalize_cp_config(d) { + // extract and remove config deck, return the config + let configs = d["ROOT"].children.filter(({ name }) => name === "CP_CONFIG"); + + if (configs.length == 0) { + // use default config + return {}; + } + let res = {}; + if (configs.length > 1) { + console.log("WARNING: more than 1 config deck found"); + } + // use first config + let { id } = configs[0]; + let deck = d[id]; + deck.children.forEach(({ id }) => { + let content = d[id].content; + let jobj = JSON.parse(content); + if (jobj && jobj["lang"]) { + res[jobj["lang"]] = jobj; + } + }); + // remove from d + configs.forEach(({ id }) => { + let children = d["ROOT"].children; + children.splice( + children.findIndex(({ id: id2 }) => id === id2), + 1 + ); + }); + return res; +} + +function gen_default(name) { + return (pod, pods) => { + // default gen from a list of pods to content + let ids = pod.children + .filter(({ type }) => type !== "DECK") + .filter(({ lang }) => lang === name) + .map(({ id }) => id); + if (ids.length == 0) return null; + return ids.map((id) => pods[id].content).join("\n\n"); + }; +} + +async function ensureGitRepo({ repo, user }) { + // 1. ensure the github repo exits. If not, create it. + + // This function is only used to export to github repo. If no git repo is + // configured, this function should not be called. + if (!repo.githubRepo) { + throw new Error("No github repo configured"); + } + // Create gitub repo query github api + const octokit = new Octokit({ + auth: user.githubAccessToken, + }); + // 2. clone the repo + const path = `/srv/git/${repo.id}`; + const exec = util.promisify(child.exec); + // FIXME different copies of the api server should connect to the same drive? + if (!fs.existsSync(`${path}`)) { + // check if the repo exists. If not, create it. + + let res = await octokit.request("GET /repos/{owner_repo}", { + owner_repo: repo.githubRepo, + }); + // FIXME what if the repo exist? + if (!res) { + // create the repo + await octokit.request("POST /user/repos", { + // FIXME the user name? + name: repo.githubRepo.split("/")[1], + private: true, + }); + } + await exec( + // CAUTION the token info would be inside the git remote url + `git clone https://${user.githubAccessToken}@github.com/${repo.githubRepo} ${path}` + ); + // await fs.promises.rm(`${path}/src`, { recursive: true }); + } else { + // run git pull + // FIXME this could be very slow to pull every time. + await exec(`cd ${path} && git pull`); + } +} + +async function gitCommitAndPush(repoId) { + let path = `/srv/git/${repoId}`; + // /srv/git/ob88ejg7qc24cuvvjzh3 + // const child = require("child_process") + // child.exec(`cd /srv/git/ob88ejg7qc24cuvvjzh3 $ && git push`); + const exec = util.promisify(child.exec); + if (!fs.existsSync(path)) { + return false; + } + // FIXME not sure if I want to git add here + console.log("Committing", path); + await exec(`cd ${path} && git add .`); + console.log("commiting .."); + try { + await exec(`cd ${path} && git commit -m "sync by CodePod"`); + } catch (e) { + console.log("nothing to commit"); + } + // CAUTION this will push to github + let { stdout } = await exec(`cd ${path} && git status`); + if (stdout.indexOf("Your branch is up to date with") !== -1) { + console.log("nothing to push"); + return true; + } + console.log("Pushing .."); + // throw new Error("Not implemented"); + // add timeout? + await asyncTimeout(async () => { + await exec(`cd ${path} && git push`); + console.log("done"); + }, 5000); + // setTimeout(() => { + // // throw exception? + // throw new Error("Timeout"); + // }, 5000); + // await exec(`cd ${path} && git push`); + // console.log("done"); +} + +async function sanityCheck(repoId) { + // Sanity check + // 1. if the repo is empty + // 2. if the .codepod/repoId === repoId + let path = `/srv/git/${repoId}`; + if (!fs.existsSync(path)) { + return false; + } + const exec = util.promisify(child.exec); + // check empty + let { stdout } = await exec(`cd ${path} && git status`); + if (stdout.indexOf("No commits yet") !== -1) { + return true; + } + // check .codepod/repoId + // TODO generate this file when exporting. + let repoIdContent = await fs.promises.readFile( + `${path}/.codepod/repoId`, + "utf8" + ); + if (repoIdContent === repoId) { + return true; + } + return false; +} + +/** + * Entry point of Github export and sync. This function will: + * 1. ensure the github repo exits. If not, create it. + * 2. clone the repo + * 3. export the content to the repo folder + * 4. commit and push to github + * @param _ + * @param param1 + * @param param2 + * @returns + */ +export async function githubExport(_, { repoId }, { userId }) { + if (!userId) throw Error("Unauthenticated"); + // 1. update db + // 2. TODO commit on FS. FIXME the DB only records content change, but the + // staged changes also include metadata. + ensureRepoEditAccess({ repoId, userId }); + let repo = await prisma.repo.findUnique({ + where: { + id: repoId, + }, + }); + if (!repo) throw new Error("Repo not found"); + let user = await prisma.user.findUnique({ + where: { + id: userId, + }, + }); + if (!user) throw new Error("User not found"); + if (!user.githubAccessToken) + throw new Error("User has no github access token."); + console.log("ensure git repo"); + await ensureGitRepo({ repo, user }); + // Sanity check + // 1. if the repo is empty + // 2. if the .codepod/repoId === repoId + let sanity = await sanityCheck(repoId); + if (!sanity) { + throw new Error("Repo sanity check failed."); + } + + console.log("exporting"); + const pods = await prisma.pod.findMany({ + where: { + repo: { + id: repo.id, + }, + }, + }); + // 3. export files + await gitExport({ repo, pods }); + // 4. git commit and push + await gitCommitAndPush(repoId); + return true; +} + +const asyncTimeout = (func, timeout) => + new Promise(async (resolve, reject) => { + setTimeout(() => { + reject(new Error("Timeout")); + }, timeout); + await func(); + resolve(true); + }); + +export async function setGitHubAccessToken(_, { token }, { userId }) { + if (!userId) throw Error("Unauthenticated"); + let user = await prisma.user.findFirst({ + where: { + id: userId, + }, + }); + if (!user) { + throw new Error("User not found"); + } + // save + await prisma.user.update({ + where: { id: userId }, + data: { + githubAccessToken: token, + }, + }); + return true; +} + +export async function getGitHubAccessToken(_, {}, { userId }) { + let user = await prisma.user.findFirst({ + where: { id: userId }, + }); + return user?.githubAccessToken; +} + +export async function deleteGitHubAccessToken(_, {}, { userId }) { + await prisma.user.update({ + where: { id: userId }, + data: { + githubAccessToken: null, + }, + }); + return true; +} + +export async function linkedGitHubRepo(_, { repoId }, { userId }) { + await ensureRepoEditAccess({ repoId, userId }); + let repo = await prisma.repo.findFirst({ + where: { + id: repoId, + }, + }); + if (!repo) { + throw Error("repo not found"); + } + return repo.githubRepo; +} +export async function linkGitHubRepo(_, { repoId, ghRepoName }, { userId }) { + await ensureRepoEditAccess({ repoId, userId }); + // create the repo if not exist + let user = await prisma.user.findFirst({ + where: { + id: userId, + }, + }); + // do the link + await prisma.repo.update({ + where: { + id: repoId, + }, + data: { + githubRepo: ghRepoName, + }, + }); + return true; +} + +export async function unlinkGitHubRepo(_, { repoId }, { userId }) { + await ensureRepoEditAccess({ repoId, userId }); + await prisma.repo.update({ + where: { + id: repoId, + }, + data: { + githubRepo: null, + }, + }); + return true; +} + +export async function getMyGitHubRepos(_, {}, { userId }) { + // 1. get the access token + let user = await prisma.user.findFirst({ + where: { + id: userId, + }, + }); + if (!user) { + throw new Error("User not found"); + } + // 2. query github api + const octokit = new Octokit({ + auth: user.githubAccessToken, + }); + let { data } = await octokit.request("GET /user/repos"); + const repos = data.map((repo) => repo.full_name); + return repos; +} diff --git a/api/src/resolver_repo.ts b/api/src/resolver_repo.ts index 931a493c..a1fbce99 100644 --- a/api/src/resolver_repo.ts +++ b/api/src/resolver_repo.ts @@ -8,7 +8,7 @@ const { PrismaClient } = Prisma; const prisma = new PrismaClient(); -async function ensureRepoEditAccess({ repoId, userId }) { +export async function ensureRepoEditAccess({ repoId, userId }) { let repo = await prisma.repo.findFirst({ where: { id: repoId, diff --git a/api/src/server.ts b/api/src/server.ts index 48049b0c..aa75ce8a 100644 --- a/api/src/server.ts +++ b/api/src/server.ts @@ -11,9 +11,17 @@ import { ApolloServerPluginLandingPageLocalDefault, } from "apollo-server-core"; +const { OAuthApp, createNodeMiddleware } = require("octokit"); + import { typeDefs } from "./typedefs"; import { resolvers } from "./resolver"; +const github_oauth_app = new OAuthApp({ + clientType: "oauth-app", + clientId: "", + clientSecret: "", +}); + interface TokenInterface { id: string; } @@ -40,6 +48,65 @@ async function startServer() { plugins: [ApolloServerPluginLandingPageLocalDefault({ embed: true })], }); const expapp = express(); + // The default login url is /api/oauth/login + // Well, for standalone server pkg, it's /api/github/oauth/login + // The default callback url is /api/github/oauth/callback + // expapp.use(createNodeMiddleware(github_oauth_app)); + + expapp.use((req, res, next) => { + console.log("Time:", Date.now()); + // console.log("req", req); + console.log("req.url", req.url); + console.log("req.query", req.query); + const { pathname } = new URL(req.url as string, "http://localhost"); + + // my own middleware to handle github oauth + if (pathname === "/api/github/oauth/login") { + console.log("=== logging in"); + const { url } = github_oauth_app.getWebFlowAuthorizationUrl({ + state: req.query.state, + scopes: ["repo"], + // redirectUrl: "/api/github/oauth/callback", + // scopes: req.query.scopes + // ? (req.query.scopes as string).split(",") + // : undefined, + // allowSignup: req.query.allowSignup + // ? req.query.allowSignup === "true" + // : undefined, + // redirectUrl: req.query.redirectUrl, + }); + console.log("redirecting to url", url); + res.redirect(url); + console.log("after redicting .."); + } else if (pathname === "/api/github/oauth/callback") { + console.log("=== callback"); + github_oauth_app + .createToken({ + code: req.query.code, + state: req.query.state, + }) + .then((response) => { + console.log(response); + // TODO write the token to database + // TODO authenticate so that we know where to write the token + res + .header("hebi", response.authentication.token) + .redirect(`/profile?token=${response.authentication.token}`); + // TODO how to show success indicator on the front-end? + // res.redirect("/profile"); + // send the token to the front-end + // res.send(response.authentication.token); + }) + .catch((error) => { + console.log(error); + // res.redirect(`/?error=${error}`); + // TODO how to show error indicator on the front-end? + res.redirect("/profile"); + }); + } else { + next(); + } + }); const http_server = http.createServer(expapp); const wss = new WebSocketServer({ server: http_server }); // graphql api will be available at /graphql diff --git a/api/src/typedefs.ts b/api/src/typedefs.ts index 937c3d54..19ba3d83 100644 --- a/api/src/typedefs.ts +++ b/api/src/typedefs.ts @@ -101,6 +101,9 @@ export const typeDefs = gql` listAllRuntimes: [RuntimeInfo] myCollabRepos: [Repo] infoRuntime(sessionId: String!): RuntimeInfo + getGitHubAccessToken: String + linkedGitHubRepo(repoId: String!): String + getMyGitHubRepos: [String] } type Mutation { @@ -126,5 +129,10 @@ export const typeDefs = gql` updateVisibility(repoId: String, isPublic: Boolean): Boolean addCollaborator(repoId: String, email: String): Boolean deleteCollaborator(repoId: String, collaboratorId: String): Boolean + githubExport(repoId: String): Boolean + setGitHubAccessToken(token: String): Boolean + deleteGitHubAccessToken: Boolean + linkGitHubRepo(repoId: String!, ghRepoName: String!): Boolean + unlinkGitHubRepo(repoId: String): Boolean } `; diff --git a/api/yarn.lock b/api/yarn.lock index 608ad030..1f847e46 100644 --- a/api/yarn.lock +++ b/api/yarn.lock @@ -760,6 +760,231 @@ optionalDependencies: openid-client "^5.1.6" +"@octokit/app@^13.1.1": + version "13.1.2" + resolved "https://registry.yarnpkg.com/@octokit/app/-/app-13.1.2.tgz#81fdee338abddda9c016e5beccdb19ff5110bb66" + integrity sha512-Kf+h5sa1SOI33hFsuHvTsWj1jUrjp1x4MuiJBq7U/NicfEGa6nArPUoDnyfP/YTmcQ5cQ5yvOgoIBkbwPg6kzQ== + dependencies: + "@octokit/auth-app" "^4.0.8" + "@octokit/auth-unauthenticated" "^3.0.0" + "@octokit/core" "^4.0.0" + "@octokit/oauth-app" "^4.0.7" + "@octokit/plugin-paginate-rest" "^6.0.0" + "@octokit/types" "^9.0.0" + "@octokit/webhooks" "^10.0.0" + +"@octokit/auth-app@^4.0.8": + version "4.0.9" + resolved "https://registry.yarnpkg.com/@octokit/auth-app/-/auth-app-4.0.9.tgz#66500c8f66545d970a19123b9b364c678c972d6b" + integrity sha512-VFpKIXhHO+kVJtane5cEvdYPtjDKCOI0uKsRrsZfJP+uEu7rcPbQCLCcRKgyT+mUIzGr1IIOmwP/lFqSip1dXA== + dependencies: + "@octokit/auth-oauth-app" "^5.0.0" + "@octokit/auth-oauth-user" "^2.0.0" + "@octokit/request" "^6.0.0" + "@octokit/request-error" "^3.0.0" + "@octokit/types" "^9.0.0" + "@types/lru-cache" "^5.1.0" + deprecation "^2.3.1" + lru-cache "^6.0.0" + universal-github-app-jwt "^1.1.1" + universal-user-agent "^6.0.0" + +"@octokit/auth-oauth-app@^5.0.0": + version "5.0.5" + resolved "https://registry.yarnpkg.com/@octokit/auth-oauth-app/-/auth-oauth-app-5.0.5.tgz#be2a93d72835133b4866ac4721aa628849475525" + integrity sha512-UPX1su6XpseaeLVCi78s9droxpGtBWIgz9XhXAx9VXabksoF0MyI5vaa1zo1njyYt6VaAjFisC2A2Wchcu2WmQ== + dependencies: + "@octokit/auth-oauth-device" "^4.0.0" + "@octokit/auth-oauth-user" "^2.0.0" + "@octokit/request" "^6.0.0" + "@octokit/types" "^9.0.0" + "@types/btoa-lite" "^1.0.0" + btoa-lite "^1.0.0" + universal-user-agent "^6.0.0" + +"@octokit/auth-oauth-device@^4.0.0": + version "4.0.4" + resolved "https://registry.yarnpkg.com/@octokit/auth-oauth-device/-/auth-oauth-device-4.0.4.tgz#b8dde812a38bf5cb0696b6e7d0a74681d437c390" + integrity sha512-Xl85BZYfqCMv+Uvz33nVVUjE7I/PVySNaK6dRRqlkvYcArSr9vRcZC9KVjXYObGRTCN6mISeYdakAZvWEN4+Jw== + dependencies: + "@octokit/oauth-methods" "^2.0.0" + "@octokit/request" "^6.0.0" + "@octokit/types" "^9.0.0" + universal-user-agent "^6.0.0" + +"@octokit/auth-oauth-user@^2.0.0": + version "2.1.1" + resolved "https://registry.yarnpkg.com/@octokit/auth-oauth-user/-/auth-oauth-user-2.1.1.tgz#d900972f3d9247924637ab3343a8305746feadb2" + integrity sha512-JgqnNNPf9CaWLxWm9uh2WgxcaVYhxBR09NVIPTiMU2dVZ3FObOHs3njBiLNw+zq84k+rEdm5Y7AsiASrZ84Apg== + dependencies: + "@octokit/auth-oauth-device" "^4.0.0" + "@octokit/oauth-methods" "^2.0.0" + "@octokit/request" "^6.0.0" + "@octokit/types" "^9.0.0" + btoa-lite "^1.0.0" + universal-user-agent "^6.0.0" + +"@octokit/auth-token@^3.0.0": + version "3.0.3" + resolved "https://registry.yarnpkg.com/@octokit/auth-token/-/auth-token-3.0.3.tgz#ce7e48a3166731f26068d7a7a7996b5da58cbe0c" + integrity sha512-/aFM2M4HVDBT/jjDBa84sJniv1t9Gm/rLkalaz9htOm+L+8JMj1k9w0CkUdcxNyNxZPlTxKPVko+m1VlM58ZVA== + dependencies: + "@octokit/types" "^9.0.0" + +"@octokit/auth-unauthenticated@^3.0.0": + version "3.0.4" + resolved "https://registry.yarnpkg.com/@octokit/auth-unauthenticated/-/auth-unauthenticated-3.0.4.tgz#347d3f3a6fefb22d399a941b986bac5361fc95df" + integrity sha512-AT74XGBylcLr4lmUp1s6mjSUgphGdlse21Qjtv5DzpX1YOl5FXKwvNcZWESdhyBbpDT8VkVyLFqa/7a7eqpPNw== + dependencies: + "@octokit/request-error" "^3.0.0" + "@octokit/types" "^9.0.0" + +"@octokit/core@^4.0.0", "@octokit/core@^4.0.4": + version "4.2.0" + resolved "https://registry.yarnpkg.com/@octokit/core/-/core-4.2.0.tgz#8c253ba9605aca605bc46187c34fcccae6a96648" + integrity sha512-AgvDRUg3COpR82P7PBdGZF/NNqGmtMq2NiPqeSsDIeCfYFOZ9gddqWNQHnFdEUf+YwOj4aZYmJnlPp7OXmDIDg== + dependencies: + "@octokit/auth-token" "^3.0.0" + "@octokit/graphql" "^5.0.0" + "@octokit/request" "^6.0.0" + "@octokit/request-error" "^3.0.0" + "@octokit/types" "^9.0.0" + before-after-hook "^2.2.0" + universal-user-agent "^6.0.0" + +"@octokit/endpoint@^7.0.0": + version "7.0.5" + resolved "https://registry.yarnpkg.com/@octokit/endpoint/-/endpoint-7.0.5.tgz#2bb2a911c12c50f10014183f5d596ce30ac67dd1" + integrity sha512-LG4o4HMY1Xoaec87IqQ41TQ+glvIeTKqfjkCEmt5AIwDZJwQeVZFIEYXrYY6yLwK+pAScb9Gj4q+Nz2qSw1roA== + dependencies: + "@octokit/types" "^9.0.0" + is-plain-object "^5.0.0" + universal-user-agent "^6.0.0" + +"@octokit/graphql@^5.0.0": + version "5.0.5" + resolved "https://registry.yarnpkg.com/@octokit/graphql/-/graphql-5.0.5.tgz#a4cb3ea73f83b861893a6370ee82abb36e81afd2" + integrity sha512-Qwfvh3xdqKtIznjX9lz2D458r7dJPP8l6r4GQkIdWQouZwHQK0mVT88uwiU2bdTU2OtT1uOlKpRciUWldpG0yQ== + dependencies: + "@octokit/request" "^6.0.0" + "@octokit/types" "^9.0.0" + universal-user-agent "^6.0.0" + +"@octokit/oauth-app@^4.0.6", "@octokit/oauth-app@^4.0.7": + version "4.2.0" + resolved "https://registry.yarnpkg.com/@octokit/oauth-app/-/oauth-app-4.2.0.tgz#f965496b1d957c3ff0275a5d5233b380181ce72b" + integrity sha512-gyGclT77RQMkVUEW3YBeAKY+LBSc5u3eC9Wn/Uwt3WhuKuu9mrV18EnNpDqmeNll+mdV02yyBROU29Tlili6gg== + dependencies: + "@octokit/auth-oauth-app" "^5.0.0" + "@octokit/auth-oauth-user" "^2.0.0" + "@octokit/auth-unauthenticated" "^3.0.0" + "@octokit/core" "^4.0.0" + "@octokit/oauth-authorization-url" "^5.0.0" + "@octokit/oauth-methods" "^2.0.0" + "@types/aws-lambda" "^8.10.83" + fromentries "^1.3.1" + universal-user-agent "^6.0.0" + +"@octokit/oauth-authorization-url@^5.0.0": + version "5.0.0" + resolved "https://registry.yarnpkg.com/@octokit/oauth-authorization-url/-/oauth-authorization-url-5.0.0.tgz#029626ce87f3b31addb98cd0d2355c2381a1c5a1" + integrity sha512-y1WhN+ERDZTh0qZ4SR+zotgsQUE1ysKnvBt1hvDRB2WRzYtVKQjn97HEPzoehh66Fj9LwNdlZh+p6TJatT0zzg== + +"@octokit/oauth-methods@^2.0.0": + version "2.0.5" + resolved "https://registry.yarnpkg.com/@octokit/oauth-methods/-/oauth-methods-2.0.5.tgz#b11ce2205c46ffcd731c7332b21bb62dad10ce24" + integrity sha512-yQP6B5gE3axNxuM3U9KqWs/ErAQ+WLPaPgC/7EjsZsQibkf8sjdAfF8/y/EJW+Dd05XQvadX4WhQZPMnO1SE1A== + dependencies: + "@octokit/oauth-authorization-url" "^5.0.0" + "@octokit/request" "^6.2.3" + "@octokit/request-error" "^3.0.3" + "@octokit/types" "^9.0.0" + btoa-lite "^1.0.0" + +"@octokit/openapi-types@^16.0.0": + version "16.0.0" + resolved "https://registry.yarnpkg.com/@octokit/openapi-types/-/openapi-types-16.0.0.tgz#d92838a6cd9fb4639ca875ddb3437f1045cc625e" + integrity sha512-JbFWOqTJVLHZSUUoF4FzAZKYtqdxWu9Z5m2QQnOyEa04fOFljvyh7D3GYKbfuaSWisqehImiVIMG4eyJeP5VEA== + +"@octokit/plugin-paginate-rest@^6.0.0": + version "6.0.0" + resolved "https://registry.yarnpkg.com/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-6.0.0.tgz#f34b5a7d9416019126042cd7d7b811e006c0d561" + integrity sha512-Sq5VU1PfT6/JyuXPyt04KZNVsFOSBaYOAq2QRZUwzVlI10KFvcbUo8lR258AAQL1Et60b0WuVik+zOWKLuDZxw== + dependencies: + "@octokit/types" "^9.0.0" + +"@octokit/plugin-rest-endpoint-methods@^7.0.0": + version "7.0.1" + resolved "https://registry.yarnpkg.com/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-7.0.1.tgz#f7ebe18144fd89460f98f35a587b056646e84502" + integrity sha512-pnCaLwZBudK5xCdrR823xHGNgqOzRnJ/mpC/76YPpNP7DybdsJtP7mdOwh+wYZxK5jqeQuhu59ogMI4NRlBUvA== + dependencies: + "@octokit/types" "^9.0.0" + deprecation "^2.3.1" + +"@octokit/plugin-retry@^4.0.3": + version "4.1.1" + resolved "https://registry.yarnpkg.com/@octokit/plugin-retry/-/plugin-retry-4.1.1.tgz#2a96e97219f6506d636b4de696cf368da44a8e20" + integrity sha512-iR7rg5KRSl6L6RELTQQ3CYeNgeBJyuAmP95odzcQ/zyefnRT/Peo8rWeky4z7V/+/oPWqOL4I5Z+V8KtjpHCJw== + dependencies: + "@octokit/types" "^9.0.0" + bottleneck "^2.15.3" + +"@octokit/plugin-throttling@^5.0.0": + version "5.0.1" + resolved "https://registry.yarnpkg.com/@octokit/plugin-throttling/-/plugin-throttling-5.0.1.tgz#e3ba0a49830a777097b6d49615782a0a5e51e743" + integrity sha512-I4qxs7wYvYlFuY3PAUGWAVPhFXG3RwnvTiSr5Fu/Auz7bYhDLnzS2MjwV8nGLq/FPrWwYiweeZrI5yjs1YG4tQ== + dependencies: + "@octokit/types" "^9.0.0" + bottleneck "^2.15.3" + +"@octokit/request-error@^3.0.0", "@octokit/request-error@^3.0.3": + version "3.0.3" + resolved "https://registry.yarnpkg.com/@octokit/request-error/-/request-error-3.0.3.tgz#ef3dd08b8e964e53e55d471acfe00baa892b9c69" + integrity sha512-crqw3V5Iy2uOU5Np+8M/YexTlT8zxCfI+qu+LxUB7SZpje4Qmx3mub5DfEKSO8Ylyk0aogi6TYdf6kxzh2BguQ== + dependencies: + "@octokit/types" "^9.0.0" + deprecation "^2.0.0" + once "^1.4.0" + +"@octokit/request@^6.0.0", "@octokit/request@^6.2.3": + version "6.2.3" + resolved "https://registry.yarnpkg.com/@octokit/request/-/request-6.2.3.tgz#76d5d6d44da5c8d406620a4c285d280ae310bdb4" + integrity sha512-TNAodj5yNzrrZ/VxP+H5HiYaZep0H3GU0O7PaF+fhDrt8FPrnkei9Aal/txsN/1P7V3CPiThG0tIvpPDYUsyAA== + dependencies: + "@octokit/endpoint" "^7.0.0" + "@octokit/request-error" "^3.0.0" + "@octokit/types" "^9.0.0" + is-plain-object "^5.0.0" + node-fetch "^2.6.7" + universal-user-agent "^6.0.0" + +"@octokit/types@^9.0.0": + version "9.0.0" + resolved "https://registry.yarnpkg.com/@octokit/types/-/types-9.0.0.tgz#6050db04ddf4188ec92d60e4da1a2ce0633ff635" + integrity sha512-LUewfj94xCMH2rbD5YJ+6AQ4AVjFYTgpp6rboWM5T7N3IsIF65SBEOVcYMGAEzO/kKNiNaW4LoWtoThOhH06gw== + dependencies: + "@octokit/openapi-types" "^16.0.0" + +"@octokit/webhooks-methods@^3.0.0": + version "3.0.2" + resolved "https://registry.yarnpkg.com/@octokit/webhooks-methods/-/webhooks-methods-3.0.2.tgz#cece91cc72714a1c83b35d121e04334f051e509c" + integrity sha512-Vlnv5WBscf07tyAvfDbp7pTkMZUwk7z7VwEF32x6HqI+55QRwBTcT+D7DDjZXtad/1dU9E32x0HmtDlF9VIRaQ== + +"@octokit/webhooks-types@6.10.0": + version "6.10.0" + resolved "https://registry.yarnpkg.com/@octokit/webhooks-types/-/webhooks-types-6.10.0.tgz#b441780d26370c7682f4f964d4b36b5cb0c757f8" + integrity sha512-lDNv83BeEyxxukdQ0UttiUXawk9+6DkdjjFtm2GFED+24IQhTVaoSbwV9vWWKONyGLzRmCQqZmoEWkDhkEmPlw== + +"@octokit/webhooks@^10.0.0": + version "10.7.0" + resolved "https://registry.yarnpkg.com/@octokit/webhooks/-/webhooks-10.7.0.tgz#ec05e655d309383e2cd08dafe51abd1705df6d4a" + integrity sha512-zZBbQMpXXnK/ki/utrFG/TuWv9545XCSLibfDTxrYqR1PmU6zel02ebTOrA7t5XIGHzlEOc/NgISUIBUe7pMFA== + dependencies: + "@octokit/request-error" "^3.0.0" + "@octokit/webhooks-methods" "^3.0.0" + "@octokit/webhooks-types" "6.10.0" + aggregate-error "^3.1.0" + "@prisma/client@4.3.1": version "4.3.1" resolved "https://registry.yarnpkg.com/@prisma/client/-/client-4.3.1.tgz#b9aad9bd9bd43e7f715ec1d763c8bd9273688800" @@ -876,6 +1101,11 @@ dependencies: "@types/node" "*" +"@types/aws-lambda@^8.10.83": + version "8.10.110" + resolved "https://registry.yarnpkg.com/@types/aws-lambda/-/aws-lambda-8.10.110.tgz#32a1f9d40b855d69830243492bbb6408098f4c88" + integrity sha512-r6egf2Cwv/JaFTTrF9OXFVUB3j/SXTgM9BwrlbBRjWAa2Tu6GWoDoLflppAZ8uSfbUJdXvC7Br3DjuN9pQ2NUQ== + "@types/babel__core@^7.1.14": version "7.1.19" resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.1.19.tgz#7b497495b7d1b4812bdb9d02804d0576f43ee460" @@ -922,6 +1152,11 @@ "@types/connect" "*" "@types/node" "*" +"@types/btoa-lite@^1.0.0": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@types/btoa-lite/-/btoa-lite-1.0.0.tgz#e190a5a548e0b348adb0df9ac7fa5f1151c7cca4" + integrity sha512-wJsiX1tosQ+J5+bY5LrSahHxr2wT+uME5UDwdN1kg4frt40euqA+wzECkmq4t5QbveHiJepfdThgQrPw6KiSlg== + "@types/connect@*": version "3.4.35" resolved "https://registry.yarnpkg.com/@types/connect/-/connect-3.4.35.tgz#5fcf6ae445e4021d1fc2219a4873cc73a3bb2ad1" @@ -1029,11 +1264,23 @@ dependencies: "@types/node" "*" +"@types/jsonwebtoken@^9.0.0": + version "9.0.1" + resolved "https://registry.yarnpkg.com/@types/jsonwebtoken/-/jsonwebtoken-9.0.1.tgz#29b1369c4774200d6d6f63135bf3d1ba3ef997a4" + integrity sha512-c5ltxazpWabia/4UzhIoaDcIza4KViOQhdbjRlfcIGVnsE3c3brkz9Z+F/EeJIECOQP7W7US2hNE930cWWkPiw== + dependencies: + "@types/node" "*" + "@types/long@^4.0.0": version "4.0.2" resolved "https://registry.yarnpkg.com/@types/long/-/long-4.0.2.tgz#b74129719fc8d11c01868010082d483b7545591a" integrity sha512-MqTGEo5bj5t157U6fA/BiDynNkn0YknVdh48CMPkTSpFTVmvao5UQmm7uEF6xBEo7qIMAlY/JSleYaE6VOdpaA== +"@types/lru-cache@^5.1.0": + version "5.1.1" + resolved "https://registry.yarnpkg.com/@types/lru-cache/-/lru-cache-5.1.1.tgz#c48c2e27b65d2a153b19bfc1a317e30872e01eef" + integrity sha512-ssE3Vlrys7sdIzs5LOxCzTVMsU7i9oa/IaW92wF32JFb3CVczqOkru2xspuKczHEbG3nvmPY7IFqVmGGHdNbYw== + "@types/mime@*": version "3.0.1" resolved "https://registry.yarnpkg.com/@types/mime/-/mime-3.0.1.tgz#5f8f2bca0a5863cb69bc0b0acd88c96cb1d4ae10" @@ -1188,6 +1435,14 @@ agent-base@6: dependencies: debug "4" +aggregate-error@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/aggregate-error/-/aggregate-error-3.1.0.tgz#92670ff50f5359bdb7a3e0d40d0ec30c5737687a" + integrity sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA== + dependencies: + clean-stack "^2.0.0" + indent-string "^4.0.0" + ajv@^6.12.3: version "6.12.6" resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" @@ -1479,6 +1734,11 @@ bcryptjs@^2.4.3: resolved "https://registry.yarnpkg.com/bcryptjs/-/bcryptjs-2.4.3.tgz#9ab5627b93e60621ff7cdac5da9733027df1d0cb" integrity sha512-V/Hy/X9Vt7f3BbPJEi8BdVFMByHi+jNXrYkW3huaybV/kQ0KJg0Y6PkEMbn+zeT+i+SiKZ/HMqJGIIt4LZDqNQ== +before-after-hook@^2.2.0: + version "2.2.3" + resolved "https://registry.yarnpkg.com/before-after-hook/-/before-after-hook-2.2.3.tgz#c51e809c81a4e354084422b9b26bad88249c517c" + integrity sha512-NzUnlZexiaH/46WDhANlyR2bXRopNg4F/zuSA3OpZnllCUgRaOF2znDioDWrmbNVsuZk6l9pMquQB38cfBZwkQ== + bignumber.js@^9.0.0: version "9.1.1" resolved "https://registry.yarnpkg.com/bignumber.js/-/bignumber.js-9.1.1.tgz#c4df7dc496bd849d4c9464344c1aa74228b4dac6" @@ -1516,6 +1776,11 @@ body-parser@1.20.0, body-parser@^1.19.0: type-is "~1.6.18" unpipe "1.0.0" +bottleneck@^2.15.3: + version "2.19.5" + resolved "https://registry.yarnpkg.com/bottleneck/-/bottleneck-2.19.5.tgz#5df0b90f59fd47656ebe63c78a98419205cadd91" + integrity sha512-VHiNCbI1lKdl44tGrhNfU3lup0Tj/ZBMJB5/2ZbNXRCPuRCO7ed2mgcK4r17y+KB2EfuYuRaVlwNbAeaWGSpbw== + brace-expansion@^1.1.7: version "1.1.11" resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" @@ -1555,6 +1820,11 @@ bser@2.1.1: dependencies: node-int64 "^0.4.0" +btoa-lite@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/btoa-lite/-/btoa-lite-1.0.0.tgz#337766da15801210fdd956c22e9c6891ab9d0337" + integrity sha512-gvW7InbIyF8AicrqWoptdW08pUxuhq8BEgowNajy9RhiE86fmGAGl+bLKo6oB8QP0CkqHLowfN0oJdKC/J6LbA== + buffer-equal-constant-time@1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz#f8e71132f7ffe6e01a5c9697a4c6f3e48d5cc819" @@ -1685,6 +1955,11 @@ cjs-module-lexer@^1.0.0: resolved "https://registry.yarnpkg.com/cjs-module-lexer/-/cjs-module-lexer-1.2.2.tgz#9f84ba3244a512f3a54e5277e8eef4c489864e40" integrity sha512-cOU9usZw8/dXIXKtwa8pM0OTJQuJkxMN6w30csNRUerHfeQ5R6U3kkU/FtJeIf3M202OHfY2U8ccInBG7/xogA== +clean-stack@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/clean-stack/-/clean-stack-2.2.0.tgz#ee8472dbb129e727b31e8a10a427dee9dfe4008b" + integrity sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A== + cliui@^7.0.2: version "7.0.4" resolved "https://registry.yarnpkg.com/cliui/-/cliui-7.0.4.tgz#a0265ee655476fc807aea9df3df8df7783808b4f" @@ -1888,6 +2163,11 @@ depd@2.0.0: resolved "https://registry.yarnpkg.com/depd/-/depd-2.0.0.tgz#b696163cc757560d09cf22cc8fad1571b79e76df" integrity sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw== +deprecation@^2.0.0, deprecation@^2.3.1: + version "2.3.1" + resolved "https://registry.yarnpkg.com/deprecation/-/deprecation-2.3.1.tgz#6368cbdb40abf3373b525ac87e4a260c3a700919" + integrity sha512-xmHIy4F3scKVwMsQ4WnVaS8bHOx0DmVwRywosKhaILI0ywMDWPtBSku2HNxRvF7jtwDRsoEwYQSfbxj8b7RlJQ== + destroy@1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.2.0.tgz#4803735509ad8be552934c67df614f94e66fa015" @@ -2230,6 +2510,11 @@ fresh@0.5.2: resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" integrity sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q== +fromentries@^1.3.1: + version "1.3.2" + resolved "https://registry.yarnpkg.com/fromentries/-/fromentries-1.3.2.tgz#e4bca6808816bf8f93b52750f1127f5a6fd86e3a" + integrity sha512-cHEpEQHUg0f8XdtZCc2ZAhrHzKzT0MrFUTcvx+hfxYu7rGMDc5SKoXFh+n4YigxsHXRzc6OrCshdR1bWH6HHyg== + fs-constants@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/fs-constants/-/fs-constants-1.0.0.tgz#6be0de9be998ce16af8afc24497b9ee9b7ccd9ad" @@ -2493,6 +2778,11 @@ imurmurhash@^0.1.4: resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" integrity sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA== +indent-string@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-4.0.0.tgz#624f8f4497d619b2d9768531d58f4122854d7251" + integrity sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg== + inflight@^1.0.4: version "1.0.6" resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" @@ -2562,6 +2852,11 @@ is-number@^7.0.0: resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== +is-plain-object@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-5.0.0.tgz#4427f50ab3429e9025ea7d52e9043a9ef4159344" + integrity sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q== + is-stream@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.1.tgz#fac1e3d53b97ad5a9d0ae9cef2389f5810a5c077" @@ -3086,6 +3381,16 @@ jsonwebtoken@^8.5.1: ms "^2.1.1" semver "^5.6.0" +jsonwebtoken@^9.0.0: + version "9.0.0" + resolved "https://registry.yarnpkg.com/jsonwebtoken/-/jsonwebtoken-9.0.0.tgz#d0faf9ba1cc3a56255fe49c0961a67e520c1926d" + integrity sha512-tuGfYXxkQGDPnLJ7SibiQgVgeDgfbPq2k2ICcbgqW8WxWLBAxKQM/ZCu/IT8SOSwmaYl4dpTFCW5xZv7YbbWUw== + dependencies: + jws "^3.2.2" + lodash "^4.17.21" + ms "^2.1.1" + semver "^7.3.8" + jsprim@^1.2.2: version "1.4.2" resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.4.2.tgz#712c65533a15c878ba59e9ed5f0e26d5b77c5feb" @@ -3197,6 +3502,11 @@ lodash.sortby@^4.7.0: resolved "https://registry.yarnpkg.com/lodash.sortby/-/lodash.sortby-4.7.0.tgz#edd14c824e2cc9c1e0b0a1b42bb5210516a42438" integrity sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA== +lodash@^4.17.21: + version "4.17.21" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" + integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== + loglevel@^1.6.8: version "1.8.0" resolved "https://registry.yarnpkg.com/loglevel/-/loglevel-1.8.0.tgz#e7ec73a57e1e7b419cb6c6ac06bf050b67356114" @@ -3472,6 +3782,20 @@ object-inspect@^1.9.0: resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.12.2.tgz#c0641f26394532f28ab8d796ab954e43c009a8ea" integrity sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ== +octokit@^2.0.14: + version "2.0.14" + resolved "https://registry.yarnpkg.com/octokit/-/octokit-2.0.14.tgz#e2057097a6c9cac3e7724a4365b450b7c694a6a4" + integrity sha512-z6cgZBFxirpFEQ1La8Lg83GCs5hOV2EPpkYYdjsGNbfQMv8qUGjq294MiRBCbZqLufviakGsPUxaNKe3JrPmsA== + dependencies: + "@octokit/app" "^13.1.1" + "@octokit/core" "^4.0.4" + "@octokit/oauth-app" "^4.0.6" + "@octokit/plugin-paginate-rest" "^6.0.0" + "@octokit/plugin-rest-endpoint-methods" "^7.0.0" + "@octokit/plugin-retry" "^4.0.3" + "@octokit/plugin-throttling" "^5.0.0" + "@octokit/types" "^9.0.0" + oidc-token-hash@^5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/oidc-token-hash/-/oidc-token-hash-5.0.1.tgz#ae6beec3ec20f0fd885e5400d175191d6e2f10c6" @@ -3879,6 +4203,13 @@ semver@^6.0.0, semver@^6.3.0: resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== +semver@^7.3.8: + version "7.3.8" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.8.tgz#07a78feafb3f7b32347d725e33de7e2a2df67798" + integrity sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A== + dependencies: + lru-cache "^6.0.0" + semver@~7.0.0: version "7.0.0" resolved "https://registry.yarnpkg.com/semver/-/semver-7.0.0.tgz#5f3ca35761e47e05b206c6daff2cf814f0316b8e" @@ -4428,6 +4759,19 @@ underscore@^1.9.1: resolved "https://registry.yarnpkg.com/underscore/-/underscore-1.13.6.tgz#04786a1f589dc6c09f761fc5f45b89e935136441" integrity sha512-+A5Sja4HP1M08MaXya7p5LvjuM7K6q/2EaC0+iovj/wOcMsTzMvDFbasi/oSapiwOlt252IqsKqPjCl7huKS0A== +universal-github-app-jwt@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/universal-github-app-jwt/-/universal-github-app-jwt-1.1.1.tgz#d57cee49020662a95ca750a057e758a1a7190e6e" + integrity sha512-G33RTLrIBMFmlDV4u4CBF7dh71eWwykck4XgaxaIVeZKOYZRAAxvcGMRFTUclVY6xoUPQvO4Ne5wKGxYm/Yy9w== + dependencies: + "@types/jsonwebtoken" "^9.0.0" + jsonwebtoken "^9.0.0" + +universal-user-agent@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/universal-user-agent/-/universal-user-agent-6.0.0.tgz#3381f8503b251c0d9cd21bc1de939ec9df5480ee" + integrity sha512-isyNax3wXoKaulPDZWHQqbmIx1k2tb9fb3GGDBRxCscfYV2Ch7WxPArBsFEG8s/safwXTT7H4QGhaIkTp9447w== + unpipe@1.0.0, unpipe@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" diff --git a/compose/dev/nginx.conf b/compose/dev/nginx.conf index a7e2b5ef..3e665f8f 100644 --- a/compose/dev/nginx.conf +++ b/compose/dev/nginx.conf @@ -11,6 +11,9 @@ server { location /graphql { proxy_pass http://api:4000; } + location /api { + proxy_pass http://api:4000; + } location /runtime { rewrite ^/runtime(.*)$ $1 break; proxy_pass http://proxy:4010; diff --git a/ui/package.json b/ui/package.json index f39ec33b..911adc1f 100644 --- a/ui/package.json +++ b/ui/package.json @@ -33,6 +33,7 @@ "nanoid-dictionary": "^4.3.0", "net": "^1.0.2", "notistack": "^2.0.8", + "octokit": "^2.0.14", "react": "^18.2.0", "react-copy-to-clipboard": "^5.1.0", "react-dom": "^18.2.0", diff --git a/ui/src/components/Sidebar.tsx b/ui/src/components/Sidebar.tsx index f349db89..59f73f3a 100644 --- a/ui/src/components/Sidebar.tsx +++ b/ui/src/components/Sidebar.tsx @@ -1,5 +1,5 @@ import { useEffect, useContext, useState } from "react"; -import { useParams } from "react-router-dom"; +import { useLocation, useParams } from "react-router-dom"; import Box from "@mui/material/Box"; import Button from "@mui/material/Button"; import Divider from "@mui/material/Divider"; @@ -13,6 +13,10 @@ import ChevronLeftIcon from "@mui/icons-material/ChevronLeft"; import Grid from "@mui/material/Grid"; import ChevronRightIcon from "@mui/icons-material/ChevronRight"; import RestartAltIcon from "@mui/icons-material/RestartAlt"; +import GitHubIcon from "@mui/icons-material/GitHub"; +import OpenInNewIcon from "@mui/icons-material/OpenInNew"; +import HelpOutlineOutlinedIcon from "@mui/icons-material/HelpOutlineOutlined"; + import Typography from "@mui/material/Typography"; import { useSnackbar, VariantType } from "notistack"; @@ -24,7 +28,15 @@ import { usePrompt } from "../lib/prompt"; import { RepoContext } from "../lib/store"; import useMe from "../lib/me"; -import { FormControlLabel, FormGroup, Stack, Switch } from "@mui/material"; +import { + Autocomplete, + FormControlLabel, + FormGroup, + Link, + Stack, + Switch, + TextField, +} from "@mui/material"; import { getUpTime } from "../lib/utils"; function Flex(props) { @@ -303,6 +315,173 @@ function SyncStatus() { ); } +function ConnectToGitHubRepo() { + // const { repos, loading } = useGitHubRepos(); + const [name, setName] = useState(""); + let { id: repoId } = useParams(); + const [linkGitHubRepo] = useMutation( + gql` + mutation LinkGitHubRepo($repoId: String!, $ghRepoName: String!) { + linkGitHubRepo(repoId: $repoId, ghRepoName: $ghRepoName) + } + `, + { refetchQueries: ["LinkedGitHubRepo"] } + ); + return ( + + + Connect to GitHub Repo{" "} + + Note that to prevent accidental overwrite, the linked github repo + must be either: +
  • Not exist, or
  • +
  • Exists but empty, or
  • +
  • It's .codepod/repoId matches current repo ID.
  • +
    + } + placement="top" + sx={{ marginBottom: 1, marginLeft: -1 }} + > + + +
    + {/* a input box, which upon typing, show the filtered list. If not found, show create button */} + { + setName(e.target.value); + }} + /> + + + ); +} + +function GitHubRepoLinkStatus() { + let { id: repoId } = useParams(); + const { data } = useQuery( + gql` + query LinkedGitHubRepo($repoId: String!) { + linkedGitHubRepo(repoId: $repoId) + } + `, + { variables: { repoId } } + ); + const [unlinkGitHubRepo] = useMutation( + gql` + mutation UnlinkGitHubRepo($repoId: String!) { + unlinkGitHubRepo(repoId: $repoId) + } + `, + { refetchQueries: ["LinkedGitHubRepo"] } + ); + let [ + githubExport, + { loading: githubExportLoadng, error: githubExportError }, + ] = useMutation( + gql` + mutation GithubExport($repoId: String) { + githubExport(repoId: $repoId) + } + ` + ); + + // if the github repo is not connected, show the connect button + if (data?.linkedGitHubRepo) { + return ( + + + + + {data.linkedGitHubRepo} + + + + + + {githubExportError && ( + {githubExportError.message} + )} + + ); + } else { + return ; + } +} + +function GitExport() { + const location = useLocation(); + let from = ((location.state as any)?.from?.pathname as string) || "/"; + let { id: repoId } = useParams(); + + const { data } = useQuery(gql` + query GetGitHubAccessToken { + getGitHubAccessToken + } + `); + if (!repoId) return no repoId; + console.log("from:", from); + return ( + + {/* a stack of buttons */} + + {/* Link to */} + {data?.getGitHubAccessToken ? ( + + {/* Account Linked */} + + + ) : ( + + + GitHub Login + + + )} + + + ); +} + function ActiveSessions() { const { loading, data, refetch } = useQuery(gql` query GetActiveSessions { @@ -456,6 +635,9 @@ export const Sidebar: React.FC = ({ + + + diff --git a/ui/src/lib/auth.tsx b/ui/src/lib/auth.tsx index 7c1c5a17..d91e852a 100644 --- a/ui/src/lib/auth.tsx +++ b/ui/src/lib/auth.tsx @@ -175,5 +175,6 @@ function useProvideAuth() { signUp, isSignedIn, hasToken, + authToken, }; } diff --git a/ui/src/pages/profile.tsx b/ui/src/pages/profile.tsx index 2589de6e..666ba370 100644 --- a/ui/src/pages/profile.tsx +++ b/ui/src/pages/profile.tsx @@ -3,12 +3,45 @@ import Divider from "@mui/material/Divider"; import Typography from "@mui/material/Typography"; import Paper from "@mui/material/Paper"; -import { Container, Stack } from "@mui/material"; +import { Button, Container, Link, Stack } from "@mui/material"; +import GitHubIcon from "@mui/icons-material/GitHub"; import useMe from "../lib/me"; +import { Navigate, useNavigate, useSearchParams } from "react-router-dom"; +import { gql, useMutation, useQuery } from "@apollo/client"; export default function Profile() { const { loading, me } = useMe(); + // const [] = useParams() + let [searchParams] = useSearchParams(); + // This is the access token from backend. I need to write this to the database + // with a graphQL call, because I need to attach user's authToken. + let access_token = searchParams.get("token"); + const [setGitHubAccessToken] = useMutation( + gql` + mutation SetGitHubAccessToken($token: String) { + setGitHubAccessToken(token: $token) + } + `, + { + refetchQueries: ["GetGitHubAccessToken"], + } + ); + const [deleteGitHubAccessToken] = useMutation( + gql` + mutation DeleteGitHubAccessToken { + deleteGitHubAccessToken + } + `, + { + refetchQueries: ["GetGitHubAccessToken"], + } + ); + const { data } = useQuery(gql` + query GetGitHubAccessToken { + getGitHubAccessToken + } + `); if (!me) { // router.push("/login"); @@ -21,6 +54,13 @@ export default function Profile() { ); } + if (access_token) { + setGitHubAccessToken({ variables: { token: access_token } }); + // remove the searchParams from the url + // navigate("/profile"); + return ; + } + return ( {loading ? ( @@ -34,7 +74,39 @@ export default function Profile() { Name {me.firstname} {me.lastname} Email: {me.email} - CodePod version 0.4.6 + {/* CodePod version 0.4.6 */} + + + + Link to Github + + {data?.getGitHubAccessToken ? ( + + Connected + {/* {data.getGitHubAccessToken} */} + + + ) : ( + + Login + + )} + diff --git a/ui/yarn.lock b/ui/yarn.lock index 48d57d05..2b7bd619 100644 --- a/ui/yarn.lock +++ b/ui/yarn.lock @@ -2026,6 +2026,231 @@ dependencies: svgmoji "^3.2.0" +"@octokit/app@^13.1.1": + version "13.1.2" + resolved "https://registry.yarnpkg.com/@octokit/app/-/app-13.1.2.tgz#81fdee338abddda9c016e5beccdb19ff5110bb66" + integrity sha512-Kf+h5sa1SOI33hFsuHvTsWj1jUrjp1x4MuiJBq7U/NicfEGa6nArPUoDnyfP/YTmcQ5cQ5yvOgoIBkbwPg6kzQ== + dependencies: + "@octokit/auth-app" "^4.0.8" + "@octokit/auth-unauthenticated" "^3.0.0" + "@octokit/core" "^4.0.0" + "@octokit/oauth-app" "^4.0.7" + "@octokit/plugin-paginate-rest" "^6.0.0" + "@octokit/types" "^9.0.0" + "@octokit/webhooks" "^10.0.0" + +"@octokit/auth-app@^4.0.8": + version "4.0.9" + resolved "https://registry.yarnpkg.com/@octokit/auth-app/-/auth-app-4.0.9.tgz#66500c8f66545d970a19123b9b364c678c972d6b" + integrity sha512-VFpKIXhHO+kVJtane5cEvdYPtjDKCOI0uKsRrsZfJP+uEu7rcPbQCLCcRKgyT+mUIzGr1IIOmwP/lFqSip1dXA== + dependencies: + "@octokit/auth-oauth-app" "^5.0.0" + "@octokit/auth-oauth-user" "^2.0.0" + "@octokit/request" "^6.0.0" + "@octokit/request-error" "^3.0.0" + "@octokit/types" "^9.0.0" + "@types/lru-cache" "^5.1.0" + deprecation "^2.3.1" + lru-cache "^6.0.0" + universal-github-app-jwt "^1.1.1" + universal-user-agent "^6.0.0" + +"@octokit/auth-oauth-app@^5.0.0": + version "5.0.5" + resolved "https://registry.yarnpkg.com/@octokit/auth-oauth-app/-/auth-oauth-app-5.0.5.tgz#be2a93d72835133b4866ac4721aa628849475525" + integrity sha512-UPX1su6XpseaeLVCi78s9droxpGtBWIgz9XhXAx9VXabksoF0MyI5vaa1zo1njyYt6VaAjFisC2A2Wchcu2WmQ== + dependencies: + "@octokit/auth-oauth-device" "^4.0.0" + "@octokit/auth-oauth-user" "^2.0.0" + "@octokit/request" "^6.0.0" + "@octokit/types" "^9.0.0" + "@types/btoa-lite" "^1.0.0" + btoa-lite "^1.0.0" + universal-user-agent "^6.0.0" + +"@octokit/auth-oauth-device@^4.0.0": + version "4.0.4" + resolved "https://registry.yarnpkg.com/@octokit/auth-oauth-device/-/auth-oauth-device-4.0.4.tgz#b8dde812a38bf5cb0696b6e7d0a74681d437c390" + integrity sha512-Xl85BZYfqCMv+Uvz33nVVUjE7I/PVySNaK6dRRqlkvYcArSr9vRcZC9KVjXYObGRTCN6mISeYdakAZvWEN4+Jw== + dependencies: + "@octokit/oauth-methods" "^2.0.0" + "@octokit/request" "^6.0.0" + "@octokit/types" "^9.0.0" + universal-user-agent "^6.0.0" + +"@octokit/auth-oauth-user@^2.0.0": + version "2.1.1" + resolved "https://registry.yarnpkg.com/@octokit/auth-oauth-user/-/auth-oauth-user-2.1.1.tgz#d900972f3d9247924637ab3343a8305746feadb2" + integrity sha512-JgqnNNPf9CaWLxWm9uh2WgxcaVYhxBR09NVIPTiMU2dVZ3FObOHs3njBiLNw+zq84k+rEdm5Y7AsiASrZ84Apg== + dependencies: + "@octokit/auth-oauth-device" "^4.0.0" + "@octokit/oauth-methods" "^2.0.0" + "@octokit/request" "^6.0.0" + "@octokit/types" "^9.0.0" + btoa-lite "^1.0.0" + universal-user-agent "^6.0.0" + +"@octokit/auth-token@^3.0.0": + version "3.0.3" + resolved "https://registry.yarnpkg.com/@octokit/auth-token/-/auth-token-3.0.3.tgz#ce7e48a3166731f26068d7a7a7996b5da58cbe0c" + integrity sha512-/aFM2M4HVDBT/jjDBa84sJniv1t9Gm/rLkalaz9htOm+L+8JMj1k9w0CkUdcxNyNxZPlTxKPVko+m1VlM58ZVA== + dependencies: + "@octokit/types" "^9.0.0" + +"@octokit/auth-unauthenticated@^3.0.0": + version "3.0.4" + resolved "https://registry.yarnpkg.com/@octokit/auth-unauthenticated/-/auth-unauthenticated-3.0.4.tgz#347d3f3a6fefb22d399a941b986bac5361fc95df" + integrity sha512-AT74XGBylcLr4lmUp1s6mjSUgphGdlse21Qjtv5DzpX1YOl5FXKwvNcZWESdhyBbpDT8VkVyLFqa/7a7eqpPNw== + dependencies: + "@octokit/request-error" "^3.0.0" + "@octokit/types" "^9.0.0" + +"@octokit/core@^4.0.0", "@octokit/core@^4.0.4": + version "4.2.0" + resolved "https://registry.yarnpkg.com/@octokit/core/-/core-4.2.0.tgz#8c253ba9605aca605bc46187c34fcccae6a96648" + integrity sha512-AgvDRUg3COpR82P7PBdGZF/NNqGmtMq2NiPqeSsDIeCfYFOZ9gddqWNQHnFdEUf+YwOj4aZYmJnlPp7OXmDIDg== + dependencies: + "@octokit/auth-token" "^3.0.0" + "@octokit/graphql" "^5.0.0" + "@octokit/request" "^6.0.0" + "@octokit/request-error" "^3.0.0" + "@octokit/types" "^9.0.0" + before-after-hook "^2.2.0" + universal-user-agent "^6.0.0" + +"@octokit/endpoint@^7.0.0": + version "7.0.5" + resolved "https://registry.yarnpkg.com/@octokit/endpoint/-/endpoint-7.0.5.tgz#2bb2a911c12c50f10014183f5d596ce30ac67dd1" + integrity sha512-LG4o4HMY1Xoaec87IqQ41TQ+glvIeTKqfjkCEmt5AIwDZJwQeVZFIEYXrYY6yLwK+pAScb9Gj4q+Nz2qSw1roA== + dependencies: + "@octokit/types" "^9.0.0" + is-plain-object "^5.0.0" + universal-user-agent "^6.0.0" + +"@octokit/graphql@^5.0.0": + version "5.0.5" + resolved "https://registry.yarnpkg.com/@octokit/graphql/-/graphql-5.0.5.tgz#a4cb3ea73f83b861893a6370ee82abb36e81afd2" + integrity sha512-Qwfvh3xdqKtIznjX9lz2D458r7dJPP8l6r4GQkIdWQouZwHQK0mVT88uwiU2bdTU2OtT1uOlKpRciUWldpG0yQ== + dependencies: + "@octokit/request" "^6.0.0" + "@octokit/types" "^9.0.0" + universal-user-agent "^6.0.0" + +"@octokit/oauth-app@^4.0.6", "@octokit/oauth-app@^4.0.7": + version "4.2.0" + resolved "https://registry.yarnpkg.com/@octokit/oauth-app/-/oauth-app-4.2.0.tgz#f965496b1d957c3ff0275a5d5233b380181ce72b" + integrity sha512-gyGclT77RQMkVUEW3YBeAKY+LBSc5u3eC9Wn/Uwt3WhuKuu9mrV18EnNpDqmeNll+mdV02yyBROU29Tlili6gg== + dependencies: + "@octokit/auth-oauth-app" "^5.0.0" + "@octokit/auth-oauth-user" "^2.0.0" + "@octokit/auth-unauthenticated" "^3.0.0" + "@octokit/core" "^4.0.0" + "@octokit/oauth-authorization-url" "^5.0.0" + "@octokit/oauth-methods" "^2.0.0" + "@types/aws-lambda" "^8.10.83" + fromentries "^1.3.1" + universal-user-agent "^6.0.0" + +"@octokit/oauth-authorization-url@^5.0.0": + version "5.0.0" + resolved "https://registry.yarnpkg.com/@octokit/oauth-authorization-url/-/oauth-authorization-url-5.0.0.tgz#029626ce87f3b31addb98cd0d2355c2381a1c5a1" + integrity sha512-y1WhN+ERDZTh0qZ4SR+zotgsQUE1ysKnvBt1hvDRB2WRzYtVKQjn97HEPzoehh66Fj9LwNdlZh+p6TJatT0zzg== + +"@octokit/oauth-methods@^2.0.0": + version "2.0.5" + resolved "https://registry.yarnpkg.com/@octokit/oauth-methods/-/oauth-methods-2.0.5.tgz#b11ce2205c46ffcd731c7332b21bb62dad10ce24" + integrity sha512-yQP6B5gE3axNxuM3U9KqWs/ErAQ+WLPaPgC/7EjsZsQibkf8sjdAfF8/y/EJW+Dd05XQvadX4WhQZPMnO1SE1A== + dependencies: + "@octokit/oauth-authorization-url" "^5.0.0" + "@octokit/request" "^6.2.3" + "@octokit/request-error" "^3.0.3" + "@octokit/types" "^9.0.0" + btoa-lite "^1.0.0" + +"@octokit/openapi-types@^16.0.0": + version "16.0.0" + resolved "https://registry.yarnpkg.com/@octokit/openapi-types/-/openapi-types-16.0.0.tgz#d92838a6cd9fb4639ca875ddb3437f1045cc625e" + integrity sha512-JbFWOqTJVLHZSUUoF4FzAZKYtqdxWu9Z5m2QQnOyEa04fOFljvyh7D3GYKbfuaSWisqehImiVIMG4eyJeP5VEA== + +"@octokit/plugin-paginate-rest@^6.0.0": + version "6.0.0" + resolved "https://registry.yarnpkg.com/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-6.0.0.tgz#f34b5a7d9416019126042cd7d7b811e006c0d561" + integrity sha512-Sq5VU1PfT6/JyuXPyt04KZNVsFOSBaYOAq2QRZUwzVlI10KFvcbUo8lR258AAQL1Et60b0WuVik+zOWKLuDZxw== + dependencies: + "@octokit/types" "^9.0.0" + +"@octokit/plugin-rest-endpoint-methods@^7.0.0": + version "7.0.1" + resolved "https://registry.yarnpkg.com/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-7.0.1.tgz#f7ebe18144fd89460f98f35a587b056646e84502" + integrity sha512-pnCaLwZBudK5xCdrR823xHGNgqOzRnJ/mpC/76YPpNP7DybdsJtP7mdOwh+wYZxK5jqeQuhu59ogMI4NRlBUvA== + dependencies: + "@octokit/types" "^9.0.0" + deprecation "^2.3.1" + +"@octokit/plugin-retry@^4.0.3": + version "4.1.1" + resolved "https://registry.yarnpkg.com/@octokit/plugin-retry/-/plugin-retry-4.1.1.tgz#2a96e97219f6506d636b4de696cf368da44a8e20" + integrity sha512-iR7rg5KRSl6L6RELTQQ3CYeNgeBJyuAmP95odzcQ/zyefnRT/Peo8rWeky4z7V/+/oPWqOL4I5Z+V8KtjpHCJw== + dependencies: + "@octokit/types" "^9.0.0" + bottleneck "^2.15.3" + +"@octokit/plugin-throttling@^5.0.0": + version "5.0.1" + resolved "https://registry.yarnpkg.com/@octokit/plugin-throttling/-/plugin-throttling-5.0.1.tgz#e3ba0a49830a777097b6d49615782a0a5e51e743" + integrity sha512-I4qxs7wYvYlFuY3PAUGWAVPhFXG3RwnvTiSr5Fu/Auz7bYhDLnzS2MjwV8nGLq/FPrWwYiweeZrI5yjs1YG4tQ== + dependencies: + "@octokit/types" "^9.0.0" + bottleneck "^2.15.3" + +"@octokit/request-error@^3.0.0", "@octokit/request-error@^3.0.3": + version "3.0.3" + resolved "https://registry.yarnpkg.com/@octokit/request-error/-/request-error-3.0.3.tgz#ef3dd08b8e964e53e55d471acfe00baa892b9c69" + integrity sha512-crqw3V5Iy2uOU5Np+8M/YexTlT8zxCfI+qu+LxUB7SZpje4Qmx3mub5DfEKSO8Ylyk0aogi6TYdf6kxzh2BguQ== + dependencies: + "@octokit/types" "^9.0.0" + deprecation "^2.0.0" + once "^1.4.0" + +"@octokit/request@^6.0.0", "@octokit/request@^6.2.3": + version "6.2.3" + resolved "https://registry.yarnpkg.com/@octokit/request/-/request-6.2.3.tgz#76d5d6d44da5c8d406620a4c285d280ae310bdb4" + integrity sha512-TNAodj5yNzrrZ/VxP+H5HiYaZep0H3GU0O7PaF+fhDrt8FPrnkei9Aal/txsN/1P7V3CPiThG0tIvpPDYUsyAA== + dependencies: + "@octokit/endpoint" "^7.0.0" + "@octokit/request-error" "^3.0.0" + "@octokit/types" "^9.0.0" + is-plain-object "^5.0.0" + node-fetch "^2.6.7" + universal-user-agent "^6.0.0" + +"@octokit/types@^9.0.0": + version "9.0.0" + resolved "https://registry.yarnpkg.com/@octokit/types/-/types-9.0.0.tgz#6050db04ddf4188ec92d60e4da1a2ce0633ff635" + integrity sha512-LUewfj94xCMH2rbD5YJ+6AQ4AVjFYTgpp6rboWM5T7N3IsIF65SBEOVcYMGAEzO/kKNiNaW4LoWtoThOhH06gw== + dependencies: + "@octokit/openapi-types" "^16.0.0" + +"@octokit/webhooks-methods@^3.0.0": + version "3.0.2" + resolved "https://registry.yarnpkg.com/@octokit/webhooks-methods/-/webhooks-methods-3.0.2.tgz#cece91cc72714a1c83b35d121e04334f051e509c" + integrity sha512-Vlnv5WBscf07tyAvfDbp7pTkMZUwk7z7VwEF32x6HqI+55QRwBTcT+D7DDjZXtad/1dU9E32x0HmtDlF9VIRaQ== + +"@octokit/webhooks-types@6.10.0": + version "6.10.0" + resolved "https://registry.yarnpkg.com/@octokit/webhooks-types/-/webhooks-types-6.10.0.tgz#b441780d26370c7682f4f964d4b36b5cb0c757f8" + integrity sha512-lDNv83BeEyxxukdQ0UttiUXawk9+6DkdjjFtm2GFED+24IQhTVaoSbwV9vWWKONyGLzRmCQqZmoEWkDhkEmPlw== + +"@octokit/webhooks@^10.0.0": + version "10.7.0" + resolved "https://registry.yarnpkg.com/@octokit/webhooks/-/webhooks-10.7.0.tgz#ec05e655d309383e2cd08dafe51abd1705df6d4a" + integrity sha512-zZBbQMpXXnK/ki/utrFG/TuWv9545XCSLibfDTxrYqR1PmU6zel02ebTOrA7t5XIGHzlEOc/NgISUIBUe7pMFA== + dependencies: + "@octokit/request-error" "^3.0.0" + "@octokit/webhooks-methods" "^3.0.0" + "@octokit/webhooks-types" "6.10.0" + aggregate-error "^3.1.0" + "@pmmmwh/react-refresh-webpack-plugin@^0.5.3": version "0.5.8" resolved "https://registry.yarnpkg.com/@pmmmwh/react-refresh-webpack-plugin/-/react-refresh-webpack-plugin-0.5.8.tgz#da3383761e2c0c440610819f3204769022a38d12" @@ -3341,6 +3566,11 @@ resolved "https://registry.yarnpkg.com/@types/aria-query/-/aria-query-4.2.2.tgz#ed4e0ad92306a704f9fb132a0cfcf77486dbe2bc" integrity sha512-HnYpAE1Y6kRyKM/XkEuiRQhTHvkzMBurTHnpFLYLBGPIylZNPs9jJcuOOYWxPLJCSEtmZT0Y8rHDokKN7rRTig== +"@types/aws-lambda@^8.10.83": + version "8.10.110" + resolved "https://registry.yarnpkg.com/@types/aws-lambda/-/aws-lambda-8.10.110.tgz#32a1f9d40b855d69830243492bbb6408098f4c88" + integrity sha512-r6egf2Cwv/JaFTTrF9OXFVUB3j/SXTgM9BwrlbBRjWAa2Tu6GWoDoLflppAZ8uSfbUJdXvC7Br3DjuN9pQ2NUQ== + "@types/babel__core@^7.0.0", "@types/babel__core@^7.1.14": version "7.1.19" resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.1.19.tgz#7b497495b7d1b4812bdb9d02804d0576f43ee460" @@ -3389,6 +3619,11 @@ dependencies: "@types/node" "*" +"@types/btoa-lite@^1.0.0": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@types/btoa-lite/-/btoa-lite-1.0.0.tgz#e190a5a548e0b348adb0df9ac7fa5f1151c7cca4" + integrity sha512-wJsiX1tosQ+J5+bY5LrSahHxr2wT+uME5UDwdN1kg4frt40euqA+wzECkmq4t5QbveHiJepfdThgQrPw6KiSlg== + "@types/codemirror@^5.60.2": version "5.60.5" resolved "https://registry.yarnpkg.com/@types/codemirror/-/codemirror-5.60.5.tgz#5b989a3b4bbe657458cf372c92b6bfda6061a2b7" @@ -3762,11 +3997,23 @@ resolved "https://registry.yarnpkg.com/@types/json5/-/json5-0.0.29.tgz#ee28707ae94e11d2b827bcbe5270bcea7f3e71ee" integrity sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ== +"@types/jsonwebtoken@^9.0.0": + version "9.0.1" + resolved "https://registry.yarnpkg.com/@types/jsonwebtoken/-/jsonwebtoken-9.0.1.tgz#29b1369c4774200d6d6f63135bf3d1ba3ef997a4" + integrity sha512-c5ltxazpWabia/4UzhIoaDcIza4KViOQhdbjRlfcIGVnsE3c3brkz9Z+F/EeJIECOQP7W7US2hNE930cWWkPiw== + dependencies: + "@types/node" "*" + "@types/lodash@^4.14.149": version "4.14.186" resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.14.186.tgz#862e5514dd7bd66ada6c70ee5fce844b06c8ee97" integrity sha512-eHcVlLXP0c2FlMPm56ITode2AgLMSa6aJ05JTTbYbI+7EMkCEE5qk2E41d5g2lCVTqRe0GnnRFurmlCsDODrPw== +"@types/lru-cache@^5.1.0": + version "5.1.1" + resolved "https://registry.yarnpkg.com/@types/lru-cache/-/lru-cache-5.1.1.tgz#c48c2e27b65d2a153b19bfc1a317e30872e01eef" + integrity sha512-ssE3Vlrys7sdIzs5LOxCzTVMsU7i9oa/IaW92wF32JFb3CVczqOkru2xspuKczHEbG3nvmPY7IFqVmGGHdNbYw== + "@types/marked@^4.0.2": version "4.0.8" resolved "https://registry.yarnpkg.com/@types/marked/-/marked-4.0.8.tgz#b316887ab3499d0a8f4c70b7bd8508f92d477955" @@ -4381,6 +4628,14 @@ agent-base@6: dependencies: debug "4" +aggregate-error@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/aggregate-error/-/aggregate-error-3.1.0.tgz#92670ff50f5359bdb7a3e0d40d0ec30c5737687a" + integrity sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA== + dependencies: + clean-stack "^2.0.0" + indent-string "^4.0.0" + ajv-formats@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/ajv-formats/-/ajv-formats-2.1.1.tgz#6e669400659eb74973bbf2e33327180a0996b520" @@ -4784,6 +5039,11 @@ batch@0.6.1: resolved "https://registry.yarnpkg.com/batch/-/batch-0.6.1.tgz#dc34314f4e679318093fc760272525f94bf25c16" integrity sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw== +before-after-hook@^2.2.0: + version "2.2.3" + resolved "https://registry.yarnpkg.com/before-after-hook/-/before-after-hook-2.2.3.tgz#c51e809c81a4e354084422b9b26bad88249c517c" + integrity sha512-NzUnlZexiaH/46WDhANlyR2bXRopNg4F/zuSA3OpZnllCUgRaOF2znDioDWrmbNVsuZk6l9pMquQB38cfBZwkQ== + bfj@^7.0.2: version "7.0.2" resolved "https://registry.yarnpkg.com/bfj/-/bfj-7.0.2.tgz#1988ce76f3add9ac2913fd8ba47aad9e651bfbb2" @@ -4842,6 +5102,11 @@ boolbase@^1.0.0, boolbase@~1.0.0: resolved "https://registry.yarnpkg.com/boolbase/-/boolbase-1.0.0.tgz#68dff5fbe60c51eb37725ea9e3ed310dcc1e776e" integrity sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww== +bottleneck@^2.15.3: + version "2.19.5" + resolved "https://registry.yarnpkg.com/bottleneck/-/bottleneck-2.19.5.tgz#5df0b90f59fd47656ebe63c78a98419205cadd91" + integrity sha512-VHiNCbI1lKdl44tGrhNfU3lup0Tj/ZBMJB5/2ZbNXRCPuRCO7ed2mgcK4r17y+KB2EfuYuRaVlwNbAeaWGSpbw== + brace-expansion@^1.1.7: version "1.1.11" resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" @@ -4886,6 +5151,16 @@ bser@2.1.1: dependencies: node-int64 "^0.4.0" +btoa-lite@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/btoa-lite/-/btoa-lite-1.0.0.tgz#337766da15801210fdd956c22e9c6891ab9d0337" + integrity sha512-gvW7InbIyF8AicrqWoptdW08pUxuhq8BEgowNajy9RhiE86fmGAGl+bLKo6oB8QP0CkqHLowfN0oJdKC/J6LbA== + +buffer-equal-constant-time@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz#f8e71132f7ffe6e01a5c9697a4c6f3e48d5cc819" + integrity sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA== + buffer-from@^1.0.0: version "1.1.2" resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5" @@ -5079,6 +5354,11 @@ clean-css@^5.2.2: dependencies: source-map "~0.6.0" +clean-stack@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/clean-stack/-/clean-stack-2.2.0.tgz#ee8472dbb129e727b31e8a10a427dee9dfe4008b" + integrity sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A== + cliui@^7.0.2: version "7.0.4" resolved "https://registry.yarnpkg.com/cliui/-/cliui-7.0.4.tgz#a0265ee655476fc807aea9df3df8df7783808b4f" @@ -5743,6 +6023,11 @@ depd@~1.1.2: resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9" integrity sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ== +deprecation@^2.0.0, deprecation@^2.3.1: + version "2.3.1" + resolved "https://registry.yarnpkg.com/deprecation/-/deprecation-2.3.1.tgz#6368cbdb40abf3373b525ac87e4a260c3a700919" + integrity sha512-xmHIy4F3scKVwMsQ4WnVaS8bHOx0DmVwRywosKhaILI0ywMDWPtBSku2HNxRvF7jtwDRsoEwYQSfbxj8b7RlJQ== + destroy@1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.2.0.tgz#4803735509ad8be552934c67df614f94e66fa015" @@ -5944,6 +6229,13 @@ duplexer@^0.1.2: resolved "https://registry.yarnpkg.com/duplexer/-/duplexer-0.1.2.tgz#3abe43aef3835f8ae077d136ddce0f276b0400e6" integrity sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg== +ecdsa-sig-formatter@1.0.11: + version "1.0.11" + resolved "https://registry.yarnpkg.com/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz#ae0f0fa2d85045ef14a817daa3ce9acd0489e5bf" + integrity sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ== + dependencies: + safe-buffer "^5.0.1" + ee-first@1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" @@ -6786,6 +7078,11 @@ fresh@0.5.2: resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" integrity sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q== +fromentries@^1.3.1: + version "1.3.2" + resolved "https://registry.yarnpkg.com/fromentries/-/fromentries-1.3.2.tgz#e4bca6808816bf8f93b52750f1127f5a6fd86e3a" + integrity sha512-cHEpEQHUg0f8XdtZCc2ZAhrHzKzT0MrFUTcvx+hfxYu7rGMDc5SKoXFh+n4YigxsHXRzc6OrCshdR1bWH6HHyg== + fs-extra@^10.0.0: version "10.1.0" resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-10.1.0.tgz#02873cfbc4084dde127eaa5f9905eef2325d1abf" @@ -8321,6 +8618,16 @@ jsonpointer@^5.0.0: resolved "https://registry.yarnpkg.com/jsonpointer/-/jsonpointer-5.0.1.tgz#2110e0af0900fd37467b5907ecd13a7884a1b559" integrity sha512-p/nXbhSEcu3pZRdkW1OfJhpsVtW1gd4Wa1fnQc9YLiTfAjn0312eMKimbdIQzuZl9aa9xUGaRlP9T/CJE/ditQ== +jsonwebtoken@^9.0.0: + version "9.0.0" + resolved "https://registry.yarnpkg.com/jsonwebtoken/-/jsonwebtoken-9.0.0.tgz#d0faf9ba1cc3a56255fe49c0961a67e520c1926d" + integrity sha512-tuGfYXxkQGDPnLJ7SibiQgVgeDgfbPq2k2ICcbgqW8WxWLBAxKQM/ZCu/IT8SOSwmaYl4dpTFCW5xZv7YbbWUw== + dependencies: + jws "^3.2.2" + lodash "^4.17.21" + ms "^2.1.1" + semver "^7.3.8" + "jsx-ast-utils@^2.4.1 || ^3.0.0", jsx-ast-utils@^3.3.2: version "3.3.3" resolved "https://registry.yarnpkg.com/jsx-ast-utils/-/jsx-ast-utils-3.3.3.tgz#76b3e6e6cece5c69d49a5792c3d01bd1a0cdc7ea" @@ -8336,6 +8643,23 @@ jsx-dom-cjs@^8.0.0: dependencies: csstype "^3.1.0" +jwa@^1.4.1: + version "1.4.1" + resolved "https://registry.yarnpkg.com/jwa/-/jwa-1.4.1.tgz#743c32985cb9e98655530d53641b66c8645b039a" + integrity sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA== + dependencies: + buffer-equal-constant-time "1.0.1" + ecdsa-sig-formatter "1.0.11" + safe-buffer "^5.0.1" + +jws@^3.2.2: + version "3.2.2" + resolved "https://registry.yarnpkg.com/jws/-/jws-3.2.2.tgz#001099f3639468c9414000e99995fa52fb478304" + integrity sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA== + dependencies: + jwa "^1.4.1" + safe-buffer "^5.0.1" + kind-of@^6.0.2: version "6.0.3" resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd" @@ -8896,6 +9220,13 @@ no-case@^3.0.4: lower-case "^2.0.2" tslib "^2.0.3" +node-fetch@^2.6.7: + version "2.6.9" + resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.9.tgz#7c7f744b5cc6eb5fd404e0c7a9fec630a55657e6" + integrity sha512-DJm/CJkZkRjKKj4Zi4BsKVZh3ValV5IR5s7LVZnW+6YMh0W1BfNA8XSs6DLMGYlId5F3KnA70uu2qepcR08Qqg== + dependencies: + whatwg-url "^5.0.0" + node-forge@^1: version "1.3.1" resolved "https://registry.yarnpkg.com/node-forge/-/node-forge-1.3.1.tgz#be8da2af243b2417d5f646a770663a92b7e9ded3" @@ -9069,6 +9400,20 @@ obuf@^1.0.0, obuf@^1.1.2: resolved "https://registry.yarnpkg.com/obuf/-/obuf-1.1.2.tgz#09bea3343d41859ebd446292d11c9d4db619084e" integrity sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg== +octokit@^2.0.14: + version "2.0.14" + resolved "https://registry.yarnpkg.com/octokit/-/octokit-2.0.14.tgz#e2057097a6c9cac3e7724a4365b450b7c694a6a4" + integrity sha512-z6cgZBFxirpFEQ1La8Lg83GCs5hOV2EPpkYYdjsGNbfQMv8qUGjq294MiRBCbZqLufviakGsPUxaNKe3JrPmsA== + dependencies: + "@octokit/app" "^13.1.1" + "@octokit/core" "^4.0.4" + "@octokit/oauth-app" "^4.0.6" + "@octokit/plugin-paginate-rest" "^6.0.0" + "@octokit/plugin-rest-endpoint-methods" "^7.0.0" + "@octokit/plugin-retry" "^4.0.3" + "@octokit/plugin-throttling" "^5.0.0" + "@octokit/types" "^9.0.0" + on-finished@2.4.1: version "2.4.1" resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.4.1.tgz#58c8c44116e54845ad57f14ab10b03533184ac3f" @@ -9081,7 +9426,7 @@ on-headers@~1.0.2: resolved "https://registry.yarnpkg.com/on-headers/-/on-headers-1.0.2.tgz#772b0ae6aaa525c399e489adfad90c403eb3c28f" integrity sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA== -once@^1.3.0: +once@^1.3.0, once@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== @@ -10898,7 +11243,7 @@ safe-buffer@5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1: resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== -safe-buffer@5.2.1, safe-buffer@>=5.1.0, safe-buffer@^5.1.0, safe-buffer@~5.2.0: +safe-buffer@5.2.1, safe-buffer@>=5.1.0, safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@~5.2.0: version "5.2.1" resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== @@ -11020,7 +11365,7 @@ semver@^6.0.0, semver@^6.1.1, semver@^6.1.2, semver@^6.3.0: resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== -semver@^7.3.2, semver@^7.3.5, semver@^7.3.7: +semver@^7.3.2, semver@^7.3.5, semver@^7.3.7, semver@^7.3.8: version "7.3.8" resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.8.tgz#07a78feafb3f7b32347d725e33de7e2a2df67798" integrity sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A== @@ -11780,6 +12125,11 @@ tr46@^2.1.0: dependencies: punycode "^2.1.1" +tr46@~0.0.3: + version "0.0.3" + resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a" + integrity sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw== + tree-sitter-javascript@^0.19.0: version "0.19.0" resolved "https://registry.yarnpkg.com/tree-sitter-javascript/-/tree-sitter-javascript-0.19.0.tgz#20fc0da277502dac2bb3bf9ff75372268e761558" @@ -11974,6 +12324,19 @@ unique-string@^2.0.0: dependencies: crypto-random-string "^2.0.0" +universal-github-app-jwt@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/universal-github-app-jwt/-/universal-github-app-jwt-1.1.1.tgz#d57cee49020662a95ca750a057e758a1a7190e6e" + integrity sha512-G33RTLrIBMFmlDV4u4CBF7dh71eWwykck4XgaxaIVeZKOYZRAAxvcGMRFTUclVY6xoUPQvO4Ne5wKGxYm/Yy9w== + dependencies: + "@types/jsonwebtoken" "^9.0.0" + jsonwebtoken "^9.0.0" + +universal-user-agent@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/universal-user-agent/-/universal-user-agent-6.0.0.tgz#3381f8503b251c0d9cd21bc1de939ec9df5480ee" + integrity sha512-isyNax3wXoKaulPDZWHQqbmIx1k2tb9fb3GGDBRxCscfYV2Ch7WxPArBsFEG8s/safwXTT7H4QGhaIkTp9447w== + universalify@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.2.0.tgz#6451760566fa857534745ab1dde952d1b1761be0" @@ -12141,6 +12504,11 @@ web-vitals@^2.1.0: resolved "https://registry.yarnpkg.com/web-vitals/-/web-vitals-2.1.4.tgz#76563175a475a5e835264d373704f9dde718290c" integrity sha512-sVWcwhU5mX6crfI5Vd2dC4qchyTqxV8URinzt25XqVh+bHEPGH4C3NPrNionCP7Obx59wrYEbNlw4Z8sjALzZg== +webidl-conversions@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871" + integrity sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ== + webidl-conversions@^4.0.2: version "4.0.2" resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-4.0.2.tgz#a855980b1f0b6b359ba1d5d9fb39ae941faa63ad" @@ -12304,6 +12672,14 @@ whatwg-mimetype@^2.3.0: resolved "https://registry.yarnpkg.com/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz#3d4b1e0312d2079879f826aff18dbeeca5960fbf" integrity sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g== +whatwg-url@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-5.0.0.tgz#966454e8765462e37644d3626f6742ce8b70965d" + integrity sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw== + dependencies: + tr46 "~0.0.3" + webidl-conversions "^3.0.0" + whatwg-url@^7.0.0: version "7.1.0" resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-7.1.0.tgz#c2c492f1eca612988efd3d2266be1b9fc6170d06"