diff --git a/api/resolvers/item.js b/api/resolvers/item.js index c7bddaa5..dc4bcc68 100644 --- a/api/resolvers/item.js +++ b/api/resolvers/item.js @@ -847,7 +847,7 @@ export default { return await models.user.findUnique({ where: { id: item.fwdUserId } }) }, comments: async (item, { sort }, { me, models }) => { - if (item.comments) return item.comments + if (typeof item.comments !== 'undefined') return item.comments if (item.ncomments === 0) return [] return comments(me, models, item.id, sort || defaultCommentSort(item.pinId, item.bioId, item.createdAt)) diff --git a/api/resolvers/user.js b/api/resolvers/user.js index 94d00b00..6f9d74fb 100644 --- a/api/resolvers/user.js +++ b/api/resolvers/user.js @@ -73,7 +73,7 @@ async function authMethods (user, args, { models, me }) { } }) - const oauth = accounts.map(a => a.providerId) + const oauth = accounts.map(a => a.provider) return { lightning: !!user.pubkey, @@ -87,7 +87,7 @@ async function authMethods (user, args, { models, me }) { export default { Query: { me: async (parent, { skipUpdate }, { models, me }) => { - if (!me) { + if (!me?.id) { return null } @@ -518,7 +518,7 @@ export default { let user if (authType === 'twitter' || authType === 'github') { user = await models.user.findUnique({ where: { id: me.id } }) - const account = await models.account.findFirst({ where: { userId: me.id, providerId: authType } }) + const account = await models.account.findFirst({ where: { userId: me.id, provider: authType } }) if (!account) { throw new GraphQLError('no such account', { extensions: { code: 'BAD_INPUT' } }) } diff --git a/api/ssrApollo.js b/api/ssrApollo.js index 27d15749..1341f47d 100644 --- a/api/ssrApollo.js +++ b/api/ssrApollo.js @@ -1,7 +1,6 @@ import { ApolloClient, InMemoryCache } from '@apollo/client' import { SchemaLink } from '@apollo/client/link/schema' import { makeExecutableSchema } from '@graphql-tools/schema' -import { getSession } from 'next-auth/client' import resolvers from './resolvers' import typeDefs from './typeDefs' import models from './models' @@ -11,9 +10,11 @@ import lnd from './lnd' import search from './search' import { ME } from '../fragments/users' import { PRICE } from '../fragments/price' +import { getServerSession } from 'next-auth/next' +import { getAuthOptions } from '../pages/api/auth/[...nextauth]' -export default async function getSSRApolloClient (req, me = null) { - const session = req && await getSession({ req }) +export default async function getSSRApolloClient ({ req, res, me = null }) { + const session = req && await getServerSession(req, res, getAuthOptions(req)) const client = new ApolloClient({ ssrMode: true, link: new SchemaLink({ @@ -54,7 +55,7 @@ export default async function getSSRApolloClient (req, me = null) { } export function getGetServerSideProps (queryOrFunc, variablesOrFunc = null, notFoundFunc, requireVar) { - return async function ({ req, query: params }) { + return async function ({ req, res, query: params }) { const { nodata, ...realParams } = params // we want to use client-side cache if (nodata) return { props: { } } @@ -63,7 +64,7 @@ export function getGetServerSideProps (queryOrFunc, variablesOrFunc = null, notF const vars = { ...realParams, ...variables } const query = typeof queryOrFunc === 'function' ? queryOrFunc(vars) : queryOrFunc - const client = await getSSRApolloClient(req) + const client = await getSSRApolloClient({ req, res }) const { data: { me } } = await client.query({ query: ME, diff --git a/components/error-boundary.js b/components/error-boundary.js index ba5f0dcd..75e19727 100644 --- a/components/error-boundary.js +++ b/components/error-boundary.js @@ -1,6 +1,6 @@ import { Component } from 'react' import { StaticLayout } from './layout' -import styles from '../styles/404.module.css' +import styles from '../styles/error.module.css' import Image from 'react-bootstrap/Image' class ErrorBoundary extends Component { @@ -27,8 +27,8 @@ class ErrorBoundary extends Component { // You can render any custom fallback UI return ( - -

something went wrong

+ +

something went wrong

) } diff --git a/components/header.js b/components/header.js index f168121e..07fd7532 100644 --- a/components/header.js +++ b/components/header.js @@ -9,7 +9,7 @@ import NavDropdown from 'react-bootstrap/NavDropdown' import Price from './price' import { useMe } from './me' import Head from 'next/head' -import { signOut } from 'next-auth/client' +import { signOut } from 'next-auth/react' import { useCallback, useEffect, useState } from 'react' import { randInRange } from '../lib/rand' import { abbrNum } from '../lib/format' diff --git a/components/lightning-auth.js b/components/lightning-auth.js index 939fd4f8..dbb1860e 100644 --- a/components/lightning-auth.js +++ b/components/lightning-auth.js @@ -1,5 +1,5 @@ import { gql, useMutation, useQuery } from '@apollo/client' -import { signIn } from 'next-auth/client' +import { signIn } from 'next-auth/react' import { useEffect } from 'react' import Col from 'react-bootstrap/Col' import Container from 'react-bootstrap/Container' @@ -20,9 +20,11 @@ function QrAuth ({ k1, encodedUrl, slashtagUrl, callbackUrl }) { }` const { data } = useQuery(query, { pollInterval: 1000, nextFetchPolicy: 'cache-and-network' }) - if (data && data.lnAuth.pubkey) { - signIn(encodedUrl ? 'lightning' : 'slashtags', { ...data.lnAuth, callbackUrl }) - } + useEffect(() => { + if (data?.lnAuth?.pubkey) { + signIn(encodedUrl ? 'lightning' : 'slashtags', { ...data.lnAuth, callbackUrl }) + } + }, [data?.lnAuth]) // output pubkey and k1 return ( diff --git a/components/login.js b/components/login.js index ec7fb290..34ecb460 100644 --- a/components/login.js +++ b/components/login.js @@ -1,4 +1,4 @@ -import { signIn } from 'next-auth/client' +import { signIn } from 'next-auth/react' import styles from './login.module.css' import { Form, Input, SubmitButton } from '../components/form' import { useState } from 'react' @@ -33,16 +33,15 @@ export function EmailLoginForm ({ text, callbackUrl }) { export default function Login ({ providers, callbackUrl, error, text, Header, Footer }) { const errors = { - Signin: 'Try signing with a different account.', - OAuthSignin: 'Try signing with a different account.', - OAuthCallback: 'Try signing with a different account.', - OAuthCreateAccount: 'Try signing with a different account.', - EmailCreateAccount: 'Try signing with a different account.', - Callback: 'Try signing with a different account.', - OAuthAccountNotLinked: 'To confirm your identity, sign in with the same account you used originally.', - EmailSignin: 'Check your email address.', - CredentialsSignin: 'Auth failed', - default: 'Unable to sign in.' + OAuthSignin: 'Error constructing OAuth URL. Try again or choose a different method.', + OAuthCallback: 'Error handling OAuth response. Try again or choose a different method.', + OAuthCreateAccount: 'Could not create OAuth account. Try again or choose a different method.', + EmailCreateAccount: 'Could not create Email account. Try again or choose a different method.', + Callback: 'Error in callback handler. Try again or choose a different method.', + OAuthAccountNotLinked: 'This auth method is linked to another account. To link to this account first unlink the other account.', + EmailSignin: 'Failed to send email. Make sure you entered your email address correctly.', + CredentialsSignin: 'Auth failed. Try again or choose a different method.', + default: 'Auth failed. Try again or choose a different method.' } const [errorMessage, setErrorMessage] = useState(error && (errors[error] ?? errors.default)) @@ -70,7 +69,7 @@ export default function Login ({ providers, callbackUrl, error, text, Header, Fo switch (provider.name) { case 'Email': return ( -
+
or
@@ -80,8 +79,8 @@ export default function Login ({ providers, callbackUrl, error, text, Header, Fo return ( router.push({ pathname: router.pathname, query: { callbackUrl: router.query.callbackUrl, type: provider.name.toLowerCase() } @@ -93,8 +92,8 @@ export default function Login ({ providers, callbackUrl, error, text, Header, Fo return ( signIn(provider.id, { callbackUrl })} text={`${text || 'Login'} with`} /> diff --git a/components/notifications.js b/components/notifications.js index ee02a4a9..7e264492 100644 --- a/components/notifications.js +++ b/components/notifications.js @@ -126,7 +126,7 @@ function EarnNotification ({ n }) {
- you stacked {n.earnedSats} sats in rewards{timeSince(new Date(n.sortTime))} + you stacked {n.earnedSats} sats in rewards{timeSince(new Date(n.sortTime))}
{n.sources &&
@@ -166,7 +166,7 @@ function InvoicePaid ({ n }) {
{n.earnedSats} sats were deposited in your account - {timeSince(new Date(n.sortTime))} + {timeSince(new Date(n.sortTime))}
) @@ -177,7 +177,7 @@ function Referral ({ n }) { someone joined via one of your referral links - {timeSince(new Date(n.sortTime))} + {timeSince(new Date(n.sortTime))} ) diff --git a/components/poll.js b/components/poll.js index 8cf54595..4add69cf 100644 --- a/components/poll.js +++ b/components/poll.js @@ -5,7 +5,7 @@ import { timeLeft } from '../lib/time' import { useMe } from './me' import styles from './poll.module.css' import Check from '../svgs/checkbox-circle-fill.svg' -import { signIn } from 'next-auth/client' +import { signIn } from 'next-auth/react' import ActionTooltip from './action-tooltip' import { useShowModal } from './modal' import FundError from './fund-error' diff --git a/components/upvote.js b/components/upvote.js index efcdfb40..c5281b1d 100644 --- a/components/upvote.js +++ b/components/upvote.js @@ -35,7 +35,7 @@ const UpvotePopover = ({ target, show, handleClose }) => { > Zapping - +
Press the bolt again to zap {me?.tipDefault || 1} more sat{me?.tipDefault > 1 ? 's' : ''}.
@@ -54,7 +54,7 @@ const TipPopover = ({ target, show, handleClose }) => ( > Press and hold - +
Press and hold bolt to zap a custom amount.
diff --git a/lib/apollo.js b/lib/apollo.js index 5350d42a..25ba82d5 100644 --- a/lib/apollo.js +++ b/lib/apollo.js @@ -12,8 +12,12 @@ function isFirstPage (cursor, existingThings) { } } +const SSR = typeof window === 'undefined' +const defaultFetchPolicy = SSR ? 'cache-only' : 'cache-first' +const defaultNextFetchPolicy = SSR ? 'cache-only' : 'cache-first' + export default function getApolloClient () { - if (typeof window === 'undefined') { + if (SSR) { return getClient(`${process.env.SELF_URL}/api/graphql`) } else { global.apolloClient ||= getClient('/api/graphql') @@ -24,7 +28,7 @@ export default function getApolloClient () { function getClient (uri) { return new ApolloClient({ link: new HttpLink({ uri }), - ssrMode: typeof window === 'undefined', + ssrMode: SSR, cache: new InMemoryCache({ freezeResults: true, typePolicies: { @@ -143,13 +147,13 @@ function getClient (uri) { assumeImmutableResults: true, defaultOptions: { watchQuery: { - fetchPolicy: 'cache-first', - nextFetchPolicy: 'cache-first', + fetchPolicy: defaultFetchPolicy, + nextFetchPolicy: defaultNextFetchPolicy, canonizeResults: true }, query: { - fetchPolicy: 'cache-first', - nextFetchPolicy: 'cache-first', + fetchPolicy: defaultFetchPolicy, + nextFetchPolicy: defaultNextFetchPolicy, canonizeResults: true } } diff --git a/lib/rss.js b/lib/rss.js index c756d986..27f77fbe 100644 --- a/lib/rss.js +++ b/lib/rss.js @@ -56,7 +56,7 @@ function generateRssFeed (items, sub = null) { export default function getGetRssServerSideProps (query, variables = null) { return async function ({ req, res, query: params }) { const emptyProps = { props: {} } // to avoid server side warnings - const client = await getSSRApolloClient(req) + const client = await getSSRApolloClient({ req, res }) const { error, data: { items: { items } } } = await client.query({ query, variables: { ...params, ...variables } }) diff --git a/package-lock.json b/package-lock.json index 680297af..7dd8b2b7 100644 --- a/package-lock.json +++ b/package-lock.json @@ -11,6 +11,7 @@ "@apollo/client": "^3.7.17", "@apollo/server": "^4.8.1", "@as-integrations/next": "^2.0.1", + "@auth/prisma-adapter": "^1.0.1", "@graphql-tools/schema": "^10.0.0", "@noble/curves": "^1.1.0", "@opensearch-project/opensearch": "^2.3.1", @@ -43,11 +44,12 @@ "mdast-util-to-string": "^4.0.0", "micromark-extension-gfm": "^3.0.0", "next": "^13.4.12", - "next-auth": "^3.29.10", + "next-auth": "^4.22.3", "next-plausible": "^3.10.1", "next-seo": "^6.1.0", "nextjs-progressbar": "0.0.16", "node-s3-url-encode": "^0.0.4", + "nodemailer": "^6.9.4", "nostr": "^0.2.8", "opentimestamps": "^0.4.9", "page-metadata-parser": "^1.1.4", @@ -78,6 +80,7 @@ "web-push": "^3.6.2", "webln": "^0.3.2", "webpack": "^5.88.2", + "workbox-navigation-preload": "^7.0.0", "workbox-precaching": "^7.0.0", "workbox-recipes": "^7.0.0", "workbox-routing": "^7.0.0", @@ -476,6 +479,49 @@ "next": "^12.0.0 || ^13.0.0" } }, + "node_modules/@auth/core": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/@auth/core/-/core-0.9.0.tgz", + "integrity": "sha512-W2WO0WCBg1T3P8+yjQPzurTQhPv6ecBYfJ2oE3uvXPAX5ZLWAMSjKFAIa9oLZy5pwrB+YehJZPnlIxVilhrVcg==", + "dependencies": { + "@panva/hkdf": "^1.0.4", + "cookie": "0.5.0", + "jose": "^4.11.1", + "oauth4webapi": "^2.0.6", + "preact": "10.11.3", + "preact-render-to-string": "5.2.3" + }, + "peerDependencies": { + "nodemailer": "^6.8.0" + }, + "peerDependenciesMeta": { + "nodemailer": { + "optional": true + } + } + }, + "node_modules/@auth/core/node_modules/preact-render-to-string": { + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/preact-render-to-string/-/preact-render-to-string-5.2.3.tgz", + "integrity": "sha512-aPDxUn5o3GhWdtJtW0svRC2SS/l8D9MAgo2+AWml+BhDImb27ALf04Q2d+AHqUUOc6RdSXFIBVa2gxzgMKgtZA==", + "dependencies": { + "pretty-format": "^3.8.0" + }, + "peerDependencies": { + "preact": ">=10" + } + }, + "node_modules/@auth/prisma-adapter": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@auth/prisma-adapter/-/prisma-adapter-1.0.1.tgz", + "integrity": "sha512-sBp9l/jVr7l9y7rp2Pv6eoP7i8X2CgRNE3jDWJ0B/u+HnKRofXflD1cldPqRSAkJhqH3UxhVtMTEijT9FoofmQ==", + "dependencies": { + "@auth/core": "0.9.0" + }, + "peerDependencies": { + "@prisma/client": ">=2.26.0 || >=3 || >=4" + } + }, "node_modules/@babel/code-frame": { "version": "7.22.5", "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.5.tgz", @@ -2677,49 +2723,6 @@ "@jridgewell/sourcemap-codec": "1.4.14" } }, - "node_modules/@next-auth/prisma-legacy-adapter": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/@next-auth/prisma-legacy-adapter/-/prisma-legacy-adapter-0.1.2.tgz", - "integrity": "sha512-QpGcRvrnFERkvVFroqS89qDbnskw9AjhvWxO095u3xl/8QVI++Y+doluQdZWuV6PewjrV7xY+uVUEnRhnGM8yQ==", - "dependencies": { - "@babel/runtime": "^7.14.0" - }, - "peerDependencies": { - "@prisma/client": "^2.16.1", - "next-auth": "^3.17.2" - } - }, - "node_modules/@next-auth/typeorm-legacy-adapter": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/@next-auth/typeorm-legacy-adapter/-/typeorm-legacy-adapter-0.1.4.tgz", - "integrity": "sha512-UDnctrPiUU0yaPNeFhD6uw0FAuWGvx6IUVwUYTEzZm26RCEe/BBjkpGLYk43M3rcnkBPfkiljomAs/O7Uzh12w==", - "dependencies": { - "@babel/runtime": "^7.14.0", - "require_optional": "^1.0.1", - "typeorm": "^0.2.30" - }, - "peerDependencies": { - "mongodb": "^3.5.9", - "mssql": "^6.2.1", - "mysql": "^2.18.1", - "next-auth": "^3.1.0", - "pg": "^8.2.1" - }, - "peerDependenciesMeta": { - "mongodb": { - "optional": true - }, - "mssql": { - "optional": true - }, - "mysql": { - "optional": true - }, - "pg": { - "optional": true - } - } - }, "node_modules/@next/env": { "version": "13.4.12", "resolved": "https://registry.npmjs.org/@next/env/-/env-13.4.12.tgz", @@ -2964,12 +2967,12 @@ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" }, - "node_modules/@panva/asn1.js": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@panva/asn1.js/-/asn1.js-1.0.0.tgz", - "integrity": "sha512-UdkG3mLEqXgnlKsWanWcgb6dOjUzJ+XC5f+aWw30qrtjxeNUSfKX1cd5FBzOaXQumoe9nIqeZUvrRJS03HCCtw==", - "engines": { - "node": ">=10.13.0" + "node_modules/@panva/hkdf": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@panva/hkdf/-/hkdf-1.1.1.tgz", + "integrity": "sha512-dhPeilub1NuIG0X5Kvhh9lH4iW3ZsHlnzwgwbOlgwQ2wG1IqFzsgHqmKPk3WzsdWAeaxKJxgM0+W433RmN45GA==", + "funding": { + "url": "https://github.com/sponsors/panva" } }, "node_modules/@popperjs/core": { @@ -3242,11 +3245,6 @@ "url": "https://github.com/sindresorhus/is?sponsor=1" } }, - "node_modules/@sqltools/formatter": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/@sqltools/formatter/-/formatter-1.2.5.tgz", - "integrity": "sha512-Uy0+khmZqUrUGm5dmMqVlnvufZRSK0FbYzVgp0UMstm+F5+W2/jnEEQyc9vo1ZR/E5ZI/B1WjjoTqBqwJL6Krw==" - }, "node_modules/@surma/rollup-plugin-off-main-thread": { "version": "2.2.3", "resolved": "https://registry.npmjs.org/@surma/rollup-plugin-off-main-thread/-/rollup-plugin-off-main-thread-2.2.3.tgz", @@ -4129,11 +4127,6 @@ "node": ">=4" } }, - "node_modules/any-promise": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", - "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==" - }, "node_modules/anymatch": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", @@ -4146,14 +4139,6 @@ "node": ">= 8" } }, - "node_modules/app-root-path": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/app-root-path/-/app-root-path-3.1.0.tgz", - "integrity": "sha512-biN3PwB2gUtjaYy/isrU3aNWI5w+fAfvHkSvCKeQGxhmYpwKFUxudR3Yya+KqVRHBmEDYh+/lTozYCFbmzX4nA==", - "engines": { - "node": ">= 6.0.0" - } - }, "node_modules/archy": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/archy/-/archy-1.0.0.tgz", @@ -5541,90 +5526,6 @@ "node": ">=6" } }, - "node_modules/cli-highlight": { - "version": "2.1.11", - "resolved": "https://registry.npmjs.org/cli-highlight/-/cli-highlight-2.1.11.tgz", - "integrity": "sha512-9KDcoEVwyUXrjcJNvHD0NFc/hiwe/WPVYIleQh2O1N2Zro5gWJZ/K+3DGn8w8P/F6FxOgzyC5bxDyHIgCSPhGg==", - "dependencies": { - "chalk": "^4.0.0", - "highlight.js": "^10.7.1", - "mz": "^2.4.0", - "parse5": "^5.1.1", - "parse5-htmlparser2-tree-adapter": "^6.0.0", - "yargs": "^16.0.0" - }, - "bin": { - "highlight": "bin/highlight" - }, - "engines": { - "node": ">=8.0.0", - "npm": ">=5.0.0" - } - }, - "node_modules/cli-highlight/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/cli-highlight/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/cli-highlight/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/cli-highlight/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "node_modules/cli-highlight/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "engines": { - "node": ">=8" - } - }, - "node_modules/cli-highlight/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/client-only": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/client-only/-/client-only-0.0.1.tgz", @@ -5649,16 +5550,6 @@ } ] }, - "node_modules/cliui": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", - "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^7.0.0" - } - }, "node_modules/clone-response": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.3.tgz", @@ -6516,14 +6407,6 @@ "url": "https://github.com/fb55/domutils?sponsor=1" } }, - "node_modules/dotenv": { - "version": "8.6.0", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-8.6.0.tgz", - "integrity": "sha512-IrPdXQsk2BbzvCBGBOTmmSH5SodmqZNt4ERAZDmW4CT+tL8VtvinqywuANaFu4bOMWki16nqf0e4oC0QIaDr/g==", - "engines": { - "node": ">=10" - } - }, "node_modules/dset": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/dset/-/dset-3.1.2.tgz", @@ -8079,14 +7962,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/futoin-hkdf": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/futoin-hkdf/-/futoin-hkdf-1.5.1.tgz", - "integrity": "sha512-g5d0Qp7ks55hYmYmfqn4Nz18XH49lcCR+vvIvHT92xXnsJaGZmY1EtWQWilJ6BQp57heCIXM/rRo+AFep8hGgg==", - "engines": { - "node": ">=8" - } - }, "node_modules/gensync": { "version": "1.0.0-beta.2", "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", @@ -9647,15 +9522,9 @@ } }, "node_modules/jose": { - "version": "1.28.2", - "resolved": "https://registry.npmjs.org/jose/-/jose-1.28.2.tgz", - "integrity": "sha512-wWy51U2MXxYi3g8zk2lsQ8M6O1lartpkxuq1TYexzPKYLgHLZkCjklaATP36I5BUoWjF2sInB9U1Qf18fBZxNA==", - "dependencies": { - "@panva/asn1.js": "^1.0.0" - }, - "engines": { - "node": ">=10.13.0" - }, + "version": "4.14.4", + "resolved": "https://registry.npmjs.org/jose/-/jose-4.14.4.tgz", + "integrity": "sha512-j8GhLiKmUAh+dsFXlX1aJCbt5KMibuKb+d7j1JaOJG6s2UjX1PQlW+OKB/sD4a/5ZYF4RcmYmLSndOoU3Lt/3g==", "funding": { "url": "https://github.com/sponsors/panva" } @@ -9773,35 +9642,6 @@ "node": ">=0.10.0" } }, - "node_modules/jsonwebtoken": { - "version": "8.5.1", - "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-8.5.1.tgz", - "integrity": "sha512-XjwVfRS6jTMsqYs0EsuJ4LGxXV14zQybNd4L2r0UvbVnSF9Af8x7p5MzbJ90Ioz/9TI41/hTCvznF/loiSzn8w==", - "dependencies": { - "jws": "^3.2.2", - "lodash.includes": "^4.3.0", - "lodash.isboolean": "^3.0.3", - "lodash.isinteger": "^4.0.4", - "lodash.isnumber": "^3.0.3", - "lodash.isplainobject": "^4.0.6", - "lodash.isstring": "^4.0.1", - "lodash.once": "^4.0.0", - "ms": "^2.1.1", - "semver": "^5.6.0" - }, - "engines": { - "node": ">=4", - "npm": ">=1.4.28" - } - }, - "node_modules/jsonwebtoken/node_modules/semver": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", - "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", - "bin": { - "semver": "bin/semver" - } - }, "node_modules/jsprim": { "version": "1.4.2", "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.2.tgz", @@ -9829,25 +9669,6 @@ "node": ">=4.0" } }, - "node_modules/jwa": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/jwa/-/jwa-1.4.1.tgz", - "integrity": "sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA==", - "dependencies": { - "buffer-equal-constant-time": "1.0.1", - "ecdsa-sig-formatter": "1.0.11", - "safe-buffer": "^5.0.1" - } - }, - "node_modules/jws": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/jws/-/jws-3.2.2.tgz", - "integrity": "sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==", - "dependencies": { - "jwa": "^1.4.1", - "safe-buffer": "^5.0.1" - } - }, "node_modules/kademlia-routing-table": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/kademlia-routing-table/-/kademlia-routing-table-1.0.1.tgz", @@ -10110,46 +9931,16 @@ "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", "integrity": "sha1-gteb/zCmfEAF/9XiUVMArZyk168=" }, - "node_modules/lodash.includes": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/lodash.includes/-/lodash.includes-4.3.0.tgz", - "integrity": "sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w==" - }, - "node_modules/lodash.isboolean": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz", - "integrity": "sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg==" - }, - "node_modules/lodash.isinteger": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz", - "integrity": "sha512-DBwtEWN2caHQ9/imiNeEA5ys1JoRtRfY3d7V9wkqtbycnAmTvRRmbHKDV4a0EYc678/dia0jrte4tjYwVBaZUA==" - }, - "node_modules/lodash.isnumber": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz", - "integrity": "sha512-QYqzpfwO3/CWf3XP+Z+tkQsfaLL/EnUlXWVkIk5FUPc4sBdTehEqZONuyRt2P67PXAk+NXmTBcc97zw9t1FQrw==" - }, "node_modules/lodash.isplainobject": { "version": "4.0.6", "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", "integrity": "sha1-fFJqUtibRcRcxpC4gWO+BJf1UMs=" }, - "node_modules/lodash.isstring": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz", - "integrity": "sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw==" - }, "node_modules/lodash.merge": { "version": "4.6.2", "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==" }, - "node_modules/lodash.once": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz", - "integrity": "sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==" - }, "node_modules/lodash.sortby": { "version": "4.7.0", "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz", @@ -13560,17 +13351,6 @@ "same-data": "^1.0.0" } }, - "node_modules/mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", - "bin": { - "mkdirp": "bin/cmd.js" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/mkdirp-classic": { "version": "0.5.3", "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", @@ -13655,16 +13435,6 @@ "queue-tick": "^1.0.0" } }, - "node_modules/mz": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", - "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", - "dependencies": { - "any-promise": "^1.0.0", - "object-assign": "^4.0.1", - "thenify-all": "^1.0.0" - } - }, "node_modules/nanoassert": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/nanoassert/-/nanoassert-2.0.0.tgz", @@ -13761,32 +13531,30 @@ } }, "node_modules/next-auth": { - "version": "3.29.10", - "resolved": "https://registry.npmjs.org/next-auth/-/next-auth-3.29.10.tgz", - "integrity": "sha512-e4nNYhISQRHNnem/WX1ybnQGDGb2rMP29maNmIXEOxSL6Uhu/pGFYu/aqApgIObDVWFt5l+33Ddh3rc71hjvEA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/balazsorban44" - } - ], + "version": "4.22.3", + "resolved": "https://registry.npmjs.org/next-auth/-/next-auth-4.22.3.tgz", + "integrity": "sha512-XAgy9xV3J2eJOXrQhmxdjV6MLM29ibm6WtMXc3KY6IPZeApf+SuBuPvlqCUfbu5YsAzlg9WSw6u01dChTfeZOA==", "dependencies": { - "@babel/runtime": "^7.14.0", - "@next-auth/prisma-legacy-adapter": "0.1.2", - "@next-auth/typeorm-legacy-adapter": "0.1.4", - "futoin-hkdf": "^1.3.2", - "jose": "^1.27.2", - "jsonwebtoken": "^8.5.1", - "nodemailer": "^6.4.16", + "@babel/runtime": "^7.20.13", + "@panva/hkdf": "^1.0.2", + "cookie": "^0.5.0", + "jose": "^4.11.4", "oauth": "^0.9.15", - "pkce-challenge": "^2.1.0", - "preact": "^10.4.1", - "preact-render-to-string": "^5.1.14", - "querystring": "^0.2.0" + "openid-client": "^5.4.0", + "preact": "^10.6.3", + "preact-render-to-string": "^5.1.19", + "uuid": "^8.3.2" }, "peerDependencies": { - "react": "^16.13.1 || ^17", - "react-dom": "^16.13.1 || ^17" + "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-plausible": { @@ -13900,9 +13668,9 @@ "integrity": "sha1-VWD8abweqQ46THhB8jPSAHU3hQM=" }, "node_modules/nodemailer": { - "version": "6.8.0", - "resolved": "https://registry.npmjs.org/nodemailer/-/nodemailer-6.8.0.tgz", - "integrity": "sha512-EjYvSmHzekz6VNkNd12aUqAco+bOkRe3Of5jVhltqKhEsjw/y0PYPJfp83+s9Wzh1dspYAkUW/YNQ350NATbSQ==", + "version": "6.9.4", + "resolved": "https://registry.npmjs.org/nodemailer/-/nodemailer-6.9.4.tgz", + "integrity": "sha512-CXjQvrQZV4+6X5wP6ZIgdehJamI63MFoYFGGPtHudWym9qaEHDNdPzaj5bfMCvxG1vhAileSWW90q7nL0N36mA==", "engines": { "node": ">=6.0.0" } @@ -14043,6 +13811,14 @@ "node": "*" } }, + "node_modules/oauth4webapi": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/oauth4webapi/-/oauth4webapi-2.3.0.tgz", + "integrity": "sha512-JGkb5doGrwzVDuHwgrR4nHJayzN4h59VCed6EW8Tql6iHDfZIabCJvg6wtbn5q6pyB2hZruI3b77Nudvq7NmvA==", + "funding": { + "url": "https://github.com/sponsors/panva" + } + }, "node_modules/object-assign": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", @@ -14051,6 +13827,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.3", "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", @@ -14145,6 +13929,14 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/oidc-token-hash": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/oidc-token-hash/-/oidc-token-hash-5.0.3.tgz", + "integrity": "sha512-IF4PcGgzAr6XXSff26Sk/+P4KZFJVuHAJZj3wgO3vX2bMdNVp/QXTP3P7CEm9V1IdG8lDLY3HhiqpsE/nOwpPw==", + "engines": { + "node": "^10.13.0 || >=12.0.0" + } + }, "node_modules/on-exit-leak-free": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/on-exit-leak-free/-/on-exit-leak-free-2.1.0.tgz", @@ -14177,6 +13969,20 @@ "wrappy": "1" } }, + "node_modules/openid-client": { + "version": "5.4.3", + "resolved": "https://registry.npmjs.org/openid-client/-/openid-client-5.4.3.tgz", + "integrity": "sha512-sVQOvjsT/sbSfYsQI/9liWQGVZH/Pp3rrtlGEwgk/bbHfrUDZ24DN57lAagIwFtuEu+FM9Ev7r85s8S/yPjimQ==", + "dependencies": { + "jose": "^4.14.4", + "lru-cache": "^6.0.0", + "object-hash": "^2.2.0", + "oidc-token-hash": "^5.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/panva" + } + }, "node_modules/opentimestamps": { "version": "0.4.9", "resolved": "https://registry.npmjs.org/opentimestamps/-/opentimestamps-0.4.9.tgz", @@ -14465,24 +14271,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/parse5": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-5.1.1.tgz", - "integrity": "sha512-ugq4DFI0Ptb+WWjAdOK16+u/nHfiIrcE+sh8kZMaM0WllQKLI9rOUq6c2b7cwPkXdzfQESqvoqK6ug7U/Yyzug==" - }, - "node_modules/parse5-htmlparser2-tree-adapter": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-6.0.1.tgz", - "integrity": "sha512-qPuWvbLgvDGilKc5BoicRovlT4MtYT6JfJyBOMDsKoiT+GiuP5qyrPCnR9HcPECIJJmZh5jRndyNThnhhb/vlA==", - "dependencies": { - "parse5": "^6.0.1" - } - }, - "node_modules/parse5-htmlparser2-tree-adapter/node_modules/parse5": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", - "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==" - }, "node_modules/parseurl": { "version": "1.3.3", "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", @@ -14760,11 +14548,6 @@ "resolved": "https://registry.npmjs.org/pino-std-serializers/-/pino-std-serializers-6.2.2.tgz", "integrity": "sha512-cHjPPsE+vhj/tnhCy/wiMh3M3z3h/j15zHQX+S9GkTBgqJuTuJzYJ4gUyACLhDaJ7kk9ba9iRDmbH2tJU03OiA==" }, - "node_modules/pkce-challenge": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/pkce-challenge/-/pkce-challenge-2.2.0.tgz", - "integrity": "sha512-Ly0Y0OwhtG2N1ynk5ruqoyJxkrWhAPmvdRk0teiLh9Dp2+J4URKpv1JSKWD0j1Sd+QCeiwO9lTl0EjmrB2jWeA==" - }, "node_modules/pkg-conf": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/pkg-conf/-/pkg-conf-3.1.0.tgz", @@ -14973,9 +14756,9 @@ } }, "node_modules/preact": { - "version": "10.11.2", - "resolved": "https://registry.npmjs.org/preact/-/preact-10.11.2.tgz", - "integrity": "sha512-skAwGDFmgxhq1DCBHke/9e12ewkhc7WYwjuhHB8HHS8zkdtITXLRmUMTeol2ldxvLwYtwbFeifZ9uDDWuyL4Iw==", + "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" @@ -15987,11 +15770,6 @@ "postcss-value-parser": "^3.3.0" } }, - "node_modules/reflect-metadata": { - "version": "0.1.13", - "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.1.13.tgz", - "integrity": "sha512-Ts1Y/anZELhSsjMcU605fU9RE4Oi3p5ORujwbIKXfWa+0Zxs510Qrmrce5/Jowq3cHSZSJqBjypxmHarc+vEWg==" - }, "node_modules/refractor": { "version": "3.6.0", "resolved": "https://registry.npmjs.org/refractor/-/refractor-3.6.0.tgz", @@ -16681,31 +16459,6 @@ "uuid": "bin/uuid" } }, - "node_modules/require_optional": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/require_optional/-/require_optional-1.0.1.tgz", - "integrity": "sha512-qhM/y57enGWHAe3v/NcwML6a3/vfESLe/sGM2dII+gEO0BpKRUkWZow/tyloNqJyN6kXSl3RyyM8Ll5D/sJP8g==", - "dependencies": { - "resolve-from": "^2.0.0", - "semver": "^5.1.0" - } - }, - "node_modules/require_optional/node_modules/resolve-from": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-2.0.0.tgz", - "integrity": "sha512-qpFcKaXsq8+oRoLilkwyc7zHGF5i9Q2/25NIgLQQ/+VVv9rU4qvr6nXVAw1DsnXJyQkZsR4Ytfbtg5ehfcUssQ==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/require_optional/node_modules/semver": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", - "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", - "bin": { - "semver": "bin/semver" - } - }, "node_modules/require-directory": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", @@ -18092,25 +17845,6 @@ "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", "dev": true }, - "node_modules/thenify": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", - "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", - "dependencies": { - "any-promise": "^1.0.0" - } - }, - "node_modules/thenify-all": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", - "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==", - "dependencies": { - "thenify": ">= 3.1.0 < 4" - }, - "engines": { - "node": ">=0.8" - } - }, "node_modules/thread-stream": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/thread-stream/-/thread-stream-2.3.0.tgz", @@ -18418,237 +18152,6 @@ "resolved": "https://registry.npmjs.org/typeforce/-/typeforce-1.18.0.tgz", "integrity": "sha512-7uc1O8h1M1g0rArakJdf0uLRSSgFcYexrVoKo+bzJd32gd4gDy2L/Z+8/FjPnU9ydY3pEnVPtr9FyscYY60K1g==" }, - "node_modules/typeorm": { - "version": "0.2.45", - "resolved": "https://registry.npmjs.org/typeorm/-/typeorm-0.2.45.tgz", - "integrity": "sha512-c0rCO8VMJ3ER7JQ73xfk0zDnVv0WDjpsP6Q1m6CVKul7DB9iVdWLRjPzc8v2eaeBuomsbZ2+gTaYr8k1gm3bYA==", - "dependencies": { - "@sqltools/formatter": "^1.2.2", - "app-root-path": "^3.0.0", - "buffer": "^6.0.3", - "chalk": "^4.1.0", - "cli-highlight": "^2.1.11", - "debug": "^4.3.1", - "dotenv": "^8.2.0", - "glob": "^7.1.6", - "js-yaml": "^4.0.0", - "mkdirp": "^1.0.4", - "reflect-metadata": "^0.1.13", - "sha.js": "^2.4.11", - "tslib": "^2.1.0", - "uuid": "^8.3.2", - "xml2js": "^0.4.23", - "yargs": "^17.0.1", - "zen-observable-ts": "^1.0.0" - }, - "bin": { - "typeorm": "cli.js" - }, - "funding": { - "url": "https://opencollective.com/typeorm" - }, - "peerDependencies": { - "@sap/hana-client": "^2.11.14", - "better-sqlite3": "^7.1.2", - "hdb-pool": "^0.1.6", - "ioredis": "^4.28.3", - "mongodb": "^3.6.0", - "mssql": "^6.3.1", - "mysql2": "^2.2.5", - "oracledb": "^5.1.0", - "pg": "^8.5.1", - "pg-native": "^3.0.0", - "pg-query-stream": "^4.0.0", - "redis": "^3.1.1", - "sql.js": "^1.4.0", - "sqlite3": "^5.0.2", - "typeorm-aurora-data-api-driver": "^2.0.0" - }, - "peerDependenciesMeta": { - "@sap/hana-client": { - "optional": true - }, - "better-sqlite3": { - "optional": true - }, - "hdb-pool": { - "optional": true - }, - "ioredis": { - "optional": true - }, - "mongodb": { - "optional": true - }, - "mssql": { - "optional": true - }, - "mysql2": { - "optional": true - }, - "oracledb": { - "optional": true - }, - "pg": { - "optional": true - }, - "pg-native": { - "optional": true - }, - "pg-query-stream": { - "optional": true - }, - "redis": { - "optional": true - }, - "sql.js": { - "optional": true - }, - "sqlite3": { - "optional": true - }, - "typeorm-aurora-data-api-driver": { - "optional": true - } - } - }, - "node_modules/typeorm/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/typeorm/node_modules/buffer": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", - "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.2.1" - } - }, - "node_modules/typeorm/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/typeorm/node_modules/cliui": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", - "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.1", - "wrap-ansi": "^7.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/typeorm/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/typeorm/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "node_modules/typeorm/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "engines": { - "node": ">=8" - } - }, - "node_modules/typeorm/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/typeorm/node_modules/xml2js": { - "version": "0.4.23", - "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.23.tgz", - "integrity": "sha512-ySPiMjM0+pLDftHgXY4By0uswI3SPKLDw/i3UXbnO8M/p28zqexCUoPmQFrYD+/1BzhGJSs2i1ERWKJAtiLrug==", - "dependencies": { - "sax": ">=0.6.0", - "xmlbuilder": "~11.0.0" - }, - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/typeorm/node_modules/yargs": { - "version": "17.7.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", - "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", - "dependencies": { - "cliui": "^8.0.1", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.3", - "y18n": "^5.0.5", - "yargs-parser": "^21.1.1" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/typeorm/node_modules/yargs-parser": { - "version": "21.1.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", - "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", - "engines": { - "node": ">=12" - } - }, "node_modules/typescript": { "version": "5.1.6", "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.1.6.tgz", @@ -20015,31 +19518,6 @@ "node": ">= 6" } }, - "node_modules/yargs": { - "version": "16.2.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", - "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", - "dependencies": { - "cliui": "^7.0.2", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.0", - "y18n": "^5.0.5", - "yargs-parser": "^20.2.2" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/yargs-parser": { - "version": "20.2.9", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", - "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", - "engines": { - "node": ">=10" - } - }, "node_modules/yauzl": { "version": "2.10.0", "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", @@ -20401,6 +19879,37 @@ "resolved": "https://registry.npmjs.org/@as-integrations/next/-/next-2.0.1.tgz", "integrity": "sha512-smtgZPkpWT0iOkSdH28BnOy69jZd6ILGiI3C56d3+6czbTwtcV2sgb2zweRqSd3vBzDPvA4mHkjsJZY7cXlZEA==" }, + "@auth/core": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/@auth/core/-/core-0.9.0.tgz", + "integrity": "sha512-W2WO0WCBg1T3P8+yjQPzurTQhPv6ecBYfJ2oE3uvXPAX5ZLWAMSjKFAIa9oLZy5pwrB+YehJZPnlIxVilhrVcg==", + "requires": { + "@panva/hkdf": "^1.0.4", + "cookie": "0.5.0", + "jose": "^4.11.1", + "oauth4webapi": "^2.0.6", + "preact": "10.11.3", + "preact-render-to-string": "5.2.3" + }, + "dependencies": { + "preact-render-to-string": { + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/preact-render-to-string/-/preact-render-to-string-5.2.3.tgz", + "integrity": "sha512-aPDxUn5o3GhWdtJtW0svRC2SS/l8D9MAgo2+AWml+BhDImb27ALf04Q2d+AHqUUOc6RdSXFIBVa2gxzgMKgtZA==", + "requires": { + "pretty-format": "^3.8.0" + } + } + } + }, + "@auth/prisma-adapter": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@auth/prisma-adapter/-/prisma-adapter-1.0.1.tgz", + "integrity": "sha512-sBp9l/jVr7l9y7rp2Pv6eoP7i8X2CgRNE3jDWJ0B/u+HnKRofXflD1cldPqRSAkJhqH3UxhVtMTEijT9FoofmQ==", + "requires": { + "@auth/core": "0.9.0" + } + }, "@babel/code-frame": { "version": "7.22.5", "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.5.tgz", @@ -21963,24 +21472,6 @@ "@jridgewell/sourcemap-codec": "1.4.14" } }, - "@next-auth/prisma-legacy-adapter": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/@next-auth/prisma-legacy-adapter/-/prisma-legacy-adapter-0.1.2.tgz", - "integrity": "sha512-QpGcRvrnFERkvVFroqS89qDbnskw9AjhvWxO095u3xl/8QVI++Y+doluQdZWuV6PewjrV7xY+uVUEnRhnGM8yQ==", - "requires": { - "@babel/runtime": "^7.14.0" - } - }, - "@next-auth/typeorm-legacy-adapter": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/@next-auth/typeorm-legacy-adapter/-/typeorm-legacy-adapter-0.1.4.tgz", - "integrity": "sha512-UDnctrPiUU0yaPNeFhD6uw0FAuWGvx6IUVwUYTEzZm26RCEe/BBjkpGLYk43M3rcnkBPfkiljomAs/O7Uzh12w==", - "requires": { - "@babel/runtime": "^7.14.0", - "require_optional": "^1.0.1", - "typeorm": "^0.2.30" - } - }, "@next/env": { "version": "13.4.12", "resolved": "https://registry.npmjs.org/@next/env/-/env-13.4.12.tgz", @@ -22121,10 +21612,10 @@ } } }, - "@panva/asn1.js": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@panva/asn1.js/-/asn1.js-1.0.0.tgz", - "integrity": "sha512-UdkG3mLEqXgnlKsWanWcgb6dOjUzJ+XC5f+aWw30qrtjxeNUSfKX1cd5FBzOaXQumoe9nIqeZUvrRJS03HCCtw==" + "@panva/hkdf": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@panva/hkdf/-/hkdf-1.1.1.tgz", + "integrity": "sha512-dhPeilub1NuIG0X5Kvhh9lH4iW3ZsHlnzwgwbOlgwQ2wG1IqFzsgHqmKPk3WzsdWAeaxKJxgM0+W433RmN45GA==" }, "@popperjs/core": { "version": "2.11.8", @@ -22333,11 +21824,6 @@ "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.6.0.tgz", "integrity": "sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==" }, - "@sqltools/formatter": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/@sqltools/formatter/-/formatter-1.2.5.tgz", - "integrity": "sha512-Uy0+khmZqUrUGm5dmMqVlnvufZRSK0FbYzVgp0UMstm+F5+W2/jnEEQyc9vo1ZR/E5ZI/B1WjjoTqBqwJL6Krw==" - }, "@surma/rollup-plugin-off-main-thread": { "version": "2.2.3", "resolved": "https://registry.npmjs.org/@surma/rollup-plugin-off-main-thread/-/rollup-plugin-off-main-thread-2.2.3.tgz", @@ -23156,11 +22642,6 @@ "color-convert": "^1.9.0" } }, - "any-promise": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", - "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==" - }, "anymatch": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", @@ -23170,11 +22651,6 @@ "picomatch": "^2.0.4" } }, - "app-root-path": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/app-root-path/-/app-root-path-3.1.0.tgz", - "integrity": "sha512-biN3PwB2gUtjaYy/isrU3aNWI5w+fAfvHkSvCKeQGxhmYpwKFUxudR3Yya+KqVRHBmEDYh+/lTozYCFbmzX4nA==" - }, "archy": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/archy/-/archy-1.0.0.tgz", @@ -24247,64 +23723,6 @@ "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==" }, - "cli-highlight": { - "version": "2.1.11", - "resolved": "https://registry.npmjs.org/cli-highlight/-/cli-highlight-2.1.11.tgz", - "integrity": "sha512-9KDcoEVwyUXrjcJNvHD0NFc/hiwe/WPVYIleQh2O1N2Zro5gWJZ/K+3DGn8w8P/F6FxOgzyC5bxDyHIgCSPhGg==", - "requires": { - "chalk": "^4.0.0", - "highlight.js": "^10.7.1", - "mz": "^2.4.0", - "parse5": "^5.1.1", - "parse5-htmlparser2-tree-adapter": "^6.0.0", - "yargs": "^16.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, "client-only": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/client-only/-/client-only-0.0.1.tgz", @@ -24315,16 +23733,6 @@ "resolved": "https://registry.npmjs.org/clipboard-copy/-/clipboard-copy-4.0.1.tgz", "integrity": "sha512-wOlqdqziE/NNTUJsfSgXmBMIrYmfd5V0HCGsR8uAKHcg+h9NENWINcfRjtWGU77wDHC8B8ijV4hMTGYbrKovng==" }, - "cliui": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", - "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", - "requires": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^7.0.0" - } - }, "clone-response": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.3.tgz", @@ -24967,11 +24375,6 @@ "domhandler": "^4.2.0" } }, - "dotenv": { - "version": "8.6.0", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-8.6.0.tgz", - "integrity": "sha512-IrPdXQsk2BbzvCBGBOTmmSH5SodmqZNt4ERAZDmW4CT+tL8VtvinqywuANaFu4bOMWki16nqf0e4oC0QIaDr/g==" - }, "dset": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/dset/-/dset-3.1.2.tgz", @@ -26126,11 +25529,6 @@ "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==" }, - "futoin-hkdf": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/futoin-hkdf/-/futoin-hkdf-1.5.1.tgz", - "integrity": "sha512-g5d0Qp7ks55hYmYmfqn4Nz18XH49lcCR+vvIvHT92xXnsJaGZmY1EtWQWilJ6BQp57heCIXM/rRo+AFep8hGgg==" - }, "gensync": { "version": "1.0.0-beta.2", "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", @@ -27270,12 +26668,9 @@ "integrity": "sha512-9FzQjJ7MATs1tSpnco1K6ayiYE3figslrXA72G2HQ/n76RzvYlofyi5QM+iX4YRs/pu3yzxlVQSST23+dMDknw==" }, "jose": { - "version": "1.28.2", - "resolved": "https://registry.npmjs.org/jose/-/jose-1.28.2.tgz", - "integrity": "sha512-wWy51U2MXxYi3g8zk2lsQ8M6O1lartpkxuq1TYexzPKYLgHLZkCjklaATP36I5BUoWjF2sInB9U1Qf18fBZxNA==", - "requires": { - "@panva/asn1.js": "^1.0.0" - } + "version": "4.14.4", + "resolved": "https://registry.npmjs.org/jose/-/jose-4.14.4.tgz", + "integrity": "sha512-j8GhLiKmUAh+dsFXlX1aJCbt5KMibuKb+d7j1JaOJG6s2UjX1PQlW+OKB/sD4a/5ZYF4RcmYmLSndOoU3Lt/3g==" }, "js-sha256": { "version": "0.9.0", @@ -27372,30 +26767,6 @@ "resolved": "https://registry.npmjs.org/jsonpointer/-/jsonpointer-5.0.1.tgz", "integrity": "sha512-p/nXbhSEcu3pZRdkW1OfJhpsVtW1gd4Wa1fnQc9YLiTfAjn0312eMKimbdIQzuZl9aa9xUGaRlP9T/CJE/ditQ==" }, - "jsonwebtoken": { - "version": "8.5.1", - "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-8.5.1.tgz", - "integrity": "sha512-XjwVfRS6jTMsqYs0EsuJ4LGxXV14zQybNd4L2r0UvbVnSF9Af8x7p5MzbJ90Ioz/9TI41/hTCvznF/loiSzn8w==", - "requires": { - "jws": "^3.2.2", - "lodash.includes": "^4.3.0", - "lodash.isboolean": "^3.0.3", - "lodash.isinteger": "^4.0.4", - "lodash.isnumber": "^3.0.3", - "lodash.isplainobject": "^4.0.6", - "lodash.isstring": "^4.0.1", - "lodash.once": "^4.0.0", - "ms": "^2.1.1", - "semver": "^5.6.0" - }, - "dependencies": { - "semver": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", - "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==" - } - } - }, "jsprim": { "version": "1.4.2", "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.2.tgz", @@ -27417,25 +26788,6 @@ "object.assign": "^4.1.3" } }, - "jwa": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/jwa/-/jwa-1.4.1.tgz", - "integrity": "sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA==", - "requires": { - "buffer-equal-constant-time": "1.0.1", - "ecdsa-sig-formatter": "1.0.11", - "safe-buffer": "^5.0.1" - } - }, - "jws": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/jws/-/jws-3.2.2.tgz", - "integrity": "sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==", - "requires": { - "jwa": "^1.4.1", - "safe-buffer": "^5.0.1" - } - }, "kademlia-routing-table": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/kademlia-routing-table/-/kademlia-routing-table-1.0.1.tgz", @@ -27646,46 +26998,16 @@ "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", "integrity": "sha1-gteb/zCmfEAF/9XiUVMArZyk168=" }, - "lodash.includes": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/lodash.includes/-/lodash.includes-4.3.0.tgz", - "integrity": "sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w==" - }, - "lodash.isboolean": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz", - "integrity": "sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg==" - }, - "lodash.isinteger": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz", - "integrity": "sha512-DBwtEWN2caHQ9/imiNeEA5ys1JoRtRfY3d7V9wkqtbycnAmTvRRmbHKDV4a0EYc678/dia0jrte4tjYwVBaZUA==" - }, - "lodash.isnumber": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz", - "integrity": "sha512-QYqzpfwO3/CWf3XP+Z+tkQsfaLL/EnUlXWVkIk5FUPc4sBdTehEqZONuyRt2P67PXAk+NXmTBcc97zw9t1FQrw==" - }, "lodash.isplainobject": { "version": "4.0.6", "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", "integrity": "sha1-fFJqUtibRcRcxpC4gWO+BJf1UMs=" }, - "lodash.isstring": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz", - "integrity": "sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw==" - }, "lodash.merge": { "version": "4.6.2", "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==" }, - "lodash.once": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz", - "integrity": "sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==" - }, "lodash.sortby": { "version": "4.7.0", "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz", @@ -29657,11 +28979,6 @@ "same-data": "^1.0.0" } }, - "mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==" - }, "mkdirp-classic": { "version": "0.5.3", "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", @@ -29733,16 +29050,6 @@ "queue-tick": "^1.0.0" } }, - "mz": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", - "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", - "requires": { - "any-promise": "^1.0.0", - "object-assign": "^4.0.1", - "thenify-all": "^1.0.0" - } - }, "nanoassert": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/nanoassert/-/nanoassert-2.0.0.tgz", @@ -29804,22 +29111,19 @@ } }, "next-auth": { - "version": "3.29.10", - "resolved": "https://registry.npmjs.org/next-auth/-/next-auth-3.29.10.tgz", - "integrity": "sha512-e4nNYhISQRHNnem/WX1ybnQGDGb2rMP29maNmIXEOxSL6Uhu/pGFYu/aqApgIObDVWFt5l+33Ddh3rc71hjvEA==", + "version": "4.22.3", + "resolved": "https://registry.npmjs.org/next-auth/-/next-auth-4.22.3.tgz", + "integrity": "sha512-XAgy9xV3J2eJOXrQhmxdjV6MLM29ibm6WtMXc3KY6IPZeApf+SuBuPvlqCUfbu5YsAzlg9WSw6u01dChTfeZOA==", "requires": { - "@babel/runtime": "^7.14.0", - "@next-auth/prisma-legacy-adapter": "0.1.2", - "@next-auth/typeorm-legacy-adapter": "0.1.4", - "futoin-hkdf": "^1.3.2", - "jose": "^1.27.2", - "jsonwebtoken": "^8.5.1", - "nodemailer": "^6.4.16", + "@babel/runtime": "^7.20.13", + "@panva/hkdf": "^1.0.2", + "cookie": "^0.5.0", + "jose": "^4.11.4", "oauth": "^0.9.15", - "pkce-challenge": "^2.1.0", - "preact": "^10.4.1", - "preact-render-to-string": "^5.1.14", - "querystring": "^0.2.0" + "openid-client": "^5.4.0", + "preact": "^10.6.3", + "preact-render-to-string": "^5.1.19", + "uuid": "^8.3.2" } }, "next-plausible": { @@ -29886,9 +29190,9 @@ "integrity": "sha1-VWD8abweqQ46THhB8jPSAHU3hQM=" }, "nodemailer": { - "version": "6.8.0", - "resolved": "https://registry.npmjs.org/nodemailer/-/nodemailer-6.8.0.tgz", - "integrity": "sha512-EjYvSmHzekz6VNkNd12aUqAco+bOkRe3Of5jVhltqKhEsjw/y0PYPJfp83+s9Wzh1dspYAkUW/YNQ350NATbSQ==" + "version": "6.9.4", + "resolved": "https://registry.npmjs.org/nodemailer/-/nodemailer-6.9.4.tgz", + "integrity": "sha512-CXjQvrQZV4+6X5wP6ZIgdehJamI63MFoYFGGPtHudWym9qaEHDNdPzaj5bfMCvxG1vhAileSWW90q7nL0N36mA==" }, "nofilter": { "version": "3.1.0", @@ -30011,11 +29315,21 @@ "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==" }, + "oauth4webapi": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/oauth4webapi/-/oauth4webapi-2.3.0.tgz", + "integrity": "sha512-JGkb5doGrwzVDuHwgrR4nHJayzN4h59VCed6EW8Tql6iHDfZIabCJvg6wtbn5q6pyB2hZruI3b77Nudvq7NmvA==" + }, "object-assign": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" }, + "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.3", "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", @@ -30080,6 +29394,11 @@ "es-abstract": "^1.20.4" } }, + "oidc-token-hash": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/oidc-token-hash/-/oidc-token-hash-5.0.3.tgz", + "integrity": "sha512-IF4PcGgzAr6XXSff26Sk/+P4KZFJVuHAJZj3wgO3vX2bMdNVp/QXTP3P7CEm9V1IdG8lDLY3HhiqpsE/nOwpPw==" + }, "on-exit-leak-free": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/on-exit-leak-free/-/on-exit-leak-free-2.1.0.tgz", @@ -30106,6 +29425,17 @@ "wrappy": "1" } }, + "openid-client": { + "version": "5.4.3", + "resolved": "https://registry.npmjs.org/openid-client/-/openid-client-5.4.3.tgz", + "integrity": "sha512-sVQOvjsT/sbSfYsQI/9liWQGVZH/Pp3rrtlGEwgk/bbHfrUDZ24DN57lAagIwFtuEu+FM9Ev7r85s8S/yPjimQ==", + "requires": { + "jose": "^4.14.4", + "lru-cache": "^6.0.0", + "object-hash": "^2.2.0", + "oidc-token-hash": "^5.0.3" + } + }, "opentimestamps": { "version": "0.4.9", "resolved": "https://registry.npmjs.org/opentimestamps/-/opentimestamps-0.4.9.tgz", @@ -30312,26 +29642,6 @@ "lines-and-columns": "^1.1.6" } }, - "parse5": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-5.1.1.tgz", - "integrity": "sha512-ugq4DFI0Ptb+WWjAdOK16+u/nHfiIrcE+sh8kZMaM0WllQKLI9rOUq6c2b7cwPkXdzfQESqvoqK6ug7U/Yyzug==" - }, - "parse5-htmlparser2-tree-adapter": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-6.0.1.tgz", - "integrity": "sha512-qPuWvbLgvDGilKc5BoicRovlT4MtYT6JfJyBOMDsKoiT+GiuP5qyrPCnR9HcPECIJJmZh5jRndyNThnhhb/vlA==", - "requires": { - "parse5": "^6.0.1" - }, - "dependencies": { - "parse5": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", - "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==" - } - } - }, "parseurl": { "version": "1.3.3", "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", @@ -30537,11 +29847,6 @@ "resolved": "https://registry.npmjs.org/pino-std-serializers/-/pino-std-serializers-6.2.2.tgz", "integrity": "sha512-cHjPPsE+vhj/tnhCy/wiMh3M3z3h/j15zHQX+S9GkTBgqJuTuJzYJ4gUyACLhDaJ7kk9ba9iRDmbH2tJU03OiA==" }, - "pkce-challenge": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/pkce-challenge/-/pkce-challenge-2.2.0.tgz", - "integrity": "sha512-Ly0Y0OwhtG2N1ynk5ruqoyJxkrWhAPmvdRk0teiLh9Dp2+J4URKpv1JSKWD0j1Sd+QCeiwO9lTl0EjmrB2jWeA==" - }, "pkg-conf": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/pkg-conf/-/pkg-conf-3.1.0.tgz", @@ -30685,9 +29990,9 @@ } }, "preact": { - "version": "10.11.2", - "resolved": "https://registry.npmjs.org/preact/-/preact-10.11.2.tgz", - "integrity": "sha512-skAwGDFmgxhq1DCBHke/9e12ewkhc7WYwjuhHB8HHS8zkdtITXLRmUMTeol2ldxvLwYtwbFeifZ9uDDWuyL4Iw==" + "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", @@ -31460,11 +30765,6 @@ "postcss-value-parser": "^3.3.0" } }, - "reflect-metadata": { - "version": "0.1.13", - "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.1.13.tgz", - "integrity": "sha512-Ts1Y/anZELhSsjMcU605fU9RE4Oi3p5ORujwbIKXfWa+0Zxs510Qrmrce5/Jowq3cHSZSJqBjypxmHarc+vEWg==" - }, "refractor": { "version": "3.6.0", "resolved": "https://registry.npmjs.org/refractor/-/refractor-3.6.0.tgz", @@ -31978,27 +31278,6 @@ "lodash": "^4.17.19" } }, - "require_optional": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/require_optional/-/require_optional-1.0.1.tgz", - "integrity": "sha512-qhM/y57enGWHAe3v/NcwML6a3/vfESLe/sGM2dII+gEO0BpKRUkWZow/tyloNqJyN6kXSl3RyyM8Ll5D/sJP8g==", - "requires": { - "resolve-from": "^2.0.0", - "semver": "^5.1.0" - }, - "dependencies": { - "resolve-from": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-2.0.0.tgz", - "integrity": "sha512-qpFcKaXsq8+oRoLilkwyc7zHGF5i9Q2/25NIgLQQ/+VVv9rU4qvr6nXVAw1DsnXJyQkZsR4Ytfbtg5ehfcUssQ==" - }, - "semver": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", - "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==" - } - } - }, "require-directory": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", @@ -33048,22 +32327,6 @@ "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", "dev": true }, - "thenify": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", - "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", - "requires": { - "any-promise": "^1.0.0" - } - }, - "thenify-all": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", - "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==", - "requires": { - "thenify": ">= 3.1.0 < 4" - } - }, "thread-stream": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/thread-stream/-/thread-stream-2.3.0.tgz", @@ -33309,122 +32572,6 @@ "resolved": "https://registry.npmjs.org/typeforce/-/typeforce-1.18.0.tgz", "integrity": "sha512-7uc1O8h1M1g0rArakJdf0uLRSSgFcYexrVoKo+bzJd32gd4gDy2L/Z+8/FjPnU9ydY3pEnVPtr9FyscYY60K1g==" }, - "typeorm": { - "version": "0.2.45", - "resolved": "https://registry.npmjs.org/typeorm/-/typeorm-0.2.45.tgz", - "integrity": "sha512-c0rCO8VMJ3ER7JQ73xfk0zDnVv0WDjpsP6Q1m6CVKul7DB9iVdWLRjPzc8v2eaeBuomsbZ2+gTaYr8k1gm3bYA==", - "requires": { - "@sqltools/formatter": "^1.2.2", - "app-root-path": "^3.0.0", - "buffer": "^6.0.3", - "chalk": "^4.1.0", - "cli-highlight": "^2.1.11", - "debug": "^4.3.1", - "dotenv": "^8.2.0", - "glob": "^7.1.6", - "js-yaml": "^4.0.0", - "mkdirp": "^1.0.4", - "reflect-metadata": "^0.1.13", - "sha.js": "^2.4.11", - "tslib": "^2.1.0", - "uuid": "^8.3.2", - "xml2js": "^0.4.23", - "yargs": "^17.0.1", - "zen-observable-ts": "^1.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "requires": { - "color-convert": "^2.0.1" - } - }, - "buffer": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", - "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", - "requires": { - "base64-js": "^1.3.1", - "ieee754": "^1.2.1" - } - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "cliui": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", - "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", - "requires": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.1", - "wrap-ansi": "^7.0.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "requires": { - "has-flag": "^4.0.0" - } - }, - "xml2js": { - "version": "0.4.23", - "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.23.tgz", - "integrity": "sha512-ySPiMjM0+pLDftHgXY4By0uswI3SPKLDw/i3UXbnO8M/p28zqexCUoPmQFrYD+/1BzhGJSs2i1ERWKJAtiLrug==", - "requires": { - "sax": ">=0.6.0", - "xmlbuilder": "~11.0.0" - } - }, - "yargs": { - "version": "17.7.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", - "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", - "requires": { - "cliui": "^8.0.1", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.3", - "y18n": "^5.0.5", - "yargs-parser": "^21.1.1" - } - }, - "yargs-parser": { - "version": "21.1.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", - "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==" - } - } - }, "typescript": { "version": "5.1.6", "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.1.6.tgz", @@ -34467,25 +33614,6 @@ "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==" }, - "yargs": { - "version": "16.2.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", - "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", - "requires": { - "cliui": "^7.0.2", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.0", - "y18n": "^5.0.5", - "yargs-parser": "^20.2.2" - } - }, - "yargs-parser": { - "version": "20.2.9", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", - "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==" - }, "yauzl": { "version": "2.10.0", "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", diff --git a/package.json b/package.json index 27442627..9cf9fcfd 100644 --- a/package.json +++ b/package.json @@ -12,6 +12,7 @@ "@apollo/client": "^3.7.17", "@apollo/server": "^4.8.1", "@as-integrations/next": "^2.0.1", + "@auth/prisma-adapter": "^1.0.1", "@graphql-tools/schema": "^10.0.0", "@noble/curves": "^1.1.0", "@opensearch-project/opensearch": "^2.3.1", @@ -44,11 +45,12 @@ "mdast-util-to-string": "^4.0.0", "micromark-extension-gfm": "^3.0.0", "next": "^13.4.12", - "next-auth": "^3.29.10", + "next-auth": "^4.22.3", "next-plausible": "^3.10.1", "next-seo": "^6.1.0", "nextjs-progressbar": "0.0.16", "node-s3-url-encode": "^0.0.4", + "nodemailer": "^6.9.4", "nostr": "^0.2.8", "opentimestamps": "^0.4.9", "page-metadata-parser": "^1.1.4", @@ -79,6 +81,7 @@ "web-push": "^3.6.2", "webln": "^0.3.2", "webpack": "^5.88.2", + "workbox-navigation-preload": "^7.0.0", "workbox-precaching": "^7.0.0", "workbox-recipes": "^7.0.0", "workbox-routing": "^7.0.0", diff --git a/pages/404.js b/pages/404.js index 5e525063..33925dd9 100644 --- a/pages/404.js +++ b/pages/404.js @@ -1,12 +1,5 @@ -import Image from 'react-bootstrap/Image' -import { StaticLayout } from '../components/layout' -import styles from '../styles/404.module.css' +import Error from './_error' -export default function fourZeroFour () { - return ( - - -

404page not found

-
- ) +export default function Custom404 () { + return } diff --git a/pages/500.js b/pages/500.js index 008ef63a..53fac9ca 100644 --- a/pages/500.js +++ b/pages/500.js @@ -1,12 +1,5 @@ -import Image from 'react-bootstrap/Image' -import { StaticLayout } from '../components/layout' -import styles from '../styles/404.module.css' +import Error from './_error' -export default function fiveHundo () { - return ( - - -

500server error

-
- ) +export default function Custom500 () { + return } diff --git a/pages/_app.js b/pages/_app.js index 8e6a6dcd..8c7f4458 100644 --- a/pages/_app.js +++ b/pages/_app.js @@ -1,6 +1,5 @@ import '../styles/globals.scss' import { ApolloProvider, gql } from '@apollo/client' -import { Provider } from 'next-auth/client' import { MeProvider } from '../components/me' import PlausibleProvider from 'next-plausible' import getApolloClient from '../lib/apollo' @@ -28,7 +27,7 @@ function writeQuery (client, apollo, data) { } } -function MyApp ({ Component, pageProps: { session, ...props } }) { +function MyApp ({ Component, pageProps: { ...props } }) { const client = getApolloClient() const router = useRouter() @@ -80,21 +79,19 @@ function MyApp ({ Component, pageProps: { session, ...props } }) { - - - - - - - - - - - - - - - + + + + + + + + + + + + + diff --git a/pages/_error.js b/pages/_error.js new file mode 100644 index 00000000..16a3586d --- /dev/null +++ b/pages/_error.js @@ -0,0 +1,77 @@ +import Image from 'react-bootstrap/Image' +import { StaticLayout } from '../components/layout' +import styles from '../styles/error.module.css' + +const statusDescribe = { + 200: 'OK', + 201: 'Created', + 202: 'Accepted', + 203: 'Non-Authoritative Information', + 204: 'No Content', + 205: 'Reset Content', + 206: 'Partial Content', + 300: 'Multiple Choices', + 301: 'Moved Permanently', + 302: 'Found', + 303: 'See Other', + 304: 'Not Modified', + 305: 'Use Proxy', + 306: 'Unused', + 307: 'Temporary Redirect', + 400: 'Bad Request', + 401: 'Unauthorized', + 402: 'Payment Required', + 403: 'Forbidden', + 404: 'Not Found', + 405: 'Method Not Allowed', + 406: 'Not Acceptable', + 407: 'Proxy Authentication Required', + 408: 'Request Timeout', + 409: 'Conflict', + 410: 'Gone', + 411: 'Length Required', + 412: 'Precondition Required', + 413: 'Request Entry Too Large', + 414: 'Request-URI Too Long', + 415: 'Unsupported Media Type', + 416: 'Requested Range Not Satisfiable', + 417: 'Expectation Failed', + 418: 'I\'m a teapot', + 429: 'Too Many Requests', + 500: 'Internal Server Error', + 501: 'Not Implemented', + 502: 'Bad Gateway', + 503: 'Service Unavailable', + 504: 'Gateway Timeout', + 505: 'HTTP Version Not Supported' +} + +function ErrorImage ({ statusCode }) { + if (statusCode === 404) { + return + } + if (statusCode >= 500) { + return + } + if (statusCode >= 400) { + return + } + if (statusCode >= 300) { + return + } + return +} + +export default function Error ({ statusCode }) { + return ( + + +

{statusCode}{statusDescribe[statusCode].toUpperCase()}

+
+ ) +} + +Error.getInitialProps = ({ res, err }) => { + const statusCode = res ? res.statusCode : err ? err.statusCode : 404 + return { statusCode } +} diff --git a/pages/api/auth/[...nextauth].js b/pages/api/auth/[...nextauth].js index 9e44e243..840127a1 100644 --- a/pages/api/auth/[...nextauth].js +++ b/pages/api/auth/[...nextauth].js @@ -1,40 +1,16 @@ import NextAuth from 'next-auth' -import Providers from 'next-auth/providers' -import { PrismaLegacyAdapter } from '../../../lib/prisma-adapter' +import CredentialsProvider from 'next-auth/providers/credentials' +import GitHubProvider from 'next-auth/providers/github' +import TwitterProvider from 'next-auth/providers/twitter' +import EmailProvider from 'next-auth/providers/email' import prisma from '../../../api/models' import nodemailer from 'nodemailer' -import { getSession } from 'next-auth/client' +import { PrismaAdapter } from '@auth/prisma-adapter' +import { getToken } from 'next-auth/jwt' +import { NodeNextRequest } from 'next/dist/server/base-http/node' -// node v16 and next don't give us parsed headers like v14, so we -// do our best to parse them in a similar fashion to like in v14 -// getSession requires req.headers.cookie otherwise it will throw -function parsedHeaders (req) { - return req.rawHeaders.reduce( - (obj, value, index, arr) => { - if (index % 2 === 0) { - const key = value.toLowerCase() - if (typeof obj[key] === 'string') { - if (key === 'cookie') { - obj[key] = obj[key] + '; ' + arr[index + 1] - } else if (key === 'set-cookie') { - obj[key] = obj[key].push(arr[index + 1]) - } else { - obj[key] = obj[key] + ', ' + arr[index + 1] - } - } else { - if (key === 'set-cookie') { - obj[key] = [arr[index + 1]] - } else { - obj[key] = arr[index + 1] - } - } - } - return obj - }, {}) -} - -export default (req, res) => NextAuth(req, res, { - callbacks: { +function getCallbacks (req) { + return { /** * @param {object} token Decrypted JSON Web Token * @param {object} user User object (only available on sign in) @@ -43,13 +19,18 @@ export default (req, res) => NextAuth(req, res, { * @param {boolean} isNewUser True if new user (only available on sign in) * @return {object} JSON Web Token that will be saved */ - async jwt (token, user, account, profile, isNewUser) { - // Add additional session params - if (user?.id) { + async jwt ({ token, user, account, profile, isNewUser }) { + if (user) { + // token won't have an id on it for new logins, we add it + // note: token is what's kept in the jwt token.id = Number(user.id) - // HACK next-auth needs this to do account linking with jwts - // see: https://github.com/nextauthjs/next-auth/issues/625 - token.user = { id: Number(user.id) } + } + + if (token?.id) { + // HACK token.sub is used by nextjs v4 internally and is used like a userId + // setting it here allows us to link multiple auth method to an account + // ... in v3 this linking field was token.user.id + token.sub = Number(token.id) } if (isNewUser) { @@ -82,149 +63,123 @@ export default (req, res) => NextAuth(req, res, { return token }, - async session (session, token) { - // we need to add additional session params here - session.user.id = Number(token.id) + async session ({ session, token }) { + // note: this function takes the current token (result of running jwt above) + // and returns a new object session that's returned whenever get|use[Server]Session is called + session.user.id = token.id + return session } - }, - providers: [ - Providers.Credentials({ - id: 'lightning', - // The name to display on the sign in form (e.g. 'Sign in with...') - name: 'Lightning', - // The credentials is used to generate a suitable form on the sign in page. - // You can specify whatever fields you are expecting to be submitted. - // e.g. domain, username, password, 2FA token, etc. - credentials: { - pubkey: { label: 'publickey', type: 'text' }, - k1: { label: 'k1', type: 'text' } - }, - async authorize (credentials, req) { - const { k1, pubkey } = credentials - try { - const lnauth = await prisma.lnAuth.findUnique({ where: { k1 } }) - await prisma.lnAuth.delete({ where: { k1 } }) - if (lnauth.pubkey === pubkey) { - let user = await prisma.user.findUnique({ where: { pubkey } }) - req.headers = parsedHeaders(req) - const session = await getSession({ req }) - if (!user) { - // if we are logged in, update rather than create - if (session?.user) { - user = await prisma.user.update({ where: { id: session.user.id }, data: { pubkey } }) - } else { - user = await prisma.user.create({ data: { name: pubkey.slice(0, 10), pubkey } }) - } - } else if (session && session.user?.id !== user.id) { - throw new Error('account not linked') - } + } +} - return user - } - } catch (error) { - console.log(error) +async function pubkeyAuth (credentials, req, pubkeyColumnName) { + const { k1, pubkey } = credentials + try { + const lnauth = await prisma.lnAuth.findUnique({ where: { k1 } }) + await prisma.lnAuth.delete({ where: { k1 } }) + if (lnauth.pubkey === pubkey) { + let user = await prisma.user.findUnique({ where: { [pubkeyColumnName]: pubkey } }) + const token = await getToken({ req }) + if (!user) { + // if we are logged in, update rather than create + if (token?.id) { + user = await prisma.user.update({ where: { id: token.id }, data: { [pubkeyColumnName]: pubkey } }) + } else { + user = await prisma.user.create({ data: { name: pubkey.slice(0, 10), [pubkeyColumnName]: pubkey } }) } - + } else if (token && token?.id !== user.id) { return null } - }), - Providers.Credentials({ - id: 'slashtags', - // The name to display on the sign in form (e.g. 'Sign in with...') - name: 'Slashtags', - // The credentials is used to generate a suitable form on the sign in page. - // You can specify whatever fields you are expecting to be submitted. - // e.g. domain, username, password, 2FA token, etc. - credentials: { - pubkey: { label: 'publickey', type: 'text' }, - k1: { label: 'k1', type: 'text' } - }, - async authorize (credentials, req) { - const { k1, pubkey } = credentials - try { - const lnauth = await prisma.lnAuth.findUnique({ where: { k1 } }) - await prisma.lnAuth.delete({ where: { k1 } }) - if (lnauth.pubkey === pubkey) { - let user = await prisma.user.findUnique({ where: { slashtagId: pubkey } }) - req.headers = parsedHeaders(req) - const session = await getSession({ req }) - if (!user) { - // if we are logged in, update rather than create - if (session?.user) { - user = await prisma.user.update({ where: { id: session.user.id }, data: { slashtagId: pubkey } }) - } else { - user = await prisma.user.create({ data: { name: pubkey.slice(0, 10), slashtagId: pubkey } }) - } - } else if (session && session.user?.id !== user.id) { - throw new Error('account not linked') - } - return user - } - } catch (error) { - console.log(error) - } + return user + } + } catch (error) { + console.log(error) + } - return null + return null +} + +const providers = [ + CredentialsProvider({ + id: 'lightning', + name: 'Lightning', + credentials: { + pubkey: { label: 'publickey', type: 'text' }, + k1: { label: 'k1', type: 'text' } + }, + authorize: async (credentials, req) => await pubkeyAuth(credentials, new NodeNextRequest(req), 'pubkey') + }), + CredentialsProvider({ + id: 'slashtags', + name: 'Slashtags', + credentials: { + pubkey: { label: 'publickey', type: 'text' }, + k1: { label: 'k1', type: 'text' } + }, + authorize: async (credentials, req) => await pubkeyAuth(credentials, new NodeNextRequest(req), 'slashtagId') + }), + GitHubProvider({ + clientId: process.env.GITHUB_ID, + clientSecret: process.env.GITHUB_SECRET, + authorization: { + url: 'https://github.com/login/oauth/authorize', + params: { scope: '' } + }, + profile: profile => { + return { + ...profile, + name: profile.login } - }), - Providers.GitHub({ - clientId: process.env.GITHUB_ID, - clientSecret: process.env.GITHUB_SECRET, - authorization: 'https://github.com/login/oauth/authorize', - scope: '', // read-only acces to public information - profile: profile => { - return { - ...profile, - name: profile.login - } + } + }), + TwitterProvider({ + clientId: process.env.TWITTER_ID, + clientSecret: process.env.TWITTER_SECRET, + profile: profile => { + return { + ...profile, + name: profile.screen_name } - }), - Providers.Twitter({ - clientId: process.env.TWITTER_ID, - clientSecret: process.env.TWITTER_SECRET, - profile: profile => { - return { - ...profile, - name: profile.screen_name - } - } - }), - Providers.Email({ - server: process.env.LOGIN_EMAIL_SERVER, - from: process.env.LOGIN_EMAIL_FROM, - sendVerificationRequest, - profile: profile => { - return profile - } - }) - ], - adapter: PrismaLegacyAdapter({ prisma }), - secret: process.env.NEXTAUTH_SECRET, - session: { jwt: true }, - jwt: { - signingKey: process.env.JWT_SIGNING_PRIVATE_KEY + } + }), + EmailProvider({ + server: process.env.LOGIN_EMAIL_SERVER, + from: process.env.LOGIN_EMAIL_FROM, + sendVerificationRequest + }) +] + +export const getAuthOptions = req => ({ + callbacks: getCallbacks(req), + providers, + adapter: PrismaAdapter(prisma), + session: { + strategy: 'jwt' }, pages: { signIn: '/login', - verifyRequest: '/email' + verifyRequest: '/email', + error: '/auth/error' } }) +export default async (req, res) => { + await NextAuth(req, res, getAuthOptions(req)) +} + async function sendVerificationRequest ({ identifier: email, url, - token, - baseUrl, provider }) { const user = await prisma.user.findUnique({ where: { email } }) return new Promise((resolve, reject) => { const { server, from } = provider - // Strip protocol from URL and use domain as site name - const site = baseUrl.replace(/^https?:\/\//, '') + + const site = new URL(url).host nodemailer.createTransport(server).sendMail( { diff --git a/pages/api/graphql.js b/pages/api/graphql.js index 154b8a34..853da90c 100644 --- a/pages/api/graphql.js +++ b/pages/api/graphql.js @@ -4,7 +4,8 @@ import resolvers from '../../api/resolvers' import models from '../../api/models' import lnd from '../../api/lnd' import typeDefs from '../../api/typeDefs' -import { getSession } from 'next-auth/client' +import { getServerSession } from 'next-auth/next' +import { getAuthOptions } from './auth/[...nextauth]' import search from '../../api/search' import slashtags from '../../api/slashtags' @@ -21,7 +22,7 @@ const apolloServer = new ApolloServer({ return (error, result) => { const end = process.hrtime.bigint() const ms = (end - start) / 1000000n - if (ms > 20 && info.parentType.name !== 'User') { + if (ms > 5) { console.log(`Field ${info.parentType.name}.${info.fieldName} took ${ms}ms`) } if (error) { @@ -42,8 +43,8 @@ const apolloServer = new ApolloServer({ }) export default startServerAndCreateNextHandler(apolloServer, { - context: async (req) => { - const session = await getSession({ req }) + context: async (req, res) => { + const session = await getServerSession(req, res, getAuthOptions(req)) return { models, lnd, diff --git a/pages/api/lnwith.js b/pages/api/lnwith.js index 551c189e..5dc90cba 100644 --- a/pages/api/lnwith.js +++ b/pages/api/lnwith.js @@ -61,7 +61,7 @@ async function doWithdrawal (query, res) { } // create withdrawal in gql - const client = await getSSRApolloClient(null, me) + const client = await getSSRApolloClient({ me }) const { error, data } = await client.mutate({ mutation: CREATE_WITHDRAWL, variables: { invoice: query.pr, maxFee: 10 } diff --git a/pages/api/ots/preimage/[id].js b/pages/api/ots/preimage/[id].js index d87ff73f..05fca508 100644 --- a/pages/api/ots/preimage/[id].js +++ b/pages/api/ots/preimage/[id].js @@ -3,7 +3,7 @@ import { ITEM_OTS } from '../../../../fragments/items' import stringifyCanon from 'canonical-json' export default async function handler (req, res) { - const client = await getSSRApolloClient(req) + const client = await getSSRApolloClient({ req, res }) const { data } = await client.query({ query: ITEM_OTS, variables: { id: req.query.id } diff --git a/pages/auth/error.js b/pages/auth/error.js new file mode 100644 index 00000000..5c714af2 --- /dev/null +++ b/pages/auth/error.js @@ -0,0 +1,63 @@ +import Image from 'react-bootstrap/Image' +import { StaticLayout } from '../../components/layout' +import styles from '../../styles/error.module.css' +import LightningIcon from '../../svgs/bolt.svg' +import { useRouter } from 'next/router' +import Button from 'react-bootstrap/Button' + +export function getServerSideProps ({ query }) { + return { + props: { + error: query.error + } + } +} + +export default function AuthError ({ error }) { + const router = useRouter() + + if (error === 'AccessDenied') { + return ( + + +

ACCESS DENIED

+
+ ) + } else if (error === 'Verification') { + return ( + + +

This magic link has expired.

+

Get another by logging in.

+ +
+ ) + } else if (error === 'Configuration') { + return ( + + +

configuration error

+
+ ) + } + + return ( + + +

auth error

+
+ + ) +} diff --git a/pages/email.js b/pages/email.js index ddddc44a..edba132e 100644 --- a/pages/email.js +++ b/pages/email.js @@ -5,9 +5,9 @@ export default function Email () { return (
-

Check your email

-

A sign in link has been sent to your email address

- + +

Check your email

+

A sign in link has been sent to your email address

) diff --git a/pages/invites/[id].js b/pages/invites/[id].js index 41cad50a..34f523fe 100644 --- a/pages/invites/[id].js +++ b/pages/invites/[id].js @@ -1,5 +1,6 @@ import Login from '../../components/login' -import { providers, getSession } from 'next-auth/client' +import { getProviders } from 'next-auth/react' +import { getServerSession } from 'next-auth/next' import models from '../../api/models' import serialize from '../../api/resolvers/serial' import { gql } from '@apollo/client' @@ -7,11 +8,12 @@ import { INVITE_FIELDS } from '../../fragments/invites' import getSSRApolloClient from '../../api/ssrApollo' import Link from 'next/link' import { CenterLayout } from '../../components/layout' +import { authOptions } from '../api/auth/[...nextauth]' export async function getServerSideProps ({ req, res, query: { id, error = null } }) { - const session = await getSession({ req }) + const session = await getServerSession(req, res, authOptions(req)) - const client = await getSSRApolloClient(req) + const client = await getSSRApolloClient({ req, res }) const { data } = await client.query({ query: gql` ${INVITE_FIELDS} @@ -38,16 +40,17 @@ export async function getServerSideProps ({ req, res, query: { id, error = null console.log(e) } - res.writeHead(302, { - Location: '/' - }) - res.end() - return { props: {} } + return { + redirect: { + destination: '/', + permanent: false + } + } } return { props: { - providers: await providers({ req, res }), + providers: await getProviders(), callbackUrl: process.env.PUBLIC_URL + req.url, invite: data.invite, error diff --git a/pages/login.js b/pages/login.js index 0ab18c90..346d3369 100644 --- a/pages/login.js +++ b/pages/login.js @@ -1,11 +1,13 @@ -import { providers, getSession } from 'next-auth/client' +import { getProviders } from 'next-auth/react' +import { getServerSession } from 'next-auth/next' +import { getAuthOptions } from './api/auth/[...nextauth]' import Link from 'next/link' import { StaticLayout } from '../components/layout' import Login from '../components/login' import { isExternal } from '../lib/url' export async function getServerSideProps ({ req, res, query: { callbackUrl, error = null } }) { - const session = await getSession({ req }) + const session = await getServerSession(req, res, getAuthOptions(req)) // prevent open redirects. See https://github.com/stackernews/stacker.news/issues/264 // let undefined urls through without redirect ... otherwise this interferes with multiple auth linking @@ -20,17 +22,18 @@ export async function getServerSideProps ({ req, res, query: { callbackUrl, erro callbackUrl = '/' } - if (session && res && callbackUrl) { - res.writeHead(302, { - Location: callbackUrl - }) - res.end() - return { props: {} } + if (session && callbackUrl) { + return { + redirect: { + destination: callbackUrl, + permanent: false + } + } } return { props: { - providers: await providers({ req, res }), + providers: await getProviders(), callbackUrl, error } diff --git a/pages/settings.js b/pages/settings.js index 9e5027f5..a742f8a5 100644 --- a/pages/settings.js +++ b/pages/settings.js @@ -7,7 +7,7 @@ import { useState } from 'react' import { gql, useMutation, useQuery } from '@apollo/client' import { getGetServerSideProps } from '../api/ssrApollo' import LoginButton from '../components/login-button' -import { signIn } from 'next-auth/client' +import { signIn } from 'next-auth/react' import { LightningAuth, SlashtagsAuth } from '../components/lightning-auth' import { SETTINGS, SET_SETTINGS } from '../fragments/users' import { useRouter } from 'next/router' @@ -359,7 +359,7 @@ function AuthMethods ({ methods }) { // if there's only one auth method left const links = providers.reduce((t, p) => t + (methods[p] ? 1 : 0), 0) if (links === 1) { - showModal(onClose => ()) + showModal(onClose => ()) } else { await unlinkAuth({ variables: { authType: type } }) } diff --git a/prisma/migrations/20230727184222_next_auth_4/migration.sql b/prisma/migrations/20230727184222_next_auth_4/migration.sql new file mode 100644 index 00000000..5b4eb3b4 --- /dev/null +++ b/prisma/migrations/20230727184222_next_auth_4/migration.sql @@ -0,0 +1,45 @@ +/* + Warnings: + + - You are about to drop the column `compound_id` on the `accounts` table. All the data in the column will be lost. + - The `access_token_expires` column on the `accounts` table would be dropped and recreated. This will lead to data loss if there is data in the column. + - You are about to drop the column `access_token` on the `sessions` table. All the data in the column will be lost. + - A unique constraint covering the columns `[provider_id,provider_account_id]` on the table `accounts` will be added. If there are existing duplicate values, this will fail. + - A unique constraint covering the columns `[identifier,token]` on the table `verification_requests` will be added. If there are existing duplicate values, this will fail. + +*/ +-- DropIndex +DROP INDEX "accounts.compound_id_unique"; + +-- DropIndex +DROP INDEX "accounts.provider_account_id_index"; + +-- DropIndex +DROP INDEX "accounts.provider_id_index"; + +-- DropIndex +DROP INDEX "sessions.access_token_unique"; + +-- AlterTable +ALTER TABLE "accounts" DROP COLUMN "compound_id", +ADD COLUMN "id_token" TEXT, +ADD COLUMN "scope" TEXT, +ADD COLUMN "session_state" TEXT, +ADD COLUMN "token_type" TEXT; + +ALTER TABLE accounts ALTER COLUMN "access_token_expires" TYPE TEXT USING CAST(extract(epoch FROM "access_token_expires") AS BIGINT)*1000; + +-- AlterTable +ALTER TABLE "sessions" DROP COLUMN "access_token"; + +-- CreateIndex +CREATE UNIQUE INDEX "accounts_provider_id_provider_account_id_key" ON "accounts"("provider_id", "provider_account_id"); + +-- CreateIndex +CREATE UNIQUE INDEX "verification_requests_identifier_token_key" ON "verification_requests"("identifier", "token"); + +-- AddForeignKey +ALTER TABLE "accounts" ADD CONSTRAINT "accounts_user_id_fkey" FOREIGN KEY ("user_id") REFERENCES "users"("id") ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "sessions" ADD CONSTRAINT "sessions_user_id_fkey" FOREIGN KEY ("user_id") REFERENCES "users"("id") ON DELETE CASCADE ON UPDATE CASCADE; diff --git a/prisma/schema.prisma b/prisma/schema.prisma index 98dea5c6..095849c2 100644 --- a/prisma/schema.prisma +++ b/prisma/schema.prisma @@ -80,6 +80,8 @@ model User { photo Upload? @relation(fields: [photoId], references: [id]) referrer User? @relation("referrals", fields: [referrerId], references: [id]) referrees User[] @relation("referrals") + Account Account[] + Session Session[] @@index([createdAt], map: "users.created_at_index") @@index([inviteId], map: "users.inviteId_index") @@ -426,37 +428,42 @@ model Withdrawl { } model Account { - id Int @id @default(autoincrement()) - createdAt DateTime @default(now()) @map("created_at") - updatedAt DateTime @updatedAt @map("updated_at") - compoundId String @unique(map: "accounts.compound_id_unique") @map("compound_id") - userId Int @map("user_id") - providerType String @map("provider_type") - providerId String @map("provider_id") - providerAccountId String @map("provider_account_id") - refreshToken String? @map("refresh_token") - accessToken String? @map("access_token") - accessTokenExpires DateTime? @map("access_token_expires") + id Int @id @default(autoincrement()) + createdAt DateTime @default(now()) @map("created_at") + updatedAt DateTime @updatedAt @map("updated_at") + userId Int @map("user_id") + type String @map("provider_type") + provider String @map("provider_id") + providerAccountId String @map("provider_account_id") + refresh_token String? @map("refresh_token") + access_token String? @map("access_token") + expires_at String? @map("access_token_expires") + token_type String? + scope String? + id_token String? + session_state String? - @@index([providerAccountId], map: "accounts.provider_account_id_index") - @@index([providerId], map: "accounts.provider_id_index") + user User @relation(fields: [userId], references: [id], onDelete: Cascade) + + @@unique([provider, providerAccountId]) @@index([userId], map: "accounts.user_id_index") @@map("accounts") } model Session { id Int @id @default(autoincrement()) + sessionToken String @unique(map: "sessions.session_token_unique") @map("session_token") createdAt DateTime @default(now()) @map("created_at") updatedAt DateTime @updatedAt @map("updated_at") userId Int @map("user_id") expires DateTime - sessionToken String @unique(map: "sessions.session_token_unique") @map("session_token") - accessToken String @unique(map: "sessions.access_token_unique") @map("access_token") + + user User @relation(fields: [userId], references: [id], onDelete: Cascade) @@map("sessions") } -model VerificationRequest { +model VerificationToken { id Int @id @default(autoincrement()) createdAt DateTime @default(now()) @map("created_at") updatedAt DateTime @updatedAt @map("updated_at") @@ -464,6 +471,7 @@ model VerificationRequest { token String @unique(map: "verification_requests.token_unique") expires DateTime + @@unique([identifier, token]) @@map("verification_requests") } diff --git a/public/double.gif b/public/double.gif new file mode 100644 index 00000000..ba6861eb Binary files /dev/null and b/public/double.gif differ diff --git a/public/forbidden.gif b/public/forbidden.gif new file mode 100644 index 00000000..5ca06534 Binary files /dev/null and b/public/forbidden.gif differ diff --git a/styles/404.module.css b/styles/404.module.css deleted file mode 100644 index da0d1748..00000000 --- a/styles/404.module.css +++ /dev/null @@ -1,13 +0,0 @@ -.fourZeroFour { - font-family: 'lightning'; - font-size: 96px; - display: flex; - justify-content: space-evenly; - align-items: center; - margin-top: 1rem; - width: 100%; -} - -.notFound { - font-size: 24px; -} \ No newline at end of file diff --git a/styles/error.module.css b/styles/error.module.css index 29594859..014de4b4 100644 --- a/styles/error.module.css +++ b/styles/error.module.css @@ -8,6 +8,10 @@ width: 100%; } +.smaller { + font-size: 48px; +} + .describe { font-size: 24px; } \ No newline at end of file diff --git a/styles/globals.scss b/styles/globals.scss index 0841b564..7c55826f 100644 --- a/styles/globals.scss +++ b/styles/globals.scss @@ -167,6 +167,10 @@ mark { color: #ffffff !important; } +.btn-outline-grey-darkmode:hover, .btn-outline-grey-darkmode:active { + color: #ffffff !important; +} + .table { color: var(--theme-color); background-color: var(--theme-body); diff --git a/worker/index.js b/worker/index.js index 4c593542..0c93ac8e 100644 --- a/worker/index.js +++ b/worker/index.js @@ -1,6 +1,5 @@ const PgBoss = require('pg-boss') -const dotenv = require('dotenv') -dotenv.config({ path: '..' }) +require('@next/env').loadEnvConfig('..') const { PrismaClient } = require('@prisma/client') const { checkInvoice, checkWithdrawal } = require('./wallet') const { repin } = require('./repin')