mirror of
https://github.com/SrIzan10/next-auth.git
synced 2026-05-01 10:55:20 +00:00
Compare commits
59 Commits
@auth/core
...
next-auth@
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
26c846594f | ||
|
|
2432ce9001 | ||
|
|
0a689b4f4e | ||
|
|
2fb34bab51 | ||
|
|
d0e7689d07 | ||
|
|
c004659174 | ||
|
|
c212e96f83 | ||
|
|
d41f2a4a02 | ||
|
|
5ecf20a804 | ||
|
|
9e423f3252 | ||
|
|
cf810f246a | ||
|
|
05fe398b1a | ||
|
|
8659c02366 | ||
|
|
2e039643b6 | ||
|
|
3943f9b7b2 | ||
|
|
f2e85c2113 | ||
|
|
c53c868288 | ||
|
|
0bc4fcb51a | ||
|
|
139c2edb50 | ||
|
|
4e94d89554 | ||
|
|
43d66fcb23 | ||
|
|
bfcf1a3604 | ||
|
|
5b1555ed97 | ||
|
|
0ed07b31b6 | ||
|
|
2311be7589 | ||
|
|
e847b3466f | ||
|
|
8df6d5b469 | ||
|
|
0bcaeca369 | ||
|
|
4f5ddbcb76 | ||
|
|
0cbeb4055e | ||
|
|
5a128db369 | ||
|
|
c385cf8c7c | ||
|
|
53fa46744c | ||
|
|
451eaaabd2 | ||
|
|
f54424c216 | ||
|
|
09bcc1d504 | ||
|
|
6ecf9cb93d | ||
|
|
ba2711d279 | ||
|
|
03881bf98f | ||
|
|
230164f751 | ||
|
|
fecf5e0a1c | ||
|
|
400d0f1842 | ||
|
|
39657bf06c | ||
|
|
d1dd8d95c4 | ||
|
|
554ec439c9 | ||
|
|
8e4db3899a | ||
|
|
444b99ee96 | ||
|
|
f12b527300 | ||
|
|
ac48211967 | ||
|
|
2bd60f6626 | ||
|
|
a83573ed2f | ||
|
|
6242aa7ecb | ||
|
|
54cbbadc8f | ||
|
|
fd4af6512e | ||
|
|
6482e359b7 | ||
|
|
64aac2efc0 | ||
|
|
df37a24c23 | ||
|
|
8bcdf8e818 | ||
|
|
dd765a1b45 |
41
.eslintrc.js
Normal file
41
.eslintrc.js
Normal file
@@ -0,0 +1,41 @@
|
|||||||
|
const path = require("path")
|
||||||
|
|
||||||
|
module.exports = {
|
||||||
|
root: true,
|
||||||
|
parser: "@typescript-eslint/parser",
|
||||||
|
overrides: [
|
||||||
|
{
|
||||||
|
files: ["*.ts", "*.tsx"],
|
||||||
|
extends: ["standard-with-typescript", "prettier"],
|
||||||
|
rules: {
|
||||||
|
camelcase: "off",
|
||||||
|
"@typescript-eslint/naming-convention": "off",
|
||||||
|
"@typescript-eslint/strict-boolean-expressions": "off",
|
||||||
|
"@typescript-eslint/explicit-function-return-type": "off",
|
||||||
|
"@typescript-eslint/restrict-template-expressions": "off",
|
||||||
|
},
|
||||||
|
|
||||||
|
parserOptions: {
|
||||||
|
project: [
|
||||||
|
path.resolve(__dirname, "./packages/**/tsconfig.eslint.json"),
|
||||||
|
path.resolve(__dirname, "./packages/frameworks/**/tsconfig.json"),
|
||||||
|
path.resolve(__dirname, "./apps/**/tsconfig.json"),
|
||||||
|
],
|
||||||
|
},
|
||||||
|
},
|
||||||
|
],
|
||||||
|
extends: ["prettier"],
|
||||||
|
globals: {
|
||||||
|
localStorage: "readonly",
|
||||||
|
location: "readonly",
|
||||||
|
fetch: "readonly",
|
||||||
|
},
|
||||||
|
rules: {
|
||||||
|
camelcase: "off",
|
||||||
|
},
|
||||||
|
plugins: ["jest"],
|
||||||
|
env: {
|
||||||
|
"jest/globals": true,
|
||||||
|
},
|
||||||
|
ignorePatterns: [".eslintrc.js"],
|
||||||
|
}
|
||||||
2
.github/ISSUE_TEMPLATE/1_bug_framework.yml
vendored
2
.github/ISSUE_TEMPLATE/1_bug_framework.yml
vendored
@@ -30,7 +30,7 @@ body:
|
|||||||
Run this command in your project's root folder and paste the result:
|
Run this command in your project's root folder and paste the result:
|
||||||
|
|
||||||
```sh
|
```sh
|
||||||
npx envinfo --system --binaries --browsers --npmPackages "next,react,next-auth,@auth/*"
|
npx envinfo --system --binaries --browsers --npmPackages "next,react,next-auth"
|
||||||
```
|
```
|
||||||
Alternatively, you can manually gather the version information from your package.json for these packages: "next", "react" and "next-auth". Please also mention your OS and Node.js version, as well as the browser you are using.
|
Alternatively, you can manually gather the version information from your package.json for these packages: "next", "react" and "next-auth". Please also mention your OS and Node.js version, as well as the browser you are using.
|
||||||
validations:
|
validations:
|
||||||
|
|||||||
5
.github/ISSUE_TEMPLATE/2_bug_provider.yml
vendored
5
.github/ISSUE_TEMPLATE/2_bug_provider.yml
vendored
@@ -25,14 +25,12 @@ body:
|
|||||||
- "Custom provider"
|
- "Custom provider"
|
||||||
- "42 School"
|
- "42 School"
|
||||||
- "Apple"
|
- "Apple"
|
||||||
- "Asgardeo"
|
|
||||||
- "Atlassian"
|
- "Atlassian"
|
||||||
- "Auth0"
|
- "Auth0"
|
||||||
- "Authentik"
|
- "Authentik"
|
||||||
- "Azure Active Directory"
|
- "Azure Active Directory"
|
||||||
- "Azure Active Directory B2C"
|
- "Azure Active Directory B2C"
|
||||||
- "Battlenet"
|
- "Battlenet"
|
||||||
- "Beyond Identity"
|
|
||||||
- "Box"
|
- "Box"
|
||||||
- "Bungie"
|
- "Bungie"
|
||||||
- "Cognito"
|
- "Cognito"
|
||||||
@@ -59,7 +57,6 @@ body:
|
|||||||
- "Medium"
|
- "Medium"
|
||||||
- "Naver"
|
- "Naver"
|
||||||
- "Netlify"
|
- "Netlify"
|
||||||
- "Notion"
|
|
||||||
- "Okta"
|
- "Okta"
|
||||||
- "OneLogin"
|
- "OneLogin"
|
||||||
- "Osso"
|
- "Osso"
|
||||||
@@ -90,7 +87,7 @@ body:
|
|||||||
Run this command in your project's root folder and paste the result:
|
Run this command in your project's root folder and paste the result:
|
||||||
|
|
||||||
```sh
|
```sh
|
||||||
npx envinfo --system --binaries --browsers --npmPackages "next,react,next-auth,@auth/*"
|
npx envinfo --system --binaries --browsers --npmPackages "next,react,next-auth"
|
||||||
```
|
```
|
||||||
Alternatively, you can manually gather the version information from your package.json for these packages: "next", "react" and "next-auth". Please also mention your OS and Node.js version, as well as the browser you are using.
|
Alternatively, you can manually gather the version information from your package.json for these packages: "next", "react" and "next-auth". Please also mention your OS and Node.js version, as well as the browser you are using.
|
||||||
validations:
|
validations:
|
||||||
|
|||||||
6
.github/ISSUE_TEMPLATE/3_bug_adapter.yml
vendored
6
.github/ISSUE_TEMPLATE/3_bug_adapter.yml
vendored
@@ -29,10 +29,10 @@ body:
|
|||||||
- "@next-auth/mongodb-adapter"
|
- "@next-auth/mongodb-adapter"
|
||||||
- "@next-auth/neo4j-adapter"
|
- "@next-auth/neo4j-adapter"
|
||||||
- "@next-auth/pouchdb-adapter"
|
- "@next-auth/pouchdb-adapter"
|
||||||
- "@auth/prisma-adapter"
|
- "@next-auth/prisma-adapter"
|
||||||
- "@next-auth/sequelize-adapter"
|
- "@next-auth/sequelize-adapter"
|
||||||
- "@next-auth/supabase-adapter"
|
- "@next-auth/supabase-adapter"
|
||||||
- "@auth/typeorm-adapter"
|
- "@next-auth/typeorm-legacy-adapter"
|
||||||
- "@next-auth/upstash-redis-adapter"
|
- "@next-auth/upstash-redis-adapter"
|
||||||
- "@next-auth/xata-adapter"
|
- "@next-auth/xata-adapter"
|
||||||
validations:
|
validations:
|
||||||
@@ -44,7 +44,7 @@ body:
|
|||||||
Run this command in your project's root folder and paste the result:
|
Run this command in your project's root folder and paste the result:
|
||||||
|
|
||||||
```sh
|
```sh
|
||||||
npx envinfo --system --binaries --browsers --npmPackages "next,react,next-auth,@auth/*" && npx envinfo --npmPackages "@next-auth/*"
|
npx envinfo --system --binaries --browsers --npmPackages "next,react,next-auth" && npx envinfo --npmPackages "@next-auth/*"
|
||||||
```
|
```
|
||||||
Alternatively, if the above command did not work, we need the version of the following packages from your package.json: "next", "react", "next-auth" and your adapter. Please also mention your OS and Node.js version, as well as the browser you are using.
|
Alternatively, if the above command did not work, we need the version of the following packages from your package.json: "next", "react", "next-auth" and your adapter. Please also mention your OS and Node.js version, as well as the browser you are using.
|
||||||
validations:
|
validations:
|
||||||
|
|||||||
2
.github/ISSUE_TEMPLATE/config.yml
vendored
2
.github/ISSUE_TEMPLATE/config.yml
vendored
@@ -1 +1 @@
|
|||||||
blank_issues_enabled: false
|
blank_issues_enabled: false
|
||||||
8
.github/PULL_REQUEST_TEMPLATE.md
vendored
8
.github/PULL_REQUEST_TEMPLATE.md
vendored
@@ -8,7 +8,7 @@ merge of your pull request!
|
|||||||
> _NOTE_:
|
> _NOTE_:
|
||||||
>
|
>
|
||||||
> - It's a good idea to open an issue first to discuss potential changes.
|
> - It's a good idea to open an issue first to discuss potential changes.
|
||||||
> - Please make sure that you are _NOT_ opening a PR to fix a potential security vulnerability. Instead, please follow the [Security guidelines](https://github.com/nextauthjs/.github/blob/main/SECURITY.md) to disclose the issue to us confidentially.
|
> - Please make sure that you are _NOT_ opening a PR to fix a potential security vulnerability. Instead, please follow the [Security guidelines](../Security.md) to disclose the issue to us confidentially.
|
||||||
|
|
||||||
## ☕️ Reasoning
|
## ☕️ Reasoning
|
||||||
|
|
||||||
@@ -28,7 +28,7 @@ Fixes: INSERT_ISSUE_LINK_HERE
|
|||||||
|
|
||||||
## 📌 Resources
|
## 📌 Resources
|
||||||
|
|
||||||
- [Security guidelines](https://github.com/nextauthjs/.github/blob/main/SECURITY.md)
|
- [Security guidelines](../Security.md)
|
||||||
- [Contributing guidelines](https://github.com/nextauthjs/.github/blob/main/CONTRIBUTING.md)
|
- [Contributing guidelines](../CONTRIBUTING.md)
|
||||||
- [Code of conduct](https://github.com/nextauthjs/.github/blob/main/CODE_OF_CONDUCT.md)
|
- [Code of conduct](../CODE_OF_CONDUCT.md)
|
||||||
- [Contributing to Open Source](https://kcd.im/pull-request)
|
- [Contributing to Open Source](https://kcd.im/pull-request)
|
||||||
|
|||||||
2
.github/actions/issue-validator/index.mjs
vendored
2
.github/actions/issue-validator/index.mjs
vendored
File diff suppressed because one or more lines are too long
3
.github/actions/issue-validator/licenses.txt
vendored
3
.github/actions/issue-validator/licenses.txt
vendored
@@ -526,7 +526,7 @@ IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
|||||||
root
|
root
|
||||||
ISC License
|
ISC License
|
||||||
|
|
||||||
Copyright (c) 2022-2023, Balázs Orbán
|
Copyright (c) 2018-2021, Iain Collins
|
||||||
|
|
||||||
Permission to use, copy, modify, and/or distribute this software for any
|
Permission to use, copy, modify, and/or distribute this software for any
|
||||||
purpose with or without fee is hereby granted, provided that the above
|
purpose with or without fee is hereby granted, provided that the above
|
||||||
@@ -540,7 +540,6 @@ WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
|
|||||||
ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
|
ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
|
||||||
OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||||
|
|
||||||
|
|
||||||
tr46
|
tr46
|
||||||
MIT
|
MIT
|
||||||
|
|
||||||
|
|||||||
5
.github/actions/issue-validator/repro.md
vendored
5
.github/actions/issue-validator/repro.md
vendored
@@ -14,9 +14,9 @@ Ensure the link is pointing to a codebase that is accessible (e.g. not a private
|
|||||||
|
|
||||||
### **What happens if I don't provide a sufficient minimal reproduction?**
|
### **What happens if I don't provide a sufficient minimal reproduction?**
|
||||||
|
|
||||||
Issues with the `incomplete` label that receives no meaningful activity (e.g. new comments with a reproduction link) are closed after 7 days.
|
Issues with the `incomplete` label that receives no meaningful activity (e.g. new comments with a reproduction link) are automatically closed and locked after 30 days.
|
||||||
|
|
||||||
If your issue has _not_ been resolved in that time and it has been closed/locked, please open a new issue with the required reproduction. (It's less likely that we check back on already closed issues.)
|
If your issue has _not_ been resolved in that time and it has been closed/locked, please open a new issue with the required reproduction.
|
||||||
|
|
||||||
### **I did not open this issue, but it is relevant to me, what can I do to help?**
|
### **I did not open this issue, but it is relevant to me, what can I do to help?**
|
||||||
|
|
||||||
@@ -35,3 +35,4 @@ Upvoting issues to show your interest will help us prioritize and address them a
|
|||||||
- [How to create a Minimal, Complete, and Verifiable example](https://stackoverflow.com/help/mcve)
|
- [How to create a Minimal, Complete, and Verifiable example](https://stackoverflow.com/help/mcve)
|
||||||
- [Reporting a NextAuth.js bug](https://github.com/nextauthjs/next-auth/blob/main/.github/ISSUE_TEMPLATE/1_bug_framework.yml)
|
- [Reporting a NextAuth.js bug](https://github.com/nextauthjs/next-auth/blob/main/.github/ISSUE_TEMPLATE/1_bug_framework.yml)
|
||||||
- [How to Contribute to Open Source (Next.js)](https://www.youtube.com/watch?v=cuoNzXFLitc)
|
- [How to Contribute to Open Source (Next.js)](https://www.youtube.com/watch?v=cuoNzXFLitc)
|
||||||
|
|
||||||
|
|||||||
@@ -7,6 +7,8 @@ import { readFileSync } from "node:fs"
|
|||||||
import { join } from "node:path"
|
import { join } from "node:path"
|
||||||
|
|
||||||
const addReproductionLabel = "incomplete"
|
const addReproductionLabel = "incomplete"
|
||||||
|
const __dirname =
|
||||||
|
"/home/runner/work/nextauthjs/next-auth/.github/actions/issue-validator"
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @typedef {{
|
* @typedef {{
|
||||||
@@ -71,12 +73,7 @@ async function run() {
|
|||||||
}),
|
}),
|
||||||
client.issues.createComment({
|
client.issues.createComment({
|
||||||
...issueCommon,
|
...issueCommon,
|
||||||
body: readFileSync(
|
body: readFileSync(join(__dirname, "repro.md"), "utf8"),
|
||||||
join(
|
|
||||||
"/home/runner/work/next-auth/next-auth/.github/actions/issue-validator/repro.md"
|
|
||||||
),
|
|
||||||
"utf8"
|
|
||||||
),
|
|
||||||
}),
|
}),
|
||||||
])
|
])
|
||||||
return core.info(
|
return core.info(
|
||||||
|
|||||||
6
.github/issue-labeler.yml
vendored
6
.github/issue-labeler.yml
vendored
@@ -25,7 +25,7 @@ pouchdb:
|
|||||||
- "@next-auth/pouchdb-adapter"
|
- "@next-auth/pouchdb-adapter"
|
||||||
|
|
||||||
prisma:
|
prisma:
|
||||||
- "@auth/prisma-adapter"
|
- "@next-auth/prisma-adapter"
|
||||||
|
|
||||||
sequelize:
|
sequelize:
|
||||||
- "@next-auth/sequelize-adapter"
|
- "@next-auth/sequelize-adapter"
|
||||||
@@ -33,8 +33,8 @@ sequelize:
|
|||||||
supabase:
|
supabase:
|
||||||
- "@next-auth/supabase-adapter"
|
- "@next-auth/supabase-adapter"
|
||||||
|
|
||||||
typeorm:
|
typeorm-legacy:
|
||||||
- "@auth/typeorm-adapter"
|
- "@next-auth/typeorm-legacy-adapter"
|
||||||
|
|
||||||
upstash-redis:
|
upstash-redis:
|
||||||
- "@next-auth/upstash-redis-adapter"
|
- "@next-auth/upstash-redis-adapter"
|
||||||
|
|||||||
98
.github/pr-labeler.yml
vendored
98
.github/pr-labeler.yml
vendored
@@ -1,26 +1,74 @@
|
|||||||
# https://github.com/actions/labeler#create-githublabeleryml
|
# https://github.com/actions/labeler#create-githublabeleryml
|
||||||
adapters: ["packages/core/src/adapters.ts", "packages/adapter-*/**/*"]
|
|
||||||
core: ["packages/core/src/**/*"]
|
test:
|
||||||
dgraph: ["packages/adapter-dgraph/**/*"]
|
- test/**/*
|
||||||
documentation: ["packages/docs/docs/**/*"]
|
- types/tests/**/*
|
||||||
dynamodb: ["packages/adapter-dynamodb/**/*"]
|
|
||||||
examples: ["apps/examples/**/*"]
|
providers:
|
||||||
fauna: ["packages/adapter-fauna/**/*"]
|
- packages/next-auth/src/providers/**/*
|
||||||
firebase: ["packages/adapter-firebase/**/*"]
|
- test/integration/**/*
|
||||||
frameworks: ["packages/frameworks-*/**/*"]
|
|
||||||
legacy: ["packages/next-auth/**/*"]
|
adapters:
|
||||||
mikro-orm: ["packages/adapter-mikro-orm/**/*"]
|
- packages/next-auth/src/adapters.ts
|
||||||
mongodb: ["packages/adapter-mongodb/**/*"]
|
- packages/adapter-*/**
|
||||||
neo4j: ["packages/adapter-neo4j/**/*"]
|
|
||||||
playgrounds: ["apps/playgrounds/**/*"]
|
dgraph:
|
||||||
pouchdb: ["packages/adapter-pouchdb/**/*"]
|
- packages/adapter-dgraph/**
|
||||||
prisma: ["packages/adapter-prisma/**/*"]
|
|
||||||
providers: ["packages/core/src/providers/**/*"]
|
dynamodb:
|
||||||
sequelize: ["packages/adapter-sequelize/**/*"]
|
- packages/adapter-dynamodb/**
|
||||||
solidjs: ["packages/frameworks-solid-start/**/*"]
|
|
||||||
supabase: ["packages/adapter-supabase/**/*"]
|
fauna:
|
||||||
svelte: ["packages/frameworks-sveltekit/**/*"]
|
- packages/adapter-fauna/**
|
||||||
test: ["**test**/*"]
|
|
||||||
typeorm: ["packages/adapter-typeorm/**/*"]
|
firebase:
|
||||||
upstash-redis: ["packages/adapter-upstash-redis/**/*"]
|
- packages/adapter-firebase/**
|
||||||
xata: ["packages/adapter-xata/**/*"]
|
|
||||||
|
mikro-orm:
|
||||||
|
- packages/adapter-mikro-orm/**
|
||||||
|
|
||||||
|
mongodb:
|
||||||
|
- packages/adapter-mongodb/**
|
||||||
|
|
||||||
|
neo4j:
|
||||||
|
- packages/adapter-neo4j/**
|
||||||
|
|
||||||
|
pouchdb:
|
||||||
|
- packages/adapter-pouchdb/**
|
||||||
|
|
||||||
|
prisma:
|
||||||
|
- packages/adapter-prisma/**
|
||||||
|
|
||||||
|
sequelize:
|
||||||
|
- packages/adapter-sequelize/**
|
||||||
|
|
||||||
|
supabase:
|
||||||
|
- packages/adapter-supabase/**
|
||||||
|
|
||||||
|
typeorm-legacy:
|
||||||
|
- packages/adapter-typeorm-legacy/**
|
||||||
|
|
||||||
|
upstash-redis:
|
||||||
|
- packages/adapter-upstash-redis/**
|
||||||
|
|
||||||
|
xata:
|
||||||
|
- packages/adapter-xata/**
|
||||||
|
|
||||||
|
core:
|
||||||
|
- packages/next-auth/src/**/*
|
||||||
|
|
||||||
|
style:
|
||||||
|
- packages/next-auth/src/css/**/*
|
||||||
|
|
||||||
|
client:
|
||||||
|
- packages/next-auth/src/client/**/*
|
||||||
|
- packages/next-auth/src/react/**/*
|
||||||
|
|
||||||
|
pages:
|
||||||
|
- packages/next-auth/src/core/pages/**/*
|
||||||
|
|
||||||
|
TypeScript:
|
||||||
|
- packages/next-auth/src/**/types.ts
|
||||||
|
|
||||||
|
documentation:
|
||||||
|
- packages/docs/docs/**/*
|
||||||
|
|||||||
24
.github/sync.yml
vendored
24
.github/sync.yml
vendored
@@ -1,26 +1,6 @@
|
|||||||
nextauthjs/sveltekit-auth-example:
|
# This is a legacy example pushed from the v4 branch
|
||||||
- source: apps/examples/sveltekit
|
|
||||||
dest: .
|
|
||||||
deleteOrphaned: true
|
|
||||||
- .github/FUNDING.yml
|
|
||||||
- LICENSE
|
|
||||||
|
|
||||||
nextauthjs/solid-start-auth-example:
|
|
||||||
- source: "apps/examples/solid-start"
|
|
||||||
dest: .
|
|
||||||
deleteOrphaned: true
|
|
||||||
- .github/FUNDING.yml
|
|
||||||
- LICENSE
|
|
||||||
|
|
||||||
nextauthjs/next-auth-gatsby-example:
|
|
||||||
- source: apps/playgrounds/gatsby
|
|
||||||
dest: .
|
|
||||||
deleteOrphaned: true
|
|
||||||
- .github/FUNDING.yml
|
|
||||||
- LICENSE
|
|
||||||
|
|
||||||
nextauthjs/next-auth-example:
|
nextauthjs/next-auth-example:
|
||||||
- source: apps/examples/nextjs
|
- source: apps/example-nextjs
|
||||||
dest: .
|
dest: .
|
||||||
deleteOrphaned: true
|
deleteOrphaned: true
|
||||||
- .github/FUNDING.yml
|
- .github/FUNDING.yml
|
||||||
|
|||||||
9
.github/version-pr/index.js
vendored
9
.github/version-pr/index.js
vendored
@@ -5,15 +5,14 @@ const core = require("@actions/core")
|
|||||||
try {
|
try {
|
||||||
const packageJSONPath = path.join(
|
const packageJSONPath = path.join(
|
||||||
process.cwd(),
|
process.cwd(),
|
||||||
`packages/${process.env.PACKAGE_PATH || "next-auth"}/package.json`
|
"packages/next-auth/package.json"
|
||||||
)
|
)
|
||||||
const packageJSON = JSON.parse(fs.readFileSync(packageJSONPath, "utf8"))
|
const packageJSON = JSON.parse(fs.readFileSync(packageJSONPath, "utf8"))
|
||||||
|
|
||||||
const sha8 = process.env.GITHUB_SHA.substring(0, 8)
|
const sha8 = process.env.GITHUB_SHA.substring(0, 8)
|
||||||
const prefix = "0.0.0-"
|
const prNumber = process.env.PR_NUMBER
|
||||||
const pr = process.env.PR_NUMBER
|
|
||||||
const source = pr ? `pr.${pr}` : "manual"
|
const packageVersion = `0.0.0-pr.${prNumber}.${sha8}`
|
||||||
const packageVersion = `${prefix}${source}.${sha8}`
|
|
||||||
packageJSON.version = packageVersion
|
packageJSON.version = packageVersion
|
||||||
core.setOutput("version", packageVersion)
|
core.setOutput("version", packageVersion)
|
||||||
fs.writeFileSync(packageJSONPath, JSON.stringify(packageJSON))
|
fs.writeFileSync(packageJSONPath, JSON.stringify(packageJSON))
|
||||||
|
|||||||
6
.github/workflows/issue-validator.yml
vendored
6
.github/workflows/issue-validator.yml
vendored
@@ -11,7 +11,7 @@ jobs:
|
|||||||
- uses: actions/setup-node@v3
|
- uses: actions/setup-node@v3
|
||||||
with:
|
with:
|
||||||
node-version: 18
|
node-version: 18
|
||||||
- name: Run issue validator
|
- name: 'Run issue validator'
|
||||||
run: node /home/runner/work/next-auth/next-auth/.github/actions/issue-validator/index.mjs
|
run: node ./.github/actions/issue-validator/index.mjs
|
||||||
env:
|
env:
|
||||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||||
145
.github/workflows/release.yml
vendored
145
.github/workflows/release.yml
vendored
@@ -3,59 +3,12 @@ name: Release
|
|||||||
on:
|
on:
|
||||||
push:
|
push:
|
||||||
branches:
|
branches:
|
||||||
- main
|
- "main"
|
||||||
- beta
|
- "beta"
|
||||||
- next
|
- "next"
|
||||||
- 3.x
|
- "3.x"
|
||||||
|
- "v4"
|
||||||
pull_request:
|
pull_request:
|
||||||
# TODO: Support latest releases
|
|
||||||
workflow_dispatch:
|
|
||||||
inputs:
|
|
||||||
name:
|
|
||||||
type: choice
|
|
||||||
description: Package name (npm)
|
|
||||||
options:
|
|
||||||
- "@auth/core"
|
|
||||||
- "@auth/nextjs"
|
|
||||||
- "@auth/dgraph-adapter"
|
|
||||||
- "@auth/drizzle-adapter"
|
|
||||||
- "@auth/dynamodb-adapter"
|
|
||||||
- "@auth/fauna-adapter"
|
|
||||||
- "@auth/firebase-adapter"
|
|
||||||
- "@auth/mikro-orm-adapter"
|
|
||||||
- "@auth/mongodb-adapter"
|
|
||||||
- "@auth/neo4j-adapter"
|
|
||||||
- "@auth/pouchdb-adapter"
|
|
||||||
- "@auth/prisma-adapter"
|
|
||||||
- "@auth/sequelize-adapter"
|
|
||||||
- "@auth/supabase-adapter"
|
|
||||||
- "@auth/typeorm-adapter"
|
|
||||||
- "@auth/upstash-redis-adapter"
|
|
||||||
- "@auth/xata-adapter"
|
|
||||||
- "next-auth"
|
|
||||||
# TODO: Infer from package name
|
|
||||||
path:
|
|
||||||
type: choice
|
|
||||||
description: Directory name (packages/*)
|
|
||||||
options:
|
|
||||||
- "core"
|
|
||||||
- "frameworks-nextjs"
|
|
||||||
- "adapter-dgraph"
|
|
||||||
- "adapter-drizzle"
|
|
||||||
- "adapter-dynamodb"
|
|
||||||
- "adapter-fauna"
|
|
||||||
- "adapter-firebase"
|
|
||||||
- "adapter-mikro-orm"
|
|
||||||
- "adapter-mongodb"
|
|
||||||
- "adapter-neo4j"
|
|
||||||
- "adapter-pouchdb"
|
|
||||||
- "adapter-prisma"
|
|
||||||
- "adapter-sequelize"
|
|
||||||
- "adapter-supabase"
|
|
||||||
- "adapter-typeorm"
|
|
||||||
- "adapter-upstash-redis"
|
|
||||||
- "adapter-xata"
|
|
||||||
- "next-auth"
|
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
test:
|
test:
|
||||||
@@ -68,6 +21,8 @@ jobs:
|
|||||||
fetch-depth: 2
|
fetch-depth: 2
|
||||||
- name: Install pnpm
|
- name: Install pnpm
|
||||||
uses: pnpm/action-setup@v2.2.4
|
uses: pnpm/action-setup@v2.2.4
|
||||||
|
with:
|
||||||
|
version: 7.5.1
|
||||||
- name: Setup Node
|
- name: Setup Node
|
||||||
uses: actions/setup-node@v3
|
uses: actions/setup-node@v3
|
||||||
with:
|
with:
|
||||||
@@ -75,30 +30,13 @@ jobs:
|
|||||||
cache: "pnpm"
|
cache: "pnpm"
|
||||||
- name: Install dependencies
|
- name: Install dependencies
|
||||||
run: pnpm install
|
run: pnpm install
|
||||||
|
- name: Build
|
||||||
|
run: pnpm build
|
||||||
- name: Run tests
|
- name: Run tests
|
||||||
run: pnpm test
|
run: pnpm test
|
||||||
timeout-minutes: 15
|
|
||||||
env:
|
env:
|
||||||
UPSTASH_REDIS_URL: ${{ secrets.UPSTASH_REDIS_URL }}
|
UPSTASH_REDIS_URL: ${{ secrets.UPSTASH_REDIS_URL }}
|
||||||
UPSTASH_REDIS_KEY: ${{ secrets.UPSTASH_REDIS_KEY }}
|
UPSTASH_REDIS_KEY: ${{ secrets.UPSTASH_REDIS_KEY }}
|
||||||
TURBO_TOKEN: ${{ secrets.TURBO_TOKEN }}
|
|
||||||
TURBO_TEAM: ${{ secrets.TURBO_TEAM }}
|
|
||||||
# - name: Run E2E tests
|
|
||||||
# if: github.repository == 'nextauthjs/next-auth'
|
|
||||||
# run: pnpm e2e
|
|
||||||
# timeout-minutes: 15
|
|
||||||
# env:
|
|
||||||
# AUTH0_USERNAME: ${{ secrets.AUTH0_USERNAME }}
|
|
||||||
# AUTH0_PASSWORD: ${{ secrets.AUTH0_PASSWORD }}
|
|
||||||
# TURBO_TOKEN: ${{ secrets.TURBO_TOKEN }}
|
|
||||||
# TURBO_TEAM: ${{ secrets.TURBO_TEAM }}
|
|
||||||
# - name: Upload E2E artifacts
|
|
||||||
# if: github.repository == 'nextauthjs/next-auth'
|
|
||||||
# uses: actions/upload-artifact@v3
|
|
||||||
# with:
|
|
||||||
# name: playwright-report
|
|
||||||
# path: apps/dev/nextjs/playwright-report/
|
|
||||||
# retention-days: 30
|
|
||||||
# - name: Coverage
|
# - name: Coverage
|
||||||
# uses: codecov/codecov-action@v1
|
# uses: codecov/codecov-action@v1
|
||||||
# with:
|
# with:
|
||||||
@@ -115,9 +53,10 @@ jobs:
|
|||||||
uses: actions/checkout@v3
|
uses: actions/checkout@v3
|
||||||
with:
|
with:
|
||||||
fetch-depth: 0
|
fetch-depth: 0
|
||||||
token: ${{ secrets.GH_PAT_CLASSIC }}
|
|
||||||
- name: Install pnpm
|
- name: Install pnpm
|
||||||
uses: pnpm/action-setup@v2.2.4
|
uses: pnpm/action-setup@v2.2.4
|
||||||
|
with:
|
||||||
|
version: 7.5.1
|
||||||
- name: Setup Node
|
- name: Setup Node
|
||||||
uses: actions/setup-node@v3
|
uses: actions/setup-node@v3
|
||||||
with:
|
with:
|
||||||
@@ -126,12 +65,15 @@ jobs:
|
|||||||
- name: Install dependencies
|
- name: Install dependencies
|
||||||
run: pnpm install
|
run: pnpm install
|
||||||
- name: Publish to npm and GitHub
|
- name: Publish to npm and GitHub
|
||||||
run: pnpm release
|
run: |
|
||||||
|
git config --global user.email "balazsorban44@users.noreply.github.com"
|
||||||
|
git config --global user.name "Balázs Orbán"
|
||||||
|
pnpm release
|
||||||
env:
|
env:
|
||||||
# Use GH_PAT when this is fixed:
|
RELEASE_TOKEN: ${{ secrets.RELEASE_TOKEN }}
|
||||||
# https://github.com/github/roadmap/issues/622
|
GITHUB_TOKEN: ${{ secrets.RELEASE_TOKEN }}
|
||||||
GITHUB_TOKEN: ${{ secrets.GH_PAT_CLASSIC }}
|
NPM_TOKEN_PKG: ${{ secrets.NPM_TOKEN_PKG }}
|
||||||
NPM_TOKEN: ${{ secrets.NPM_TOKEN }}
|
NPM_TOKEN_ORG: ${{ secrets.NPM_TOKEN_ORG }}
|
||||||
release-pr:
|
release-pr:
|
||||||
name: Publish PR
|
name: Publish PR
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
@@ -143,6 +85,8 @@ jobs:
|
|||||||
uses: actions/checkout@v3
|
uses: actions/checkout@v3
|
||||||
- name: Install pnpm
|
- name: Install pnpm
|
||||||
uses: pnpm/action-setup@v2.2.4
|
uses: pnpm/action-setup@v2.2.4
|
||||||
|
with:
|
||||||
|
version: 7.5.1
|
||||||
- name: Setup Node
|
- name: Setup Node
|
||||||
uses: actions/setup-node@v3
|
uses: actions/setup-node@v3
|
||||||
with:
|
with:
|
||||||
@@ -157,52 +101,19 @@ jobs:
|
|||||||
PR_NUMBER: ${{ github.event.number }}
|
PR_NUMBER: ${{ github.event.number }}
|
||||||
- name: Publish to npm
|
- name: Publish to npm
|
||||||
run: |
|
run: |
|
||||||
cd packages/core
|
cd packages/next-auth
|
||||||
echo "//registry.npmjs.org/:_authToken=$NPM_TOKEN" >> .npmrc
|
echo "//registry.npmjs.org/:_authToken=$NPM_TOKEN" >> .npmrc
|
||||||
pnpm publish --no-git-checks --access public --tag experimental
|
pnpm publish --no-git-checks --access public --tag experimental
|
||||||
env:
|
env:
|
||||||
NPM_TOKEN: ${{ secrets.NPM_TOKEN }}
|
NPM_TOKEN: ${{ secrets.NPM_TOKEN_PKG }}
|
||||||
- name: Comment version on PR
|
- name: Comment version on PR
|
||||||
uses: NejcZdovc/comment-pr@v2
|
uses: NejcZdovc/comment-pr@v2
|
||||||
with:
|
with:
|
||||||
message:
|
message:
|
||||||
"🎉 Experimental release [published 📦️ on npm](https://npmjs.com/package/@auth/core/v/${{ env.VERSION }})!\n \
|
"🎉 Experimental release [published 📦️ on npm](https://npmjs.com/package/next-auth/v/${{ env.VERSION }})!\n \
|
||||||
```sh\npnpm add @auth/core@${{ env.VERSION }}\n```\n \
|
```sh\npnpm add next-auth@${{ env.VERSION }}\n```\n \
|
||||||
```sh\nyarn add @auth/core@${{ env.VERSION }}\n```\n \
|
```sh\nyarn add next-auth@${{ env.VERSION }}\n```\n \
|
||||||
```sh\nnpm i @auth/core@${{ env.VERSION }}\n```"
|
```sh\nnpm i next-auth@${{ env.VERSION }}\n```"
|
||||||
env:
|
env:
|
||||||
VERSION: ${{ steps.determine-version.outputs.version }}
|
VERSION: ${{ steps.determine-version.outputs.version }}
|
||||||
GITHUB_TOKEN: ${{ secrets.GH_PAT }}
|
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||||
release-manual:
|
|
||||||
name: Publish manually
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
if: ${{ github.event_name == 'workflow_dispatch' }}
|
|
||||||
steps:
|
|
||||||
- name: Init
|
|
||||||
uses: actions/checkout@v3
|
|
||||||
- name: Install pnpm
|
|
||||||
uses: pnpm/action-setup@v2.2.4
|
|
||||||
- name: Setup Node
|
|
||||||
uses: actions/setup-node@v3
|
|
||||||
with:
|
|
||||||
node-version: 18
|
|
||||||
cache: "pnpm"
|
|
||||||
- name: Install dependencies
|
|
||||||
run: pnpm install
|
|
||||||
- name: Determine version
|
|
||||||
uses: ./.github/version-pr
|
|
||||||
id: determine-version
|
|
||||||
env:
|
|
||||||
PACKAGE_PATH: ${{ github.event.inputs.path }}
|
|
||||||
- name: Publish to npm
|
|
||||||
run: |
|
|
||||||
pnpm build
|
|
||||||
cd packages/$PACKAGE_PATH
|
|
||||||
echo "//registry.npmjs.org/:_authToken=$NPM_TOKEN" >> .npmrc
|
|
||||||
pnpm publish --no-git-checks --access public --tag experimental
|
|
||||||
echo "🎉 Experimental release published 📦️ on npm: https://npmjs.com/package/${{ github.event.inputs.name }}/v/${{ env.VERSION }}"
|
|
||||||
echo "Install via: pnpm add ${{ github.event.inputs.name }}@${{ env.VERSION }}"
|
|
||||||
env:
|
|
||||||
NPM_TOKEN: ${{ secrets.NPM_TOKEN }}
|
|
||||||
PACKAGE_PATH: ${{ github.event.inputs.path }}
|
|
||||||
VERSION: ${{ steps.determine-version.outputs.version }}
|
|
||||||
|
|||||||
9
.github/workflows/sync-examples.yml
vendored
9
.github/workflows/sync-examples.yml
vendored
@@ -2,7 +2,7 @@ name: Sync Example Repositories
|
|||||||
on:
|
on:
|
||||||
push:
|
push:
|
||||||
branches:
|
branches:
|
||||||
- main
|
- v4
|
||||||
workflow_dispatch:
|
workflow_dispatch:
|
||||||
jobs:
|
jobs:
|
||||||
sync:
|
sync:
|
||||||
@@ -11,9 +11,8 @@ jobs:
|
|||||||
- name: Checkout Repository
|
- name: Checkout Repository
|
||||||
uses: actions/checkout@v3
|
uses: actions/checkout@v3
|
||||||
- name: Run GitHub File Sync
|
- name: Run GitHub File Sync
|
||||||
uses: balazsorban44/repo-file-sync-action@master
|
# Can update to v1 when https://github.com/BetaHuhn/repo-file-sync-action/issues/168 is resolved
|
||||||
|
uses: BetaHuhn/repo-file-sync-action@v1.16.5
|
||||||
with:
|
with:
|
||||||
GH_PAT: ${{ secrets.GH_PAT }}
|
GH_PAT: ${{ secrets.GH_PAT_CLASSIC }}
|
||||||
IS_FINE_GRAINED: true
|
|
||||||
SKIP_PR: true
|
SKIP_PR: true
|
||||||
ORIGINAL_MESSAGE: true
|
|
||||||
|
|||||||
29
.gitignore
vendored
29
.gitignore
vendored
@@ -1,6 +1,7 @@
|
|||||||
# Misc
|
# Misc
|
||||||
.DS_Store
|
.DS_Store
|
||||||
.eslintcache
|
.npmrc
|
||||||
|
|
||||||
.env
|
.env
|
||||||
.env.local
|
.env.local
|
||||||
.env.development.local
|
.env.development.local
|
||||||
@@ -11,9 +12,8 @@ npm-debug.log*
|
|||||||
yarn-debug.log*
|
yarn-debug.log*
|
||||||
yarn-error.log*
|
yarn-error.log*
|
||||||
firebase-debug.log
|
firebase-debug.log
|
||||||
ui-debug.log
|
|
||||||
.pnpm-debug.log
|
.pnpm-debug.log
|
||||||
.husky
|
|
||||||
|
|
||||||
# Dependencies
|
# Dependencies
|
||||||
node_modules
|
node_modules
|
||||||
@@ -34,22 +34,24 @@ packages/next-auth/utils
|
|||||||
packages/next-auth/core
|
packages/next-auth/core
|
||||||
packages/next-auth/jwt
|
packages/next-auth/jwt
|
||||||
packages/next-auth/react
|
packages/next-auth/react
|
||||||
|
packages/next-auth/adapters.d.ts
|
||||||
|
packages/next-auth/adapters.js
|
||||||
|
packages/next-auth/index.d.ts
|
||||||
|
packages/next-auth/index.js
|
||||||
packages/next-auth/next
|
packages/next-auth/next
|
||||||
packages/*/*.js
|
packages/next-auth/middleware.d.ts
|
||||||
packages/*/*.d.ts
|
packages/next-auth/middleware.js
|
||||||
packages/*/*.d.ts.map
|
|
||||||
|
|
||||||
# Development app
|
# Development app
|
||||||
apps/dev/src/css
|
apps/dev/src/css
|
||||||
apps/dev/prisma/migrations
|
apps/dev/prisma/migrations
|
||||||
apps/dev/typeorm
|
apps/dev/typeorm
|
||||||
apps/dev/nextjs-2
|
|
||||||
|
|
||||||
# VS
|
# VS
|
||||||
/.vs/slnx.sqlite-journal
|
/.vs/slnx.sqlite-journal
|
||||||
/.vs/slnx.sqlite
|
/.vs/slnx.sqlite
|
||||||
/.vs
|
/.vs
|
||||||
.vscode/generated*
|
.vscode
|
||||||
|
|
||||||
# Jetbrains
|
# Jetbrains
|
||||||
.idea
|
.idea
|
||||||
@@ -79,12 +81,11 @@ docs/.docusaurus
|
|||||||
docs/providers.json
|
docs/providers.json
|
||||||
|
|
||||||
# Core
|
# Core
|
||||||
packages/core/src/providers/oauth-types.ts
|
packages/core/adapters.*
|
||||||
|
packages/core/index.*
|
||||||
|
packages/core/jwt
|
||||||
packages/core/lib
|
packages/core/lib
|
||||||
packages/core/providers
|
packages/core/providers
|
||||||
packages/core/src/lib/pages/styles.ts
|
|
||||||
docs/docs/reference/core
|
|
||||||
docs/docs/reference/sveltekit
|
|
||||||
|
|
||||||
|
|
||||||
# SvelteKit
|
# SvelteKit
|
||||||
@@ -94,7 +95,3 @@ packages/frameworks-sveltekit/.svelte-kit
|
|||||||
packages/frameworks-sveltekit/package
|
packages/frameworks-sveltekit/package
|
||||||
packages/frameworks-sveltekit/vite.config.js.timestamp-*
|
packages/frameworks-sveltekit/vite.config.js.timestamp-*
|
||||||
packages/frameworks-sveltekit/vite.config.ts.timestamp-*
|
packages/frameworks-sveltekit/vite.config.ts.timestamp-*
|
||||||
|
|
||||||
# Adapters
|
|
||||||
|
|
||||||
docs/docs/reference/adapter
|
|
||||||
1
.husky/.gitignore
vendored
Normal file
1
.husky/.gitignore
vendored
Normal file
@@ -0,0 +1 @@
|
|||||||
|
_
|
||||||
4
.husky/pre-commit
Executable file
4
.husky/pre-commit
Executable file
@@ -0,0 +1,4 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
. "$(dirname "$0")/_/husky.sh"
|
||||||
|
|
||||||
|
# npx pretty-quick --staged
|
||||||
@@ -1,67 +0,0 @@
|
|||||||
.cache-loader
|
|
||||||
.DS_Store
|
|
||||||
.pnpm-debug.log
|
|
||||||
.turbo
|
|
||||||
.vscode/generated*
|
|
||||||
/_work
|
|
||||||
/actions-runner
|
|
||||||
node_modules
|
|
||||||
patches
|
|
||||||
pnpm-lock.yaml
|
|
||||||
.github/actions/issue-validator/index.mjs
|
|
||||||
*.d.ts
|
|
||||||
*.d.ts.map
|
|
||||||
|
|
||||||
.svelte-kit
|
|
||||||
.next
|
|
||||||
.nuxt
|
|
||||||
|
|
||||||
# --------------- Docs ---------------
|
|
||||||
|
|
||||||
.docusaurus
|
|
||||||
build
|
|
||||||
docs/docs/reference/core
|
|
||||||
docs/docs/reference/sveltekit
|
|
||||||
static
|
|
||||||
docs/providers.json
|
|
||||||
|
|
||||||
# --------------- Packages ---------------
|
|
||||||
|
|
||||||
coverage
|
|
||||||
dist
|
|
||||||
packages/**/*.cjs
|
|
||||||
packages/**/*.js
|
|
||||||
|
|
||||||
# @auth/core
|
|
||||||
packages/core/src/providers/oauth-types.ts
|
|
||||||
packages/core/src/lib/pages/styles.ts
|
|
||||||
|
|
||||||
# @auth/sveltekit
|
|
||||||
packages/frameworks-sveltekit/package
|
|
||||||
packages/frameworks-sveltekit/vite.config.{js,ts}.timestamp-*
|
|
||||||
|
|
||||||
# next-auth
|
|
||||||
packages/next-auth/src/providers/oauth-types.ts
|
|
||||||
packages/next-auth/css/index.css
|
|
||||||
|
|
||||||
|
|
||||||
# Adapters
|
|
||||||
.branches
|
|
||||||
db.sqlite
|
|
||||||
dev.db
|
|
||||||
dynamodblocal-bin
|
|
||||||
firebase-debug.log
|
|
||||||
firestore-debug.log
|
|
||||||
migrations
|
|
||||||
test.schema.gql
|
|
||||||
|
|
||||||
# --------------- Apps ---------------
|
|
||||||
|
|
||||||
|
|
||||||
# Examples should have their own Prettier config since they are templates too
|
|
||||||
apps/example-sveltekit
|
|
||||||
|
|
||||||
# Development app
|
|
||||||
apps/dev/prisma
|
|
||||||
apps/dev/migrations
|
|
||||||
apps/dev/typeorm
|
|
||||||
8
.vscode/settings.json
vendored
8
.vscode/settings.json
vendored
@@ -1,8 +0,0 @@
|
|||||||
{
|
|
||||||
"files.exclude": {
|
|
||||||
"packages/core/{lib,providers,*.js,*.d.ts,*.d.ts.map}": true,
|
|
||||||
"packages/next-auth/{client,core,css,jwt,next,providers,react,utils,*.js,*.d.ts}": true
|
|
||||||
},
|
|
||||||
"typescript.tsdk": "node_modules/typescript/lib",
|
|
||||||
"openInGitHub.remote.branch": "main"
|
|
||||||
}
|
|
||||||
14
.vscode/snippets.code-snippets
vendored
14
.vscode/snippets.code-snippets
vendored
@@ -1,14 +0,0 @@
|
|||||||
{
|
|
||||||
"oauth2-spec": {
|
|
||||||
"description": "Markdown link to OAuth 2 specification",
|
|
||||||
"scope": "typescript",
|
|
||||||
"prefix": "oauth2",
|
|
||||||
"body": ["[OAuth 2](https://datatracker.ietf.org/doc/html/rfc6749)"]
|
|
||||||
},
|
|
||||||
"oidc-spec": {
|
|
||||||
"description": "Markdown link to OpenID Connect specification",
|
|
||||||
"scope": "typescript",
|
|
||||||
"prefix": "oidc",
|
|
||||||
"body": ["[OIDC](https://openid.net/specs/openid-connect-core-1_0.html)"]
|
|
||||||
}
|
|
||||||
}
|
|
||||||
4
LICENSE
4
LICENSE
@@ -1,6 +1,6 @@
|
|||||||
ISC License
|
ISC License
|
||||||
|
|
||||||
Copyright (c) 2022-2023, Balázs Orbán
|
Copyright (c) 2018-2021, Iain Collins
|
||||||
|
|
||||||
Permission to use, copy, modify, and/or distribute this software for any
|
Permission to use, copy, modify, and/or distribute this software for any
|
||||||
purpose with or without fee is hereby granted, provided that the above
|
purpose with or without fee is hereby granted, provided that the above
|
||||||
@@ -12,4 +12,4 @@ MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
|
|||||||
ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
||||||
WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
|
WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
|
||||||
ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
|
ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
|
||||||
OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||||
@@ -1,6 +1,5 @@
|
|||||||
/// <reference types="next" />
|
/// <reference types="next" />
|
||||||
/// <reference types="next/image-types/global" />
|
/// <reference types="next/image-types/global" />
|
||||||
/// <reference types="next/navigation-types/compat/navigation" />
|
|
||||||
|
|
||||||
// NOTE: This file should not be edited
|
// NOTE: This file should not be edited
|
||||||
// see https://nextjs.org/docs/basic-features/typescript for more information.
|
// see https://nextjs.org/docs/basic-features/typescript for more information.
|
||||||
4
apps/dev/nextjs-v4/.vscode/settings.json
vendored
4
apps/dev/nextjs-v4/.vscode/settings.json
vendored
@@ -1,4 +0,0 @@
|
|||||||
{
|
|
||||||
"typescript.tsdk": "../../node_modules/.pnpm/typescript@4.8.4/node_modules/typescript/lib",
|
|
||||||
"typescript.enablePromptUseWorkspaceTsdk": true
|
|
||||||
}
|
|
||||||
@@ -1,14 +0,0 @@
|
|||||||
import NextAuth, { type NextAuthOptions } from "next-auth"
|
|
||||||
import GitHub from "next-auth/providers/github"
|
|
||||||
|
|
||||||
export const authOptions: NextAuthOptions = {
|
|
||||||
providers: [
|
|
||||||
GitHub({
|
|
||||||
clientId: process.env.GITHUB_ID,
|
|
||||||
clientSecret: process.env.GITHUB_SECRET,
|
|
||||||
}),
|
|
||||||
],
|
|
||||||
}
|
|
||||||
|
|
||||||
const handler = NextAuth(authOptions)
|
|
||||||
export { handler as GET, handler as POST }
|
|
||||||
@@ -1,60 +0,0 @@
|
|||||||
-- CreateTable
|
|
||||||
CREATE TABLE "Account" (
|
|
||||||
"id" TEXT NOT NULL PRIMARY KEY,
|
|
||||||
"userId" TEXT NOT NULL,
|
|
||||||
"type" TEXT NOT NULL,
|
|
||||||
"provider" TEXT NOT NULL,
|
|
||||||
"providerAccountId" TEXT NOT NULL,
|
|
||||||
"refresh_token" TEXT,
|
|
||||||
"access_token" TEXT,
|
|
||||||
"expires_at" INTEGER,
|
|
||||||
"token_type" TEXT,
|
|
||||||
"scope" TEXT,
|
|
||||||
"id_token" TEXT,
|
|
||||||
"session_state" TEXT,
|
|
||||||
"oauth_token_secret" TEXT,
|
|
||||||
"oauth_token" TEXT,
|
|
||||||
"createdAt" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
||||||
"updatedAt" DATETIME NOT NULL,
|
|
||||||
CONSTRAINT "Account_userId_fkey" FOREIGN KEY ("userId") REFERENCES "User" ("id") ON DELETE RESTRICT ON UPDATE CASCADE
|
|
||||||
);
|
|
||||||
|
|
||||||
-- CreateTable
|
|
||||||
CREATE TABLE "Session" (
|
|
||||||
"id" TEXT NOT NULL PRIMARY KEY,
|
|
||||||
"sessionToken" TEXT NOT NULL,
|
|
||||||
"userId" TEXT NOT NULL,
|
|
||||||
"expires" DATETIME NOT NULL,
|
|
||||||
CONSTRAINT "Session_userId_fkey" FOREIGN KEY ("userId") REFERENCES "User" ("id") ON DELETE RESTRICT ON UPDATE CASCADE
|
|
||||||
);
|
|
||||||
|
|
||||||
-- CreateTable
|
|
||||||
CREATE TABLE "User" (
|
|
||||||
"id" TEXT NOT NULL PRIMARY KEY,
|
|
||||||
"name" TEXT,
|
|
||||||
"email" TEXT,
|
|
||||||
"emailVerified" DATETIME,
|
|
||||||
"image" TEXT
|
|
||||||
);
|
|
||||||
|
|
||||||
-- CreateTable
|
|
||||||
CREATE TABLE "VerificationToken" (
|
|
||||||
"identifier" TEXT NOT NULL,
|
|
||||||
"token" TEXT NOT NULL,
|
|
||||||
"expires" DATETIME NOT NULL
|
|
||||||
);
|
|
||||||
|
|
||||||
-- CreateIndex
|
|
||||||
CREATE UNIQUE INDEX "Account_provider_providerAccountId_key" ON "Account"("provider", "providerAccountId");
|
|
||||||
|
|
||||||
-- CreateIndex
|
|
||||||
CREATE UNIQUE INDEX "Session_sessionToken_key" ON "Session"("sessionToken");
|
|
||||||
|
|
||||||
-- CreateIndex
|
|
||||||
CREATE UNIQUE INDEX "User_email_key" ON "User"("email");
|
|
||||||
|
|
||||||
-- CreateIndex
|
|
||||||
CREATE UNIQUE INDEX "VerificationToken_token_key" ON "VerificationToken"("token");
|
|
||||||
|
|
||||||
-- CreateIndex
|
|
||||||
CREATE UNIQUE INDEX "VerificationToken_identifier_token_key" ON "VerificationToken"("identifier", "token");
|
|
||||||
@@ -1,3 +0,0 @@
|
|||||||
# Please do not edit this file manually
|
|
||||||
# It should be added in your version-control system (i.e. Git)
|
|
||||||
provider = "sqlite"
|
|
||||||
@@ -1,75 +0,0 @@
|
|||||||
# Rename file to .env.local (or .env) and populate values
|
|
||||||
# to be able to run the dev app
|
|
||||||
|
|
||||||
NEXTAUTH_URL=http://localhost:3000
|
|
||||||
|
|
||||||
# You can use `openssl rand -hex 32` or
|
|
||||||
# https://generate-secret.vercel.app/32 to generate a secret.
|
|
||||||
# Note: Changing a secret may invalidate existing sessions
|
|
||||||
# and/or verification tokens.
|
|
||||||
NEXTAUTH_SECRET=secret
|
|
||||||
|
|
||||||
ASGARDEO_CLIENT_ID=
|
|
||||||
ASGARDEO_CLIENT_SECRET=
|
|
||||||
ASGARDEO_ISSUER=
|
|
||||||
|
|
||||||
AUTH0_ID=
|
|
||||||
AUTH0_SECRET=
|
|
||||||
AUTH0_ISSUER=
|
|
||||||
|
|
||||||
# Beyond Identity Provider
|
|
||||||
BEYOND_IDENTITY_CLIENT_ID=
|
|
||||||
BEYOND_IDENTITY_CLIENT_SECRET=
|
|
||||||
BEYOND_IDENTITY_ISSUER=
|
|
||||||
|
|
||||||
GITHUB_ID=
|
|
||||||
GITHUB_SECRET=
|
|
||||||
|
|
||||||
NOTION_ID=
|
|
||||||
NOTION_SECRET=
|
|
||||||
NOTION_REDIRECT_URI=
|
|
||||||
|
|
||||||
IDS4_ID=
|
|
||||||
IDS4_SECRET=
|
|
||||||
IDS4_ISSUER=
|
|
||||||
|
|
||||||
KEYCLOAK_ID=
|
|
||||||
KEYCLOAK_SECRET=
|
|
||||||
KEYCLOAK_ISSUER=
|
|
||||||
|
|
||||||
LINE_ID=
|
|
||||||
LINE_SECRET=
|
|
||||||
|
|
||||||
TRAKT_ID=
|
|
||||||
TRAKT_SECRET=
|
|
||||||
|
|
||||||
TWITCH_ID=
|
|
||||||
TWITCH_SECRET=
|
|
||||||
|
|
||||||
TWITTER_ID=
|
|
||||||
TWITTER_SECRET=
|
|
||||||
|
|
||||||
WIKIMEDIA_ID=
|
|
||||||
WIKIMEDIA_SECRET=
|
|
||||||
|
|
||||||
# Yandex OAuth. new app -> https://oauth.yandex.com/client/new/id
|
|
||||||
YANDEX_ID=
|
|
||||||
YANDEX_SECRET=
|
|
||||||
|
|
||||||
# Example configuration for a Gmail account (will need SMTP enabled)
|
|
||||||
EMAIL_SERVER=smtps://user@gmail.com:password@smtp.gmail.com:465
|
|
||||||
EMAIL_FROM=user@gmail.com
|
|
||||||
|
|
||||||
# Note: If using with Prisma adapter, you need to use a `.env`
|
|
||||||
# file rather than a `.env.local` file to configure env vars.
|
|
||||||
# Postgres: DATABASE_URL=postgres://nextauth:password@127.0.0.1:5432/nextauth?synchronize=true
|
|
||||||
# MySQL: DATABASE_URL=mysql://nextauth:password@127.0.0.1:3306/nextauth?synchronize=true
|
|
||||||
# MongoDB: DATABASE_URL=mongodb://nextauth:password@127.0.0.1:27017/nextauth?synchronize=true
|
|
||||||
DATABASE_URL=
|
|
||||||
|
|
||||||
# Supabase Example Configuration
|
|
||||||
# Supabase Example Configuration
|
|
||||||
# NEXT_PUBLIC_SUPABASE_URL=http://localhost:54321
|
|
||||||
# SUPABASE_SERVICE_ROLE_KEY=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJzdXBhYmFzZS1kZW1vIiwicm9sZSI6InNlcnZpY2Vfcm9sZSJ9.vI9obAHOGyVVKa3pD--kJlyxp-Z2zV9UUMAhKpNLAcU
|
|
||||||
# SUPABASE_JWT_SECRET=super-secret-jwt-token-with-at-least-32-characters-long
|
|
||||||
# NEXT_PUBLIC_SUPABASE_ANON_KEY=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJzdXBhYmFzZS1kZW1vIiwicm9sZSI6ImFub24ifQ.625_WdcF3KHqz5amU0x2X5WWHP-OEs_4qj0ssLNHzTs
|
|
||||||
4
apps/dev/nextjs/.gitignore
vendored
4
apps/dev/nextjs/.gitignore
vendored
@@ -1,4 +0,0 @@
|
|||||||
node_modules/
|
|
||||||
/test-results/
|
|
||||||
/playwright-report/
|
|
||||||
/playwright/.cache/
|
|
||||||
4
apps/dev/nextjs/.vscode/settings.json
vendored
4
apps/dev/nextjs/.vscode/settings.json
vendored
@@ -1,4 +0,0 @@
|
|||||||
{
|
|
||||||
"typescript.tsdk": "../../../node_modules/.pnpm/typescript@4.9.4/node_modules/typescript/lib",
|
|
||||||
"typescript.enablePromptUseWorkspaceTsdk": true
|
|
||||||
}
|
|
||||||
@@ -1,6 +0,0 @@
|
|||||||
# NextAuth.js Development App
|
|
||||||
|
|
||||||
This folder contains a Next.js app using NextAuth.js for local development. See the following section on how to start:
|
|
||||||
|
|
||||||
[Setting up local environment
|
|
||||||
](https://github.com/nextauthjs/.github/blob/main/CONTRIBUTING.md#setting-up-local-environment)
|
|
||||||
@@ -1,12 +0,0 @@
|
|||||||
export default function RootLayout({
|
|
||||||
children,
|
|
||||||
}: {
|
|
||||||
children: React.ReactNode
|
|
||||||
}) {
|
|
||||||
return (
|
|
||||||
<html>
|
|
||||||
<head></head>
|
|
||||||
<body>{children}</body>
|
|
||||||
</html>
|
|
||||||
)
|
|
||||||
}
|
|
||||||
@@ -1,6 +0,0 @@
|
|||||||
import { unstable_getServerSession } from "next-auth/next"
|
|
||||||
|
|
||||||
export default async function Page() {
|
|
||||||
const session = await unstable_getServerSession()
|
|
||||||
return <pre>{JSON.stringify(session, null, 2)}</pre>
|
|
||||||
}
|
|
||||||
@@ -1,20 +0,0 @@
|
|||||||
import { signIn } from "next-auth/react"
|
|
||||||
|
|
||||||
export default function AccessDenied() {
|
|
||||||
return (
|
|
||||||
<>
|
|
||||||
<h1>Access Denied</h1>
|
|
||||||
<p>
|
|
||||||
<a
|
|
||||||
href="/api/auth/signin"
|
|
||||||
onClick={(e) => {
|
|
||||||
e.preventDefault()
|
|
||||||
signIn()
|
|
||||||
}}
|
|
||||||
>
|
|
||||||
You must be signed in to view this page
|
|
||||||
</a>
|
|
||||||
</p>
|
|
||||||
</>
|
|
||||||
)
|
|
||||||
}
|
|
||||||
@@ -1,28 +0,0 @@
|
|||||||
import Link from "next/link"
|
|
||||||
import styles from "./footer.module.css"
|
|
||||||
import packageJSON from "package.json"
|
|
||||||
|
|
||||||
export default function Footer() {
|
|
||||||
return (
|
|
||||||
<footer className={styles.footer}>
|
|
||||||
<hr />
|
|
||||||
<ul className={styles.navItems}>
|
|
||||||
<li className={styles.navItem}>
|
|
||||||
<a href="https://authjs.dev">Documentation</a>
|
|
||||||
</li>
|
|
||||||
<li className={styles.navItem}>
|
|
||||||
<a href="https://www.npmjs.com/package/@auth/core">NPM</a>
|
|
||||||
</li>
|
|
||||||
<li className={styles.navItem}>
|
|
||||||
<a href="https://github.com/nextauthjs/next-auth-example">GitHub</a>
|
|
||||||
</li>
|
|
||||||
<li className={styles.navItem}>
|
|
||||||
<Link href="/policy">Policy</Link>
|
|
||||||
</li>
|
|
||||||
<li className={styles.navItem}>
|
|
||||||
<em>{packageJSON.version}</em>
|
|
||||||
</li>
|
|
||||||
</ul>
|
|
||||||
</footer>
|
|
||||||
)
|
|
||||||
}
|
|
||||||
@@ -1,89 +0,0 @@
|
|||||||
import Link from "next/link"
|
|
||||||
import { useSession } from "next-auth/react"
|
|
||||||
import styles from "./header.module.css"
|
|
||||||
|
|
||||||
// The approach used in this component shows how to built a sign in and sign out
|
|
||||||
// component that works on pages which support both client and server side
|
|
||||||
// rendering, and avoids any flash incorrect content on initial page load.
|
|
||||||
export default function Header() {
|
|
||||||
const { data: session, status } = useSession()
|
|
||||||
|
|
||||||
return (
|
|
||||||
<header>
|
|
||||||
<noscript>
|
|
||||||
<style>{".nojs-show { opacity: 1; top: 0; }"}</style>
|
|
||||||
</noscript>
|
|
||||||
<div className={styles.signedInStatus}>
|
|
||||||
<p
|
|
||||||
className={`nojs-show ${
|
|
||||||
!session && status === "loading" ? styles.loading : styles.loaded
|
|
||||||
}`}
|
|
||||||
>
|
|
||||||
{!session && (
|
|
||||||
<>
|
|
||||||
<span className={styles.notSignedInText}>
|
|
||||||
You are not signed in
|
|
||||||
</span>
|
|
||||||
<a href="/api/auth/signin" className={styles.buttonPrimary}>
|
|
||||||
Sign in
|
|
||||||
</a>
|
|
||||||
</>
|
|
||||||
)}
|
|
||||||
{session && (
|
|
||||||
<>
|
|
||||||
{session.user.image && (
|
|
||||||
<img src={session.user.image} className={styles.avatar} />
|
|
||||||
)}
|
|
||||||
<span className={styles.signedInText}>
|
|
||||||
<small>Signed in as</small>
|
|
||||||
<br />
|
|
||||||
<strong>{session.user.email} </strong>
|
|
||||||
{session.user.name ? `(${session.user.name})` : null}
|
|
||||||
</span>
|
|
||||||
<a href="/api/auth/signout" className={styles.button}>
|
|
||||||
Sign out
|
|
||||||
</a>
|
|
||||||
</>
|
|
||||||
)}
|
|
||||||
</p>
|
|
||||||
</div>
|
|
||||||
<nav>
|
|
||||||
<ul className={styles.navItems}>
|
|
||||||
<li className={styles.navItem}>
|
|
||||||
<Link href="/">Home</Link>
|
|
||||||
</li>
|
|
||||||
<li className={styles.navItem}>
|
|
||||||
<Link href="/client">Client</Link>
|
|
||||||
</li>
|
|
||||||
<li className={styles.navItem}>
|
|
||||||
<Link href="/server">Server</Link>
|
|
||||||
</li>
|
|
||||||
<li className={styles.navItem}>
|
|
||||||
<Link href="/protected">Protected</Link>
|
|
||||||
</li>
|
|
||||||
<li className={styles.navItem}>
|
|
||||||
<Link href="/protected-ssr">Protected(SSR)</Link>
|
|
||||||
</li>
|
|
||||||
<li className={styles.navItem}>
|
|
||||||
<Link href="/api-example">API</Link>
|
|
||||||
</li>
|
|
||||||
<li className={styles.navItem}>
|
|
||||||
<Link href="/credentials">Credentials</Link>
|
|
||||||
</li>
|
|
||||||
<li className={styles.navItem}>
|
|
||||||
<Link href="/email">Email</Link>
|
|
||||||
</li>
|
|
||||||
<li className={styles.navItem}>
|
|
||||||
<Link href="/middleware-protected">Middleware protected</Link>
|
|
||||||
</li>
|
|
||||||
<li className={styles.navItem}>
|
|
||||||
<Link href="/supabase-client-rls">Supabase RLS</Link>
|
|
||||||
</li>
|
|
||||||
<li className={styles.navItem}>
|
|
||||||
<Link href="/supabase-ssr">Supabase RLS(SSR)</Link>
|
|
||||||
</li>
|
|
||||||
</ul>
|
|
||||||
</nav>
|
|
||||||
</header>
|
|
||||||
)
|
|
||||||
}
|
|
||||||
@@ -1,12 +0,0 @@
|
|||||||
import Header from "components/header"
|
|
||||||
import Footer from "components/footer"
|
|
||||||
|
|
||||||
export default function Layout({ children }) {
|
|
||||||
return (
|
|
||||||
<>
|
|
||||||
<Header />
|
|
||||||
<main>{children}</main>
|
|
||||||
<Footer />
|
|
||||||
</>
|
|
||||||
)
|
|
||||||
}
|
|
||||||
@@ -1,45 +0,0 @@
|
|||||||
export { default } from "next-auth/middleware"
|
|
||||||
|
|
||||||
export const config = { matcher: ["/middleware-protected"] }
|
|
||||||
|
|
||||||
// Other ways to use this middleware
|
|
||||||
|
|
||||||
// import withAuth from "next-auth/middleware"
|
|
||||||
// import { withAuth } from "next-auth/middleware"
|
|
||||||
|
|
||||||
// export function middleware(req, ev) {
|
|
||||||
// return withAuth(req)
|
|
||||||
// }
|
|
||||||
|
|
||||||
// export function middleware(req, ev) {
|
|
||||||
// return withAuth(req, ev)
|
|
||||||
// }
|
|
||||||
|
|
||||||
// export function middleware(req, ev) {
|
|
||||||
// return withAuth(req, {
|
|
||||||
// callbacks: {
|
|
||||||
// authorized: ({ token }) => !!token,
|
|
||||||
// },
|
|
||||||
// })
|
|
||||||
// }
|
|
||||||
|
|
||||||
// export default withAuth(function middleware(req, ev) {
|
|
||||||
// console.log(req.nextauth.token)
|
|
||||||
// })
|
|
||||||
|
|
||||||
// export default withAuth(
|
|
||||||
// function middleware(req, ev) {
|
|
||||||
// console.log(req, ev)
|
|
||||||
// },
|
|
||||||
// {
|
|
||||||
// callbacks: {
|
|
||||||
// authorized: ({ token }) => token.name === "Balázs Orbán",
|
|
||||||
// },
|
|
||||||
// }
|
|
||||||
// )
|
|
||||||
|
|
||||||
// export default withAuth({
|
|
||||||
// callbacks: {
|
|
||||||
// authorized: ({ token }) => !!token,
|
|
||||||
// },
|
|
||||||
// })
|
|
||||||
@@ -1,9 +0,0 @@
|
|||||||
/** @type {import("next").NextConfig} */
|
|
||||||
module.exports = {
|
|
||||||
webpack(config) {
|
|
||||||
config.experiments = { ...config.experiments, topLevelAwait: true }
|
|
||||||
return config
|
|
||||||
},
|
|
||||||
experimental: { appDir: true },
|
|
||||||
typescript: { ignoreBuildErrors: true },
|
|
||||||
}
|
|
||||||
@@ -1,43 +0,0 @@
|
|||||||
{
|
|
||||||
"name": "next-auth-app",
|
|
||||||
"version": "1.0.0",
|
|
||||||
"description": "Next.js + Auth.js Developer app",
|
|
||||||
"private": true,
|
|
||||||
"scripts": {
|
|
||||||
"clean": "rm -rf .next",
|
|
||||||
"dev": "next dev",
|
|
||||||
"build": "next build",
|
|
||||||
"start": "next start",
|
|
||||||
"email": "fake-smtp-server",
|
|
||||||
"start:email": "pnpm email",
|
|
||||||
"e2e": "pnpm dlx playwright test"
|
|
||||||
},
|
|
||||||
"license": "ISC",
|
|
||||||
"dependencies": {
|
|
||||||
"@auth/core": "workspace:*",
|
|
||||||
"@next-auth/fauna-adapter": "workspace:*",
|
|
||||||
"@auth/prisma-adapter": "workspace:*",
|
|
||||||
"@next-auth/supabase-adapter": "workspace:*",
|
|
||||||
"@auth/typeorm-adapter": "workspace:*",
|
|
||||||
"@prisma/client": "^3",
|
|
||||||
"@supabase/supabase-js": "^2.0.5",
|
|
||||||
"faunadb": "^4",
|
|
||||||
"next": "13.3.0",
|
|
||||||
"next-auth": "workspace:*",
|
|
||||||
"nodemailer": "^6",
|
|
||||||
"react": "^18",
|
|
||||||
"react-dom": "^18"
|
|
||||||
},
|
|
||||||
"devDependencies": {
|
|
||||||
"@playwright/test": "1.29.2",
|
|
||||||
"@types/jsonwebtoken": "^8.5.5",
|
|
||||||
"@types/react": "18.0.37",
|
|
||||||
"@types/react-dom": "^18.0.6",
|
|
||||||
"dotenv": "^16.0.3",
|
|
||||||
"fake-smtp-server": "^0.8.0",
|
|
||||||
"pg": "^8.7.3",
|
|
||||||
"prisma": "^3",
|
|
||||||
"sqlite3": "^5.0.8",
|
|
||||||
"typeorm": "0.3.7"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,10 +0,0 @@
|
|||||||
import { SessionProvider } from "next-auth/react"
|
|
||||||
import "./styles.css"
|
|
||||||
|
|
||||||
export default function App({ Component, pageProps }) {
|
|
||||||
return (
|
|
||||||
<SessionProvider session={pageProps.session}>
|
|
||||||
<Component {...pageProps} />
|
|
||||||
</SessionProvider>
|
|
||||||
)
|
|
||||||
}
|
|
||||||
@@ -1,19 +0,0 @@
|
|||||||
import Layout from "../components/layout"
|
|
||||||
|
|
||||||
export default function Page() {
|
|
||||||
return (
|
|
||||||
<Layout>
|
|
||||||
<h1>API Example</h1>
|
|
||||||
<p>The examples below show responses from the example API endpoints.</p>
|
|
||||||
<p>
|
|
||||||
<em>You must be signed in to see responses.</em>
|
|
||||||
</p>
|
|
||||||
<h2>Session</h2>
|
|
||||||
<p>/api/examples/session</p>
|
|
||||||
<iframe src="/api/examples/session" />
|
|
||||||
<h2>JSON Web Token</h2>
|
|
||||||
<p>/api/examples/jwt</p>
|
|
||||||
<iframe src="/api/examples/jwt" />
|
|
||||||
</Layout>
|
|
||||||
)
|
|
||||||
}
|
|
||||||
@@ -1,159 +0,0 @@
|
|||||||
import { Auth, type AuthConfig } from "@auth/core"
|
|
||||||
|
|
||||||
// Providers
|
|
||||||
import Apple from "@auth/core/providers/apple"
|
|
||||||
import Asgardeo from "@auth/core/providers/asgardeo"
|
|
||||||
import Auth0 from "@auth/core/providers/auth0"
|
|
||||||
import AzureAD from "@auth/core/providers/azure-ad"
|
|
||||||
import AzureB2C from "@auth/core/providers/azure-ad-b2c"
|
|
||||||
import BeyondIdentity from "@auth/core/providers/beyondidentity"
|
|
||||||
import BoxyHQSAML from "@auth/core/providers/boxyhq-saml"
|
|
||||||
// import Cognito from "@auth/core/providers/cognito"
|
|
||||||
import Credentials from "@auth/core/providers/credentials"
|
|
||||||
import Discord from "@auth/core/providers/discord"
|
|
||||||
import DuendeIDS6 from "@auth/core/providers/duende-identity-server6"
|
|
||||||
// import Email from "@auth/core/providers/email"
|
|
||||||
import Facebook from "@auth/core/providers/facebook"
|
|
||||||
import Foursquare from "@auth/core/providers/foursquare"
|
|
||||||
import Freshbooks from "@auth/core/providers/freshbooks"
|
|
||||||
import GitHub from "@auth/core/providers/github"
|
|
||||||
import Gitlab from "@auth/core/providers/gitlab"
|
|
||||||
import Google from "@auth/core/providers/google"
|
|
||||||
// import IDS4 from "@auth/core/providers/identity-server4"
|
|
||||||
import Instagram from "@auth/core/providers/instagram"
|
|
||||||
// import Keycloak from "@auth/core/providers/keycloak"
|
|
||||||
import Line from "@auth/core/providers/line"
|
|
||||||
import LinkedIn from "@auth/core/providers/linkedin"
|
|
||||||
import Mailchimp from "@auth/core/providers/mailchimp"
|
|
||||||
import Notion from "@auth/core/providers/notion"
|
|
||||||
// import Okta from "@auth/core/providers/okta"
|
|
||||||
import Osu from "@auth/core/providers/osu"
|
|
||||||
import Patreon from "@auth/core/providers/patreon"
|
|
||||||
import Slack from "@auth/core/providers/slack"
|
|
||||||
import Spotify from "@auth/core/providers/spotify"
|
|
||||||
import Trakt from "@auth/core/providers/trakt"
|
|
||||||
import Twitch from "@auth/core/providers/twitch"
|
|
||||||
import Twitter from "@auth/core/providers/twitter"
|
|
||||||
import Yandex from "@auth/core/providers/yandex"
|
|
||||||
import Vk from "@auth/core/providers/vk"
|
|
||||||
import Wikimedia from "@auth/core/providers/wikimedia"
|
|
||||||
import WorkOS from "@auth/core/providers/workos"
|
|
||||||
|
|
||||||
// // Prisma
|
|
||||||
// import { PrismaClient } from "@prisma/client"
|
|
||||||
// import { PrismaAdapter } from "@auth/prisma-adapter"
|
|
||||||
// const client = globalThis.prisma || new PrismaClient()
|
|
||||||
// if (process.env.NODE_ENV !== "production") globalThis.prisma = client
|
|
||||||
// const adapter = PrismaAdapter(client)
|
|
||||||
|
|
||||||
// // Fauna
|
|
||||||
// import { Client as FaunaClient } from "faunadb"
|
|
||||||
// import { FaunaAdapter } from "@next-auth/fauna-adapter"
|
|
||||||
// const opts = { secret: process.env.FAUNA_SECRET, domain: process.env.FAUNA_DOMAIN }
|
|
||||||
// const client = globalThis.fauna || new FaunaClient(opts)
|
|
||||||
// if (process.env.NODE_ENV !== "production") globalThis.fauna = client
|
|
||||||
// const adapter = FaunaAdapter(client)
|
|
||||||
|
|
||||||
// // TypeORM
|
|
||||||
// import { TypeORMAdapter } from "@auth/typeorm-adapter"
|
|
||||||
// const adapter = TypeORMAdapter({
|
|
||||||
// type: "sqlite",
|
|
||||||
// name: "next-auth-test-memory",
|
|
||||||
// database: "./typeorm/dev.db",
|
|
||||||
// synchronize: true,
|
|
||||||
// })
|
|
||||||
|
|
||||||
// // Supabase
|
|
||||||
// import { SupabaseAdapter } from "@next-auth/supabase-adapter"
|
|
||||||
// const adapter = SupabaseAdapter({
|
|
||||||
// url: process.env.NEXT_PUBLIC_SUPABASE_URL,
|
|
||||||
// secret: process.env.SUPABASE_SERVICE_ROLE_KEY,
|
|
||||||
// })
|
|
||||||
|
|
||||||
export const authConfig: AuthConfig = {
|
|
||||||
// adapter,
|
|
||||||
debug: process.env.NODE_ENV !== "production",
|
|
||||||
theme: {
|
|
||||||
logo: "https://next-auth.js.org/img/logo/logo-sm.png",
|
|
||||||
brandColor: "#1786fb",
|
|
||||||
},
|
|
||||||
providers: [
|
|
||||||
Credentials({
|
|
||||||
credentials: { password: { label: "Password", type: "password" } },
|
|
||||||
async authorize(credentials) {
|
|
||||||
if (credentials.password !== "pw") return null
|
|
||||||
return { name: "Fill Murray", email: "bill@fillmurray.com", image: "https://www.fillmurray.com/64/64", id: "1", foo: "" }
|
|
||||||
},
|
|
||||||
}),
|
|
||||||
Apple({ clientId: process.env.APPLE_ID, clientSecret: process.env.APPLE_SECRET }),
|
|
||||||
Asgardeo({ clientId: process.env.ASGARDEO_CLIENT_ID, clientSecret: process.env.ASGARDEO_CLIENT_SECRET, issuer: process.env.ASGARDEO_ISSUER }),
|
|
||||||
Auth0({ clientId: process.env.AUTH0_ID, clientSecret: process.env.AUTH0_SECRET, issuer: process.env.AUTH0_ISSUER }),
|
|
||||||
AzureAD({
|
|
||||||
clientId: process.env.AZURE_AD_CLIENT_ID,
|
|
||||||
clientSecret: process.env.AZURE_AD_CLIENT_SECRET,
|
|
||||||
tenantId: process.env.AZURE_AD_TENANT_ID,
|
|
||||||
}),
|
|
||||||
AzureB2C({ clientId: process.env.AZURE_B2C_ID, clientSecret: process.env.AZURE_B2C_SECRET, issuer: process.env.AZURE_B2C_ISSUER }),
|
|
||||||
BeyondIdentity({ clientId: process.env.BEYOND_IDENTITY_CLIENT_ID, clientSecret: process.env.BEYOND_IDENTITY_CLIENT_SECRET, issuer: process.env.BEYOND_IDENTITY_ISSUER }),
|
|
||||||
BoxyHQSAML({ issuer: "https://jackson-demo.boxyhq.com", clientId: "tenant=boxyhq.com&product=saml-demo.boxyhq.com", clientSecret: "dummy" }),
|
|
||||||
// Cognito({ clientId: process.env.COGNITO_ID, clientSecret: process.env.COGNITO_SECRET, issuer: process.env.COGNITO_ISSUER }),
|
|
||||||
Discord({ clientId: process.env.DISCORD_ID, clientSecret: process.env.DISCORD_SECRET }),
|
|
||||||
DuendeIDS6({ clientId: "interactive.confidential", clientSecret: "secret", issuer: "https://demo.duendesoftware.com" }),
|
|
||||||
Facebook({ clientId: process.env.FACEBOOK_ID, clientSecret: process.env.FACEBOOK_SECRET }),
|
|
||||||
Foursquare({ clientId: process.env.FOURSQUARE_ID, clientSecret: process.env.FOURSQUARE_SECRET }),
|
|
||||||
Freshbooks({ clientId: process.env.FRESHBOOKS_ID, clientSecret: process.env.FRESHBOOKS_SECRET }),
|
|
||||||
GitHub({ clientId: process.env.GITHUB_ID, clientSecret: process.env.GITHUB_SECRET, redirectProxy: process.env.AUTH_REDIRECT_PROXY_URL }),
|
|
||||||
Gitlab({ clientId: process.env.GITLAB_ID, clientSecret: process.env.GITLAB_SECRET }),
|
|
||||||
Google({ clientId: process.env.GOOGLE_ID, clientSecret: process.env.GOOGLE_SECRET }),
|
|
||||||
// IDS4({ clientId: process.env.IDS4_ID, clientSecret: process.env.IDS4_SECRET, issuer: process.env.IDS4_ISSUER }),
|
|
||||||
Instagram({ clientId: process.env.INSTAGRAM_ID, clientSecret: process.env.INSTAGRAM_SECRET }),
|
|
||||||
// Keycloak({ clientId: process.env.KEYCLOAK_ID, clientSecret: process.env.KEYCLOAK_SECRET, issuer: process.env.KEYCLOAK_ISSUER }),
|
|
||||||
Line({ clientId: process.env.LINE_ID, clientSecret: process.env.LINE_SECRET }),
|
|
||||||
LinkedIn({ clientId: process.env.LINKEDIN_ID, clientSecret: process.env.LINKEDIN_SECRET }),
|
|
||||||
Mailchimp({ clientId: process.env.MAILCHIMP_ID, clientSecret: process.env.MAILCHIMP_SECRET }),
|
|
||||||
Notion({ clientId: process.env.NOTION_ID, clientSecret: process.env.NOTION_SECRET, redirectUri: process.env.NOTION_REDIRECT_URI }),
|
|
||||||
// Okta({ clientId: process.env.OKTA_ID, clientSecret: process.env.OKTA_SECRET, issuer: process.env.OKTA_ISSUER }),
|
|
||||||
Osu({ clientId: process.env.OSU_CLIENT_ID, clientSecret: process.env.OSU_CLIENT_SECRET }),
|
|
||||||
Patreon({ clientId: process.env.PATREON_ID, clientSecret: process.env.PATREON_SECRET }),
|
|
||||||
Slack({ clientId: process.env.SLACK_ID, clientSecret: process.env.SLACK_SECRET }),
|
|
||||||
Spotify({ clientId: process.env.SPOTIFY_ID, clientSecret: process.env.SPOTIFY_SECRET }),
|
|
||||||
Trakt({ clientId: process.env.TRAKT_ID, clientSecret: process.env.TRAKT_SECRET }),
|
|
||||||
Twitch({ clientId: process.env.TWITCH_ID, clientSecret: process.env.TWITCH_SECRET }),
|
|
||||||
Twitter({ clientId: process.env.TWITTER_ID, clientSecret: process.env.TWITTER_SECRET }),
|
|
||||||
// TwitterLegacy({ clientId: process.env.TWITTER_LEGACY_ID, clientSecret: process.env.TWITTER_LEGACY_SECRET }),
|
|
||||||
Yandex({ clientId: process.env.YANDEX_ID, clientSecret: process.env.YANDEX_SECRET }),
|
|
||||||
Vk({ clientId: process.env.VK_ID, clientSecret: process.env.VK_SECRET }),
|
|
||||||
Wikimedia({ clientId: process.env.WIKIMEDIA_ID, clientSecret: process.env.WIKIMEDIA_SECRET }),
|
|
||||||
WorkOS({ clientId: process.env.WORKOS_ID, clientSecret: process.env.WORKOS_SECRET }),
|
|
||||||
],
|
|
||||||
// debug: process.env.NODE_ENV !== "production",
|
|
||||||
}
|
|
||||||
|
|
||||||
if (authConfig.adapter) {
|
|
||||||
// TODO:
|
|
||||||
// authOptions.providers.unshift(
|
|
||||||
// // NOTE: You can start a fake e-mail server with `pnpm email`
|
|
||||||
// // and then go to `http://localhost:1080` in the browser
|
|
||||||
// Email({ server: "smtp://127.0.0.1:1025?tls.rejectUnauthorized=false" })
|
|
||||||
// )
|
|
||||||
}
|
|
||||||
|
|
||||||
// TODO: move to next-auth/edge
|
|
||||||
function AuthHandler(...args: any[]) {
|
|
||||||
const envSecret = process.env.AUTH_SECRET ?? process.env.NEXTAUTH_SECRET
|
|
||||||
const envTrustHost = !!(process.env.NEXTAUTH_URL ?? process.env.AUTH_TRUST_HOST ?? process.env.VERCEL ?? process.env.NODE_ENV !== "production")
|
|
||||||
if (args.length === 1) {
|
|
||||||
return async (req: Request) => {
|
|
||||||
args[0].secret ??= envSecret
|
|
||||||
args[0].trustHost ??= envTrustHost
|
|
||||||
return Auth(req, args[0])
|
|
||||||
}
|
|
||||||
}
|
|
||||||
args[1].secret ??= envSecret
|
|
||||||
args[1].trustHost ??= envTrustHost
|
|
||||||
return Auth(args[0], args[1])
|
|
||||||
}
|
|
||||||
|
|
||||||
export default AuthHandler(authConfig)
|
|
||||||
|
|
||||||
export const config = { runtime: "experimental-edge" }
|
|
||||||
@@ -1,7 +0,0 @@
|
|||||||
// This is an example of how to read a JSON Web Token from an API route
|
|
||||||
import { getToken } from "next-auth/jwt"
|
|
||||||
|
|
||||||
export default async (req, res) => {
|
|
||||||
const token = await getToken({ req })
|
|
||||||
res.send(JSON.stringify(token, null, 2))
|
|
||||||
}
|
|
||||||
@@ -1,19 +0,0 @@
|
|||||||
// This is an example of to protect an API route
|
|
||||||
import { unstable_getServerSession } from "next-auth/next"
|
|
||||||
import { authOptions } from "../auth/[...nextauth]"
|
|
||||||
|
|
||||||
export default async (req, res) => {
|
|
||||||
const session = await unstable_getServerSession(req, res, authOptions)
|
|
||||||
|
|
||||||
if (session) {
|
|
||||||
res.send({
|
|
||||||
content:
|
|
||||||
"This is protected content. You can access this content because you are signed in.",
|
|
||||||
session,
|
|
||||||
})
|
|
||||||
} else {
|
|
||||||
res.send({
|
|
||||||
error: "You must be sign in to view the protected content on this page.",
|
|
||||||
})
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,8 +0,0 @@
|
|||||||
// This is an example of how to access a session from an API route
|
|
||||||
import { unstable_getServerSession } from "next-auth/next"
|
|
||||||
import { authOptions } from "../auth/[...nextauth]"
|
|
||||||
|
|
||||||
export default async (req, res) => {
|
|
||||||
const session = await unstable_getServerSession(req, res, authOptions)
|
|
||||||
res.json(session)
|
|
||||||
}
|
|
||||||
@@ -1,30 +0,0 @@
|
|||||||
// This is an example of how to query data from Supabase with RLS.
|
|
||||||
// Learn more about Row Levele Security (RLS): https://supabase.com/docs/guides/auth/row-level-security
|
|
||||||
import { unstable_getServerSession } from "next-auth/next"
|
|
||||||
import { authOptions } from "../auth/[...nextauth]"
|
|
||||||
import { createClient } from "@supabase/supabase-js"
|
|
||||||
|
|
||||||
export default async (req, res) => {
|
|
||||||
const session = await unstable_getServerSession(req, res, authOptions)
|
|
||||||
|
|
||||||
if (!session)
|
|
||||||
return res.send(JSON.stringify({ error: "No session!" }, null, 2))
|
|
||||||
|
|
||||||
const { supabaseAccessToken } = session
|
|
||||||
|
|
||||||
const supabase = createClient(
|
|
||||||
process.env.NEXT_PUBLIC_SUPABASE_URL,
|
|
||||||
process.env.NEXT_PUBLIC_SUPABASE_ANON_KEY,
|
|
||||||
{
|
|
||||||
global: {
|
|
||||||
headers: {
|
|
||||||
Authorization: `Bearer ${supabaseAccessToken}`,
|
|
||||||
},
|
|
||||||
},
|
|
||||||
}
|
|
||||||
)
|
|
||||||
// Now you can query with RLS enabled.
|
|
||||||
const { data, error } = await supabase.from("users").select("*")
|
|
||||||
|
|
||||||
res.send(JSON.stringify({ supabaseAccessToken, data, error }, null, 2))
|
|
||||||
}
|
|
||||||
@@ -1,27 +0,0 @@
|
|||||||
import Layout from "../components/layout"
|
|
||||||
|
|
||||||
export default function Page() {
|
|
||||||
return (
|
|
||||||
<Layout>
|
|
||||||
<h1>Client Side Rendering</h1>
|
|
||||||
<p>
|
|
||||||
This page uses the <strong>useSession()</strong> React Hook in the{" "}
|
|
||||||
<strong></Header></strong> component.
|
|
||||||
</p>
|
|
||||||
<p>
|
|
||||||
The <strong>useSession()</strong> React Hook easy to use and allows
|
|
||||||
pages to render very quickly.
|
|
||||||
</p>
|
|
||||||
<p>
|
|
||||||
The advantage of this approach is that session state is shared between
|
|
||||||
pages by using the <strong>Provider</strong> in <strong>_app.js</strong>{" "}
|
|
||||||
so that navigation between pages using <strong>useSession()</strong> is
|
|
||||||
very fast.
|
|
||||||
</p>
|
|
||||||
<p>
|
|
||||||
The disadvantage of <strong>useSession()</strong> is that it requires
|
|
||||||
client side JavaScript.
|
|
||||||
</p>
|
|
||||||
</Layout>
|
|
||||||
)
|
|
||||||
}
|
|
||||||
@@ -1,67 +0,0 @@
|
|||||||
// eslint-disable-next-line no-use-before-define
|
|
||||||
import * as React from "react"
|
|
||||||
import { signIn, signOut, useSession } from "next-auth/react"
|
|
||||||
import Layout from "components/layout"
|
|
||||||
|
|
||||||
export default function Page() {
|
|
||||||
const [response, setResponse] = React.useState(null)
|
|
||||||
const handleLogin = (options) => async () => {
|
|
||||||
if (options.redirect) {
|
|
||||||
return signIn("credentials", options)
|
|
||||||
}
|
|
||||||
const response = await signIn("credentials", options)
|
|
||||||
setResponse(response)
|
|
||||||
}
|
|
||||||
|
|
||||||
const handleLogout = (options) => async () => {
|
|
||||||
if (options.redirect) {
|
|
||||||
return signOut(options)
|
|
||||||
}
|
|
||||||
const response = await signOut(options)
|
|
||||||
setResponse(response)
|
|
||||||
}
|
|
||||||
|
|
||||||
const { data: session } = useSession()
|
|
||||||
|
|
||||||
if (session) {
|
|
||||||
return (
|
|
||||||
<Layout>
|
|
||||||
<h1>Test different flows for Credentials logout</h1>
|
|
||||||
<span className="spacing">Default:</span>
|
|
||||||
<button onClick={handleLogout({ redirect: true })}>Logout</button>
|
|
||||||
<br />
|
|
||||||
<span className="spacing">No redirect:</span>
|
|
||||||
<button onClick={handleLogout({ redirect: false })}>Logout</button>
|
|
||||||
<br />
|
|
||||||
<p>Response:</p>
|
|
||||||
<pre style={{ background: "#eee", padding: 16 }}>
|
|
||||||
{JSON.stringify(response, null, 2)}
|
|
||||||
</pre>
|
|
||||||
</Layout>
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
return (
|
|
||||||
<Layout>
|
|
||||||
<h1>Test different flows for Credentials login</h1>
|
|
||||||
<span className="spacing">Default:</span>
|
|
||||||
<button onClick={handleLogin({ redirect: true, password: "password" })}>
|
|
||||||
Login
|
|
||||||
</button>
|
|
||||||
<br />
|
|
||||||
<span className="spacing">No redirect:</span>
|
|
||||||
<button onClick={handleLogin({ redirect: false, password: "password" })}>
|
|
||||||
Login
|
|
||||||
</button>
|
|
||||||
<br />
|
|
||||||
<span className="spacing">No redirect, wrong password:</span>
|
|
||||||
<button onClick={handleLogin({ redirect: false, password: "" })}>
|
|
||||||
Login
|
|
||||||
</button>
|
|
||||||
<p>Response:</p>
|
|
||||||
<pre style={{ background: "#eee", padding: 16 }}>
|
|
||||||
{JSON.stringify(response, null, 2)}
|
|
||||||
</pre>
|
|
||||||
</Layout>
|
|
||||||
)
|
|
||||||
}
|
|
||||||
@@ -1,80 +0,0 @@
|
|||||||
// eslint-disable-next-line no-use-before-define
|
|
||||||
import * as React from "react"
|
|
||||||
import { signIn, signOut, useSession } from "next-auth/react"
|
|
||||||
import Layout from "components/layout"
|
|
||||||
|
|
||||||
export default function Page() {
|
|
||||||
const [response, setResponse] = React.useState(null)
|
|
||||||
const [email, setEmail] = React.useState("")
|
|
||||||
|
|
||||||
const handleChange = (event) => {
|
|
||||||
setEmail(event.target.value)
|
|
||||||
}
|
|
||||||
|
|
||||||
const handleLogin = (options) => async (event) => {
|
|
||||||
event.preventDefault()
|
|
||||||
|
|
||||||
if (options.redirect) {
|
|
||||||
return signIn("email", options)
|
|
||||||
}
|
|
||||||
const response = await signIn("email", options)
|
|
||||||
setResponse(response)
|
|
||||||
}
|
|
||||||
|
|
||||||
const handleLogout = (options) => async (event) => {
|
|
||||||
if (options.redirect) {
|
|
||||||
return signOut(options)
|
|
||||||
}
|
|
||||||
const response = await signOut(options)
|
|
||||||
setResponse(response)
|
|
||||||
}
|
|
||||||
|
|
||||||
const { data: session } = useSession()
|
|
||||||
|
|
||||||
if (session) {
|
|
||||||
return (
|
|
||||||
<Layout>
|
|
||||||
<h1>Test different flows for Email logout</h1>
|
|
||||||
<span className="spacing">Default:</span>
|
|
||||||
<button onClick={handleLogout({ redirect: true })}>Logout</button>
|
|
||||||
<br />
|
|
||||||
<span className="spacing">No redirect:</span>
|
|
||||||
<button onClick={handleLogout({ redirect: false })}>Logout</button>
|
|
||||||
<br />
|
|
||||||
<p>Response:</p>
|
|
||||||
<pre style={{ background: "#eee", padding: 16 }}>
|
|
||||||
{JSON.stringify(response, null, 2)}
|
|
||||||
</pre>
|
|
||||||
</Layout>
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
return (
|
|
||||||
<Layout>
|
|
||||||
<h1>Test different flows for Email login</h1>
|
|
||||||
<label className="spacing">
|
|
||||||
Email address:{" "}
|
|
||||||
<input
|
|
||||||
type="text"
|
|
||||||
id="email"
|
|
||||||
name="email"
|
|
||||||
value={email}
|
|
||||||
onChange={handleChange}
|
|
||||||
/>
|
|
||||||
</label>
|
|
||||||
<br />
|
|
||||||
<form onSubmit={handleLogin({ redirect: true, email })}>
|
|
||||||
<span className="spacing">Default:</span>
|
|
||||||
<button type="submit">Sign in with Email</button>
|
|
||||||
</form>
|
|
||||||
<form onSubmit={handleLogin({ redirect: false, email })}>
|
|
||||||
<span className="spacing">No redirect:</span>
|
|
||||||
<button type="submit">Sign in with Email</button>
|
|
||||||
</form>
|
|
||||||
<p>Response:</p>
|
|
||||||
<pre style={{ background: "#eee", padding: 16 }}>
|
|
||||||
{JSON.stringify(response, null, 2)}
|
|
||||||
</pre>
|
|
||||||
</Layout>
|
|
||||||
)
|
|
||||||
}
|
|
||||||
@@ -1,13 +0,0 @@
|
|||||||
import Layout from "components/layout"
|
|
||||||
|
|
||||||
export default function Page() {
|
|
||||||
return (
|
|
||||||
<Layout>
|
|
||||||
<h1>NextAuth.js Example</h1>
|
|
||||||
<p>
|
|
||||||
This is an example site to demonstrate how to use{" "}
|
|
||||||
<a href="https://authjs.dev">NextAuth.js</a> for authentication.
|
|
||||||
</p>
|
|
||||||
</Layout>
|
|
||||||
)
|
|
||||||
}
|
|
||||||
@@ -1,9 +0,0 @@
|
|||||||
import Layout from "components/layout"
|
|
||||||
|
|
||||||
export default function Page() {
|
|
||||||
return (
|
|
||||||
<Layout>
|
|
||||||
<h1>Page protected by Middleware</h1>
|
|
||||||
</Layout>
|
|
||||||
)
|
|
||||||
}
|
|
||||||
@@ -1,32 +0,0 @@
|
|||||||
import Layout from "../components/layout"
|
|
||||||
|
|
||||||
export default function Page() {
|
|
||||||
return (
|
|
||||||
<Layout>
|
|
||||||
<p>
|
|
||||||
This is an example site to demonstrate how to use{" "}
|
|
||||||
<a href="https://authjs.dev">Auth.js</a> for authentication.
|
|
||||||
</p>
|
|
||||||
<h2>Terms of Service</h2>
|
|
||||||
<p>
|
|
||||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
|
|
||||||
OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
|
||||||
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
|
||||||
IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
|
|
||||||
CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
|
|
||||||
TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
|
|
||||||
SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
||||||
</p>
|
|
||||||
<h2>Privacy Policy</h2>
|
|
||||||
<p>
|
|
||||||
This site uses JSON Web Tokens and an in-memory database which resets
|
|
||||||
every ~2 hours.
|
|
||||||
</p>
|
|
||||||
<p>
|
|
||||||
Data provided to this site is exclusively used to support signing in and
|
|
||||||
is not passed to any third party services, other than via SMTP or OAuth
|
|
||||||
for the purposes of authentication.
|
|
||||||
</p>
|
|
||||||
</Layout>
|
|
||||||
)
|
|
||||||
}
|
|
||||||
@@ -1,52 +0,0 @@
|
|||||||
// This is an example of how to protect content using server rendering
|
|
||||||
import { unstable_getServerSession } from "next-auth/next"
|
|
||||||
import { authOptions } from "./api/auth/[...nextauth]"
|
|
||||||
import Layout from "../components/layout"
|
|
||||||
import AccessDenied from "../components/access-denied"
|
|
||||||
|
|
||||||
export default function Page({ content, session }) {
|
|
||||||
// If no session exists, display access denied message
|
|
||||||
if (!session) {
|
|
||||||
return (
|
|
||||||
<Layout>
|
|
||||||
<AccessDenied />
|
|
||||||
</Layout>
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
// If session exists, display content
|
|
||||||
return (
|
|
||||||
<Layout>
|
|
||||||
<h1>Protected Page</h1>
|
|
||||||
<p>
|
|
||||||
<strong>{content}</strong>
|
|
||||||
</p>
|
|
||||||
</Layout>
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
export async function getServerSideProps(context) {
|
|
||||||
const session = await unstable_getServerSession(
|
|
||||||
context.req,
|
|
||||||
context.res,
|
|
||||||
authOptions
|
|
||||||
)
|
|
||||||
let content = null
|
|
||||||
|
|
||||||
if (session) {
|
|
||||||
const hostname = process.env.NEXTAUTH_URL || "http://localhost:3000"
|
|
||||||
const options = { headers: { cookie: context.req.headers.cookie } }
|
|
||||||
const res = await fetch(`${hostname}/api/examples/protected`, options)
|
|
||||||
const json = await res.json()
|
|
||||||
if (json.content) {
|
|
||||||
content = json.content
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return {
|
|
||||||
props: {
|
|
||||||
session,
|
|
||||||
content,
|
|
||||||
},
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,35 +0,0 @@
|
|||||||
import { useState, useEffect } from "react"
|
|
||||||
import { useSession } from "next-auth/react"
|
|
||||||
import Layout from "../components/layout"
|
|
||||||
|
|
||||||
export default function Page() {
|
|
||||||
const { status } = useSession({
|
|
||||||
required: true,
|
|
||||||
})
|
|
||||||
const [content, setContent] = useState()
|
|
||||||
|
|
||||||
// Fetch content from protected route
|
|
||||||
useEffect(() => {
|
|
||||||
if (status === "loading") return
|
|
||||||
const fetchData = async () => {
|
|
||||||
const res = await fetch("/api/examples/protected")
|
|
||||||
const json = await res.json()
|
|
||||||
if (json.content) {
|
|
||||||
setContent(json.content)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
fetchData()
|
|
||||||
}, [status])
|
|
||||||
|
|
||||||
if (status === "loading") return <Layout>Loading...</Layout>
|
|
||||||
|
|
||||||
// If session exists, display content
|
|
||||||
return (
|
|
||||||
<Layout>
|
|
||||||
<h1>Protected Page</h1>
|
|
||||||
<p>
|
|
||||||
<strong>{content}</strong>
|
|
||||||
</p>
|
|
||||||
</Layout>
|
|
||||||
)
|
|
||||||
}
|
|
||||||
@@ -1,50 +0,0 @@
|
|||||||
import { unstable_getServerSession } from "next-auth/next"
|
|
||||||
import Layout from "../components/layout"
|
|
||||||
import { authOptions } from "./api/auth/[...nextauth]"
|
|
||||||
|
|
||||||
export default function Page() {
|
|
||||||
// As this page uses Server Side Rendering, the `session` will be already
|
|
||||||
// populated on render without needing to go through a loading stage.
|
|
||||||
// This is possible because of the shared context configured in `_app.js` that
|
|
||||||
// is used by `useSession()`.
|
|
||||||
|
|
||||||
return (
|
|
||||||
<Layout>
|
|
||||||
<h1>Server Side Rendering</h1>
|
|
||||||
<p>
|
|
||||||
This page uses the <strong>unstable_getServerSession()</strong> method
|
|
||||||
in <strong>getServerSideProps()</strong>.
|
|
||||||
</p>
|
|
||||||
<p>
|
|
||||||
Using <strong>unstable_getServerSession()</strong> in{" "}
|
|
||||||
<strong>getServerSideProps()</strong> is currently the recommended
|
|
||||||
approach, although the API may still change, if you need to support
|
|
||||||
Server Side Rendering with authentication.
|
|
||||||
</p>
|
|
||||||
<p>
|
|
||||||
Using <strong>getSession()</strong> is still recommended on the client.
|
|
||||||
</p>
|
|
||||||
<p>
|
|
||||||
The advantage of Server Side Rendering is this page does not require
|
|
||||||
client side JavaScript.
|
|
||||||
</p>
|
|
||||||
<p>
|
|
||||||
The disadvantage of Server Side Rendering is that this page is slower to
|
|
||||||
render.
|
|
||||||
</p>
|
|
||||||
</Layout>
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Export the `session` prop to use sessions with Server Side Rendering
|
|
||||||
export async function getServerSideProps(context) {
|
|
||||||
return {
|
|
||||||
props: {
|
|
||||||
session: await unstable_getServerSession(
|
|
||||||
context.req,
|
|
||||||
context.res,
|
|
||||||
authOptions
|
|
||||||
),
|
|
||||||
},
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,32 +0,0 @@
|
|||||||
body {
|
|
||||||
font-family: ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont,
|
|
||||||
"Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", sans-serif,
|
|
||||||
"Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";
|
|
||||||
padding: 0 1rem 1rem 1rem;
|
|
||||||
max-width: 680px;
|
|
||||||
margin: 0 auto;
|
|
||||||
background: #fff;
|
|
||||||
color: var(--color-text);
|
|
||||||
}
|
|
||||||
|
|
||||||
li,
|
|
||||||
p {
|
|
||||||
line-height: 1.5rem;
|
|
||||||
}
|
|
||||||
|
|
||||||
a {
|
|
||||||
font-weight: 500;
|
|
||||||
}
|
|
||||||
|
|
||||||
hr {
|
|
||||||
border: 1px solid #ddd;
|
|
||||||
}
|
|
||||||
|
|
||||||
iframe {
|
|
||||||
background: #ccc;
|
|
||||||
border: 1px solid #ccc;
|
|
||||||
height: 10rem;
|
|
||||||
width: 100%;
|
|
||||||
border-radius: 0.5rem;
|
|
||||||
filter: invert(1);
|
|
||||||
}
|
|
||||||
@@ -1,48 +0,0 @@
|
|||||||
import Layout from "../components/layout"
|
|
||||||
import { useState, useEffect } from "react"
|
|
||||||
import { useSession } from "next-auth/react"
|
|
||||||
import { createClient } from "@supabase/supabase-js"
|
|
||||||
|
|
||||||
export default function Page() {
|
|
||||||
const { data: session } = useSession()
|
|
||||||
const [data, setData] = useState(null)
|
|
||||||
|
|
||||||
useEffect(() => {
|
|
||||||
if (session) {
|
|
||||||
// User is logged in, let's fetch their data.
|
|
||||||
const { supabaseAccessToken } = session
|
|
||||||
const supabase = createClient(
|
|
||||||
process.env.NEXT_PUBLIC_SUPABASE_URL,
|
|
||||||
process.env.NEXT_PUBLIC_SUPABASE_ANON_KEY,
|
|
||||||
{
|
|
||||||
global: {
|
|
||||||
headers: { Authorization: `Bearer ${supabaseAccessToken}` },
|
|
||||||
},
|
|
||||||
}
|
|
||||||
)
|
|
||||||
// Fetch data with RLS enabled.
|
|
||||||
supabase
|
|
||||||
.from("users")
|
|
||||||
.select("*")
|
|
||||||
.then(({ data }) => setData(data))
|
|
||||||
}
|
|
||||||
}, [session])
|
|
||||||
|
|
||||||
return (
|
|
||||||
<Layout>
|
|
||||||
<h1>Fetch Data from Supabase with RLS</h1>
|
|
||||||
<h2>Client-side data fetching with RLS:</h2>
|
|
||||||
<pre>{JSON.stringify(data, null, 2)}</pre>
|
|
||||||
<h2>API Example</h2>
|
|
||||||
<p>
|
|
||||||
You can also use Supabase in API routes. See the code in the
|
|
||||||
`/pages/api/examples/supabase-rls.js` file.
|
|
||||||
</p>
|
|
||||||
<p>
|
|
||||||
<em>You must be signed in to see responses.</em>
|
|
||||||
</p>
|
|
||||||
<p>/api/examples/supabase-rls</p>
|
|
||||||
<iframe src="/api/examples/supabase-rls" />
|
|
||||||
</Layout>
|
|
||||||
)
|
|
||||||
}
|
|
||||||
@@ -1,68 +0,0 @@
|
|||||||
// This is an example of how to protect content using server rendering
|
|
||||||
// and fetching data from Supabase with RLS enabled.
|
|
||||||
import { unstable_getServerSession } from "next-auth/next"
|
|
||||||
import { authOptions } from "./api/auth/[...nextauth]"
|
|
||||||
import { createClient } from "@supabase/supabase-js"
|
|
||||||
import Layout from "../components/layout"
|
|
||||||
import AccessDenied from "../components/access-denied"
|
|
||||||
|
|
||||||
export default function Page({ data, session }) {
|
|
||||||
// If no session exists, display access denied message
|
|
||||||
if (!session) {
|
|
||||||
return (
|
|
||||||
<Layout>
|
|
||||||
<AccessDenied />
|
|
||||||
</Layout>
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
// If session exists, display content
|
|
||||||
return (
|
|
||||||
<Layout>
|
|
||||||
<h1>Protected Page</h1>
|
|
||||||
<p>Data fetched during SSR from Supabase with RSL enabled:</p>
|
|
||||||
<pre>{JSON.stringify(data, null, 2)}</pre>
|
|
||||||
</Layout>
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
export async function getServerSideProps(context) {
|
|
||||||
const session = await unstable_getServerSession(
|
|
||||||
context.req,
|
|
||||||
context.res,
|
|
||||||
authOptions
|
|
||||||
)
|
|
||||||
|
|
||||||
if (!session)
|
|
||||||
return {
|
|
||||||
props: {
|
|
||||||
session,
|
|
||||||
data: null,
|
|
||||||
error: "No session",
|
|
||||||
},
|
|
||||||
}
|
|
||||||
|
|
||||||
const { supabaseAccessToken } = session
|
|
||||||
|
|
||||||
const supabase = createClient(
|
|
||||||
process.env.NEXT_PUBLIC_SUPABASE_URL,
|
|
||||||
process.env.NEXT_PUBLIC_SUPABASE_ANON_KEY,
|
|
||||||
{
|
|
||||||
global: {
|
|
||||||
headers: {
|
|
||||||
Authorization: `Bearer ${supabaseAccessToken}`,
|
|
||||||
},
|
|
||||||
},
|
|
||||||
}
|
|
||||||
)
|
|
||||||
// Now you can query with RLS enabled.
|
|
||||||
const { data, error } = await supabase.from("users").select("*")
|
|
||||||
|
|
||||||
return {
|
|
||||||
props: {
|
|
||||||
session,
|
|
||||||
data,
|
|
||||||
error,
|
|
||||||
},
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,107 +0,0 @@
|
|||||||
import type { PlaywrightTestConfig } from '@playwright/test';
|
|
||||||
import { devices } from '@playwright/test';
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Read environment variables from file.
|
|
||||||
* https://github.com/motdotla/dotenv
|
|
||||||
*/
|
|
||||||
require('dotenv').config();
|
|
||||||
|
|
||||||
/**
|
|
||||||
* See https://playwright.dev/docs/test-configuration.
|
|
||||||
*/
|
|
||||||
const config: PlaywrightTestConfig = {
|
|
||||||
testDir: './tests',
|
|
||||||
/* Maximum time one test can run for. */
|
|
||||||
timeout: 30 * 1000,
|
|
||||||
expect: {
|
|
||||||
/**
|
|
||||||
* Maximum time expect() should wait for the condition to be met.
|
|
||||||
* For example in `await expect(locator).toHaveText();`
|
|
||||||
*/
|
|
||||||
timeout: 5000
|
|
||||||
},
|
|
||||||
/* Run tests in files in parallel */
|
|
||||||
fullyParallel: true,
|
|
||||||
/* Fail the build on CI if you accidentally left test.only in the source code. */
|
|
||||||
forbidOnly: !!process.env.CI,
|
|
||||||
/* Retry on CI only */
|
|
||||||
retries: process.env.CI ? 2 : 0,
|
|
||||||
/* Opt out of parallel tests on CI. */
|
|
||||||
workers: process.env.CI ? 1 : undefined,
|
|
||||||
/* Reporter to use. See https://playwright.dev/docs/test-reporters */
|
|
||||||
reporter: 'html',
|
|
||||||
/* Shared settings for all the projects below. See https://playwright.dev/docs/api/class-testoptions. */
|
|
||||||
use: {
|
|
||||||
/* Maximum time each action such as `click()` can take. Defaults to 0 (no limit). */
|
|
||||||
actionTimeout: 0,
|
|
||||||
/* Base URL to use in actions like `await page.goto('/')`. */
|
|
||||||
// baseURL: 'http://localhost:3000',
|
|
||||||
|
|
||||||
/* Collect trace when retrying the failed test. See https://playwright.dev/docs/trace-viewer */
|
|
||||||
trace: 'on-first-retry',
|
|
||||||
},
|
|
||||||
|
|
||||||
/* Configure projects for major browsers */
|
|
||||||
projects: [
|
|
||||||
{
|
|
||||||
name: 'chromium',
|
|
||||||
use: {
|
|
||||||
...devices['Desktop Chrome'],
|
|
||||||
},
|
|
||||||
},
|
|
||||||
|
|
||||||
{
|
|
||||||
name: 'firefox',
|
|
||||||
use: {
|
|
||||||
...devices['Desktop Firefox'],
|
|
||||||
},
|
|
||||||
},
|
|
||||||
|
|
||||||
{
|
|
||||||
name: 'webkit',
|
|
||||||
use: {
|
|
||||||
...devices['Desktop Safari'],
|
|
||||||
},
|
|
||||||
},
|
|
||||||
|
|
||||||
/* Test against mobile viewports. */
|
|
||||||
// {
|
|
||||||
// name: 'Mobile Chrome',
|
|
||||||
// use: {
|
|
||||||
// ...devices['Pixel 5'],
|
|
||||||
// },
|
|
||||||
// },
|
|
||||||
// {
|
|
||||||
// name: 'Mobile Safari',
|
|
||||||
// use: {
|
|
||||||
// ...devices['iPhone 12'],
|
|
||||||
// },
|
|
||||||
// },
|
|
||||||
|
|
||||||
/* Test against branded browsers. */
|
|
||||||
// {
|
|
||||||
// name: 'Microsoft Edge',
|
|
||||||
// use: {
|
|
||||||
// channel: 'msedge',
|
|
||||||
// },
|
|
||||||
// },
|
|
||||||
// {
|
|
||||||
// name: 'Google Chrome',
|
|
||||||
// use: {
|
|
||||||
// channel: 'chrome',
|
|
||||||
// },
|
|
||||||
// },
|
|
||||||
],
|
|
||||||
|
|
||||||
/* Folder for test artifacts such as screenshots, videos, traces, etc. */
|
|
||||||
// outputDir: 'test-results/',
|
|
||||||
|
|
||||||
/* Run your local dev server before starting the tests */
|
|
||||||
// webServer: {
|
|
||||||
// command: 'npm run start',
|
|
||||||
// port: 3000,
|
|
||||||
// },
|
|
||||||
};
|
|
||||||
|
|
||||||
export default config;
|
|
||||||
@@ -1,57 +0,0 @@
|
|||||||
datasource db {
|
|
||||||
provider = "sqlite"
|
|
||||||
url = "file:./dev.db"
|
|
||||||
}
|
|
||||||
|
|
||||||
generator client {
|
|
||||||
provider = "prisma-client-js"
|
|
||||||
}
|
|
||||||
|
|
||||||
model Account {
|
|
||||||
id String @id @default(cuid())
|
|
||||||
userId String
|
|
||||||
type String
|
|
||||||
provider String
|
|
||||||
providerAccountId String
|
|
||||||
refresh_token String?
|
|
||||||
access_token String?
|
|
||||||
expires_at Int?
|
|
||||||
token_type String?
|
|
||||||
scope String?
|
|
||||||
id_token String?
|
|
||||||
session_state String?
|
|
||||||
oauth_token_secret String?
|
|
||||||
oauth_token String?
|
|
||||||
|
|
||||||
createdAt DateTime @default(now())
|
|
||||||
updatedAt DateTime @updatedAt
|
|
||||||
user User @relation(fields: [userId], references: [id])
|
|
||||||
|
|
||||||
@@unique([provider, providerAccountId])
|
|
||||||
}
|
|
||||||
|
|
||||||
model Session {
|
|
||||||
id String @id @default(cuid())
|
|
||||||
sessionToken String @unique
|
|
||||||
userId String
|
|
||||||
expires DateTime
|
|
||||||
user User @relation(fields: [userId], references: [id])
|
|
||||||
}
|
|
||||||
|
|
||||||
model User {
|
|
||||||
id String @id @default(cuid())
|
|
||||||
name String?
|
|
||||||
email String? @unique
|
|
||||||
emailVerified DateTime?
|
|
||||||
image String?
|
|
||||||
accounts Account[]
|
|
||||||
sessions Session[]
|
|
||||||
}
|
|
||||||
|
|
||||||
model VerificationToken {
|
|
||||||
identifier String
|
|
||||||
token String @unique
|
|
||||||
expires DateTime
|
|
||||||
|
|
||||||
@@unique([identifier, token])
|
|
||||||
}
|
|
||||||
@@ -1,39 +0,0 @@
|
|||||||
import { test, expect } from "@playwright/test"
|
|
||||||
|
|
||||||
test("Sign in with Auth0", async ({ page }) => {
|
|
||||||
// Go to NextAuth example app
|
|
||||||
await page.goto("https://next-auth-example.vercel.app")
|
|
||||||
|
|
||||||
// Click 'Sign In'
|
|
||||||
await page.click("#__next > header > div > p > a")
|
|
||||||
|
|
||||||
// Auth0 Login Provider
|
|
||||||
await page.click('body > div > div form[action*="auth0"] > button')
|
|
||||||
|
|
||||||
// Enter Credentials (Username/Password Login) on Auth0 Widget
|
|
||||||
await page.type("#username", process.env.AUTH0_USERNAME!)
|
|
||||||
await page.type("#password", process.env.AUTH0_PASSWORD!)
|
|
||||||
|
|
||||||
// Snap a screenshot
|
|
||||||
// await page.screenshot({ path: "1-auth0-login.png", fullPage: true })
|
|
||||||
|
|
||||||
// Press submit on Auth0 form
|
|
||||||
await page.click('body > div > main > section > div button[type="submit"]')
|
|
||||||
|
|
||||||
// Wait for next-auth example page login status header to appear
|
|
||||||
await page.waitForTimeout(2000)
|
|
||||||
|
|
||||||
// Snap a screenshot
|
|
||||||
// await page.screenshot({
|
|
||||||
// path: "2-next-auth-redirect-result.png",
|
|
||||||
// fullPage: false,
|
|
||||||
// })
|
|
||||||
|
|
||||||
// Check session object after successful login
|
|
||||||
const response = await page.goto(
|
|
||||||
"https://next-auth-example.vercel.app/api/auth/session"
|
|
||||||
)
|
|
||||||
const session = await response?.json()
|
|
||||||
expect(session?.user?.email).toBe(process.env.AUTH0_USERNAME)
|
|
||||||
// TODO: Check whole object with .toEqual()
|
|
||||||
})
|
|
||||||
@@ -1,39 +0,0 @@
|
|||||||
{
|
|
||||||
"compilerOptions": {
|
|
||||||
"target": "esnext",
|
|
||||||
"lib": [
|
|
||||||
"dom",
|
|
||||||
"dom.iterable",
|
|
||||||
"esnext"
|
|
||||||
],
|
|
||||||
"allowJs": true,
|
|
||||||
"skipLibCheck": true,
|
|
||||||
"strict": false,
|
|
||||||
"forceConsistentCasingInFileNames": true,
|
|
||||||
"noEmit": true,
|
|
||||||
"esModuleInterop": true,
|
|
||||||
"module": "esnext",
|
|
||||||
"moduleResolution": "node",
|
|
||||||
"resolveJsonModule": true,
|
|
||||||
"isolatedModules": true,
|
|
||||||
"incremental": true,
|
|
||||||
"jsx": "preserve",
|
|
||||||
"baseUrl": ".",
|
|
||||||
"plugins": [
|
|
||||||
{
|
|
||||||
"name": "next"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"strictNullChecks": true
|
|
||||||
},
|
|
||||||
"include": [
|
|
||||||
"next-env.d.ts",
|
|
||||||
"**/*.ts",
|
|
||||||
"**/*.tsx",
|
|
||||||
".next/types/**/*.ts"
|
|
||||||
],
|
|
||||||
"exclude": [
|
|
||||||
"node_modules",
|
|
||||||
"jest.config.js"
|
|
||||||
]
|
|
||||||
}
|
|
||||||
20
apps/dev/nextjs/types/nextauth.d.ts
vendored
20
apps/dev/nextjs/types/nextauth.d.ts
vendored
@@ -1,20 +0,0 @@
|
|||||||
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
||||||
import NextAuth from "next-auth"
|
|
||||||
|
|
||||||
declare module "next-auth" {
|
|
||||||
/**
|
|
||||||
* Returned by `useSession`, `getSession` and received as a prop on the `SessionProvider` React Context
|
|
||||||
*/
|
|
||||||
interface Session {
|
|
||||||
// A JWT which can be used as Authorization header with supabase-js for RLS.
|
|
||||||
supabaseAccessToken?: string
|
|
||||||
user: {
|
|
||||||
/** The user's postal address. */
|
|
||||||
address: string
|
|
||||||
} & User
|
|
||||||
}
|
|
||||||
|
|
||||||
interface User {
|
|
||||||
foo: string
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,5 +1,5 @@
|
|||||||
{
|
{
|
||||||
"name": "next-auth-app-v4",
|
"name": "next-auth-app",
|
||||||
"version": "1.0.0",
|
"version": "1.0.0",
|
||||||
"description": "NextAuth.js Developer app",
|
"description": "NextAuth.js Developer app",
|
||||||
"private": true,
|
"private": true,
|
||||||
@@ -15,13 +15,13 @@
|
|||||||
"license": "ISC",
|
"license": "ISC",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@next-auth/fauna-adapter": "workspace:*",
|
"@next-auth/fauna-adapter": "workspace:*",
|
||||||
"@auth/prisma-adapter": "workspace:*",
|
"@next-auth/prisma-adapter": "workspace:*",
|
||||||
"@next-auth/supabase-adapter": "workspace:*",
|
"@next-auth/supabase-adapter": "workspace:*",
|
||||||
"@auth/typeorm-adapter": "workspace:*",
|
"@next-auth/typeorm-legacy-adapter": "workspace:*",
|
||||||
"@prisma/client": "^3",
|
"@prisma/client": "^3",
|
||||||
"@supabase/supabase-js": "^2.0.5",
|
"@supabase/supabase-js": "^2.0.5",
|
||||||
"faunadb": "^4",
|
"faunadb": "^4",
|
||||||
"next": "13.3.0",
|
"next": "13.0.6",
|
||||||
"next-auth": "workspace:*",
|
"next-auth": "workspace:*",
|
||||||
"nodemailer": "^6",
|
"nodemailer": "^6",
|
||||||
"react": "^18",
|
"react": "^18",
|
||||||
@@ -29,7 +29,7 @@
|
|||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@types/jsonwebtoken": "^8.5.5",
|
"@types/jsonwebtoken": "^8.5.5",
|
||||||
"@types/react": "^18.0.37",
|
"@types/react": "^18.0.15",
|
||||||
"@types/react-dom": "^18.0.6",
|
"@types/react-dom": "^18.0.6",
|
||||||
"fake-smtp-server": "^0.8.0",
|
"fake-smtp-server": "^0.8.0",
|
||||||
"pg": "^8.7.3",
|
"pg": "^8.7.3",
|
||||||
@@ -37,7 +37,7 @@ import WorkOS from "next-auth/providers/workos"
|
|||||||
|
|
||||||
// // Prisma
|
// // Prisma
|
||||||
// import { PrismaClient } from "@prisma/client"
|
// import { PrismaClient } from "@prisma/client"
|
||||||
// import { PrismaAdapter } from "@auth/prisma-adapter"
|
// import { PrismaAdapter } from "@next-auth/prisma-adapter"
|
||||||
// const client = globalThis.prisma || new PrismaClient()
|
// const client = globalThis.prisma || new PrismaClient()
|
||||||
// if (process.env.NODE_ENV !== "production") globalThis.prisma = client
|
// if (process.env.NODE_ENV !== "production") globalThis.prisma = client
|
||||||
// const adapter = PrismaAdapter(client)
|
// const adapter = PrismaAdapter(client)
|
||||||
@@ -51,8 +51,8 @@ import WorkOS from "next-auth/providers/workos"
|
|||||||
// const adapter = FaunaAdapter(client)
|
// const adapter = FaunaAdapter(client)
|
||||||
|
|
||||||
// // TypeORM
|
// // TypeORM
|
||||||
// import { TypeORMAdapter } from "@auth/typeorm-adapter"
|
// import { TypeORMLegacyAdapter } from "@next-auth/typeorm-legacy-adapter"
|
||||||
// const adapter = TypeORMAdapter({
|
// const adapter = TypeORMLegacyAdapter({
|
||||||
// type: "sqlite",
|
// type: "sqlite",
|
||||||
// name: "next-auth-test-memory",
|
// name: "next-auth-test-memory",
|
||||||
// database: "./typeorm/dev.db",
|
// database: "./typeorm/dev.db",
|
||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user