diff --git a/.env.dist b/.env.dist index 8faa75c9..6941c53a 100644 --- a/.env.dist +++ b/.env.dist @@ -5,6 +5,40 @@ # DATABASE_URL="postgresql://airbroke:airbroke@localhost:6432/airbroke-development?schema=public&pgbouncer=true" # DIRECT_URL="postgresql://airbroke:airbroke@localhost:5432/airbroke-development?schema=public" +# Endpoint protection CORS_ORIGINS="http://localhost:3000,https://my.browserapp.com" + +# AI toolbox OPENAI_API_KEY="sk-xxx" OPENAI_ORGANIZATION="" + +# authentication +NEXTAUTH_SECRET="" # A random string used to hash tokens, sign cookies and generate cryptographic keys. +NEXTAUTH_URL="http://localhost:3000" # The URL of your application, used for signing cookies and OAuth secrets, defaults to http://localhost:3000 +NEXTAUTH_DEBUG="false" + +GITHUB_ID="" +GITHUB_SECRET="" +GITHUB_ORGS="" # optional, if you want to restrict access to specific organization(s), comma separated + +ATLASSIAN_ID="" +ATLASSIAN_SECRET="" + +GOOGLE_ID="" +GOOGLE_SECRET="" +GOOGLE_DOMAINS="" # optional, if you want to restrict access to specific domain(s), comma separated + +COGNITO_ID="" +COGNITO_SECRET="" +COGNITO_ISSUER="" # a URL, that looks like this: https://cognito-idp.{region}.amazonaws.com/{PoolId} + +GITLAB_ID="" +GITLAB_SECRET="" + +KEYCLOAK_ID="" +KEYCLOAK_SECRET="" +KEYCLOAK_ISSUER="" # issuer should include the realm e.g. https://my-keycloak-domain.com/realms/My_Realm + +AZURE_AD_CLIENT_ID="" +AZURE_AD_CLIENT_SECRET="" +AZURE_AD_TENANT_ID="" diff --git a/app/api/ai/route.ts b/app/api/ai/route.ts index fd94c3bb..3aa14db0 100644 --- a/app/api/ai/route.ts +++ b/app/api/ai/route.ts @@ -1,10 +1,20 @@ +import { authOptions } from '@/lib/auth'; import { prisma } from '@/lib/db'; import { ChatGPTAPI } from 'chatgpt'; +import { getServerSession } from "next-auth"; import { NextRequest, NextResponse } from 'next/server'; export const dynamic = 'force-dynamic'; export async function GET(request: NextRequest) { + const session = await getServerSession(authOptions); + if (!session) { + return new NextResponse( + JSON.stringify({ status: "fail", message: "You are not logged in" }), + { status: 401 } + ); + } + // const pass = request.nextUrl.searchParams.get('pass'); const occurrenceId = request.nextUrl.searchParams.get('occurrence'); diff --git a/app/api/auth/[...nextauth]/route.ts b/app/api/auth/[...nextauth]/route.ts new file mode 100644 index 00000000..ca0b5b4a --- /dev/null +++ b/app/api/auth/[...nextauth]/route.ts @@ -0,0 +1,6 @@ +import { authOptions } from "@/lib/auth"; +import NextAuth from "next-auth"; + +const handler = NextAuth(authOptions); + +export { handler as GET, handler as POST }; diff --git a/app/layout.tsx b/app/layout.tsx index 1362891f..fe9f2914 100644 --- a/app/layout.tsx +++ b/app/layout.tsx @@ -1,5 +1,4 @@ import { Inter } from 'next/font/google'; -import { ReactNode } from 'react'; import './globals.css'; export const metadata = { @@ -13,7 +12,7 @@ const inter = Inter({ variable: '--font-inter', }); -export default function RootLayout({ children }: { children: ReactNode }) { +export default function RootLayout({ children }: { children: React.ReactNode }) { return ( {children} diff --git a/app/page.tsx b/app/page.tsx index 7e055a0e..db29e017 100644 --- a/app/page.tsx +++ b/app/page.tsx @@ -1,12 +1,15 @@ import Background from '@/components/Background'; +import { authOptions } from '@/lib/auth'; import screenshot from '@/public/screenshot.png'; +import { getServerSession } from 'next-auth'; import Image from 'next/image'; import Link from 'next/link'; import { FaGithub } from 'react-icons/fa'; import { MdBrokenImage } from 'react-icons/md'; -export default function HomePage() { +export default async function HomePage() { const currentYear = new Date().getFullYear(); + const session = await getServerSession(authOptions); return (
@@ -19,7 +22,7 @@ export default function HomePage() {
- Whats new + Latest Releases
@@ -30,12 +33,13 @@ export default function HomePage() { Self-hosted, Cost-effective, Open Source Error Tracking for a Sustainable Startup Journey.

- Go to Projects - + + Learn more diff --git a/components/HomeButton.tsx b/components/HomeButton.tsx new file mode 100644 index 00000000..9a4ba8d3 --- /dev/null +++ b/components/HomeButton.tsx @@ -0,0 +1,25 @@ +'use client'; + +import { signIn, signOut } from 'next-auth/react'; + +export function LoginButton() { + return ( + + ); +} + +export function LogoutButton() { + return ( + + ); +} diff --git a/components/SidebarDesktop.tsx b/components/SidebarDesktop.tsx index 15a0b6e6..9fd78b39 100644 --- a/components/SidebarDesktop.tsx +++ b/components/SidebarDesktop.tsx @@ -4,6 +4,7 @@ import Link from 'next/link'; import { MdBrokenImage } from 'react-icons/md'; import { SlPlus } from 'react-icons/sl'; import { TbBrandGithub } from 'react-icons/tb'; +import { LogoutButton } from './HomeButton'; function groupBy(array: T[], key: keyof T) { return array.reduce((result: { [key: string]: T[] }, item) => { @@ -64,7 +65,7 @@ export default async function SidebarDesktop({ selectedProject }: { selectedProj ))} -
  • +
  • + + {/* User Profile Section */} +
    + {/* User info can go here, e.g. avatar and username */} + + {/* Logout Button */} + +
  • ); diff --git a/lib/auth.ts b/lib/auth.ts new file mode 100644 index 00000000..73828d55 --- /dev/null +++ b/lib/auth.ts @@ -0,0 +1,110 @@ +import type { NextAuthOptions, Profile } from "next-auth"; +import AtlassianProvider from "next-auth/providers/atlassian"; +import AzureADProvider from "next-auth/providers/azure-ad"; +import CognitoProvider from "next-auth/providers/cognito"; +import GithubProvider from "next-auth/providers/github"; +import GitlabProvider from "next-auth/providers/gitlab"; +import GoogleProvider from "next-auth/providers/google"; +import KeycloakProvider from "next-auth/providers/keycloak"; +import { Octokit } from "octokit"; + +type ExtendedProfile = Profile & { [key: string]: any; }; + +const getProviders = () => { + let providers = []; + + if (process.env.GITHUB_ID && process.env.GITHUB_SECRET) { + providers.push(GithubProvider({ + clientId: process.env.GITHUB_ID, + clientSecret: process.env.GITHUB_SECRET, + authorization: { + url: "https://github.com/login/oauth/authorize", + params: { scope: "read:user user:email user read:org" }, + }, + })); + } + + if (process.env.ATLASSIAN_ID && process.env.ATLASSIAN_SECRET) { + providers.push(AtlassianProvider({ + clientId: process.env.ATLASSIAN_ID, + clientSecret: process.env.ATLASSIAN_SECRET, + })); + } + + if (process.env.GOOGLE_ID && process.env.GOOGLE_SECRET) { + providers.push(GoogleProvider({ + clientId: process.env.GOOGLE_ID, + clientSecret: process.env.GOOGLE_SECRET, + })); + } + + if (process.env.COGNITO_ID && process.env.COGNITO_SECRET) { + providers.push(CognitoProvider({ + clientId: process.env.COGNITO_ID, + clientSecret: process.env.COGNITO_SECRET, + issuer: process.env.COGNITO_ISSUER, + })); + } + + if (process.env.GITLAB_ID && process.env.GITLAB_SECRET) { + providers.push(GitlabProvider({ + clientId: process.env.GITLAB_ID, + clientSecret: process.env.GITLAB_SECRET, + })); + } + + if (process.env.KEYCLOAK_ID && process.env.KEYCLOAK_SECRET) { + providers.push(KeycloakProvider({ + clientId: process.env.KEYCLOAK_ID, + clientSecret: process.env.KEYCLOAK_SECRET, + issuer: process.env.KEYCLOAK_ISSUER, + })); + } + + if (process.env.AZURE_AD_CLIENT_ID && process.env.AZURE_AD_CLIENT_SECRET) { + providers.push(AzureADProvider({ + clientId: process.env.AZURE_AD_CLIENT_ID, + clientSecret: process.env.AZURE_AD_CLIENT_SECRET, + tenantId: process.env.AZURE_AD_TENANT_ID, + })); + } + + return providers; +}; + +export const authOptions: NextAuthOptions = { + session: { + strategy: "jwt", + }, + debug: process.env.NEXTAUTH_DEBUG === "true", + providers: getProviders(), + callbacks: { + async signIn({ user, account, profile, email, credentials }) { + const extendedProfile = profile as ExtendedProfile; + + if (account?.provider === "google" && process.env.GOOGLE_DOMAINS) { + const domains = process.env.GOOGLE_DOMAINS.split(","); + const emailDomain = extendedProfile?.email?.split("@")[1]; + return extendedProfile?.email_verified && emailDomain && domains.includes(emailDomain); + } + + if (account?.provider === "github" && process.env.GITHUB_ORGS) { + const allowedOrgs = process.env.GITHUB_ORGS.split(","); + const token = account.access_token; + const octokit = new Octokit({ auth: token, userAgent: "airbroke" }); + const orgsResponse = await octokit.rest.orgs.listForAuthenticatedUser(); + const userOrgs = orgsResponse.data.map(org => org.login); + + // Check if the user is part of at least one of the allowed organizations + return userOrgs.some(org => allowedOrgs.includes(org)); + } + return true; + }, + }, + theme: { + colorScheme: "dark", // "auto" | "dark" | "light" + brandColor: "#192231", // Hex color code + logo: "", // Absolute URL to image + buttonText: "" // Hex color code + } +}; diff --git a/middleware.ts b/middleware.ts new file mode 100644 index 00000000..d25dad7d --- /dev/null +++ b/middleware.ts @@ -0,0 +1,15 @@ +export { default } from "next-auth/middleware"; + +export const config = { + matcher: [ + /* + * Match all request paths except for the ones starting with: + * - api (API routes) + * - _next/static (static files) + * - _next/image (image optimization files) + * - favicon.ico (favicon file) + * - the homepage ("/") + */ + '/((?!api|_next/static|_next/image|favicon.ico).+)', + ], +}; diff --git a/next.config.js b/next.config.js index 8a875c60..921ff944 100644 --- a/next.config.js +++ b/next.config.js @@ -4,6 +4,7 @@ const nextConfig = { output: 'standalone', experimental: { serverActions: true, + serverComponentsExternalPackages: ['@prisma/client', 'bcryptjs', 'chatgpt', '@octokit'], }, async rewrites() { return [ diff --git a/package.json b/package.json index e585c196..6b0bd6f3 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "airbroke", - "version": "1.1.1", + "version": "1.2.0", "private": true, "scripts": { "dev": "next dev", @@ -23,7 +23,9 @@ "chatgpt": "file:vendor/chatgpt-5.2.4.tgz", "nanoid": "4.0.2", "next": "13.4.3", + "next-auth": "^4.22.1", "numeral": "^2.0.6", + "octokit": "^2.0.16", "postcss": "8.4.23", "prettier": "2.8.8", "prettier-plugin-tailwindcss": "0.3.0", diff --git a/yarn.lock b/yarn.lock index 734315a1..0c9ffac2 100644 --- a/yarn.lock +++ b/yarn.lock @@ -391,7 +391,7 @@ __metadata: languageName: node linkType: hard -"@babel/runtime@npm:^7.12.5, @babel/runtime@npm:^7.20.7, @babel/runtime@npm:^7.9.2": +"@babel/runtime@npm:^7.12.5, @babel/runtime@npm:^7.20.13, @babel/runtime@npm:^7.20.7, @babel/runtime@npm:^7.9.2": version: 7.21.5 resolution: "@babel/runtime@npm:7.21.5" dependencies: @@ -984,6 +984,301 @@ __metadata: languageName: node linkType: hard +"@octokit/app@npm:^13.1.3": + version: 13.1.4 + resolution: "@octokit/app@npm:13.1.4" + 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 + checksum: 1c322fea80a5e7186b692990cdc07fc4ef4ee187b2098e1a687310c0d5d717ea144ab241eb6f1ca15841fdcfdf1bfbd5d10eeb34278d02b9ee8c7e1bd8f20dfa + languageName: node + linkType: hard + +"@octokit/auth-app@npm:^4.0.8": + version: 4.0.13 + resolution: "@octokit/auth-app@npm:4.0.13" + 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 + deprecation: ^2.3.1 + lru-cache: ^9.0.0 + universal-github-app-jwt: ^1.1.1 + universal-user-agent: ^6.0.0 + checksum: 809004bc3e985fd4911cc42060fecd7b88e609e1334b90c4f79711aa27cade03fa1d930945ea8f7339ddd8d4514dd220a6ae8489faefa9e0ce6881519a02fc37 + languageName: node + linkType: hard + +"@octokit/auth-oauth-app@npm:^5.0.0": + version: 5.0.5 + resolution: "@octokit/auth-oauth-app@npm:5.0.5" + 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 + checksum: 00f1567d89e1c7004aba451a2beb218da9c6e9ec5be1f973b48936de5f7960803e242a6359a4acd6238958ed62d8d3dcee3b3faafa64431504244dd37a16d418 + languageName: node + linkType: hard + +"@octokit/auth-oauth-device@npm:^4.0.0": + version: 4.0.4 + resolution: "@octokit/auth-oauth-device@npm:4.0.4" + dependencies: + "@octokit/oauth-methods": ^2.0.0 + "@octokit/request": ^6.0.0 + "@octokit/types": ^9.0.0 + universal-user-agent: ^6.0.0 + checksum: 245e1fd77684d131793a52a45133ad2514dbb14e5bb6af99eeaccff58662b567327196a721e296ef5734c0988e85a7536ef22bbf04613b302eba595995c5c751 + languageName: node + linkType: hard + +"@octokit/auth-oauth-user@npm:^2.0.0": + version: 2.1.1 + resolution: "@octokit/auth-oauth-user@npm:2.1.1" + 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 + checksum: 6dbe5974bbc71340811fcae86cbb60a177302ecc7bb7fdd7954077f5d40a615a4caae839290defb642703a9079752503314265362736a643ca39c4839454908e + languageName: node + linkType: hard + +"@octokit/auth-token@npm:^3.0.0": + version: 3.0.3 + resolution: "@octokit/auth-token@npm:3.0.3" + dependencies: + "@octokit/types": ^9.0.0 + checksum: 9b3f569cec1b7e0aa88ab6da68aed4b49b6652261bd957257541fabaf6a4d4ed99f908153cc3dd2fe15b8b0ccaff8caaafaa50bb1a4de3925b0954a47cca1900 + languageName: node + linkType: hard + +"@octokit/auth-unauthenticated@npm:^3.0.0": + version: 3.0.5 + resolution: "@octokit/auth-unauthenticated@npm:3.0.5" + dependencies: + "@octokit/request-error": ^3.0.0 + "@octokit/types": ^9.0.0 + checksum: 8372d732af9aeb09e51fc51c9aca00fb4522e182caf514898a27c5d7e33cfd8e39f9d00f7868cfc34ad437280a0fcafb312624a2968526110249e07b2b96b269 + languageName: node + linkType: hard + +"@octokit/core@npm:^4.0.0, @octokit/core@npm:^4.2.1": + version: 4.2.1 + resolution: "@octokit/core@npm:4.2.1" + 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 + checksum: f82d52e937e12da1c7c163341c845b8e27e7fa75678f5e5954e6fa017a94f1833d6e5c4e43f0be796fbfea9dc5e1137087f655dbd5acb3d57879e1b28568e0a9 + languageName: node + linkType: hard + +"@octokit/endpoint@npm:^7.0.0": + version: 7.0.5 + resolution: "@octokit/endpoint@npm:7.0.5" + dependencies: + "@octokit/types": ^9.0.0 + is-plain-object: ^5.0.0 + universal-user-agent: ^6.0.0 + checksum: 81c9e9eabf50e48940cceff7c4d7fbc9327190296507cfe8a199ea00cd492caf8f18a841caf4e3619828924b481996eb16091826db6b5a649bee44c8718ecaa9 + languageName: node + linkType: hard + +"@octokit/graphql@npm:^5.0.0": + version: 5.0.5 + resolution: "@octokit/graphql@npm:5.0.5" + dependencies: + "@octokit/request": ^6.0.0 + "@octokit/types": ^9.0.0 + universal-user-agent: ^6.0.0 + checksum: eb2d1a6305a3d1f55ff0ce92fb88b677f0bb789757152d58a79ef61171fb65ecf6fe18d6c27e236c0cee6a0c2600c2cb8370f5ac7184f8e9361c085aa4555bb1 + languageName: node + linkType: hard + +"@octokit/oauth-app@npm:^4.0.7, @octokit/oauth-app@npm:^4.2.1": + version: 4.2.2 + resolution: "@octokit/oauth-app@npm:4.2.2" + 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 + checksum: a15a849fce7c9b95d3d28583ee20a3a6b4df3d972bf65506204e05ef36998b8bc3359f918524b090157153fb3461e222b7094894bd85374159e84ad774f06ccd + languageName: node + linkType: hard + +"@octokit/oauth-authorization-url@npm:^5.0.0": + version: 5.0.0 + resolution: "@octokit/oauth-authorization-url@npm:5.0.0" + checksum: bc457c4af9559e9e8f752e643fc9d116247f4e4246e69959d99b9e39196c93d7af53c1c8e3bd946bd0e4fc29f7ba27efe9bced8525ffa41fe45ef56a8281014b + languageName: node + linkType: hard + +"@octokit/oauth-methods@npm:^2.0.0": + version: 2.0.5 + resolution: "@octokit/oauth-methods@npm:2.0.5" + 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 + checksum: dda36fdc85f1b9a4322e47d88b13183f86fd7e03e66e787ced7be41ea4a1a64f610e2d1a75f82c7ec7ff5c4a76e07a696c2e7232bf944f04fe64aac5c26bd484 + languageName: node + linkType: hard + +"@octokit/openapi-types@npm:^17.2.0": + version: 17.2.0 + resolution: "@octokit/openapi-types@npm:17.2.0" + checksum: 29995e34f98d9d64ba234d64a7ae9486c66d2bb6ac0d30d9a42decdbb4b03b13e811769b1e1505a1748ff20c22d35724985e6c128cd11a3f14f8322201520093 + languageName: node + linkType: hard + +"@octokit/plugin-paginate-rest@npm:^6.0.0, @octokit/plugin-paginate-rest@npm:^6.1.0": + version: 6.1.2 + resolution: "@octokit/plugin-paginate-rest@npm:6.1.2" + dependencies: + "@octokit/tsconfig": ^1.0.2 + "@octokit/types": ^9.2.3 + peerDependencies: + "@octokit/core": ">=4" + checksum: a7b3e686c7cbd27ec07871cde6e0b1dc96337afbcef426bbe3067152a17b535abd480db1861ca28c88d93db5f7bfdbcadd0919ead19818c28a69d0e194038065 + languageName: node + linkType: hard + +"@octokit/plugin-rest-endpoint-methods@npm:^7.1.1": + version: 7.1.2 + resolution: "@octokit/plugin-rest-endpoint-methods@npm:7.1.2" + dependencies: + "@octokit/types": ^9.2.3 + deprecation: ^2.3.1 + peerDependencies: + "@octokit/core": ">=3" + checksum: 159d29bf28d7aecbe39f08c25cf376d39b6c90ce17e50a55eafb44f3e4b9e1053a300c1edd72f308ae386146a17cbad46c410c1cfd000b048adf9c21d6922a1a + languageName: node + linkType: hard + +"@octokit/plugin-retry@npm:^4.1.3": + version: 4.1.3 + resolution: "@octokit/plugin-retry@npm:4.1.3" + dependencies: + "@octokit/types": ^9.0.0 + bottleneck: ^2.15.3 + peerDependencies: + "@octokit/core": ">=3" + checksum: f9ed5869be23dddcf1ee896ce996e46a412a586259b55612ba44c82cdeed91436102e6e3ec57db879bd91a4446dcafbaa94632e4e059c6af56d9cca9b163eacb + languageName: node + linkType: hard + +"@octokit/plugin-throttling@npm:^5.2.2": + version: 5.2.3 + resolution: "@octokit/plugin-throttling@npm:5.2.3" + dependencies: + "@octokit/types": ^9.0.0 + bottleneck: ^2.15.3 + peerDependencies: + "@octokit/core": ^4.0.0 + checksum: ce7ca75d150c63cf1bbcb5b385513bd8cd1f714c5e59f33d25c2afd08fa730250055ef8dffa74113f92e7fb3f209a147442242151607a513f55e4ce382c8e80c + languageName: node + linkType: hard + +"@octokit/request-error@npm:^3.0.0, @octokit/request-error@npm:^3.0.3": + version: 3.0.3 + resolution: "@octokit/request-error@npm:3.0.3" + dependencies: + "@octokit/types": ^9.0.0 + deprecation: ^2.0.0 + once: ^1.4.0 + checksum: 5db0b514732686b627e6ed9ef1ccdbc10501f1b271a9b31f784783f01beee70083d7edcfeb35fbd7e569fa31fdd6762b1ff6b46101700d2d97e7e48e749520d0 + languageName: node + linkType: hard + +"@octokit/request@npm:^6.0.0, @octokit/request@npm:^6.2.3": + version: 6.2.5 + resolution: "@octokit/request@npm:6.2.5" + 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 + checksum: 856451ea8cc6b1dd0f6e350a141e65c318b5e3a25b8dea373d3afd115f9a3077535a0330f5d90e9db81dc3234dba1dd64edd31e68f639553baa10b4d02b99498 + languageName: node + linkType: hard + +"@octokit/tsconfig@npm:^1.0.2": + version: 1.0.2 + resolution: "@octokit/tsconfig@npm:1.0.2" + checksum: 74d56f3e9f326a8dd63700e9a51a7c75487180629c7a68bbafee97c612fbf57af8347369bfa6610b9268a3e8b833c19c1e4beb03f26db9a9dce31f6f7a19b5b1 + languageName: node + linkType: hard + +"@octokit/types@npm:^9.0.0, @octokit/types@npm:^9.2.2, @octokit/types@npm:^9.2.3": + version: 9.2.3 + resolution: "@octokit/types@npm:9.2.3" + dependencies: + "@octokit/openapi-types": ^17.2.0 + checksum: 6806413089f20a8302237ef85aa2e83bace7499e95fdc3db2d304f9e6dc6e87fb6766452f92e08ddf475046b69753e11beabaeff6733c38bdaf3e21dfd7d3341 + languageName: node + linkType: hard + +"@octokit/webhooks-methods@npm:^3.0.0": + version: 3.0.2 + resolution: "@octokit/webhooks-methods@npm:3.0.2" + checksum: 4608d6a394bd94846301b709f44adc2bde0f43517840c49d235e3cb355986e2e9736d60b4a39c3492b31c06d10401f32cab878ec83e83b890606f58619cad5ef + languageName: node + linkType: hard + +"@octokit/webhooks-types@npm:6.11.0": + version: 6.11.0 + resolution: "@octokit/webhooks-types@npm:6.11.0" + checksum: af35ac7a3d8d95bf9906fb3a8f6075cf9cb10707c79444fa82df2d64596125f515a35a4995b4548b84ee042c7c1b1cc120e05ece4a197af541a52f154bf4bcce + languageName: node + linkType: hard + +"@octokit/webhooks@npm:^10.0.0": + version: 10.9.1 + resolution: "@octokit/webhooks@npm:10.9.1" + dependencies: + "@octokit/request-error": ^3.0.0 + "@octokit/webhooks-methods": ^3.0.0 + "@octokit/webhooks-types": 6.11.0 + aggregate-error: ^3.1.0 + checksum: 3ee4ae98777653d629068c7914a8df29affb399a385ae55954953afa0caa856bab0cf8e92cfa80d36db0e7dd08eada0a3597cffd2f503a9078410660f0609161 + languageName: node + linkType: hard + +"@panva/hkdf@npm:^1.0.2": + version: 1.1.1 + resolution: "@panva/hkdf@npm:1.1.1" + checksum: f0dd12903751d8792420353f809ed3c7de860cf506399759fff5f59f7acfef8a77e2b64012898cee7e5b047708fa0bd91dff5ef55a502bf8ea11aad9842160da + languageName: node + linkType: hard + "@pkgr/utils@npm:^2.3.1": version: 2.4.0 resolution: "@pkgr/utils@npm:2.4.0" @@ -1167,6 +1462,13 @@ __metadata: languageName: node linkType: hard +"@types/aws-lambda@npm:^8.10.83": + version: 8.10.115 + resolution: "@types/aws-lambda@npm:8.10.115" + checksum: 58c924812b0dac2e13118cbda05594f820033d2df572e0e264443cdfdb7ea07ed725614f0d5841b3f3bcf48bca7d3aa0da5b5ad3bf51ae74dadf9962037e23b5 + languageName: node + linkType: hard + "@types/babel__core@npm:^7.1.14": version: 7.20.0 resolution: "@types/babel__core@npm:7.20.0" @@ -1208,6 +1510,13 @@ __metadata: languageName: node linkType: hard +"@types/btoa-lite@npm:^1.0.0": + version: 1.0.0 + resolution: "@types/btoa-lite@npm:1.0.0" + checksum: 4d0c3c36cc8aa5669d286d62ca45d925e3ea0db75222ebacb0d9f4fd7822b8e162da8773887e045c11d64c42373807d2ab2ad97a5d8a683d2e1c981e6a05ce33 + languageName: node + linkType: hard + "@types/caseless@npm:*": version: 0.12.2 resolution: "@types/caseless@npm:0.12.2" @@ -1291,6 +1600,15 @@ __metadata: languageName: node linkType: hard +"@types/jsonwebtoken@npm:^9.0.0": + version: 9.0.2 + resolution: "@types/jsonwebtoken@npm:9.0.2" + dependencies: + "@types/node": "*" + checksum: 3bb8d40e78d7eb53e427db6e9f0f22e0890cfee80965dcf741d08341814913afb211306de6e9847c6d241cc8e36f8a59090cbfdcc510ab7c81af9d650c5afe0e + languageName: node + linkType: hard + "@types/node@npm:*": version: 20.1.2 resolution: "@types/node@npm:20.1.2" @@ -1574,7 +1892,7 @@ __metadata: languageName: node linkType: hard -"aggregate-error@npm:^3.0.0": +"aggregate-error@npm:^3.0.0, aggregate-error@npm:^3.1.0": version: 3.1.0 resolution: "aggregate-error@npm:3.1.0" dependencies: @@ -1611,7 +1929,9 @@ __metadata: jest-environment-jsdom: ^29.5.0 nanoid: 4.0.2 next: 13.4.3 + next-auth: ^4.22.1 numeral: ^2.0.6 + octokit: ^2.0.16 postcss: 8.4.23 prettier: 2.8.8 prettier-plugin-tailwindcss: 0.3.0 @@ -2001,6 +2321,13 @@ __metadata: languageName: node linkType: hard +"before-after-hook@npm:^2.2.0": + version: 2.2.3 + resolution: "before-after-hook@npm:2.2.3" + checksum: a1a2430976d9bdab4cd89cb50d27fa86b19e2b41812bf1315923b0cba03371ebca99449809226425dd3bcef20e010db61abdaff549278e111d6480034bebae87 + languageName: node + linkType: hard + "big-integer@npm:^1.6.44": version: 1.6.51 resolution: "big-integer@npm:1.6.51" @@ -2033,6 +2360,13 @@ __metadata: languageName: node linkType: hard +"bottleneck@npm:^2.15.3": + version: 2.19.5 + resolution: "bottleneck@npm:2.19.5" + checksum: c5eef1bbea12cef1f1405e7306e7d24860568b0f7ac5eeab706a86762b3fc65ef6d1c641c8a166e4db90f412fc5c948fc5ce8008a8cd3d28c7212ef9c3482bda + languageName: node + linkType: hard + "bplist-parser@npm:^0.2.0": version: 0.2.0 resolution: "bplist-parser@npm:0.2.0" @@ -2093,6 +2427,20 @@ __metadata: languageName: node linkType: hard +"btoa-lite@npm:^1.0.0": + version: 1.0.0 + resolution: "btoa-lite@npm:1.0.0" + checksum: c2d61993b801f8e35a96f20692a45459c753d9baa29d86d1343e714f8d6bbe7069f1a20a5ae868488f3fb137d5bd0c560f6fbbc90b5a71050919d2d2c97c0475 + languageName: node + linkType: hard + +"buffer-equal-constant-time@npm:1.0.1": + version: 1.0.1 + resolution: "buffer-equal-constant-time@npm:1.0.1" + checksum: 80bb945f5d782a56f374b292770901065bad21420e34936ecbe949e57724b4a13874f735850dd1cc61f078773c4fb5493a41391e7bda40d1fa388d6bd80daaab + languageName: node + linkType: hard + "buffer-from@npm:^1.0.0": version: 1.1.2 resolution: "buffer-from@npm:1.1.2" @@ -2477,6 +2825,13 @@ __metadata: languageName: node linkType: hard +"cookie@npm:^0.5.0": + version: 0.5.0 + resolution: "cookie@npm:0.5.0" + checksum: 1f4bd2ca5765f8c9689a7e8954183f5332139eb72b6ff783d8947032ec1fdf43109852c178e21a953a30c0dd42257828185be01b49d1eb1a67fd054ca588a180 + languageName: node + linkType: hard + "create-require@npm:^1.1.0": version: 1.1.1 resolution: "create-require@npm:1.1.1" @@ -2728,6 +3083,13 @@ __metadata: languageName: node linkType: hard +"deprecation@npm:^2.0.0, deprecation@npm:^2.3.1": + version: 2.3.1 + resolution: "deprecation@npm:2.3.1" + checksum: f56a05e182c2c195071385455956b0c4106fe14e36245b00c689ceef8e8ab639235176a96977ba7c74afb173317fac2e0ec6ec7a1c6d1e6eaa401c586c714132 + languageName: node + linkType: hard + "detect-libc@npm:^2.0.0, detect-libc@npm:^2.0.1": version: 2.0.1 resolution: "detect-libc@npm:2.0.1" @@ -2822,6 +3184,15 @@ __metadata: languageName: node linkType: hard +"ecdsa-sig-formatter@npm:1.0.11": + version: 1.0.11 + resolution: "ecdsa-sig-formatter@npm:1.0.11" + dependencies: + safe-buffer: ^5.0.1 + checksum: 207f9ab1c2669b8e65540bce29506134613dd5f122cccf1e6a560f4d63f2732d427d938f8481df175505aad94583bcb32c688737bb39a6df0625f903d6d93c03 + languageName: node + linkType: hard + "electron-to-chromium@npm:^1.4.284": version: 1.4.391 resolution: "electron-to-chromium@npm:1.4.391" @@ -3593,6 +3964,13 @@ __metadata: languageName: node linkType: hard +"fromentries@npm:^1.3.1": + version: 1.3.2 + resolution: "fromentries@npm:1.3.2" + checksum: 33729c529ce19f5494f846f0dd4945078f4e37f4e8955f4ae8cc7385c218f600e9d93a7d225d17636c20d1889106fd87061f911550861b7072f53bf891e6b341 + languageName: node + linkType: hard + "fs-constants@npm:^1.0.0": version: 1.0.0 resolution: "fs-constants@npm:1.0.0" @@ -4332,6 +4710,13 @@ __metadata: languageName: node linkType: hard +"is-plain-object@npm:^5.0.0": + version: 5.0.0 + resolution: "is-plain-object@npm:5.0.0" + checksum: e32d27061eef62c0847d303125440a38660517e586f2f3db7c9d179ae5b6674ab0f469d519b2e25c147a1a3bc87156d0d5f4d8821e0ce4a9ee7fe1fcf11ce45c + languageName: node + linkType: hard + "is-potential-custom-element-name@npm:^1.0.1": version: 1.0.1 resolution: "is-potential-custom-element-name@npm:1.0.1" @@ -4983,6 +5368,13 @@ __metadata: languageName: node linkType: hard +"jose@npm:^4.11.4, jose@npm:^4.14.1": + version: 4.14.4 + resolution: "jose@npm:4.14.4" + checksum: 2d820a91a8fd97c05d8bc8eedc373b944a0cd7f5fe41063086da233d0473c73fb523912a9f026ea870782bd221f4a515f441a2d3af4de48c6f2c76dac5082377 + languageName: node + linkType: hard + "js-sdsl@npm:^4.1.4": version: 4.4.0 resolution: "js-sdsl@npm:4.4.0" @@ -5139,6 +5531,18 @@ __metadata: languageName: node linkType: hard +"jsonwebtoken@npm:^9.0.0": + version: 9.0.0 + resolution: "jsonwebtoken@npm:9.0.0" + dependencies: + jws: ^3.2.2 + lodash: ^4.17.21 + ms: ^2.1.1 + semver: ^7.3.8 + checksum: b9181cecf9df99f1dc0253f91ba000a1aa4d91f5816d1608c0dba61a5623726a0bfe200b51df25de18c1a6000825d231ad7ce2788aa54fd48dcb760ad9eb9514 + languageName: node + linkType: hard + "jsx-ast-utils@npm:^2.4.1 || ^3.0.0, jsx-ast-utils@npm:^3.3.3": version: 3.3.3 resolution: "jsx-ast-utils@npm:3.3.3" @@ -5149,6 +5553,27 @@ __metadata: languageName: node linkType: hard +"jwa@npm:^1.4.1": + version: 1.4.1 + resolution: "jwa@npm:1.4.1" + dependencies: + buffer-equal-constant-time: 1.0.1 + ecdsa-sig-formatter: 1.0.11 + safe-buffer: ^5.0.1 + checksum: ff30ea7c2dcc61f3ed2098d868bf89d43701605090c5b21b5544b512843ec6fd9e028381a4dda466cbcdb885c2d1150f7c62e7168394ee07941b4098e1035e2f + languageName: node + linkType: hard + +"jws@npm:^3.2.2": + version: 3.2.2 + resolution: "jws@npm:3.2.2" + dependencies: + jwa: ^1.4.1 + safe-buffer: ^5.0.1 + checksum: f0213fe5b79344c56cd443428d8f65c16bf842dc8cb8f5aed693e1e91d79c20741663ad6eff07a6d2c433d1831acc9814e8d7bada6a0471fbb91d09ceb2bf5c2 + languageName: node + linkType: hard + "keyv@npm:^4.5.2": version: 4.5.2 resolution: "keyv@npm:4.5.2" @@ -5256,7 +5681,7 @@ __metadata: languageName: node linkType: hard -"lodash@npm:^4.17.15": +"lodash@npm:^4.17.15, lodash@npm:^4.17.21": version: 4.17.21 resolution: "lodash@npm:4.17.21" checksum: eb835a2e51d381e561e508ce932ea50a8e5a68f4ebdd771ea240d3048244a8d13658acbd502cd4829768c56f2e16bdd4340b9ea141297d472517b83868e677f7 @@ -5299,6 +5724,13 @@ __metadata: languageName: node linkType: hard +"lru-cache@npm:^9.0.0": + version: 9.1.1 + resolution: "lru-cache@npm:9.1.1" + checksum: 4d703bb9b66216bbee55ead82a9682820a2b6acbdfca491b235390b1ef1056000a032d56dfb373fdf9ad4492f1fa9d04cc9a05a77f25bd7ce6901d21ad9b68b7 + languageName: node + linkType: hard + "lz-string@npm:^1.5.0": version: 1.5.0 resolution: "lz-string@npm:1.5.0" @@ -5616,6 +6048,31 @@ __metadata: languageName: node linkType: hard +"next-auth@npm:^4.22.1": + version: 4.22.1 + resolution: "next-auth@npm:4.22.1" + dependencies: + "@babel/runtime": ^7.20.13 + "@panva/hkdf": ^1.0.2 + cookie: ^0.5.0 + jose: ^4.11.4 + oauth: ^0.9.15 + openid-client: ^5.4.0 + preact: ^10.6.3 + preact-render-to-string: ^5.1.19 + uuid: ^8.3.2 + peerDependencies: + next: ^12.2.5 || ^13 + nodemailer: ^6.6.5 + react: ^17.0.2 || ^18 + react-dom: ^17.0.2 || ^18 + peerDependenciesMeta: + nodemailer: + optional: true + checksum: 42bae16b62bac4b3d215d991c7c964dfc071a84df32900a28d4cbc20d4b6a65689b3ba9f10633780a22ff0cbc420248d012614a5b0d82918f9bbb56f7f92f7c5 + languageName: node + linkType: hard + "next@npm:13.4.3": version: 13.4.3 resolution: "next@npm:13.4.3" @@ -5695,7 +6152,7 @@ __metadata: languageName: node linkType: hard -"node-fetch@npm:^2.6.11": +"node-fetch@npm:^2.6.11, node-fetch@npm:^2.6.7": version: 2.6.11 resolution: "node-fetch@npm:2.6.11" dependencies: @@ -5824,6 +6281,13 @@ __metadata: languageName: node linkType: hard +"oauth@npm:^0.9.15": + version: 0.9.15 + resolution: "oauth@npm:0.9.15" + checksum: 957c0d8d85300398dcb0e293953650c0fc3facc795bee8228238414f19f59cef5fd4ee8d17a972c142924c10c5f6ec50ef80f77f4a6cc6e3c98f9d22c027801c + languageName: node + linkType: hard + "object-assign@npm:^4.0.1, object-assign@npm:^4.1.1": version: 4.1.1 resolution: "object-assign@npm:4.1.1" @@ -5831,6 +6295,13 @@ __metadata: languageName: node linkType: hard +"object-hash@npm:^2.2.0": + version: 2.2.0 + resolution: "object-hash@npm:2.2.0" + checksum: 55ba841e3adce9c4f1b9b46b41983eda40f854e0d01af2802d3ae18a7085a17168d6b81731d43fdf1d6bcbb3c9f9c56d22c8fea992203ad90a38d7d919bc28f1 + languageName: node + linkType: hard + "object-hash@npm:^3.0.0": version: 3.0.0 resolution: "object-hash@npm:3.0.0" @@ -5917,6 +6388,29 @@ __metadata: languageName: node linkType: hard +"octokit@npm:^2.0.16": + version: 2.0.16 + resolution: "octokit@npm:2.0.16" + dependencies: + "@octokit/app": ^13.1.3 + "@octokit/core": ^4.2.1 + "@octokit/oauth-app": ^4.2.1 + "@octokit/plugin-paginate-rest": ^6.1.0 + "@octokit/plugin-rest-endpoint-methods": ^7.1.1 + "@octokit/plugin-retry": ^4.1.3 + "@octokit/plugin-throttling": ^5.2.2 + "@octokit/types": ^9.2.2 + checksum: 975e636bc99c4965c65ad4bb17e6f6bdc7b3ab911f8b0273f149ad3f2c80982f0a382015255869d9a2ca85ab6d4d2b1e491d29084fff9c0b75e89ec77dfafdd8 + languageName: node + linkType: hard + +"oidc-token-hash@npm:^5.0.3": + version: 5.0.3 + resolution: "oidc-token-hash@npm:5.0.3" + checksum: 35fa19aea9ff2c509029ec569d74b778c8a215b92bd5e6e9bc4ebbd7ab035f44304ff02430a6397c3fb7c1d15ebfa467807ca0bcd31d06ba610b47798287d303 + languageName: node + linkType: hard + "once@npm:^1.3.0, once@npm:^1.3.1, once@npm:^1.4.0": version: 1.4.0 resolution: "once@npm:1.4.0" @@ -5956,6 +6450,18 @@ __metadata: languageName: node linkType: hard +"openid-client@npm:^5.4.0": + version: 5.4.2 + resolution: "openid-client@npm:5.4.2" + dependencies: + jose: ^4.14.1 + lru-cache: ^6.0.0 + object-hash: ^2.2.0 + oidc-token-hash: ^5.0.3 + checksum: 0f3570990a4979aff8581de35078c82d21d45baed9805e0e385dfc62c24fa295ee82d86386846a33bc33ed3b524a5406d8564f9f927420027719f84bf1d8b741 + languageName: node + linkType: hard + "optionator@npm:^0.8.1": version: 0.8.3 resolution: "optionator@npm:0.8.3" @@ -6269,6 +6775,24 @@ __metadata: languageName: node linkType: hard +"preact-render-to-string@npm:^5.1.19": + version: 5.2.6 + resolution: "preact-render-to-string@npm:5.2.6" + dependencies: + pretty-format: ^3.8.0 + peerDependencies: + preact: ">=10" + checksum: be8d5d8fb502d422c503e68af7bcccb6facd942f3ae9a4d093ebe3f1d4f0b15c540624bdac434d53a2a8e8fb7afa4606383414e937c40933ca43445470a026ff + languageName: node + linkType: hard + +"preact@npm:^10.6.3": + version: 10.14.1 + resolution: "preact@npm:10.14.1" + checksum: 2babea9a7a48c93fbdc1bc2b4ec599070585cdf253bbfc2f37ebdd3a3c85c503a92af2be175344a46d1e0439820702b92ad60e9140abefc49c43871f906e8461 + languageName: node + linkType: hard + "prebuild-install@npm:^7.1.1": version: 7.1.1 resolution: "prebuild-install@npm:7.1.1" @@ -6391,6 +6915,13 @@ __metadata: languageName: node linkType: hard +"pretty-format@npm:^3.8.0": + version: 3.8.0 + resolution: "pretty-format@npm:3.8.0" + checksum: 21a114d43ef06978f8f7f6212be4649b0b094f05d9b30e14e37550bf35c8ca24d8adbca9e5adc4cc15d9eaf7a1e7a30478a4dc37b30982bfdf0292a5b385484c + languageName: node + linkType: hard + "prisma@npm:4.14.1": version: 4.14.1 resolution: "prisma@npm:4.14.1" @@ -7735,6 +8266,23 @@ __metadata: languageName: node linkType: hard +"universal-github-app-jwt@npm:^1.1.1": + version: 1.1.1 + resolution: "universal-github-app-jwt@npm:1.1.1" + dependencies: + "@types/jsonwebtoken": ^9.0.0 + jsonwebtoken: ^9.0.0 + checksum: 31d30150b9eafa9fa8bf57bd6f97d7d91d4509ad24fa673a6e29ac2295b8f1fc293a70cb44fa807af7cfd787db1cf6edd3876fc0cae31230c5292b76677159fc + languageName: node + linkType: hard + +"universal-user-agent@npm:^6.0.0": + version: 6.0.0 + resolution: "universal-user-agent@npm:6.0.0" + checksum: 5092bbc80dd0d583cef0b62c17df0043193b74f425112ea6c1f69bc5eda21eeec7a08d8c4f793a277eb2202ffe9b44bec852fa3faff971234cd209874d1b79ef + languageName: node + linkType: hard + "universalify@npm:^0.2.0": version: 0.2.0 resolution: "universalify@npm:0.2.0" @@ -7789,6 +8337,15 @@ __metadata: languageName: node linkType: hard +"uuid@npm:^8.3.2": + version: 8.3.2 + resolution: "uuid@npm:8.3.2" + bin: + uuid: dist/bin/uuid + checksum: 5575a8a75c13120e2f10e6ddc801b2c7ed7d8f3c8ac22c7ed0c7b2ba6383ec0abda88c905085d630e251719e0777045ae3236f04c812184b7c765f63a70e58df + languageName: node + linkType: hard + "uuid@npm:^9.0.0": version: 9.0.0 resolution: "uuid@npm:9.0.0"