diff --git a/.gitignore b/.gitignore
index 8ef90936..7d46bf4b 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,3 +1,83 @@
+### JetBrains template
+# Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio, WebStorm and Rider
+# Reference: https://intellij-support.jetbrains.com/hc/en-us/articles/206544839
+
+# User-specific stuff
+.idea/**/workspace.xml
+.idea/**/tasks.xml
+.idea/**/usage.statistics.xml
+.idea/**/dictionaries
+.idea/**/shelf
+
+# AWS User-specific
+.idea/**/aws.xml
+
+# Generated files
+.idea/**/contentModel.xml
+
+# Sensitive or high-churn files
+.idea/**/dataSources/
+.idea/**/dataSources.ids
+.idea/**/dataSources.local.xml
+.idea/**/sqlDataSources.xml
+.idea/**/dynamic.xml
+.idea/**/uiDesigner.xml
+.idea/**/dbnavigator.xml
+
+# Gradle
+.idea/**/gradle.xml
+.idea/**/libraries
+
+# Gradle and Maven with auto-import
+# When using Gradle or Maven with auto-import, you should exclude module files,
+# since they will be recreated, and may cause churn. Uncomment if using
+# auto-import.
+# .idea/artifacts
+# .idea/compiler.xml
+# .idea/jarRepositories.xml
+# .idea/modules.xml
+# .idea/*.iml
+# .idea/modules
+# *.iml
+# *.ipr
+
+# CMake
+cmake-build-*/
+
+# Mongo Explorer plugin
+.idea/**/mongoSettings.xml
+
+# File-based project format
+*.iws
+
+# IntelliJ
+out/
+
+# mpeltonen/sbt-idea plugin
+.idea_modules/
+
+# JIRA plugin
+atlassian-ide-plugin.xml
+
+# Cursive Clojure plugin
+.idea/replstate.xml
+
+# SonarLint plugin
+.idea/sonarlint/
+
+# Crashlytics plugin (for Android Studio and IntelliJ)
+com_crashlytics_export_strings.xml
+crashlytics.properties
+crashlytics-build.properties
+fabric.properties
+
+# Editor-based Rest Client
+.idea/httpRequests
+
+# Android studio 3.1+ serialized cache file
+.idea/caches/build_file_checksums.ser
+
+
# See https://help.github.com/articles/ignoring-files/ for more about ignoring files.
# dependencies
@@ -10,7 +90,6 @@ coverage
# next.js
.next/
-out/
build
# misc
@@ -32,6 +111,4 @@ yarn-error.log*
# turbo
.turbo
-.idea
-
dist
diff --git a/.idea/.gitignore b/.idea/.gitignore
new file mode 100644
index 00000000..b58b603f
--- /dev/null
+++ b/.idea/.gitignore
@@ -0,0 +1,5 @@
+# Default ignored files
+/shelf/
+/workspace.xml
+# Editor-based HTTP Client requests
+/httpRequests/
diff --git a/.idea/codeStyles/Project.xml b/.idea/codeStyles/Project.xml
new file mode 100644
index 00000000..ae4df6be
--- /dev/null
+++ b/.idea/codeStyles/Project.xml
@@ -0,0 +1,62 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/codeStyles/codeStyleConfig.xml b/.idea/codeStyles/codeStyleConfig.xml
new file mode 100644
index 00000000..79ee123c
--- /dev/null
+++ b/.idea/codeStyles/codeStyleConfig.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/inspectionProfiles/Project_Default.xml b/.idea/inspectionProfiles/Project_Default.xml
new file mode 100644
index 00000000..03d9549e
--- /dev/null
+++ b/.idea/inspectionProfiles/Project_Default.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/jsLibraryMappings.xml b/.idea/jsLibraryMappings.xml
new file mode 100644
index 00000000..d23208fb
--- /dev/null
+++ b/.idea/jsLibraryMappings.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/prettier.xml b/.idea/prettier.xml
new file mode 100644
index 00000000..8004cebd
--- /dev/null
+++ b/.idea/prettier.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/vcs.xml b/.idea/vcs.xml
new file mode 100644
index 00000000..35eb1ddf
--- /dev/null
+++ b/.idea/vcs.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/README.md b/README.md
index 703546d9..ec41a063 100644
--- a/README.md
+++ b/README.md
@@ -34,8 +34,8 @@ Checkout [more options here](https://github.com/raineorshine/npm-check-updates#o
- Update navbar
- dropdown for homepage links
- add blog
- - make configurable
-- Authentication
+- Add social links in footer when sm screen
+- Hide Sign in button on homepage
- Projects
- Groups/Permissions
- Embed GitHub commit snippet
@@ -52,6 +52,7 @@ Checkout [more options here](https://github.com/raineorshine/npm-check-updates#o
- API: https://api.github.com/repos/yusanshi/emgithub/commits/7879e517c6b1d6f7b539a7770aba9feb46ff4672
- Fetch commit information and store in Dynammo db
- API rate limiting for storing commit information
+ - https://docs.github.com/en/developers/apps/building-github-apps/rate-limits-for-github-apps
- Getting commit info: https://docs.github.com/en/rest/commits/commits?apiVersion=2022-11-28#get-a-commit
- Prism diff highlighter: https://prismjs.com/plugins/diff-highlight/
- Diff 2 html CLI: https://github.com/rtfpessoa/diff2html-cli
diff --git a/apps/vighnesh153.com/.env.production b/apps/vighnesh153.com/.env.production
new file mode 100644
index 00000000..9688f506
--- /dev/null
+++ b/apps/vighnesh153.com/.env.production
@@ -0,0 +1,4 @@
+GOOGLE_CLIENT_ID=...
+GOOGLE_CLIENT_SECRET=...
+NEXTAUTH_URL=https://vighnesh153.com
+NEXTAUTH_SECRET="Charizard is the best and coolest pokemon ever ❤️"
diff --git a/apps/vighnesh153.com/package.json b/apps/vighnesh153.com/package.json
index 098a7fef..552b9ca6 100644
--- a/apps/vighnesh153.com/package.json
+++ b/apps/vighnesh153.com/package.json
@@ -19,6 +19,7 @@
"@vighnesh153/utils": "*",
"eslint-config-vighnesh153": "*",
"next": "^13.1.1",
+ "next-auth": "^4.18.8",
"next-transpile-modules": "^10.0.0",
"react": "^18.2.0",
"react-dom": "^18.2.0",
diff --git a/apps/vighnesh153.com/src/modules/common/components/auth-box.tsx b/apps/vighnesh153.com/src/modules/common/components/auth-box.tsx
new file mode 100644
index 00000000..dfcc78f7
--- /dev/null
+++ b/apps/vighnesh153.com/src/modules/common/components/auth-box.tsx
@@ -0,0 +1,25 @@
+import { useSession, signIn } from 'next-auth/react';
+import { CircularProgress, Box } from '@mui/material';
+import { not } from '@vighnesh153/utils';
+import { ProfileBox } from './profile-box';
+import { SignInButton } from './sign-in-button';
+
+export function AuthBox() {
+ const { data: session, status } = useSession();
+ const isLoading = status === 'loading';
+ const user = session?.user;
+
+ if (isLoading) {
+ return (
+
+
+
+ );
+ }
+
+ if (not(session) || not(session?.user)) {
+ return signIn('google')} />;
+ }
+
+ return ;
+}
diff --git a/apps/vighnesh153.com/src/modules/common/components/index.ts b/apps/vighnesh153.com/src/modules/common/components/index.ts
index 852e1cf6..e3114fc3 100644
--- a/apps/vighnesh153.com/src/modules/common/components/index.ts
+++ b/apps/vighnesh153.com/src/modules/common/components/index.ts
@@ -1,10 +1,12 @@
export * from './404-page';
export * from './aside-email-address';
export * from './aside-social-links';
+export * from './auth-box';
export * from './border-corner-animation-link';
export * from './focus-dashed-outline';
export * from './head';
export * from './navbar';
export * from './next-link';
+export * from './sign-in-button';
export * from './skip-to-main-content';
export * from './underlined-animation-link';
diff --git a/apps/vighnesh153.com/src/modules/common/components/navbar.tsx b/apps/vighnesh153.com/src/modules/common/components/navbar.tsx
deleted file mode 100644
index 47169b59..00000000
--- a/apps/vighnesh153.com/src/modules/common/components/navbar.tsx
+++ /dev/null
@@ -1,222 +0,0 @@
-import { RVLogoIcon } from '@vighnesh153/ui';
-import { Menu as MenuIcon } from '@mui/icons-material';
-import {
- AppBar,
- Box,
- SwipeableDrawer,
- IconButton,
- List,
- ListItem,
- Toolbar,
- Slide,
- Typography,
- useTheme,
- useScrollTrigger,
- alpha,
-} from '@mui/material';
-import React, { useState } from 'react';
-import { useIsIOS, useWindowScrollAmount } from '@vighnesh153/react-hooks';
-import { not } from '@vighnesh153/utils';
-import { commonConstants } from '../constants';
-import { FocusDashedOutline } from './focus-dashed-outline';
-import { MuiNextLink } from './next-link';
-
-interface NavItem {
- label: string;
- href: string;
-}
-
-const drawerWidth = 320;
-const navItems: NavItem[] = [
- { label: 'About', href: commonConstants.pageLinks.homePage.aboutSection },
- {
- label: 'Experience',
- href: commonConstants.pageLinks.homePage.experienceSection,
- },
- {
- label: 'Projects',
- href: commonConstants.pageLinks.homePage.projectsSection,
- },
- {
- label: 'Contact',
- href: commonConstants.pageLinks.homePage.contactMeSection,
- },
- { label: 'Resume', href: commonConstants.resumeLink },
-];
-
-function HideOnScroll(props: { children: React.ReactElement }) {
- const trigger = useScrollTrigger();
-
- return (
-
- {props.children}
-
- );
-}
-
-function NavDrawer({ isOpen, updateIsOpen }: { isOpen: boolean; updateIsOpen: (newIsOpen: boolean) => void }) {
- const theme = useTheme();
- const isIOS = useIsIOS();
-
- const container = (() => {
- try {
- return window.document.body;
- } catch (e) {
- return undefined;
- }
- })();
-
- const toggleDrawer = (newIsOpen = !isOpen) => updateIsOpen(newIsOpen);
-
- const drawer = (
-
-
- {navItems.map((item) => (
-
-
- toggleDrawer()}
- href={item.href}
- sx={{
- color: theme.palette.text.primary,
- '&:is(:hover,:focus)': {
- color: theme.palette.secondary.main,
- },
- }}
- >
-
- {item.label}
-
-
-
-
- ))}
-
-
- );
-
- return (
- toggleDrawer(true)}
- onClose={() => toggleDrawer()}
- anchor="right"
- disableBackdropTransition={not(isIOS)}
- disableDiscovery={not(isIOS)}
- ModalProps={{
- keepMounted: true, // Better open performance on mobile.
- }}
- sx={{
- display: { xs: 'block', md: 'none' },
- '& .MuiDrawer-paper': {
- width: drawerWidth,
- },
- }}
- >
- {drawer}
-
- );
-}
-
-export function Navbar() {
- const theme = useTheme();
- const { scrollAmount: windowScrollAmount } = useWindowScrollAmount();
- const [mobileDrawerOpen, setMobileDrawerOpen] = useState(false);
-
- const handleDrawerToggle = () => {
- setMobileDrawerOpen((prevState) => !prevState);
- };
-
- const getAppBarBoxShadow = () => {
- if (windowScrollAmount.scrollY < 70) {
- return 'none';
- }
- return `0 10px 30px -10px ${alpha(theme.palette.primary.dark, 0.7)}`;
- };
-
- return (
-
-
-
-
-
-
-
-
-
-
-
- {navItems.map((item) => (
-
-
- {item.label}
-
-
- ))}
-
-
-
-
-
-
-
-
-
- setMobileDrawerOpen(newIsOpen)} />
-
-
- );
-}
diff --git a/apps/vighnesh153.com/src/modules/common/components/navbar/common.tsx b/apps/vighnesh153.com/src/modules/common/components/navbar/common.tsx
new file mode 100644
index 00000000..3d4ad00e
--- /dev/null
+++ b/apps/vighnesh153.com/src/modules/common/components/navbar/common.tsx
@@ -0,0 +1,65 @@
+import React, { ReactElement } from 'react';
+import { Slide, useScrollTrigger } from '@mui/material';
+import { not } from '@vighnesh153/utils';
+import { commonConstants } from '../../constants';
+import { AuthBox } from '../auth-box';
+
+export function HideOnScroll(props: { children: React.ReactElement }) {
+ const trigger = useScrollTrigger();
+
+ return (
+
+ {props.children}
+
+ );
+}
+
+export type NavItem = ({ label: string; href: string; type: 'link' } | { element: ReactElement; type: 'custom' }) & {
+ id: string;
+};
+
+export const drawerWidth = 320;
+export const profileAndSignInId = 'profile-and-sign-in';
+export const navItems: NavItem[] = [
+ {
+ id: 'about',
+ label: 'About',
+ href: commonConstants.pageLinks.homePage.aboutSection,
+ type: 'link',
+ },
+ {
+ id: 'blog',
+ label: 'Blog',
+ href: commonConstants.pageLinks.homePage.blogsSection,
+ type: 'link',
+ },
+ {
+ id: 'projects',
+ label: 'Projects',
+ href: commonConstants.pageLinks.homePage.projectsSection,
+ type: 'link',
+ },
+ {
+ id: 'experience',
+ label: 'Experience',
+ href: commonConstants.pageLinks.homePage.experienceSection,
+ type: 'link',
+ },
+ {
+ id: 'contact',
+ label: 'Contact',
+ href: commonConstants.pageLinks.homePage.contactMeSection,
+ type: 'link',
+ },
+ {
+ id: 'resume',
+ label: 'Resume',
+ href: commonConstants.resumeLink,
+ type: 'link',
+ },
+ {
+ id: profileAndSignInId,
+ element: ,
+ type: 'custom',
+ },
+];
diff --git a/apps/vighnesh153.com/src/modules/common/components/navbar/index.ts b/apps/vighnesh153.com/src/modules/common/components/navbar/index.ts
new file mode 100644
index 00000000..b2e1759c
--- /dev/null
+++ b/apps/vighnesh153.com/src/modules/common/components/navbar/index.ts
@@ -0,0 +1 @@
+export * from './nav-row';
diff --git a/apps/vighnesh153.com/src/modules/common/components/navbar/nav-drawer.tsx b/apps/vighnesh153.com/src/modules/common/components/navbar/nav-drawer.tsx
new file mode 100644
index 00000000..4fde99de
--- /dev/null
+++ b/apps/vighnesh153.com/src/modules/common/components/navbar/nav-drawer.tsx
@@ -0,0 +1,106 @@
+import React from 'react';
+import { Box, List, ListItem, SwipeableDrawer, Typography, useTheme } from '@mui/material';
+import { useIsIOS } from '@vighnesh153/react-hooks';
+import { not } from '@vighnesh153/utils';
+import { FocusDashedOutline } from '../focus-dashed-outline';
+import { MuiNextLink } from '../next-link';
+import { drawerWidth, navItems, profileAndSignInId } from './common';
+
+export interface NavDrawerProps {
+ isOpen: boolean;
+ updateIsOpen: (newIsOpen: boolean) => void;
+ showProfileAndSignInButton: boolean;
+}
+
+export function NavDrawer({ isOpen, updateIsOpen, showProfileAndSignInButton }: NavDrawerProps) {
+ const theme = useTheme();
+ const isIOS = useIsIOS();
+
+ const removeIds: string[] = [];
+ if (not(showProfileAndSignInButton)) {
+ removeIds.push(profileAndSignInId);
+ }
+
+ const container = (() => {
+ try {
+ return window.document.body;
+ } catch (e) {
+ return undefined;
+ }
+ })();
+
+ const toggleDrawer = (newIsOpen = !isOpen) => updateIsOpen(newIsOpen);
+
+ const drawer = (
+
+
+ {navItems
+ .filter((item) => not(removeIds.includes(item.id)))
+ .map((item) => (
+
+
+ {item.type === 'link' ? (
+ toggleDrawer()}
+ href={item.href}
+ sx={{
+ color: theme.palette.text.primary,
+ '&:is(:hover,:focus)': {
+ color: theme.palette.secondary.main,
+ },
+ }}
+ >
+
+ {item.label}
+
+
+ ) : (
+ item.element
+ )}
+
+
+ ))}
+
+
+ );
+
+ return (
+ toggleDrawer(true)}
+ onClose={() => toggleDrawer()}
+ anchor="right"
+ disableBackdropTransition={not(isIOS)}
+ disableDiscovery={not(isIOS)}
+ ModalProps={{
+ keepMounted: true, // Better open performance on mobile.
+ }}
+ sx={{
+ display: { xs: 'block', md: 'none' },
+ '& .MuiDrawer-paper': {
+ width: drawerWidth,
+ },
+ }}
+ >
+ {drawer}
+
+ );
+}
diff --git a/apps/vighnesh153.com/src/modules/common/components/navbar/nav-row.tsx b/apps/vighnesh153.com/src/modules/common/components/navbar/nav-row.tsx
new file mode 100644
index 00000000..62443dcf
--- /dev/null
+++ b/apps/vighnesh153.com/src/modules/common/components/navbar/nav-row.tsx
@@ -0,0 +1,114 @@
+import React, { useState } from 'react';
+import { alpha, AppBar, Box, IconButton, Toolbar, Typography, useTheme } from '@mui/material';
+import { Menu as MenuIcon } from '@mui/icons-material';
+import { RVLogoIcon } from '@vighnesh153/ui';
+import { useWindowScrollAmount } from '@vighnesh153/react-hooks';
+import { not } from '@vighnesh153/utils';
+import { FocusDashedOutline } from '../focus-dashed-outline';
+import { MuiNextLink } from '../next-link';
+import { HideOnScroll, navItems, profileAndSignInId } from './common';
+import { NavDrawer } from './nav-drawer';
+
+export interface NavbarProps {
+ showProfileAndSignInButton?: boolean;
+}
+
+export function Navbar({ showProfileAndSignInButton = true }: NavbarProps) {
+ const theme = useTheme();
+ const { scrollAmount: windowScrollAmount } = useWindowScrollAmount();
+ const [mobileDrawerOpen, setMobileDrawerOpen] = useState(false);
+
+ const removeIds: string[] = [];
+ if (not(showProfileAndSignInButton)) {
+ removeIds.push(profileAndSignInId);
+ }
+
+ const handleDrawerToggle = () => {
+ setMobileDrawerOpen((prevState) => !prevState);
+ };
+
+ const getAppBarBoxShadow = () => {
+ if (windowScrollAmount.scrollY < 70) {
+ return 'none';
+ }
+ return `0 10px 30px -10px ${alpha(theme.palette.primary.dark, 0.7)}`;
+ };
+
+ return (
+
+
+
+
+
+
+
+
+
+
+
+ {navItems
+ .filter((item) => not(removeIds.includes(item.id)))
+ .map((item) =>
+ item.type === 'link' ? (
+
+
+ {item.label}
+
+
+ ) : (
+ {item.element}
+ )
+ )}
+
+
+
+
+
+
+
+
+
+ setMobileDrawerOpen(newIsOpen)}
+ showProfileAndSignInButton={showProfileAndSignInButton}
+ />
+
+
+ );
+}
diff --git a/apps/vighnesh153.com/src/modules/common/components/profile-box.tsx b/apps/vighnesh153.com/src/modules/common/components/profile-box.tsx
new file mode 100644
index 00000000..a0730f30
--- /dev/null
+++ b/apps/vighnesh153.com/src/modules/common/components/profile-box.tsx
@@ -0,0 +1,65 @@
+import React from 'react';
+import { signOut } from 'next-auth/react';
+import { IconButton, Avatar, Box, useTheme, Menu, MenuItem } from '@mui/material';
+
+export interface ProfileBoxProps {
+ user?: {
+ name?: string | null;
+ image?: string | null;
+ email?: string | null;
+ };
+}
+
+export function ProfileBox({ user }: ProfileBoxProps) {
+ const theme = useTheme();
+ const [anchorEl, setAnchorEl] = React.useState(null);
+ const open = Boolean(anchorEl);
+
+ const handleClick = (event: React.MouseEvent) => {
+ setAnchorEl(event.currentTarget);
+ };
+
+ const handleClose = () => {
+ setAnchorEl(null);
+ };
+
+ const handleLogout = () => {
+ handleClose();
+ void signOut();
+ };
+
+ return (
+
+
+
+
+
+
+ );
+}
diff --git a/apps/vighnesh153.com/src/modules/common/components/sign-in-button.tsx b/apps/vighnesh153.com/src/modules/common/components/sign-in-button.tsx
new file mode 100644
index 00000000..c6a5b553
--- /dev/null
+++ b/apps/vighnesh153.com/src/modules/common/components/sign-in-button.tsx
@@ -0,0 +1,10 @@
+import { Button, ButtonProps } from '@mui/material';
+import { CgProfile } from 'react-icons/cg';
+
+export function SignInButton(props: ButtonProps) {
+ return (
+ } color="info" {...props}>
+ Sign in
+
+ );
+}
diff --git a/apps/vighnesh153.com/src/modules/common/config/server-config.ts b/apps/vighnesh153.com/src/modules/common/config/server-config.ts
new file mode 100644
index 00000000..8ac914eb
--- /dev/null
+++ b/apps/vighnesh153.com/src/modules/common/config/server-config.ts
@@ -0,0 +1,19 @@
+///
+/// Do not import this file in client side code. No security risk, but it will
+/// just throw "notFound" error.
+///
+
+function envVarNotFound(name: string): string {
+ throw new Error(`"${name}" isn't provided in environment variables.`);
+}
+
+export const serverConfig = {
+ oauth: {
+ providers: {
+ google: {
+ clientId: process.env.GOOGLE_CLIENT_ID ?? envVarNotFound('GOOGLE_CLIENT_ID'),
+ clientSecret: process.env.GOOGLE_CLIENT_SECRET ?? envVarNotFound('GOOGLE_CLIENT_SECRET'),
+ },
+ },
+ },
+};
diff --git a/apps/vighnesh153.com/src/modules/common/constants/index.tsx b/apps/vighnesh153.com/src/modules/common/constants/index.tsx
index 53a848bb..83c0e4f7 100644
--- a/apps/vighnesh153.com/src/modules/common/constants/index.tsx
+++ b/apps/vighnesh153.com/src/modules/common/constants/index.tsx
@@ -48,7 +48,8 @@ export const commonConstants = {
homePage: {
aboutSection: '/#about',
experienceSection: '/#experience',
- projectsSection: '/#projects',
+ blogsSection: '/blogs',
+ projectsSection: '/projects',
contactMeSection: '/#contact',
},
},
diff --git a/apps/vighnesh153.com/src/modules/common/icons/index.ts b/apps/vighnesh153.com/src/modules/common/icons/index.ts
deleted file mode 100644
index e69de29b..00000000
diff --git a/apps/vighnesh153.com/src/pages/_app.tsx b/apps/vighnesh153.com/src/pages/_app.tsx
index 67ec2ce0..aa0f8be5 100644
--- a/apps/vighnesh153.com/src/pages/_app.tsx
+++ b/apps/vighnesh153.com/src/pages/_app.tsx
@@ -3,21 +3,24 @@ import '@vighnesh153/ui/src/imports';
import { VighneshThemeProvider } from '@vighnesh153/ui';
import type { AppProps } from 'next/app';
+import { SessionProvider } from 'next-auth/react';
import { alpha, Box } from '@mui/material';
-export default function App({ Component, pageProps }: AppProps) {
+export default function App({ Component, pageProps: { session, ...pageProps } }: AppProps) {
return (
-
- alpha(theme.palette.primary.light, 0.9),
- color: (theme) => theme.palette.secondary.main,
- },
- }}
- >
-
-
-
+
+
+ alpha(theme.palette.primary.light, 0.9),
+ color: (theme) => theme.palette.secondary.main,
+ },
+ }}
+ >
+
+
+
+
);
}
diff --git a/apps/vighnesh153.com/src/pages/api/auth/[...nextauth].ts b/apps/vighnesh153.com/src/pages/api/auth/[...nextauth].ts
new file mode 100644
index 00000000..24b2aa5b
--- /dev/null
+++ b/apps/vighnesh153.com/src/pages/api/auth/[...nextauth].ts
@@ -0,0 +1,30 @@
+import NextAuth, { AuthOptions } from 'next-auth';
+import GoogleProvider, { GoogleProfile } from 'next-auth/providers/google';
+import { serverConfig } from '@modules/common/config/server-config';
+
+export const authOptions: AuthOptions = {
+ providers: [
+ GoogleProvider({
+ clientId: serverConfig.oauth.providers.google.clientId,
+ clientSecret: serverConfig.oauth.providers.google.clientSecret,
+ authorization: {
+ params: {
+ prompt: 'consent',
+ access_type: 'offline',
+ response_type: 'code',
+ },
+ },
+ }),
+ ],
+ callbacks: {
+ async signIn({ account, profile }) {
+ if (account?.provider === 'google') {
+ const googleProfile = profile as GoogleProfile;
+ return googleProfile.email_verified;
+ }
+ return false;
+ },
+ },
+};
+
+export default NextAuth(authOptions);
diff --git a/package-lock.json b/package-lock.json
index 8819769d..ec717ff2 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -41,6 +41,7 @@
"@vighnesh153/utils": "*",
"eslint-config-vighnesh153": "*",
"next": "^13.1.1",
+ "next-auth": "^4.18.8",
"next-transpile-modules": "^10.0.0",
"react": "^18.2.0",
"react-dom": "^18.2.0",
@@ -1794,6 +1795,79 @@
}
}
},
+ "node_modules/@mui/lab": {
+ "version": "5.0.0-alpha.115",
+ "resolved": "https://registry.npmjs.org/@mui/lab/-/lab-5.0.0-alpha.115.tgz",
+ "integrity": "sha512-3u9gRiTboC1tj1Vf8Fse1EaIaJaBwE5M/9NTr4Yp/7seFpIFgL5t/2auM+r9mohqzHT6wP6HWvPAB+OZ9q0/yg==",
+ "dependencies": {
+ "@babel/runtime": "^7.20.7",
+ "@mui/base": "5.0.0-alpha.113",
+ "@mui/system": "^5.11.4",
+ "@mui/types": "^7.2.3",
+ "@mui/utils": "^5.11.2",
+ "clsx": "^1.2.1",
+ "prop-types": "^15.8.1",
+ "react-is": "^18.2.0"
+ },
+ "engines": {
+ "node": ">=12.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/mui"
+ },
+ "peerDependencies": {
+ "@emotion/react": "^11.5.0",
+ "@emotion/styled": "^11.3.0",
+ "@mui/material": "^5.0.0",
+ "@types/react": "^17.0.0 || ^18.0.0",
+ "react": "^17.0.0 || ^18.0.0",
+ "react-dom": "^17.0.0 || ^18.0.0"
+ },
+ "peerDependenciesMeta": {
+ "@emotion/react": {
+ "optional": true
+ },
+ "@emotion/styled": {
+ "optional": true
+ },
+ "@types/react": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@mui/lab/node_modules/@mui/base": {
+ "version": "5.0.0-alpha.113",
+ "resolved": "https://registry.npmjs.org/@mui/base/-/base-5.0.0-alpha.113.tgz",
+ "integrity": "sha512-XSjvyQWATM8uk+EJZvYna8D21kOXC42lwb3q4K70btuGieKlCIQLaHTTDV2OfD4+JfT4o3NJy3I4Td2co31RZA==",
+ "dependencies": {
+ "@babel/runtime": "^7.20.7",
+ "@emotion/is-prop-valid": "^1.2.0",
+ "@mui/types": "^7.2.3",
+ "@mui/utils": "^5.11.2",
+ "@popperjs/core": "^2.11.6",
+ "clsx": "^1.2.1",
+ "prop-types": "^15.8.1",
+ "react-is": "^18.2.0"
+ },
+ "engines": {
+ "node": ">=12.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/mui"
+ },
+ "peerDependencies": {
+ "@types/react": "^17.0.0 || ^18.0.0",
+ "react": "^17.0.0 || ^18.0.0",
+ "react-dom": "^17.0.0 || ^18.0.0"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
+ }
+ },
"node_modules/@mui/material": {
"version": "5.11.3",
"resolved": "https://registry.npmjs.org/@mui/material/-/material-5.11.3.tgz",
@@ -1896,9 +1970,9 @@
}
},
"node_modules/@mui/system": {
- "version": "5.11.2",
- "resolved": "https://registry.npmjs.org/@mui/system/-/system-5.11.2.tgz",
- "integrity": "sha512-PPkYhrcP2MkhscX6SauIl0wPgra0w1LGPtll+hIKc2Z2JbGRSrUCFif93kxejB7I1cAoCay9jWW4mnNhsOqF/g==",
+ "version": "5.11.4",
+ "resolved": "https://registry.npmjs.org/@mui/system/-/system-5.11.4.tgz",
+ "integrity": "sha512-fE2Ts33V5zh7ouciwXgMm/a6sLvjIj9OMeojuHNYY7BStTxparC/Fp9CNUZNJwt76U6ZJC59aYScFSRQKbW08g==",
"dependencies": {
"@babel/runtime": "^7.20.7",
"@mui/private-theming": "^5.11.2",
@@ -2406,6 +2480,14 @@
"node": "^14.17.0 || ^16.13.0 || >=18.0.0"
}
},
+ "node_modules/@panva/hkdf": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/@panva/hkdf/-/hkdf-1.0.2.tgz",
+ "integrity": "sha512-MSAs9t3Go7GUkMhpKC44T58DJ5KGk2vBo+h1cqQeqlMfdGkxaVB78ZWpv9gYi/g2fa4sopag9gJsNvS8XGgWJA==",
+ "funding": {
+ "url": "https://github.com/sponsors/panva"
+ }
+ },
"node_modules/@pkgr/utils": {
"version": "2.3.1",
"resolved": "https://registry.npmjs.org/@pkgr/utils/-/utils-2.3.1.tgz",
@@ -4126,6 +4208,14 @@
"resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz",
"integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A=="
},
+ "node_modules/cookie": {
+ "version": "0.5.0",
+ "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz",
+ "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
"node_modules/core-js-pure": {
"version": "3.27.1",
"resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.27.1.tgz",
@@ -7468,6 +7558,14 @@
"integrity": "sha512-8wb9Yw966OSxApiCt0K3yNJL8pnNeIv+OEq2YMidz4FKP6nonSRoOXc80iXY4JaN2FC11B9qsNmDsm+ZOfMROA==",
"dev": true
},
+ "node_modules/jose": {
+ "version": "4.11.2",
+ "resolved": "https://registry.npmjs.org/jose/-/jose-4.11.2.tgz",
+ "integrity": "sha512-njj0VL2TsIxCtgzhO+9RRobBvws4oYyCM8TpvoUQwl/MbIM3NFJRR9+e6x0sS5xXaP1t6OCBkaBME98OV9zU5A==",
+ "funding": {
+ "url": "https://github.com/sponsors/panva"
+ }
+ },
"node_modules/js-sdsl": {
"version": "4.2.0",
"resolved": "https://registry.npmjs.org/js-sdsl/-/js-sdsl-4.2.0.tgz",
@@ -8754,6 +8852,36 @@
}
}
},
+ "node_modules/next-auth": {
+ "version": "4.18.8",
+ "resolved": "https://registry.npmjs.org/next-auth/-/next-auth-4.18.8.tgz",
+ "integrity": "sha512-USP8ihmvB7iCGtkS0+toe2QPrzdbZfkydQZX56JOI9Ft5n/BardOXh3D4wQ2An+vpq/jDKojGlgfv21wVElW7A==",
+ "dependencies": {
+ "@babel/runtime": "^7.16.3",
+ "@panva/hkdf": "^1.0.1",
+ "cookie": "^0.5.0",
+ "jose": "^4.9.3",
+ "oauth": "^0.9.15",
+ "openid-client": "^5.1.0",
+ "preact": "^10.6.3",
+ "preact-render-to-string": "^5.1.19",
+ "uuid": "^8.3.2"
+ },
+ "engines": {
+ "node": "^12.19.0 || ^14.15.0 || ^16.13.0 || ^18.12.0"
+ },
+ "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
+ }
+ }
+ },
"node_modules/next-transpile-modules": {
"version": "10.0.0",
"resolved": "https://registry.npmjs.org/next-transpile-modules/-/next-transpile-modules-10.0.0.tgz",
@@ -9356,6 +9484,11 @@
"node": "^12.13.0 || ^14.15.0 || >=16.0.0"
}
},
+ "node_modules/oauth": {
+ "version": "0.9.15",
+ "resolved": "https://registry.npmjs.org/oauth/-/oauth-0.9.15.tgz",
+ "integrity": "sha512-a5ERWK1kh38ExDEfoO6qUHJb32rd7aYmPHuyCu3Fta/cnICvYmgd2uhuKXvPD+PXB+gCEYYEaQdIRAjCOwAKNA=="
+ },
"node_modules/object-assign": {
"version": "4.1.1",
"resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
@@ -9364,6 +9497,14 @@
"node": ">=0.10.0"
}
},
+ "node_modules/object-hash": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-2.2.0.tgz",
+ "integrity": "sha512-gScRMn0bS5fH+IuwyIFgnh9zBdo4DV+6GhygmWM9HyNJSgS0hScp1f5vjtm7oIIOiT9trXrShAkLFSc2IqKNgw==",
+ "engines": {
+ "node": ">= 6"
+ }
+ },
"node_modules/object-inspect": {
"version": "1.12.2",
"resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.2.tgz",
@@ -9454,6 +9595,14 @@
"url": "https://github.com/sponsors/ljharb"
}
},
+ "node_modules/oidc-token-hash": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/oidc-token-hash/-/oidc-token-hash-5.0.1.tgz",
+ "integrity": "sha512-EvoOtz6FIEBzE+9q253HsLCVRiK/0doEJ2HCvvqMQb3dHZrP3WlJKYtJ55CRTw4jmYomzH4wkPuCj/I3ZvpKxQ==",
+ "engines": {
+ "node": "^10.13.0 || >=12.0.0"
+ }
+ },
"node_modules/once": {
"version": "1.4.0",
"resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
@@ -9493,6 +9642,20 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
+ "node_modules/openid-client": {
+ "version": "5.3.1",
+ "resolved": "https://registry.npmjs.org/openid-client/-/openid-client-5.3.1.tgz",
+ "integrity": "sha512-RLfehQiHch9N6tRWNx68cicf3b1WR0x74bJWHRc25uYIbSRwjxYcTFaRnzbbpls5jroLAaB/bFIodTgA5LJMvw==",
+ "dependencies": {
+ "jose": "^4.10.0",
+ "lru-cache": "^6.0.0",
+ "object-hash": "^2.0.1",
+ "oidc-token-hash": "^5.0.1"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/panva"
+ }
+ },
"node_modules/optionator": {
"version": "0.9.1",
"resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz",
@@ -9829,6 +9992,31 @@
"node": "^10 || ^12 || >=14"
}
},
+ "node_modules/preact": {
+ "version": "10.11.3",
+ "resolved": "https://registry.npmjs.org/preact/-/preact-10.11.3.tgz",
+ "integrity": "sha512-eY93IVpod/zG3uMF22Unl8h9KkrcKIRs2EGar8hwLZZDU1lkjph303V9HZBwufh2s736U6VXuhD109LYqPoffg==",
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/preact"
+ }
+ },
+ "node_modules/preact-render-to-string": {
+ "version": "5.2.6",
+ "resolved": "https://registry.npmjs.org/preact-render-to-string/-/preact-render-to-string-5.2.6.tgz",
+ "integrity": "sha512-JyhErpYOvBV1hEPwIxc/fHWXPfnEGdRKxc8gFdAZ7XV4tlzyzG847XAyEZqoDnynP88akM4eaHcSOzNcLWFguw==",
+ "dependencies": {
+ "pretty-format": "^3.8.0"
+ },
+ "peerDependencies": {
+ "preact": ">=10"
+ }
+ },
+ "node_modules/preact-render-to-string/node_modules/pretty-format": {
+ "version": "3.8.0",
+ "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-3.8.0.tgz",
+ "integrity": "sha512-WuxUnVtlWL1OfZFQFuqvnvs6MiAGk9UNsBostyBOB0Is9wb5uRESevA6rnl/rkksXaGX3GzZhPup5d6Vp1nFew=="
+ },
"node_modules/prelude-ls": {
"version": "1.2.1",
"resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz",
@@ -11923,6 +12111,14 @@
"integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==",
"dev": true
},
+ "node_modules/uuid": {
+ "version": "8.3.2",
+ "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz",
+ "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==",
+ "bin": {
+ "uuid": "dist/bin/uuid"
+ }
+ },
"node_modules/v8-compile-cache-lib": {
"version": "3.0.1",
"resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz",
@@ -12345,6 +12541,7 @@
"@emotion/styled": "^11.10.5",
"@fontsource/roboto": "^4.5.8",
"@mui/icons-material": "^5.11.0",
+ "@mui/lab": "^5.0.0-alpha.115",
"@mui/material": "^5.11.3",
"@mui/utils": "^5.11.2",
"clsx": "^1.2.1",
@@ -13711,6 +13908,38 @@
"@babel/runtime": "^7.20.6"
}
},
+ "@mui/lab": {
+ "version": "5.0.0-alpha.115",
+ "resolved": "https://registry.npmjs.org/@mui/lab/-/lab-5.0.0-alpha.115.tgz",
+ "integrity": "sha512-3u9gRiTboC1tj1Vf8Fse1EaIaJaBwE5M/9NTr4Yp/7seFpIFgL5t/2auM+r9mohqzHT6wP6HWvPAB+OZ9q0/yg==",
+ "requires": {
+ "@babel/runtime": "^7.20.7",
+ "@mui/base": "5.0.0-alpha.113",
+ "@mui/system": "^5.11.4",
+ "@mui/types": "^7.2.3",
+ "@mui/utils": "^5.11.2",
+ "clsx": "^1.2.1",
+ "prop-types": "^15.8.1",
+ "react-is": "^18.2.0"
+ },
+ "dependencies": {
+ "@mui/base": {
+ "version": "5.0.0-alpha.113",
+ "resolved": "https://registry.npmjs.org/@mui/base/-/base-5.0.0-alpha.113.tgz",
+ "integrity": "sha512-XSjvyQWATM8uk+EJZvYna8D21kOXC42lwb3q4K70btuGieKlCIQLaHTTDV2OfD4+JfT4o3NJy3I4Td2co31RZA==",
+ "requires": {
+ "@babel/runtime": "^7.20.7",
+ "@emotion/is-prop-valid": "^1.2.0",
+ "@mui/types": "^7.2.3",
+ "@mui/utils": "^5.11.2",
+ "@popperjs/core": "^2.11.6",
+ "clsx": "^1.2.1",
+ "prop-types": "^15.8.1",
+ "react-is": "^18.2.0"
+ }
+ }
+ }
+ },
"@mui/material": {
"version": "5.11.3",
"resolved": "https://registry.npmjs.org/@mui/material/-/material-5.11.3.tgz",
@@ -13752,9 +13981,9 @@
}
},
"@mui/system": {
- "version": "5.11.2",
- "resolved": "https://registry.npmjs.org/@mui/system/-/system-5.11.2.tgz",
- "integrity": "sha512-PPkYhrcP2MkhscX6SauIl0wPgra0w1LGPtll+hIKc2Z2JbGRSrUCFif93kxejB7I1cAoCay9jWW4mnNhsOqF/g==",
+ "version": "5.11.4",
+ "resolved": "https://registry.npmjs.org/@mui/system/-/system-5.11.4.tgz",
+ "integrity": "sha512-fE2Ts33V5zh7ouciwXgMm/a6sLvjIj9OMeojuHNYY7BStTxparC/Fp9CNUZNJwt76U6ZJC59aYScFSRQKbW08g==",
"requires": {
"@babel/runtime": "^7.20.7",
"@mui/private-theming": "^5.11.2",
@@ -14048,6 +14277,11 @@
}
}
},
+ "@panva/hkdf": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/@panva/hkdf/-/hkdf-1.0.2.tgz",
+ "integrity": "sha512-MSAs9t3Go7GUkMhpKC44T58DJ5KGk2vBo+h1cqQeqlMfdGkxaVB78ZWpv9gYi/g2fa4sopag9gJsNvS8XGgWJA=="
+ },
"@pkgr/utils": {
"version": "2.3.1",
"resolved": "https://registry.npmjs.org/@pkgr/utils/-/utils-2.3.1.tgz",
@@ -14501,6 +14735,7 @@
"@emotion/styled": "^11.10.5",
"@fontsource/roboto": "^4.5.8",
"@mui/icons-material": "^5.11.0",
+ "@mui/lab": "^5.0.0-alpha.115",
"@mui/material": "^5.11.3",
"@mui/utils": "^5.11.2",
"@types/node": "^18.11.18",
@@ -15378,6 +15613,11 @@
"resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz",
"integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A=="
},
+ "cookie": {
+ "version": "0.5.0",
+ "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz",
+ "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw=="
+ },
"core-js-pure": {
"version": "3.27.1",
"resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.27.1.tgz",
@@ -17840,6 +18080,11 @@
"integrity": "sha512-8wb9Yw966OSxApiCt0K3yNJL8pnNeIv+OEq2YMidz4FKP6nonSRoOXc80iXY4JaN2FC11B9qsNmDsm+ZOfMROA==",
"dev": true
},
+ "jose": {
+ "version": "4.11.2",
+ "resolved": "https://registry.npmjs.org/jose/-/jose-4.11.2.tgz",
+ "integrity": "sha512-njj0VL2TsIxCtgzhO+9RRobBvws4oYyCM8TpvoUQwl/MbIM3NFJRR9+e6x0sS5xXaP1t6OCBkaBME98OV9zU5A=="
+ },
"js-sdsl": {
"version": "4.2.0",
"resolved": "https://registry.npmjs.org/js-sdsl/-/js-sdsl-4.2.0.tgz",
@@ -18806,6 +19051,22 @@
"styled-jsx": "5.1.1"
}
},
+ "next-auth": {
+ "version": "4.18.8",
+ "resolved": "https://registry.npmjs.org/next-auth/-/next-auth-4.18.8.tgz",
+ "integrity": "sha512-USP8ihmvB7iCGtkS0+toe2QPrzdbZfkydQZX56JOI9Ft5n/BardOXh3D4wQ2An+vpq/jDKojGlgfv21wVElW7A==",
+ "requires": {
+ "@babel/runtime": "^7.16.3",
+ "@panva/hkdf": "^1.0.1",
+ "cookie": "^0.5.0",
+ "jose": "^4.9.3",
+ "oauth": "^0.9.15",
+ "openid-client": "^5.1.0",
+ "preact": "^10.6.3",
+ "preact-render-to-string": "^5.1.19",
+ "uuid": "^8.3.2"
+ }
+ },
"next-transpile-modules": {
"version": "10.0.0",
"resolved": "https://registry.npmjs.org/next-transpile-modules/-/next-transpile-modules-10.0.0.tgz",
@@ -19274,11 +19535,21 @@
"set-blocking": "^2.0.0"
}
},
+ "oauth": {
+ "version": "0.9.15",
+ "resolved": "https://registry.npmjs.org/oauth/-/oauth-0.9.15.tgz",
+ "integrity": "sha512-a5ERWK1kh38ExDEfoO6qUHJb32rd7aYmPHuyCu3Fta/cnICvYmgd2uhuKXvPD+PXB+gCEYYEaQdIRAjCOwAKNA=="
+ },
"object-assign": {
"version": "4.1.1",
"resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
"integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg=="
},
+ "object-hash": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-2.2.0.tgz",
+ "integrity": "sha512-gScRMn0bS5fH+IuwyIFgnh9zBdo4DV+6GhygmWM9HyNJSgS0hScp1f5vjtm7oIIOiT9trXrShAkLFSc2IqKNgw=="
+ },
"object-inspect": {
"version": "1.12.2",
"resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.2.tgz",
@@ -19339,6 +19610,11 @@
"es-abstract": "^1.20.4"
}
},
+ "oidc-token-hash": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/oidc-token-hash/-/oidc-token-hash-5.0.1.tgz",
+ "integrity": "sha512-EvoOtz6FIEBzE+9q253HsLCVRiK/0doEJ2HCvvqMQb3dHZrP3WlJKYtJ55CRTw4jmYomzH4wkPuCj/I3ZvpKxQ=="
+ },
"once": {
"version": "1.4.0",
"resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
@@ -19366,6 +19642,17 @@
"is-wsl": "^2.2.0"
}
},
+ "openid-client": {
+ "version": "5.3.1",
+ "resolved": "https://registry.npmjs.org/openid-client/-/openid-client-5.3.1.tgz",
+ "integrity": "sha512-RLfehQiHch9N6tRWNx68cicf3b1WR0x74bJWHRc25uYIbSRwjxYcTFaRnzbbpls5jroLAaB/bFIodTgA5LJMvw==",
+ "requires": {
+ "jose": "^4.10.0",
+ "lru-cache": "^6.0.0",
+ "object-hash": "^2.0.1",
+ "oidc-token-hash": "^5.0.1"
+ }
+ },
"optionator": {
"version": "0.9.1",
"resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz",
@@ -19589,6 +19876,26 @@
"source-map-js": "^1.0.2"
}
},
+ "preact": {
+ "version": "10.11.3",
+ "resolved": "https://registry.npmjs.org/preact/-/preact-10.11.3.tgz",
+ "integrity": "sha512-eY93IVpod/zG3uMF22Unl8h9KkrcKIRs2EGar8hwLZZDU1lkjph303V9HZBwufh2s736U6VXuhD109LYqPoffg=="
+ },
+ "preact-render-to-string": {
+ "version": "5.2.6",
+ "resolved": "https://registry.npmjs.org/preact-render-to-string/-/preact-render-to-string-5.2.6.tgz",
+ "integrity": "sha512-JyhErpYOvBV1hEPwIxc/fHWXPfnEGdRKxc8gFdAZ7XV4tlzyzG847XAyEZqoDnynP88akM4eaHcSOzNcLWFguw==",
+ "requires": {
+ "pretty-format": "^3.8.0"
+ },
+ "dependencies": {
+ "pretty-format": {
+ "version": "3.8.0",
+ "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-3.8.0.tgz",
+ "integrity": "sha512-WuxUnVtlWL1OfZFQFuqvnvs6MiAGk9UNsBostyBOB0Is9wb5uRESevA6rnl/rkksXaGX3GzZhPup5d6Vp1nFew=="
+ }
+ }
+ },
"prelude-ls": {
"version": "1.2.1",
"resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz",
@@ -21095,6 +21402,11 @@
"integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==",
"dev": true
},
+ "uuid": {
+ "version": "8.3.2",
+ "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz",
+ "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg=="
+ },
"v8-compile-cache-lib": {
"version": "3.0.1",
"resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz",
@@ -21155,6 +21467,7 @@
"@vighnesh153/utils": "*",
"eslint-config-vighnesh153": "*",
"next": "^13.1.1",
+ "next-auth": "^4.18.8",
"next-transpile-modules": "^10.0.0",
"react": "^18.2.0",
"react-dom": "^18.2.0",
diff --git a/packages/eslint-config-vighnesh153/ts-base.eslintrc.js b/packages/eslint-config-vighnesh153/ts-base.eslintrc.js
index 629eff2c..ccebf5b7 100644
--- a/packages/eslint-config-vighnesh153/ts-base.eslintrc.js
+++ b/packages/eslint-config-vighnesh153/ts-base.eslintrc.js
@@ -66,6 +66,7 @@ module.exports = {
'no-unused-vars': 'error',
'no-use-before-define': 'error',
'no-useless-constructor': 'error',
+ 'no-void': 'off',
'object-curly-newline': [
'error',
{
diff --git a/packages/ui/package.json b/packages/ui/package.json
index 3db1794b..ff5b95c6 100644
--- a/packages/ui/package.json
+++ b/packages/ui/package.json
@@ -26,6 +26,7 @@
"@emotion/styled": "^11.10.5",
"@fontsource/roboto": "^4.5.8",
"@mui/icons-material": "^5.11.0",
+ "@mui/lab": "^5.0.0-alpha.115",
"@mui/material": "^5.11.3",
"@mui/utils": "^5.11.2",
"clsx": "^1.2.1",
diff --git a/turbo.json b/turbo.json
index 7750f17b..7c5ad257 100644
--- a/turbo.json
+++ b/turbo.json
@@ -6,6 +6,12 @@
"test",
"^build"
],
+ "env": [
+ "GOOGLE_CLIENT_ID",
+ "GOOGLE_CLIENT_SECRET",
+ "NEXTAUTH_SECRET",
+ "NEXTAUTH_URL"
+ ],
"outputs": [
"dist/**",
".next/**"