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"