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 (
-
+
@@ -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
- × Close alert
+ × Close alert
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
- × Close alert
+ × Close alert
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 (
-
-
- 404 page 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 (
-
-
- 500 server 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.
+ router.push('/login')}
+ size='lg'
+ >
+ login
+
+
+ )
+ } 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')