Compare commits

...

40 Commits

Author SHA1 Message Date
GitHub Actions
bcf909b69e chore(release): bump package version(s) [skip ci] 2022-12-24 16:39:23 +00:00
Balázs Orbán
4dcdd21242 fix(providers): add state check to Twitter by default
Fixes #6135
2022-12-24 17:16:22 +01:00
Balázs Orbán
137d993a13 chore(dev): upgrade next 2022-12-24 17:15:35 +01:00
Balázs Orbán
8dda662cd6 chore: fix issue validator path 2022-12-24 16:43:51 +01:00
Balázs Orbán
8a438bab32 Merge branch 'main' of github.com:nextauthjs/next-auth 2022-12-24 16:36:33 +01:00
Balázs Orbán
4aaad03e9c chore: fix issue validator 2022-12-24 16:36:30 +01:00
Fatih Aygün
4fa0d1fa2a fix(core): correctly normalize endpoint configuration (#6173) 2022-12-24 15:31:47 +00:00
Balázs Orbán
c081773667 chore: use classic PAT for example sync 2022-12-24 15:25:57 +00:00
Balázs Orbán
1ab0a2aed4 fix(adapters): correct peer dependency for Supabase Adapter
Fixes #6172
2022-12-24 15:23:29 +00:00
Balázs Orbán
cac9816d32 chore: update sync examples PAT 2022-12-24 15:19:27 +00:00
Balázs Orbán
65defc709e chore(examples): change to named import 2022-12-24 15:14:06 +00:00
Balázs Orbán
1601626d31 chore: prettier ignore generated file 2022-12-24 04:34:47 +01:00
Balázs Orbán
8c4f439279 fix: add package keywords 2022-12-24 04:32:10 +01:00
GitHub Actions
a3cc9cb5f8 chore(release): bump package version(s) [skip ci] 2022-12-24 03:15:11 +00:00
Balázs Orbán
0ad4be2809 fix(core): add header to README 2022-12-24 04:04:56 +01:00
Balázs Orbán
aea4aaf25f fix(sveltekit): add header to README 2022-12-24 04:04:49 +01:00
Balázs Orbán
9bd7bc8a47 chore: fix docs building 2022-12-24 03:43:32 +01:00
Balázs Orbán
bf8fc9ca94 chore: fix docs scripts 2022-12-24 03:39:57 +01:00
Balázs Orbán
7116248e87 chore: mark @auth/* as prereleases 2022-12-24 03:30:53 +01:00
Balázs Orbán
ef8f353d94 Merge branch 'main' of github.com:nextauthjs/next-auth 2022-12-24 03:26:10 +01:00
Balázs Orbán
01620f9b7c chore: drop older node.js versions, update pnpm 2022-12-24 03:26:07 +01:00
Balázs Orbán
87d41aff94 chore: re-add LICENSE as it seems to not be picked up 2022-12-24 02:22:29 +00:00
Balázs Orbán
2d21f5ea5e chore: remove LICENSE file in favor of .github
See: https://github.com/nextauthjs/.github
2022-12-24 02:21:52 +00:00
Balázs Orbán
adf7cae7a0 chore: gitignore eslintcache 2022-12-24 03:17:50 +01:00
Balázs Orbán
f9b75e0a39 chore: remove extra tsconfigs 2022-12-24 03:16:50 +01:00
Balázs Orbán
9d6f54539d chore: simplify eslint linting 2022-12-24 03:10:03 +01:00
Balázs Orbán
0e51c66e11 chore: remove package-level lint and format 2022-12-24 01:49:31 +01:00
Balázs Orbán
e47c3c81f1 chore: format 2022-12-24 01:47:46 +01:00
Balázs Orbán
d69edb8501 chore: tweak prettierignore 2022-12-24 01:46:17 +01:00
Balázs Orbán
e5c0e3513b chore: upgrade monorepo-release package 2022-12-24 01:33:50 +01:00
Balázs Orbán
ca208ce732 chore: remove husky 2022-12-24 01:33:20 +01:00
Balázs Orbán
dcb601987b Merge branch 'main' of github.com:nextauthjs/next-auth 2022-12-23 15:00:20 +01:00
Balázs Orbán
7fd799a9ac chore: only lint with prettier 2022-12-23 15:00:13 +01:00
Balázs Orbán
fdd5e2390d chore: format 2022-12-23 14:42:37 +01:00
Balázs Orbán
fdecbb59c4 chore: move all lint/format to top 2022-12-23 14:41:53 +01:00
Nico Domino
677d8a346f chore(docs): fix aloglia docusaurus.config.js settings (#6159)
* chore: fix docusaurus algolia config

* chore: add empty 03-core dir
2022-12-23 12:41:43 +01:00
GitHub Actions
aad0b8db0e chore(release): bump package version(s) [skip ci] 2022-12-23 06:16:36 +00:00
Balázs Orbán
137bbb8d84 fix(core): improve AuthConfig docs 2022-12-23 07:02:50 +01:00
Balázs Orbán
d7fbd05eba chore: update monorepo-release package 2022-12-23 06:52:57 +01:00
Balázs Orbán
532aa24495 chore: use classic PAT for now 2022-12-23 05:10:27 +01:00
103 changed files with 1371 additions and 1672 deletions

70
.eslintignore Normal file
View File

@@ -0,0 +1,70 @@
.eslintrc.js
.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
*.cjs
*.js
*.d.ts
*.d.ts.map
.svelte-kit
.next
.nuxt
# --------------- Docs ---------------
.docusaurus
build
docs/docs/reference/03-core
docs/docs/reference/04-sveltekit
static
# --------------- Packages ---------------
coverage
dist
# @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
# --------------- Tests ---------------
# TODO: these should be linted
packages/**/*test*

View File

@@ -1,31 +1,37 @@
// @ts-check // @ts-check
const path = require("path")
/** @type {import("eslint").ESLint.ConfigData} */ /** @type {import("eslint").ESLint.ConfigData} */
module.exports = { module.exports = {
root: true, env: { browser: true, es2022: true, node: true },
parser: "@typescript-eslint/parser", extends: ["eslint:recommended", "prettier"],
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",
},
overrides: [ overrides: [
{ {
files: ["*.ts", "*.tsx"], files: ["*.ts", "*.tsx"],
parser: "@typescript-eslint/parser",
parserOptions: { parserOptions: {
project: [ project: ["./packages/**/tsconfig.json", "./apps/**/tsconfig.json"],
path.resolve(__dirname, "./packages/**/tsconfig.eslint.json"), },
path.resolve(__dirname, "./packages/frameworks/**/tsconfig.json"), settings: { react: { version: "18" } },
path.resolve(__dirname, "./apps/**/tsconfig.json"), extends: [
], "plugin:react/recommended",
"plugin:react/jsx-runtime",
"standard-with-typescript",
"prettier",
],
rules: {
"@typescript-eslint/explicit-function-return-type": "off",
"@typescript-eslint/method-signature-style": "off",
"@typescript-eslint/naming-convention": "off",
"@typescript-eslint/no-non-null-assertion": "off",
"@typescript-eslint/restrict-template-expressions": "off",
"@typescript-eslint/strict-boolean-expressions": "off",
"react/prop-types": "off",
"react/no-unescaped-entities": "off",
}, },
}, },
{ {
files: ["*.test.ts", "*.test.js"], files: ["*.test.ts", "*.test.js"],
extends: ["plugin:jest/recommended"],
env: { jest: true }, env: { jest: true },
}, },
{ {
@@ -34,7 +40,8 @@ module.exports = {
extends: ["plugin:@docusaurus/recommended"], extends: ["plugin:@docusaurus/recommended"],
}, },
{ {
files: ["packages/core/src/**/*"], // TODO: Expand to all packages
files: ["packages/{core,sveltekit}/*.ts"],
plugins: ["jsdoc"], plugins: ["jsdoc"],
extends: ["plugin:jsdoc/recommended"], extends: ["plugin:jsdoc/recommended"],
rules: { rules: {
@@ -49,19 +56,20 @@ module.exports = {
}, },
}, },
{ {
files: ["packages/core/src/adapters.ts"], files: ["packages/frameworks-sveltekit"],
rules: { plugins: ["svelte3"],
"@typescript-eslint/method-signature-style": "off", overrides: [{ files: ["*.svelte"], processor: "svelte3/svelte3" }],
settings: {
"svelte3/typescript": () => require("typescript"),
}, },
parserOptions: { sourceType: "module", ecmaVersion: 2020 },
env: { browser: true, es2017: true, node: true },
}, },
], ],
plugins: ["jest"], parserOptions: {
ignorePatterns: [ sourceType: "module",
"**/dist/**", ecmaVersion: "latest",
"**/node_modules/**", ecmaFeatures: { jsx: true },
".eslintrc.js", },
"**/.turbo/**", root: true,
"**/coverage/**",
"**/build/**",
],
} }

View File

@@ -1 +1 @@
blank_issues_enabled: false blank_issues_enabled: false

File diff suppressed because one or more lines are too long

View File

@@ -526,7 +526,7 @@ IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
root root
ISC License ISC License
Copyright (c) 2018-2021, Iain Collins Copyright (c) 2022-2023, Balázs Orbán
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,6 +540,7 @@ 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

View File

@@ -35,4 +35,3 @@ 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)

View File

@@ -4,6 +4,7 @@ import * as github from "@actions/github"
// @ts-expect-error // @ts-expect-error
import * as core from "@actions/core" import * as core from "@actions/core"
import { readFileSync } from "node:fs" import { readFileSync } from "node:fs"
import { join } from "node:path"
const addReproductionLabel = "incomplete" const addReproductionLabel = "incomplete"
@@ -40,7 +41,13 @@ async function run() {
label: { name: newLabel }, label: { name: newLabel },
} = payload } = payload
if (pull_request || !issue?.body || !process.env.GITHUB_TOKEN) return if (
pull_request ||
!issue?.body ||
!process.env.GITHUB_TOKEN ||
!process.env.GITHUB_ACTION_PATH
)
return
const labels = issue.labels.map((l) => l.name) const labels = issue.labels.map((l) => l.name)
// const isBugReport = // const isBugReport =
@@ -70,7 +77,10 @@ async function run() {
}), }),
client.issues.createComment({ client.issues.createComment({
...issueCommon, ...issueCommon,
body: readFileSync("repro.md", "utf8"), body: readFileSync(
join(process.env.GITHUB_ACTION_PATH, "repro.md"),
"utf8"
),
}), }),
]) ])
return core.info( return core.info(

View File

@@ -20,8 +20,6 @@ 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:
@@ -50,10 +48,9 @@ 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:
@@ -64,9 +61,10 @@ jobs:
- name: Publish to npm and GitHub - name: Publish to npm and GitHub
run: pnpm release run: pnpm release
env: env:
GITHUB_TOKEN: ${{ secrets.GH_PAT }} # Use GH_PAT when this is fixed:
# https://github.com/github/roadmap/issues/622
GITHUB_TOKEN: ${{ secrets.GH_PAT_CLASSIC }}
NPM_TOKEN: ${{ secrets.NPM_TOKEN }} NPM_TOKEN: ${{ secrets.NPM_TOKEN }}
NO_VERIFY: 1
release-pr: release-pr:
name: Publish PR name: Publish PR
runs-on: ubuntu-latest runs-on: ubuntu-latest
@@ -78,8 +76,6 @@ 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:
@@ -110,4 +106,3 @@ jobs:
env: env:
VERSION: ${{ steps.determine-version.outputs.version }} VERSION: ${{ steps.determine-version.outputs.version }}
GITHUB_TOKEN: ${{ secrets.GH_PAT }} GITHUB_TOKEN: ${{ secrets.GH_PAT }}

View File

@@ -14,6 +14,6 @@ jobs:
# Can update to v1 when https://github.com/BetaHuhn/repo-file-sync-action/issues/168 is resolved # 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 uses: BetaHuhn/repo-file-sync-action@v1.16.5
with: with:
GH_PAT: ${{ secrets.SYNC_EXAMPLE_PAT }} GH_PAT: ${{ secrets.GH_PAT_CLASSIC }}
SKIP_PR: true SKIP_PR: true
ORIGINAL_MESSAGE: true ORIGINAL_MESSAGE: true

2
.gitignore vendored
View File

@@ -1,7 +1,7 @@
# Misc # Misc
.DS_Store .DS_Store
.npmrc .npmrc
.eslintcache
.env .env
.env.local .env.local
.env.development.local .env.development.local

1
.husky/.gitignore vendored
View File

@@ -1 +0,0 @@
_

View File

@@ -1,4 +0,0 @@
#!/bin/sh
. "$(dirname "$0")/_/husky.sh"
# npx pretty-quick --staged

67
.prettierignore Normal file
View File

@@ -0,0 +1,67 @@
.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/03-core
docs/docs/reference/04-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

View File

@@ -12,5 +12,11 @@ module.exports = {
], ],
options: { printWidth: 150 }, options: { printWidth: 150 },
}, },
{
files: ["**/*package.json"],
options: {
trailingComma: "none",
},
},
], ],
} }

14
.vscode/settings.json vendored
View File

@@ -1,8 +1,8 @@
{ {
"files.exclude": { "files.exclude": {
"packages/core/{lib,providers,*.js,*.d.ts,*.d.ts.map}": true, "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 "packages/next-auth/{client,core,css,jwt,next,providers,react,utils,*.js,*.d.ts}": true
}, },
"typescript.tsdk": "node_modules/typescript/lib", "typescript.tsdk": "node_modules/typescript/lib",
"openInGitHub.remote.branch": "main", "openInGitHub.remote.branch": "main"
} }

View File

@@ -3,16 +3,12 @@
"description": "Markdown link to OAuth 2 specification", "description": "Markdown link to OAuth 2 specification",
"scope": "typescript", "scope": "typescript",
"prefix": "oauth2", "prefix": "oauth2",
"body": [ "body": ["[OAuth 2](https://datatracker.ietf.org/doc/html/rfc6749)"]
"[OAuth 2](https://datatracker.ietf.org/doc/html/rfc6749)"
]
}, },
"oidc-spec": { "oidc-spec": {
"description": "Markdown link to OpenID Connect specification", "description": "Markdown link to OpenID Connect specification",
"scope": "typescript", "scope": "typescript",
"prefix": "oidc", "prefix": "oidc",
"body": [ "body": ["[OIDC](https://openid.net/specs/openid-connect-core-1_0.html)"]
"[OIDC](https://openid.net/specs/openid-connect-core-1_0.html)" }
] }
},
}

View File

@@ -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.

View File

@@ -1,4 +1,4 @@
{ {
"typescript.tsdk": "../../node_modules/.pnpm/typescript@4.8.4/node_modules/typescript/lib", "typescript.tsdk": "../../node_modules/.pnpm/typescript@4.9.4/node_modules/typescript/lib",
"typescript.enablePromptUseWorkspaceTsdk": true "typescript.enablePromptUseWorkspaceTsdk": true
} }

View File

@@ -3,4 +3,4 @@
This folder contains a Next.js app using NextAuth.js for local development. See the following section on how to start: 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 [Setting up local environment
](https://github.com/nextauthjs/next-auth/blob/main/CONTRIBUTING.md#setting-up-local-environment) ](https://github.com/nextauthjs/next-auth/blob/main/CONTRIBUTING.md#setting-up-local-environment)

View File

@@ -11,4 +11,4 @@
.navItem { .navItem {
display: inline-block; display: inline-block;
margin-right: 1rem; margin-right: 1rem;
} }

View File

@@ -11,10 +11,10 @@
top: 0; top: 0;
opacity: 1; opacity: 1;
overflow: hidden; overflow: hidden;
border-radius: 0 0 .6rem .6rem; border-radius: 0 0 0.6rem 0.6rem;
padding: .6rem 1rem; padding: 0.6rem 1rem;
margin: 0; margin: 0;
background-color: rgba(0,0,0,.05); background-color: rgba(0, 0, 0, 0.05);
transition: all 0.2s ease-in; transition: all 0.2s ease-in;
} }
@@ -26,13 +26,13 @@
.signedInText, .signedInText,
.notSignedInText { .notSignedInText {
position: absolute; position: absolute;
padding-top: .8rem; padding-top: 0.8rem;
left: 1rem; left: 1rem;
right: 6.5rem; right: 6.5rem;
white-space: nowrap; white-space: nowrap;
text-overflow: ellipsis; text-overflow: ellipsis;
overflow: hidden; overflow: hidden;
display: inherit; display: inherit;
z-index: 1; z-index: 1;
line-height: 1.3rem; line-height: 1.3rem;
} }
@@ -55,13 +55,13 @@
.button, .button,
.buttonPrimary { .buttonPrimary {
float: right; float: right;
margin-right: -.4rem; margin-right: -0.4rem;
font-weight: 500; font-weight: 500;
border-radius: .3rem; border-radius: 0.3rem;
cursor: pointer; cursor: pointer;
font-size: 1rem; font-size: 1rem;
line-height: 1.4rem; line-height: 1.4rem;
padding: .7rem .8rem; padding: 0.7rem 0.8rem;
position: relative; position: relative;
z-index: 10; z-index: 10;
background-color: transparent; background-color: transparent;
@@ -73,11 +73,11 @@
border-color: #346df1; border-color: #346df1;
color: #fff; color: #fff;
text-decoration: none; text-decoration: none;
padding: .7rem 1.4rem; padding: 0.7rem 1.4rem;
} }
.buttonPrimary:hover { .buttonPrimary:hover {
box-shadow: inset 0 0 5rem rgba(0,0,0,0.2) box-shadow: inset 0 0 5rem rgba(0, 0, 0, 0.2);
} }
.navItems { .navItems {
@@ -89,4 +89,4 @@
.navItem { .navItem {
display: inline-block; display: inline-block;
margin-right: 1rem; margin-right: 1rem;
} }

View File

@@ -1,13 +1,11 @@
import Header from 'components/header' import Header from "components/header"
import Footer from 'components/footer' import Footer from "components/footer"
export default function Layout ({ children }) { export default function Layout({ children }) {
return ( return (
<> <>
<Header /> <Header />
<main> <main>{children}</main>
{children}
</main>
<Footer /> <Footer />
</> </>
) )

View File

@@ -20,7 +20,7 @@
"@prisma/client": "^3", "@prisma/client": "^3",
"@supabase/supabase-js": "^2.0.5", "@supabase/supabase-js": "^2.0.5",
"faunadb": "^4", "faunadb": "^4",
"next": "13.0.6", "next": "13.1.1",
"next-auth": "workspace:*", "next-auth": "workspace:*",
"@auth/core": "workspace:*", "@auth/core": "workspace:*",
"nodemailer": "^6", "nodemailer": "^6",

View File

@@ -1,17 +1,19 @@
import Layout from '../components/layout' import Layout from "../components/layout"
export default function Page () { export default function Page() {
return ( return (
<Layout> <Layout>
<h1>API Example</h1> <h1>API Example</h1>
<p>The examples below show responses from the example API endpoints.</p> <p>The examples below show responses from the example API endpoints.</p>
<p><em>You must be signed in to see responses.</em></p> <p>
<em>You must be signed in to see responses.</em>
</p>
<h2>Session</h2> <h2>Session</h2>
<p>/api/examples/session</p> <p>/api/examples/session</p>
<iframe src='/api/examples/session' /> <iframe src="/api/examples/session" />
<h2>JSON Web Token</h2> <h2>JSON Web Token</h2>
<p>/api/examples/jwt</p> <p>/api/examples/jwt</p>
<iframe src='/api/examples/jwt' /> <iframe src="/api/examples/jwt" />
</Layout> </Layout>
) )
} }

View File

@@ -1,21 +1,26 @@
import Layout from '../components/layout' import Layout from "../components/layout"
export default function Page () { export default function Page() {
return ( return (
<Layout> <Layout>
<h1>Client Side Rendering</h1> <h1>Client Side Rendering</h1>
<p> <p>
This page uses the <strong>useSession()</strong> React Hook in the <strong>&lt;/Header&gt;</strong> component. This page uses the <strong>useSession()</strong> React Hook in the{" "}
<strong>&lt;/Header&gt;</strong> component.
</p> </p>
<p> <p>
The <strong>useSession()</strong> React Hook easy to use and allows pages to render very quickly. The <strong>useSession()</strong> React Hook easy to use and allows
pages to render very quickly.
</p> </p>
<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 The advantage of this approach is that session state is shared between
that navigation between pages using <strong>useSession()</strong> is very fast. 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>
<p> <p>
The disadvantage of <strong>useSession()</strong> is that it requires client side JavaScript. The disadvantage of <strong>useSession()</strong> is that it requires
client side JavaScript.
</p> </p>
</Layout> </Layout>
) )

View File

@@ -1,11 +1,11 @@
import Layout from 'components/layout' import Layout from "components/layout"
export default function Page () { export default function Page() {
return ( return (
<Layout> <Layout>
<h1>NextAuth.js Example</h1> <h1>NextAuth.js Example</h1>
<p> <p>
This is an example site to demonstrate how to use{' '} This is an example site to demonstrate how to use{" "}
<a href="https://authjs.dev">NextAuth.js</a> for authentication. <a href="https://authjs.dev">NextAuth.js</a> for authentication.
</p> </p>
</Layout> </Layout>

View File

@@ -1,6 +1,6 @@
import { unstable_getServerSession } from "next-auth/next" import { unstable_getServerSession } from "next-auth/next"
import Layout from "../components/layout" import Layout from "../components/layout"
import { authOptions } from './api/auth/[...nextauth]'; import { authOptions } from "./api/auth/[...nextauth]"
export default function Page() { export default function Page() {
// As this page uses Server Side Rendering, the `session` will be already // As this page uses Server Side Rendering, the `session` will be already

View File

@@ -27,6 +27,6 @@ iframe {
border: 1px solid #ccc; border: 1px solid #ccc;
height: 10rem; height: 10rem;
width: 100%; width: 100%;
border-radius: .5rem; border-radius: 0.5rem;
filter: invert(1); filter: invert(1);
} }

View File

@@ -1,11 +1,7 @@
{ {
"compilerOptions": { "compilerOptions": {
"target": "esnext", "target": "esnext",
"lib": [ "lib": ["dom", "dom.iterable", "esnext"],
"dom",
"dom.iterable",
"esnext"
],
"allowJs": true, "allowJs": true,
"skipLibCheck": true, "skipLibCheck": true,
"strict": false, "strict": false,
@@ -25,14 +21,6 @@
} }
] ]
}, },
"include": [ "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx", ".next/types/**/*.ts"],
"next-env.d.ts", "exclude": ["node_modules", "jest.config.js"]
"**/*.ts",
"**/*.tsx",
".next/types/**/*.ts"
],
"exclude": [
"node_modules",
"jest.config.js"
]
} }

View File

@@ -37,7 +37,7 @@ NextAuth.js is an easy to implement, full-stack (client/server) open source auth
Go to [next-auth.js.org](https://next-auth.js.org) for more information and documentation. Go to [next-auth.js.org](https://next-auth.js.org) for more information and documentation.
> *NextAuth.js is not officially associated with Vercel or Next.js.* > _NextAuth.js is not officially associated with Vercel or Next.js._
## Getting Started ## Getting Started
@@ -67,7 +67,7 @@ You **can** skip configuring a database and come back to it later if you want.
For more information about setting up a database, please check out the following links: For more information about setting up a database, please check out the following links:
* Docs: [next-auth.js.org/adapters/overview](https://next-auth.js.org/adapters/overview) - Docs: [next-auth.js.org/adapters/overview](https://next-auth.js.org/adapters/overview)
### 3. Configure Authentication Providers ### 3. Configure Authentication Providers
@@ -75,9 +75,9 @@ For more information about setting up a database, please check out the following
2. When setting up OAuth, in the developer admin page for each of your OAuth services, you should configure the callback URL to use a callback path of `{server}/api/auth/callback/{provider}`. 2. When setting up OAuth, in the developer admin page for each of your OAuth services, you should configure the callback URL to use a callback path of `{server}/api/auth/callback/{provider}`.
e.g. For Google OAuth you would use: `http://localhost:3000/api/auth/callback/google` e.g. For Google OAuth you would use: `http://localhost:3000/api/auth/callback/google`
A list of configured providers and their callback URLs is available from the endpoint `/api/auth/providers`. You can find more information at https://next-auth.js.org/configuration/providers/oauth A list of configured providers and their callback URLs is available from the endpoint `/api/auth/providers`. You can find more information at https://next-auth.js.org/configuration/providers/oauth
3. You can also choose to specify an SMTP server for passwordless sign in via email. 3. You can also choose to specify an SMTP server for passwordless sign in via email.
@@ -110,4 +110,3 @@ Follow the [Deployment documentation](https://next-auth.js.org/deployment)
## License ## License
ISC ISC

View File

@@ -18,7 +18,6 @@ export default function ProtectedPage() {
} }
fetchData() fetchData()
}, [session]) }, [session])
// If no session exists, display access denied message // If no session exists, display access denied message
if (!session) { if (!session) {

View File

@@ -1,11 +1,7 @@
{ {
"compilerOptions": { "compilerOptions": {
"target": "es5", "target": "es5",
"lib": [ "lib": ["dom", "dom.iterable", "esnext"],
"dom",
"dom.iterable",
"esnext"
],
"allowJs": true, "allowJs": true,
"skipLibCheck": true, "skipLibCheck": true,
"strict": true, "strict": true,
@@ -19,6 +15,12 @@
"jsx": "preserve", "jsx": "preserve",
"incremental": true "incremental": true
}, },
"include": ["process.d.ts", "next-env.d.ts", "next-auth.d.ts", "**/*.ts", "**/*.tsx"], "include": [
"process.d.ts",
"next-env.d.ts",
"next-auth.d.ts",
"**/*.ts",
"**/*.tsx"
],
"exclude": ["node_modules"] "exclude": ["node_modules"]
} }

View File

@@ -1,4 +1,4 @@
import SvelteKitAuth from "@auth/sveltekit" import { SvelteKitAuth } from "@auth/sveltekit"
import GitHub from "@auth/core/providers/github" import GitHub from "@auth/core/providers/github"
import { GITHUB_ID, GITHUB_SECRET } from "$env/static/private" import { GITHUB_ID, GITHUB_SECRET } from "$env/static/private"

View File

@@ -34,7 +34,7 @@ Auth.js is an easy to implement, full-stack (client/server) open source authenti
Go to [authjs.dev](https://authjs.dev) for more information and documentation. Go to [authjs.dev](https://authjs.dev) for more information and documentation.
> Auth.js is not officially associated with Vercel or Next.js._ > Auth.js is not officially associated with Vercel or Next.js.\_
## Getting Started ## Getting Started

View File

@@ -1,7 +1,7 @@
module.exports = { module.exports = {
root: true, root: true,
extends: ['@nuxt/eslint-config'], extends: ["@nuxt/eslint-config"],
rules: { rules: {
'vue/multi-word-component-names': 'off' "vue/multi-word-component-names": "off",
} },
} }

View File

@@ -28,9 +28,9 @@ Here's an example of what it looks like:
```ts ```ts
// server/api/auth/[...].ts // server/api/auth/[...].ts
import { NuxtAuthHandler } from '@/lib/auth/server' import { NuxtAuthHandler } from "@/lib/auth/server"
import GithubProvider from '@auth/core/providers/github' import GithubProvider from "@auth/core/providers/github"
import type { AuthOptions } from '@auth/core' import type { AuthOptions } from "@auth/core"
const runtimeConfig = useRuntimeConfig() const runtimeConfig = useRuntimeConfig()
@@ -39,9 +39,9 @@ export const authOptions: AuthOptions = {
providers: [ providers: [
GithubProvider({ GithubProvider({
clientId: runtimeConfig.github.clientId, clientId: runtimeConfig.github.clientId,
clientSecret: runtimeConfig.github.clientSecret clientSecret: runtimeConfig.github.clientSecret,
}) }),
] ],
} }
export default NuxtAuthHandler(authOptions) export default NuxtAuthHandler(authOptions)

View File

@@ -7,7 +7,9 @@
<style> <style>
body { body {
font-family: -apple-system, Segoe UI, Roboto, Ubuntu, Cantarell, Noto Sans, sans-serif, BlinkMacSystemFont, 'Segoe UI', Helvetica, Arial, sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol'; font-family: -apple-system, Segoe UI, Roboto, Ubuntu, Cantarell, Noto Sans,
sans-serif, BlinkMacSystemFont, "Segoe UI", Helvetica, Arial, sans-serif,
"Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol";
padding: 0 1rem 1rem 1rem; padding: 0 1rem 1rem 1rem;
max-width: 680px; max-width: 680px;
margin: 0 auto; margin: 0 auto;

View File

@@ -1,5 +1,5 @@
<script setup lang="ts"> <script setup lang="ts">
import { signIn, signOut } from '@/lib/auth/client' import { signIn, signOut } from "@/lib/auth/client"
const session = useSession() const session = useSession()
</script> </script>
@@ -9,30 +9,37 @@ const session = useSession()
<div class="signedInStatus"> <div class="signedInStatus">
<p :class="['nojs-show', 'loaded']"> <p :class="['nojs-show', 'loaded']">
<template v-if="session"> <template v-if="session">
<span v-if="session.user?.image" :style="{ backgroundImage: `url(${session.user.image})` }" class="avatar" /> <span
v-if="session.user?.image"
:style="{ backgroundImage: `url(${session.user.image})` }"
class="avatar"
/>
<span class="signedInText"> <span class="signedInText">
<small>Signed in as</small><br> <small>Signed in as</small><br />
<strong>{{ session.user?.email || session.user?.name }}</strong> <strong>{{ session.user?.email || session.user?.name }}</strong>
</span> </span>
<a href="/api/auth/signout" class="button" @click.prevent="signOut">Sign out</a> <a href="/api/auth/signout" class="button" @click.prevent="signOut"
>Sign out</a
>
</template> </template>
<template v-else> <template v-else>
<span class="notSignedInText">You are not signed in</span> <span class="notSignedInText">You are not signed in</span>
<a href="/api/auth/signin" class="buttonPrimary" @click.prevent="signIn">Sign in</a> <a
href="/api/auth/signin"
class="buttonPrimary"
@click.prevent="signIn"
>Sign in</a
>
</template> </template>
</p> </p>
</div> </div>
<nav> <nav>
<ul class="navItems"> <ul class="navItems">
<li class="navItem"> <li class="navItem">
<NuxtLink to="/"> <NuxtLink to="/"> Home </NuxtLink>
Home
</NuxtLink>
</li> </li>
<li class="navItem"> <li class="navItem">
<NuxtLink to="/protected"> <NuxtLink to="/protected"> Protected </NuxtLink>
Protected
</NuxtLink>
</li> </li>
</ul> </ul>
</nav> </nav>
@@ -57,10 +64,10 @@ const session = useSession()
top: 0; top: 0;
opacity: 1; opacity: 1;
overflow: hidden; overflow: hidden;
border-radius: 0 0 .6rem .6rem; border-radius: 0 0 0.6rem 0.6rem;
padding: .6rem 1rem; padding: 0.6rem 1rem;
margin: 0; margin: 0;
background-color: rgba(0,0,0,.05); background-color: rgba(0, 0, 0, 0.05);
transition: all 0.2s ease-in; transition: all 0.2s ease-in;
} }
@@ -72,7 +79,7 @@ const session = useSession()
.signedInText, .signedInText,
.notSignedInText { .notSignedInText {
position: absolute; position: absolute;
padding-top: .8rem; padding-top: 0.8rem;
left: 1rem; left: 1rem;
right: 6.5rem; right: 6.5rem;
white-space: nowrap; white-space: nowrap;
@@ -101,13 +108,13 @@ const session = useSession()
.button, .button,
.buttonPrimary { .buttonPrimary {
float: right; float: right;
margin-right: -.4rem; margin-right: -0.4rem;
font-weight: 500; font-weight: 500;
border-radius: .3rem; border-radius: 0.3rem;
cursor: pointer; cursor: pointer;
font-size: 1rem; font-size: 1rem;
line-height: 1.4rem; line-height: 1.4rem;
padding: .7rem .8rem; padding: 0.7rem 0.8rem;
position: relative; position: relative;
z-index: 10; z-index: 10;
background-color: transparent; background-color: transparent;
@@ -119,11 +126,11 @@ const session = useSession()
border-color: #346df1; border-color: #346df1;
color: #fff; color: #fff;
text-decoration: none; text-decoration: none;
padding: .7rem 1.4rem; padding: 0.7rem 1.4rem;
} }
.buttonPrimary:hover { .buttonPrimary:hover {
box-shadow: inset 0 0 5rem rgba(0,0,0,0.2) box-shadow: inset 0 0 5rem rgba(0, 0, 0, 0.2);
} }
.navItems { .navItems {

View File

@@ -1,5 +1,5 @@
import { Session } from '@auth/core' import { Session } from "@auth/core"
export default function useSession() { export default function useSession() {
return useState<Session | null>('session', () => null) return useState<Session | null>("session", () => null)
} }

View File

@@ -3,11 +3,11 @@ import type {
SignInOptions, SignInOptions,
SignInAuthorizationParams, SignInAuthorizationParams,
SignOutParams, SignOutParams,
} from './types' } from "./types"
import type { import type {
BuiltInProviderType, BuiltInProviderType,
RedirectableProviderType, RedirectableProviderType,
} from '@auth/core/providers' } from "@auth/core/providers"
/** /**
* Client-side method to initiate a signin flow * Client-side method to initiate a signin flow

View File

@@ -1,9 +1,9 @@
import { AuthHandler, AuthOptions, Session } from '@auth/core' import { AuthHandler, AuthOptions, Session } from "@auth/core"
import { fromNodeMiddleware, H3Event } from 'h3' import { fromNodeMiddleware, H3Event } from "h3"
import getURL from 'requrl' import getURL from "requrl"
import { createMiddleware } from "@hattip/adapter-node"; import { createMiddleware } from "@hattip/adapter-node"
export function NuxtAuthHandler (options: AuthOptions) { export function NuxtAuthHandler(options: AuthOptions) {
async function handler(ctx: { request: Request }) { async function handler(ctx: { request: Request }) {
options.trustHost ??= true options.trustHost ??= true
@@ -24,7 +24,7 @@ export async function getSession(
const headers = getRequestHeaders(event) const headers = getRequestHeaders(event)
const nodeHeaders = new Headers() const nodeHeaders = new Headers()
const url = new URL('/api/auth/session', getURL(event.node.req)) const url = new URL("/api/auth/session", getURL(event.node.req))
Object.keys(headers).forEach((key) => { Object.keys(headers).forEach((key) => {
nodeHeaders.append(key, headers[key] as any) nodeHeaders.append(key, headers[key] as any)

View File

@@ -1,42 +1,48 @@
// Taken from next-auth/react // Taken from next-auth/react
import type { BuiltInProviderType, ProviderType } from '@auth/core/providers' import type { BuiltInProviderType, ProviderType } from "@auth/core/providers"
/** /**
* Util type that matches some strings literally, but allows any other string as well. * Util type that matches some strings literally, but allows any other string as well.
* @source https://github.com/microsoft/TypeScript/issues/29729#issuecomment-832522611 * @source https://github.com/microsoft/TypeScript/issues/29729#issuecomment-832522611
*/ */
export declare type LiteralUnion<T extends U, U = string> = T | (U & Record<never, never>); export declare type LiteralUnion<T extends U, U = string> =
| T
| (U & Record<never, never>)
export interface ClientSafeProvider { export interface ClientSafeProvider {
id: LiteralUnion<BuiltInProviderType>; id: LiteralUnion<BuiltInProviderType>
name: string; name: string
type: ProviderType; type: ProviderType
signinUrl: string; signinUrl: string
callbackUrl: string; callbackUrl: string
} }
export interface SignInOptions extends Record<string, unknown> { export interface SignInOptions extends Record<string, unknown> {
/** /**
* Specify to which URL the user will be redirected after signing in. Defaults to the page URL the sign-in is initiated from. * Specify to which URL the user will be redirected after signing in. Defaults to the page URL the sign-in is initiated from.
* *
* [Documentation](https://next-auth.js.org/getting-started/client#specifying-a-callbackurl) * [Documentation](https://next-auth.js.org/getting-started/client#specifying-a-callbackurl)
*/ */
callbackUrl?: string; callbackUrl?: string
/** [Documentation](https://next-auth.js.org/getting-started/client#using-the-redirect-false-option) */ /** [Documentation](https://next-auth.js.org/getting-started/client#using-the-redirect-false-option) */
redirect?: boolean; redirect?: boolean
} }
export interface SignInResponse { export interface SignInResponse {
error: string | undefined; error: string | undefined
status: number; status: number
ok: boolean; ok: boolean
url: string | null; url: string | null
} }
/** Match `inputType` of `new URLSearchParams(inputType)` */ /** Match `inputType` of `new URLSearchParams(inputType)` */
export declare type SignInAuthorizationParams = string | string[][] | Record<string, string> | URLSearchParams; export declare type SignInAuthorizationParams =
| string
| string[][]
| Record<string, string>
| URLSearchParams
/** [Documentation](https://next-auth.js.org/getting-started/client#using-the-redirect-false-option-1) */ /** [Documentation](https://next-auth.js.org/getting-started/client#using-the-redirect-false-option-1) */
export interface SignOutResponse { export interface SignOutResponse {
url: string; url: string
} }
export interface SignOutParams<R extends boolean = true> { export interface SignOutParams<R extends boolean = true> {
/** [Documentation](https://next-auth.js.org/getting-started/client#specifying-a-callbackurl-1) */ /** [Documentation](https://next-auth.js.org/getting-started/client#specifying-a-callbackurl-1) */
callbackUrl?: string; callbackUrl?: string
/** [Documentation](https://next-auth.js.org/getting-started/client#using-the-redirect-false-option-1 */ /** [Documentation](https://next-auth.js.org/getting-started/client#using-the-redirect-false-option-1 */
redirect?: R; redirect?: R
} }

View File

@@ -4,14 +4,16 @@ export default defineNuxtConfig({
secret: process.env.NEXTAUTH_SECRET, secret: process.env.NEXTAUTH_SECRET,
github: { github: {
clientId: process.env.GITHUB_CLIENT_ID, clientId: process.env.GITHUB_CLIENT_ID,
clientSecret: process.env.GITHUB_CLIENT_SECRET clientSecret: process.env.GITHUB_CLIENT_SECRET,
} },
}, },
vite: { vite: {
define: { define: {
'process.env.NEXTAUTH_URL': JSON.stringify(process.env.NEXTAUTH_URL), "process.env.NEXTAUTH_URL": JSON.stringify(process.env.NEXTAUTH_URL),
'process.env.AUTH_TRUST_HOST': JSON.stringify(process.env.AUTH_TRUST_HOST), "process.env.AUTH_TRUST_HOST": JSON.stringify(
'process.env.VERCEL_URL': JSON.stringify(process.env.VERCEL_URL), process.env.AUTH_TRUST_HOST
} ),
} "process.env.VERCEL_URL": JSON.stringify(process.env.VERCEL_URL),
},
},
}) })

View File

@@ -2,7 +2,9 @@
<div> <div>
<h1>Nuxt Auth Example</h1> <h1>Nuxt Auth Example</h1>
<p> <p>
This is an example site to demonstrate how to use <a href="https://v3.nuxtjs.org/">Nuxt 3</a> with <a href="https://authjs.dev/">Auth.js</a> for authentication. This is an example site to demonstrate how to use
<a href="https://v3.nuxtjs.org/">Nuxt 3</a> with
<a href="https://authjs.dev/">Auth.js</a> for authentication.
</p> </p>
</div> </div>
</template> </template>

View File

@@ -2,7 +2,7 @@
const session = useSession() const session = useSession()
definePageMeta({ definePageMeta({
middleware: 'auth' middleware: "auth",
}) })
</script> </script>

View File

@@ -1,17 +1,17 @@
import { Session } from '@auth/core' import { Session } from "@auth/core"
export default defineNuxtPlugin(async () => { export default defineNuxtPlugin(async () => {
const session = useSession() const session = useSession()
addRouteMiddleware('auth', () => { addRouteMiddleware("auth", () => {
if (!session.value) return navigateTo('/') if (!session.value) return navigateTo("/")
}) })
if (process.server) { if (process.server) {
const data = await $fetch<Session>('/api/auth/session', { const data = await $fetch<Session>("/api/auth/session", {
headers: useRequestHeaders() as any headers: useRequestHeaders() as any,
}) })
const hasSession = data && Object.keys(data).length const hasSession = data && Object.keys(data).length
session.value = hasSession ? data : null session.value = hasSession ? data : null

View File

@@ -1,6 +1,6 @@
import { NuxtAuthHandler } from '@/lib/auth/server' import { NuxtAuthHandler } from "@/lib/auth/server"
import GithubProvider from '@auth/core/providers/github' import GithubProvider from "@auth/core/providers/github"
import type { AuthOptions } from '@auth/core' import type { AuthOptions } from "@auth/core"
const runtimeConfig = useRuntimeConfig() const runtimeConfig = useRuntimeConfig()
@@ -9,9 +9,9 @@ export const authOptions: AuthOptions = {
providers: [ providers: [
GithubProvider({ GithubProvider({
clientId: runtimeConfig.github.clientId, clientId: runtimeConfig.github.clientId,
clientSecret: runtimeConfig.github.clientSecret clientSecret: runtimeConfig.github.clientSecret,
}) }),
] ],
} }
export default NuxtAuthHandler(authOptions) export default NuxtAuthHandler(authOptions)

View File

@@ -1,4 +1,4 @@
{ {
// https://v3.nuxtjs.org/concepts/typescript // https://v3.nuxtjs.org/concepts/typescript
"extends": "./.nuxt/tsconfig.json", "extends": "./.nuxt/tsconfig.json"
} }

View File

@@ -1,5 +0,0 @@
node_modules
.docusaurus
build
.turbo
static

View File

@@ -39,6 +39,8 @@ const docusaurusConfig = {
apiKey: "97c0894508f2d1d4a2fef4fe6db28448", apiKey: "97c0894508f2d1d4a2fef4fe6db28448",
indexName: "next-auth", indexName: "next-auth",
searchParameters: {}, searchParameters: {},
contextualSearch: false,
externalUrlRegex: "authjs\\.dev|next-auth\\.js\\.org",
}, },
navbar: { navbar: {
title: "Auth.js", title: "Auth.js",
@@ -223,16 +225,75 @@ const docusaurusConfig = {
} }
docusaurusConfig.headTags = [ docusaurusConfig.headTags = [
{ tagName: "meta", attributes: { charSet: "utf-8" } }, {
{ tagName: "link", attributes: { rel: "canonical", href: docusaurusConfig.url } }, tagName: "meta",
{ tagName: "meta", attributes: { property: "og:title", content: docusaurusConfig.title } }, attributes: {
{ tagName: "meta", attributes: { property: "og:description", content: docusaurusConfig.tagline } }, charSet: "utf-8",
{ tagName: "meta", attributes: { property: "og:image", content: `${docusaurusConfig.url}/img/og-image.png` } }, },
{ tagName: "meta", attributes: { property: "og:url", content: docusaurusConfig.url } }, },
{ tagName: "meta", attributes: { name: "twitter:card", content: "summary_large_image" } }, {
{ tagName: "meta", attributes: { name: "twitter:title", content: docusaurusConfig.title } }, tagName: "link",
{ tagName: "meta", attributes: { name: "twitter:description", content: docusaurusConfig.tagline } }, attributes: {
{ tagName: "meta", attributes: { name: "twitter:image", content: `${docusaurusConfig.url}/img/og-image.png` } }, rel: "canonical",
href: docusaurusConfig.url,
},
},
{
tagName: "meta",
attributes: {
property: "og:title",
content: docusaurusConfig.title,
},
},
{
tagName: "meta",
attributes: {
property: "og:description",
content: docusaurusConfig.tagline,
},
},
{
tagName: "meta",
attributes: {
property: "og:image",
content: `${docusaurusConfig.url}/img/og-image.png`,
},
},
{
tagName: "meta",
attributes: {
property: "og:url",
content: docusaurusConfig.url,
},
},
{
tagName: "meta",
attributes: {
name: "twitter:card",
content: "summary_large_image",
},
},
{
tagName: "meta",
attributes: {
name: "twitter:title",
content: docusaurusConfig.title,
},
},
{
tagName: "meta",
attributes: {
name: "twitter:description",
content: docusaurusConfig.tagline,
},
},
{
tagName: "meta",
attributes: {
name: "twitter:image",
content: `${docusaurusConfig.url}/img/og-image.png`,
},
},
] ]
module.exports = docusaurusConfig module.exports = docusaurusConfig

View File

@@ -11,10 +11,8 @@
"deploy": "docusaurus deploy", "deploy": "docusaurus deploy",
"serve": "docusaurus serve", "serve": "docusaurus serve",
"clear": "docusaurus clear", "clear": "docusaurus clear",
"lint": "eslint .", "providers": "node scripts/generate-providers.mjs",
"format": "prettier --write .", "snippets": "node scripts/generate-snippets.mjs"
"providers": "node ./scripts/generate-providers",
"snippets": "node ./scripts/generate-snippets"
}, },
"dependencies": { "dependencies": {
"@auth/core": "workspace:*", "@auth/core": "workspace:*",

View File

@@ -1,25 +0,0 @@
const path = require("path")
const fs = require("fs")
// TODO: generate from core package
const providersPath = path.join(
process.cwd(),
"/docs/reference/05-oauth-providers"
)
const files = fs.readdirSync(providersPath, "utf8")
const result = files.reduce((acc, file) => {
if (file === "index.md" || file === "_category_.json") return acc
const provider = fs.readFileSync(path.join(providersPath, file), "utf8")
const { id, title } = provider.match(
/id: (?<id>.+)\ntitle: (?<title>.+)\n/
).groups
acc[id] = title
return acc
}, {})
fs.writeFileSync(
path.join(process.cwd(), "providers.json"),
JSON.stringify(result, null, 2)
)

View File

@@ -0,0 +1,22 @@
import { join } from "path"
import { readdirSync, readFileSync, writeFileSync } from "fs"
// TODO: generate from core package
const providersPath = join(process.cwd(), "/docs/reference/05-oauth-providers")
const files = readdirSync(providersPath, "utf8")
const result = files.reduce((acc, file) => {
if (file === "index.md" || file === "_category_.json") return acc
const provider = readFileSync(join(providersPath, file), "utf8")
const { id, title } = provider.match(
/id: (?<id>.+)\ntitle: (?<title>.+)\n/
).groups
acc[id] = title
return acc
}, {})
writeFileSync(
join(process.cwd(), "providers.json"),
JSON.stringify(result, null, 2)
)

View File

@@ -1,13 +1,13 @@
const path = require("path") import { join } from "path"
const fs = require("fs") import { readdirSync, readFileSync, writeFileSync } from "fs"
const snippetsPath = path.join(process.cwd(), "snippets") const snippetsPath = join(process.cwd(), "snippets")
const files = fs.readdirSync(snippetsPath, "utf8") const files = readdirSync(snippetsPath, "utf8")
const result = {} const result = {}
for (const file of files) { for (const file of files) {
const snippet = fs.readFileSync(path.join(snippetsPath, file), "utf-8") const snippet = readFileSync(join(snippetsPath, file), "utf-8")
const body = snippet const body = snippet
.replace(/\n/g, "\n * ") .replace(/\n/g, "\n * ")
.split("\n") .split("\n")
@@ -25,7 +25,7 @@ for (const file of files) {
} }
} }
fs.writeFileSync( writeFileSync(
path.join(process.cwd(), "../.vscode/generated-snippets.code-snippets"), join(process.cwd(), "../.vscode/generated-snippets.code-snippets"),
JSON.stringify(result, null, 2) JSON.stringify(result, null, 2)
) )

View File

@@ -1,4 +1,3 @@
// eslint-disable-next-line no-use-before-define
import * as React from "react" import * as React from "react"
import Link from "@docusaurus/Link" import Link from "@docusaurus/Link"
import useBaseUrl from "@docusaurus/useBaseUrl" import useBaseUrl from "@docusaurus/useBaseUrl"

View File

@@ -6,8 +6,6 @@
"scripts": { "scripts": {
"build:app": "turbo run build --filter=next-auth-app", "build:app": "turbo run build --filter=next-auth-app",
"build": "turbo run build --filter=next-auth --filter=@next-auth/* --filter=@auth/* --no-deps", "build": "turbo run build --filter=next-auth --filter=@next-auth/* --filter=@auth/* --no-deps",
"lint": "turbo run lint --parallel",
"format": "turbo run format --parallel",
"test": "turbo run test --concurrency=1 --filter=[HEAD^1] --filter=./packages/* --filter=!*pouchdb-* --filter=!@*upstash* --filter=!*dynamodb-*", "test": "turbo run test --concurrency=1 --filter=[HEAD^1] --filter=./packages/* --filter=!*pouchdb-* --filter=!@*upstash* --filter=!*dynamodb-*",
"clean": "turbo run clean --no-cache", "clean": "turbo run clean --no-cache",
"dev:db": "turbo run dev --parallel --continue --filter=next-auth-app...", "dev:db": "turbo run dev --parallel --continue --filter=next-auth-app...",
@@ -15,44 +13,40 @@
"dev:kit": "turbo run dev --parallel --continue --filter=sveltekit-nextauth...", "dev:kit": "turbo run dev --parallel --continue --filter=sveltekit-nextauth...",
"dev:docs": "turbo run dev --filter=docs", "dev:docs": "turbo run dev --filter=docs",
"email": "cd apps/dev && pnpm email", "email": "cd apps/dev && pnpm email",
"eslint": "eslint --cache .",
"lint": "prettier --check .",
"format": "prettier --write .",
"release": "release", "release": "release",
"version:pr": "node ./config/version-pr" "version:pr": "node ./config/version-pr"
}, },
"devDependencies": { "devDependencies": {
"@actions/core": "^1.6.0", "@actions/core": "^1.10.0",
"@balazsorban/monorepo-release": "0.1.1", "@balazsorban/monorepo-release": "0.1.8",
"@types/jest": "^28.1.3", "@types/jest": "^28.1.3",
"@types/node": "^17.0.25", "@types/node": "^17.0.25",
"@typescript-eslint/eslint-plugin": "^5.10.2", "@typescript-eslint/eslint-plugin": "5.47.0",
"@typescript-eslint/parser": "^4.33.0", "@typescript-eslint/parser": "5.47.0",
"eslint": "^7.32.0", "eslint": "8.30.0",
"eslint-config-prettier": "^8.3.0", "eslint-config-prettier": "^8.5.0",
"eslint-config-standard-with-typescript": "^21.0.1", "eslint-config-standard-with-typescript": "^21.0.1",
"eslint-plugin-import": "^2.25.4", "eslint-plugin-import": "^2.25.4",
"eslint-plugin-jest": "^27.0.1", "eslint-plugin-jest": "^27.0.1",
"eslint-plugin-jsdoc": "^39.6.4", "eslint-plugin-jsdoc": "^39.6.4",
"eslint-plugin-node": "^11.1.0", "eslint-plugin-node": "^11.1.0",
"eslint-plugin-promise": "^6.0.0", "eslint-plugin-promise": "^6.0.0",
"husky": "^7.0.4", "eslint-plugin-react": "^7.31.11",
"eslint-plugin-svelte3": "^4.0.0",
"prettier": "2.8.1", "prettier": "2.8.1",
"pretty-quick": "^3.1.2", "prettier-plugin-svelte": "^2.8.1",
"semver": "7.3.5", "turbo": "1.6.3",
"stream-to-array": "2.3.0",
"ts-node": "10.5.0",
"turbo": "1.3.1",
"typedoc": "^0.23.22", "typedoc": "^0.23.22",
"typedoc-plugin-markdown": "^3.14.0", "typedoc-plugin-markdown": "^3.14.0",
"typescript": "4.8.4" "typescript": "4.9.4"
},
"release": {
"packageDirectories": [
"packages"
]
}, },
"engines": { "engines": {
"node": "^12.19.0 || ^14.15.0 || ^16.13.0 || ^18.12.0" "node": "^16.13.0 || ^18.12.0"
}, },
"packageManager": "pnpm@7.13.3", "packageManager": "pnpm@7.19.0",
"funding": [ "funding": [
{ {
"type": "github", "type": "github",
@@ -68,7 +62,8 @@
"undici": "5.11.0" "undici": "5.11.0"
}, },
"patchedDependencies": { "patchedDependencies": {
"typedoc-plugin-markdown@3.14.0": "patches/typedoc-plugin-markdown@3.14.0.patch" "typedoc-plugin-markdown@3.14.0": "patches/typedoc-plugin-markdown@3.14.0.patch",
"@balazsorban/monorepo-release@0.1.8": "patches/@balazsorban__monorepo-release@0.1.8.patch"
} }
} }
} }

View File

@@ -1,8 +0,0 @@
{
"extends": "./tsconfig.json",
"include": ["tests", "src"],
"exclude": [
"./*.js",
"./*.d.ts",
]
}

View File

@@ -1,8 +0,0 @@
{
"extends": "./tsconfig.json",
"include": ["tests", "src"],
"exclude": [
"./*.js",
"./*.d.ts",
]
}

View File

@@ -69,7 +69,7 @@ export const format = {
const newObject: Record<string, unknown> = {} const newObject: Record<string, unknown> = {}
for (const key in object) { for (const key in object) {
const value = object[key] const value = object[key]
if (value?.value && typeof value.value === 'string') { if (value?.value && typeof value.value === "string") {
newObject[key] = new Date(value.value) newObject[key] = new Date(value.value)
} else { } else {
newObject[key] = value newObject[key] = value

View File

@@ -1,8 +0,0 @@
{
"extends": "./tsconfig.json",
"include": ["tests", "src"],
"exclude": [
"./*.js",
"./*.d.ts",
]
}

View File

@@ -250,12 +250,8 @@ export function FirestoreAdapter({
const verificationTokenSnapshot = await getDoc(verificationTokenRef) const verificationTokenSnapshot = await getDoc(verificationTokenRef)
if (verificationTokenSnapshot.exists() && VerificationTokens.converter) { if (verificationTokenSnapshot.exists() && VerificationTokens.converter) {
const { const { id, ...verificationToken } =
id, VerificationTokens.converter.fromFirestore(verificationTokenSnapshot)
...verificationToken
} = VerificationTokens.converter.fromFirestore(
verificationTokenSnapshot
)
return verificationToken return verificationToken
} }
@@ -274,12 +270,8 @@ export function FirestoreAdapter({
if (verificationTokenSnapshot?.exists() && VerificationTokens.converter) { if (verificationTokenSnapshot?.exists() && VerificationTokens.converter) {
await deleteDoc(verificationTokenSnapshot.ref) await deleteDoc(verificationTokenSnapshot.ref)
const { const { id, ...verificationToken } =
id, VerificationTokens.converter.fromFirestore(verificationTokenSnapshot)
...verificationToken
} = VerificationTokens.converter.fromFirestore(
verificationTokenSnapshot
)
return verificationToken return verificationToken
} }

View File

@@ -1,76 +1,117 @@
import { runBasicTests } from "@next-auth/adapter-test" import { runBasicTests } from "@next-auth/adapter-test"
import { FirestoreAdapter } from "../src" import { FirestoreAdapter } from "../src"
import { getFirestore, connectFirestoreEmulator, terminate, collection, query, where, limit, getDocs, getDoc, doc } from "firebase/firestore" import {
import { initializeApp } from "firebase/app"; getFirestore,
import { getConverter } from "../src/converter"; connectFirestoreEmulator,
import type { AdapterSession, AdapterUser, VerificationToken } from "next-auth/adapters"; terminate,
import type { Account } from "next-auth"; collection,
query,
where,
limit,
getDocs,
getDoc,
doc,
} from "firebase/firestore"
import { initializeApp } from "firebase/app"
import { getConverter } from "../src/converter"
import type {
AdapterSession,
AdapterUser,
VerificationToken,
} from "next-auth/adapters"
import type { Account } from "next-auth"
const app = initializeApp({ projectId: "next-auth-test" }); const app = initializeApp({ projectId: "next-auth-test" })
const firestore = getFirestore(app); const firestore = getFirestore(app)
connectFirestoreEmulator(firestore, 'localhost', 8080); connectFirestoreEmulator(firestore, "localhost", 8080)
type IndexableObject = Record<string, unknown>; type IndexableObject = Record<string, unknown>
const Users = collection(firestore, 'users').withConverter(getConverter<AdapterUser & IndexableObject>()); const Users = collection(firestore, "users").withConverter(
const Sessions = collection(firestore, 'sessions').withConverter(getConverter<AdapterSession & IndexableObject>()); getConverter<AdapterUser & IndexableObject>()
const Accounts = collection(firestore, 'accounts').withConverter(getConverter<Account>()); )
const VerificationTokens = collection(firestore, 'verificationTokens').withConverter(getConverter<VerificationToken & IndexableObject>({ excludeId: true })); const Sessions = collection(firestore, "sessions").withConverter(
getConverter<AdapterSession & IndexableObject>()
)
const Accounts = collection(firestore, "accounts").withConverter(
getConverter<Account>()
)
const VerificationTokens = collection(
firestore,
"verificationTokens"
).withConverter(
getConverter<VerificationToken & IndexableObject>({ excludeId: true })
)
runBasicTests({ runBasicTests({
adapter: FirestoreAdapter({ projectId: "next-auth-test" }), adapter: FirestoreAdapter({ projectId: "next-auth-test" }),
db: { db: {
async disconnect() { async disconnect() {
await terminate(firestore); await terminate(firestore)
}, },
async session(sessionToken) { async session(sessionToken) {
const snapshotQuery = query(Sessions, where("sessionToken", "==", sessionToken), limit(1)); const snapshotQuery = query(
const snapshots = await getDocs(snapshotQuery); Sessions,
const snapshot = snapshots.docs[0]; where("sessionToken", "==", sessionToken),
limit(1)
)
const snapshots = await getDocs(snapshotQuery)
const snapshot = snapshots.docs[0]
if (snapshot?.exists() && Sessions.converter) { if (snapshot?.exists() && Sessions.converter) {
const session = Sessions.converter.fromFirestore(snapshot); const session = Sessions.converter.fromFirestore(snapshot)
return session; return session
} }
return null; return null
}, },
async user(id) { async user(id) {
const snapshot = await getDoc(doc(Users, id)); const snapshot = await getDoc(doc(Users, id))
if (snapshot?.exists() && Users.converter) { if (snapshot?.exists() && Users.converter) {
const user = Users.converter.fromFirestore(snapshot); const user = Users.converter.fromFirestore(snapshot)
return user; return user
} }
return null; return null
}, },
async account({ provider, providerAccountId }) { async account({ provider, providerAccountId }) {
const snapshotQuery = query(Accounts, where("provider", "==", provider), where("providerAccountId", "==", providerAccountId), limit(1)); const snapshotQuery = query(
const snapshots = await getDocs(snapshotQuery); Accounts,
const snapshot = snapshots.docs[0]; where("provider", "==", provider),
where("providerAccountId", "==", providerAccountId),
limit(1)
)
const snapshots = await getDocs(snapshotQuery)
const snapshot = snapshots.docs[0]
if (snapshot?.exists() && Accounts.converter) { if (snapshot?.exists() && Accounts.converter) {
const account = Accounts.converter.fromFirestore(snapshot); const account = Accounts.converter.fromFirestore(snapshot)
return account; return account
} }
return null; return null
}, },
async verificationToken({ identifier, token }) { async verificationToken({ identifier, token }) {
const snapshotQuery = query(VerificationTokens, where("identifier", "==", identifier), where("token", "==", token), limit(1)); const snapshotQuery = query(
const snapshots = await getDocs(snapshotQuery); VerificationTokens,
const snapshot = snapshots.docs[0]; where("identifier", "==", identifier),
where("token", "==", token),
limit(1)
)
const snapshots = await getDocs(snapshotQuery)
const snapshot = snapshots.docs[0]
if (snapshot?.exists() && VerificationTokens.converter) { if (snapshot?.exists() && VerificationTokens.converter) {
const verificationToken = VerificationTokens.converter.fromFirestore(snapshot); const verificationToken =
VerificationTokens.converter.fromFirestore(snapshot)
return verificationToken; return verificationToken
} }
}, },
}, },

View File

@@ -1,8 +0,0 @@
{
"extends": "./tsconfig.json",
"include": ["tests", "src"],
"exclude": [
"./*.js",
"./*.d.ts",
]
}

View File

@@ -1,28 +1,28 @@
import { MikroORM, Options } from "@mikro-orm/core"; import { MikroORM, Options } from "@mikro-orm/core"
import { SqliteDriver } from "@mikro-orm/sqlite"; import { SqliteDriver } from "@mikro-orm/sqlite"
import { defaultEntities } from "../src"; import { defaultEntities } from "../src"
const config: Options<SqliteDriver> = { const config: Options<SqliteDriver> = {
dbName: "./db.sqlite", dbName: "./db.sqlite",
type: "sqlite", type: "sqlite",
entities: [ entities: [
defaultEntities.User, defaultEntities.User,
defaultEntities.Account, defaultEntities.Account,
defaultEntities.Session, defaultEntities.Session,
defaultEntities.VerificationToken, defaultEntities.VerificationToken,
], ],
} }
it("run migrations", async () => { it("run migrations", async () => {
const orm = await MikroORM.init(config) const orm = await MikroORM.init(config)
await orm.getSchemaGenerator().dropSchema() await orm.getSchemaGenerator().dropSchema()
const createSchemaSQL = await orm.getSchemaGenerator().getCreateSchemaSQL() const createSchemaSQL = await orm.getSchemaGenerator().getCreateSchemaSQL()
expect(createSchemaSQL).toMatchSnapshot('createSchemaSQL') expect(createSchemaSQL).toMatchSnapshot("createSchemaSQL")
const targetSchema = await orm.getSchemaGenerator().getTargetSchema() const targetSchema = await orm.getSchemaGenerator().getTargetSchema()
expect(targetSchema).toMatchSnapshot('targetSchema') expect(targetSchema).toMatchSnapshot("targetSchema")
await orm.getSchemaGenerator().dropSchema() await orm.getSchemaGenerator().dropSchema()
await orm.close().catch(() => null) await orm.close().catch(() => null)
}) })

View File

@@ -1,8 +0,0 @@
{
"extends": "./tsconfig.json",
"include": ["tests", "src"],
"exclude": [
"./*.js",
"./*.d.ts",
]
}

View File

@@ -1,8 +0,0 @@
{
"extends": "./tsconfig.json",
"include": ["tests", "src"],
"exclude": [
"./*.js",
"./*.d.ts",
]
}

View File

@@ -1,8 +0,0 @@
{
"extends": "./tsconfig.json",
"include": ["tests", "src"],
"exclude": [
"./*.js",
"./*.d.ts",
]
}

View File

@@ -1,8 +0,0 @@
{
"extends": "./tsconfig.json",
"include": ["tests", "src"],
"exclude": [
"./*.js",
"./*.d.ts",
]
}

View File

@@ -1,8 +0,0 @@
{
"extends": "./tsconfig.json",
"include": ["tests", "src"],
"exclude": [
"./*.js",
"./*.d.ts",
]
}

View File

@@ -1,8 +0,0 @@
{
"extends": "./tsconfig.json",
"include": ["tests", "src"],
"exclude": [
"./*.js",
"./*.d.ts",
]
}

View File

@@ -1,6 +1,6 @@
{ {
"name": "@next-auth/supabase-adapter", "name": "@next-auth/supabase-adapter",
"version": "0.2.0", "version": "0.2.1",
"description": "Supabase adapter for next-auth.", "description": "Supabase adapter for next-auth.",
"homepage": "https://authjs.dev", "homepage": "https://authjs.dev",
"repository": "https://github.com/nextauthjs/next-auth", "repository": "https://github.com/nextauthjs/next-auth",
@@ -25,7 +25,7 @@
}, },
"peerDependencies": { "peerDependencies": {
"@supabase/supabase-js": "^2.0.5", "@supabase/supabase-js": "^2.0.5",
"next-auth": "workspace:*" "next-auth": "^4.18.7"
}, },
"devDependencies": { "devDependencies": {
"@next-auth/adapter-test": "workspace:^0.0.0", "@next-auth/adapter-test": "workspace:^0.0.0",
@@ -37,4 +37,4 @@
"jest": { "jest": {
"preset": "@next-auth/adapter-test/jest" "preset": "@next-auth/adapter-test/jest"
} }
} }

View File

@@ -137,4 +137,3 @@ export interface Database {
} }
} }
} }

View File

@@ -17,17 +17,8 @@
"@babel/preset-env": "^7.14.2", "@babel/preset-env": "^7.14.2",
"@types/jest": "^26.0.23", "@types/jest": "^26.0.23",
"@types/nodemailer": "^6.4.4", "@types/nodemailer": "^6.4.4",
"@typescript-eslint/eslint-plugin": "^4.24.0",
"@typescript-eslint/parser": "^4.24.0",
"eslint": "^7.27.0",
"eslint-config-prettier": "^8.3.0",
"eslint-config-standard-with-typescript": "^20.0.0",
"eslint-plugin-import": "^2.23.3",
"eslint-plugin-node": "^11.1.0",
"eslint-plugin-promise": "^5.1.0",
"jest": "^27.0.3", "jest": "^27.0.3",
"next-auth": "workspace:*", "next-auth": "workspace:*",
"prettier": "^2.3.0",
"ts-jest": "^27.0.3", "ts-jest": "^27.0.3",
"typescript": "^4.2.4" "typescript": "^4.2.4"
} }

View File

@@ -1,8 +0,0 @@
{
"extends": "./tsconfig.json",
"include": ["tests", "src"],
"exclude": [
"./*.js",
"./*.d.ts",
]
}

View File

@@ -1,8 +0,0 @@
{
"extends": "./tsconfig.json",
"include": ["tests", "src"],
"exclude": [
"./*.js",
"./*.d.ts",
]
}

View File

@@ -1,3 +1,24 @@
# Auth.js <p align="center">
<br/>
<a href="https://authjs.dev" target="_blank"><img width="150px" src="https://authjs.dev/img/logo/logo-sm.png" /></a>
<h3 align="center">Auth.js core library</a></h3>
<h4 align="center">Authentication for the Web.</h4>
<p align="center" style="align: center;">
<a href="https://npm.im/next-auth">
<img src="https://img.shields.io/badge/TypeScript-blue?style=flat-square" alt="TypeScript" />
</a>
<a href="https://npm.im/@auth/core">
<img alt="npm" src="https://img.shields.io/npm/v/@auth/core?color=green&label=@auth/core&style=flat-square">
</a>
<a href="https://www.npmtrends.com/@auth/core">
<img src="https://img.shields.io/npm/dm/@auth/core?label=%20downloads&style=flat-square" alt="Downloads" />
</a>
<a href="https://github.com/nextauthjs/next-auth/stargazers">
<img src="https://img.shields.io/github/stars/nextauthjs/next-auth?style=flat-square" alt="Github Stars" />
</a>
</p>
</p>
Authentication for the web. ---
Check out the documentation at [authjs.dev](https://authjs.dev/reference/core/modules/main).

View File

@@ -1,7 +1,18 @@
{ {
"name": "@auth/core", "name": "@auth/core",
"version": "0.2.0", "version": "0.2.3",
"description": "Authentication for the web.", "description": "Authentication for the Web.",
"keywords": [
"authentication",
"authjs",
"jwt",
"oauth",
"oidc",
"passwordless",
"standard",
"vanilla",
"webapi"
],
"homepage": "https://authjs.dev", "homepage": "https://authjs.dev",
"repository": "https://github.com/nextauthjs/next-auth.git", "repository": "https://github.com/nextauthjs/next-auth.git",
"author": "Balázs Orbán <info@balazsorban.com>", "author": "Balázs Orbán <info@balazsorban.com>",
@@ -69,8 +80,6 @@
"build": "pnpm clean && pnpm css && tsc", "build": "pnpm clean && pnpm css && tsc",
"clean": "rm -rf *.js *.d.ts lib providers", "clean": "rm -rf *.js *.d.ts lib providers",
"css": "node ./scripts/generate-css.js", "css": "node ./scripts/generate-css.js",
"lint": "pnpm prettier --check src && eslint src",
"format": "pnpm prettier --write . && eslint src --fix",
"dev": "pnpm css && tsc -w" "dev": "pnpm css && tsc -w"
}, },
"devDependencies": { "devDependencies": {

View File

@@ -158,7 +158,6 @@ export async function Auth(
* *
* const request = new Request("https://example.com") * const request = new Request("https://example.com")
* const resposne = await AuthHandler(request, authConfig) * const resposne = await AuthHandler(request, authConfig)
*
* ``` * ```
* *
* @see [Initiailzation](https://authjs.dev/reference/configuration/auth-options) * @see [Initiailzation](https://authjs.dev/reference/configuration/auth-options)
@@ -168,10 +167,8 @@ export interface AuthConfig {
* List of authentication providers for signing in * List of authentication providers for signing in
* (e.g. Google, Facebook, Twitter, GitHub, Email, etc) in any order. * (e.g. Google, Facebook, Twitter, GitHub, Email, etc) in any order.
* This can be one of the built-in providers or an object with a custom provider. * This can be one of the built-in providers or an object with a custom provider.
* * **Default value**: `[]`
* * **Required**: *Yes*
* *
* [Documentation](https://next-auth.js.org/configuration/options#providers) | [Providers documentation](https://next-auth.js.org/configuration/providers) * @default []
*/ */
providers: Provider[] providers: Provider[]
/** /**
@@ -181,36 +178,23 @@ export interface AuthConfig {
* *
* On Unix systems: `openssl rand -hex 32` * On Unix systems: `openssl rand -hex 32`
* Or go to https://generate-secret.vercel.app/32 * Or go to https://generate-secret.vercel.app/32
*
* @default process.env.AUTH_SECRET ?? process.env.NEXTAUTH_SECRET
*
* [Documentation](https://next-auth.js.org/configuration/options#secret)
*/ */
secret?: string secret?: string
/** /**
* Configure your session like if you want to use JWT or a database, * Configure your session like if you want to use JWT or a database,
* how long until an idle session expires, or to throttle write operations in case you are using a database. * how long until an idle session expires, or to throttle write operations in case you are using a database.
* * **Default value**: See the documentation page
* * **Required**: No
*
* [Documentation](https://next-auth.js.org/configuration/options#session)
*/ */
session?: Partial<SessionOptions> session?: Partial<SessionOptions>
/** /**
* JSON Web Tokens are enabled by default if you have not specified an adapter. * JSON Web Tokens are enabled by default if you have not specified an {@link AuthConfig.adapter}.
* JSON Web Tokens are encrypted (JWE) by default. We recommend you keep this behaviour. * JSON Web Tokens are encrypted (JWE) by default. We recommend you keep this behaviour.
* * **Default value**: See the documentation page
* * **Required**: *No*
*
* [Documentation](https://next-auth.js.org/configuration/options#jwt)
*/ */
jwt?: Partial<JWTOptions> jwt?: Partial<JWTOptions>
/** /**
* Specify URLs to be used if you want to create custom sign in, sign out and error pages. * Specify URLs to be used if you want to create custom sign in, sign out and error pages.
* Pages specified will override the corresponding built-in page. * Pages specified will override the corresponding built-in page.
* * **Default value**: `{}`
* * **Required**: *No*
* *
* @default {}
* @example * @example
* *
* ```ts * ```ts
@@ -222,18 +206,12 @@ export interface AuthConfig {
* newUser: '/auth/new-user' * newUser: '/auth/new-user'
* } * }
* ``` * ```
*
* [Documentation](https://next-auth.js.org/configuration/options#pages) | [Pages documentation](https://next-auth.js.org/configuration/pages)
*/ */
pages?: Partial<PagesOptions> pages?: Partial<PagesOptions>
/** /**
* Callbacks are asynchronous functions you can use to control what happens when an action is performed. * Callbacks are asynchronous functions you can use to control what happens when an action is performed.
* Callbacks are *extremely powerful*, especially in scenarios involving JSON Web Tokens * Callbacks are *extremely powerful*, especially in scenarios involving JSON Web Tokens
* as they **allow you to implement access controls without a database** and to **integrate with external databases or APIs**. * as they **allow you to implement access controls without a database** and to **integrate with external databases or APIs**.
* * **Default value**: See the Callbacks documentation
* * **Required**: *No*
*
* [Documentation](https://next-auth.js.org/configuration/options#callbacks) | [Callbacks documentation](https://next-auth.js.org/configuration/callbacks)
*/ */
callbacks?: Partial<CallbacksOptions> callbacks?: Partial<CallbacksOptions>
/** /**
@@ -243,36 +221,23 @@ export interface AuthConfig {
* (e.g. OAuth or Email authentication flow, JWT or database sessions, etc), * (e.g. OAuth or Email authentication flow, JWT or database sessions, etc),
* but typically contains a user object and/or contents of the JSON Web Token * but typically contains a user object and/or contents of the JSON Web Token
* and other information relevant to the event. * and other information relevant to the event.
* * **Default value**: `{}`
* * **Required**: *No*
* *
* [Documentation](https://next-auth.js.org/configuration/options#events) | [Events documentation](https://next-auth.js.org/configuration/events) * @default {}
*/ */
events?: Partial<EventCallbacks> events?: Partial<EventCallbacks>
/** /** You can use the adapter option to pass in your database adapter. */
* You can use the adapter option to pass in your database adapter.
*
* * **Required**: *No*
*
* [Documentation](https://next-auth.js.org/configuration/options#adapter) |
* [Adapters Overview](https://next-auth.js.org/adapters/overview)
*/
adapter?: Adapter adapter?: Adapter
/** /**
* Set debug to true to enable debug messages for authentication and database operations. * Set debug to true to enable debug messages for authentication and database operations.
* * **Default value**: `false`
* * **Required**: *No*
* *
* - ⚠ If you added a custom `logger`, this setting is ignored. * - ⚠ If you added a custom {@link AuthConfig.logger}, this setting is ignored.
* *
* [Documentation](https://next-auth.js.org/configuration/options#debug) | [Logger documentation](https://next-auth.js.org/configuration/options#logger) * @default false
*/ */
debug?: boolean debug?: boolean
/** /**
* Override any of the logger levels (`undefined` levels will use the built-in logger), * Override any of the logger levels (`undefined` levels will use the built-in logger),
* and intercept logs in NextAuth. You can use this option to send NextAuth logs to a third-party logging service. * and intercept logs in NextAuth. You can use this option to send NextAuth logs to a third-party logging service.
* * **Default value**: `console`
* * **Required**: *No*
* *
* @example * @example
* *
@@ -294,36 +259,24 @@ export interface AuthConfig {
* }) * })
* ``` * ```
* *
* - ⚠ When set, the `debug` option is ignored * - ⚠ When set, the {@link AuthConfig.debug} option is ignored
* *
* [Documentation](https://next-auth.js.org/configuration/options#logger) | * @default console
* [Debug documentation](https://next-auth.js.org/configuration/options#debug)
*/ */
logger?: Partial<LoggerInstance> logger?: Partial<LoggerInstance>
/** /** Changes the theme of built-in {@link AuthConfig.pages}. */
* Changes the theme of pages.
* Set to `"light"` if you want to force pages to always be light.
* Set to `"dark"` if you want to force pages to always be dark.
* Set to `"auto"`, (or leave this option out)if you want the pages to follow the preferred system theme.
* * **Default value**: `"auto"`
* * **Required**: *No*
*
* [Documentation](https://next-auth.js.org/configuration/options#theme) | [Pages documentation]("https://next-auth.js.org/configuration/pages")
*/
theme?: Theme theme?: Theme
/** /**
* When set to `true` then all cookies set by NextAuth.js will only be accessible from HTTPS URLs. * When set to `true` then all cookies set by NextAuth.js will only be accessible from HTTPS URLs.
* This option defaults to `false` on URLs that start with `http://` (e.g. http://localhost:3000) for developer convenience. * This option defaults to `false` on URLs that start with `http://` (e.g. http://localhost:3000) for developer convenience.
* You can manually set this option to `false` to disable this security feature and allow cookies * You can manually set this option to `false` to disable this security feature and allow cookies
* to be accessible from non-secured URLs (this is not recommended). * to be accessible from non-secured URLs (this is not recommended).
* * **Default value**: `true` for HTTPS and `false` for HTTP sites
* * **Required**: No
*
* [Documentation](https://next-auth.js.org/configuration/options#usesecurecookies)
* *
* - ⚠ **This is an advanced option.** Advanced options are passed the same way as basic options, * - ⚠ **This is an advanced option.** Advanced options are passed the same way as basic options,
* but **may have complex implications** or side effects. * but **may have complex implications** or side effects.
* You should **try to avoid using advanced options** unless you are very comfortable using them. * You should **try to avoid using advanced options** unless you are very comfortable using them.
*
* The default is `false` HTTP and `true` for HTTPS sites.
*/ */
useSecureCookies?: boolean useSecureCookies?: boolean
/** /**
@@ -333,25 +286,14 @@ export interface AuthConfig {
* If you use this feature, you will likely want to create conditional behavior * If you use this feature, you will likely want to create conditional behavior
* to support setting different cookies policies in development and production builds, * to support setting different cookies policies in development and production builds,
* as you will be opting out of the built-in dynamic policy. * as you will be opting out of the built-in dynamic policy.
* * **Default value**: `{}`
* * **Required**: No
* *
* - ⚠ **This is an advanced option.** Advanced options are passed the same way as basic options, * - ⚠ **This is an advanced option.** Advanced options are passed the same way as basic options,
* but **may have complex implications** or side effects. * but **may have complex implications** or side effects.
* You should **try to avoid using advanced options** unless you are very comfortable using them. * You should **try to avoid using advanced options** unless you are very comfortable using them.
* *
* [Documentation](https://next-auth.js.org/configuration/options#cookies) | [Usage example](https://next-auth.js.org/configuration/options#example) * @default {}
*/ */
cookies?: Partial<CookiesOptions> cookies?: Partial<CookiesOptions>
/** /** @todo */
* If set to `true`, NextAuth.js will use either the `x-forwarded-host` or `host` headers,
* instead of `NEXTAUTH_URL`
* Make sure that reading `x-forwarded-host` on your hosting platform can be trusted.
* - ⚠ **This is an advanced option.** Advanced options are passed the same way as basic options,
* but **may have complex implications** or side effects.
* You should **try to avoid using advanced options** unless you are very comfortable using them.
*
* @default Boolean(process.env.NEXTAUTH_URL ?? process.env.AUTH_TRUST_HOST ?? process.env.VERCEL)
*/
trustHost?: boolean trustHost?: boolean
} }

View File

@@ -97,5 +97,5 @@ function normalizeEndpoint(
// eslint-disable-next-line @typescript-eslint/no-unnecessary-type-assertion // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-assertion
for (const k in e.params) url.searchParams.set(k, e.params[k] as any) for (const k in e.params) url.searchParams.set(k, e.params[k] as any)
return { url } return { ...e, url }
} }

View File

@@ -146,6 +146,7 @@ export default function Twitter<
id: "twitter", id: "twitter",
name: "Twitter", name: "Twitter",
type: "oauth", type: "oauth",
checks: ["pkce", "state"],
authorization: { authorization: {
url: "https://twitter.com/i/oauth2/authorize", url: "https://twitter.com/i/oauth2/authorize",
params: { scope: "users.read tweet.read offline.access" }, params: { scope: "users.read tweet.read offline.access" },

View File

@@ -1,11 +0,0 @@
{
"extends": "./tsconfig.json",
"compilerOptions": {
"watch": true,
"emitDeclarationOnly": false
},
"watchOptions": {
"excludeDirectories": ["jwt", "lib", "providers"],
"excludeFiles": ["./*.d.ts", "./*.js"]
}
}

View File

@@ -1,4 +0,0 @@
{
"extends": "./tsconfig.json",
"exclude": ["./*.js", "./*.d.ts"]
}

View File

@@ -1,7 +0,0 @@
.DS_Store
node_modules
/build
/.svelte-kit
/package
/index.*
/client.*

View File

@@ -1,3 +1,24 @@
# SvelteKit Auth <p align="center">
<br/>
<a href="https://authjs.dev" target="_blank"><img width="150px" src="https://authjs.dev/img/logo/logo-sm.png" /></a>
<h3 align="center">SvelteKit Auth</a></h3>
<h4 align="center">Authentication for SvelteKit.</h4>
<p align="center" style="align: center;">
<a href="https://npm.im/next-auth">
<img src="https://img.shields.io/badge/TypeScript-blue?style=flat-square" alt="TypeScript" />
</a>
<a href="https://npm.im/@auth/sveltekit">
<img alt="npm" src="https://img.shields.io/npm/v/@auth/sveltekit?color=green&label=@auth/sveltekit&style=flat-square">
</a>
<a href="https://www.npmtrends.com/@auth/sveltekit">
<img src="https://img.shields.io/npm/dm/@auth/sveltekit?label=%20downloads&style=flat-square" alt="Downloads" />
</a>
<a href="https://github.com/nextauthjs/next-auth/stargazers">
<img src="https://img.shields.io/github/stars/nextauthjs/next-auth?style=flat-square" alt="Github Stars" />
</a>
</p>
</p>
Authentication for SvelteKit. ---
Check out the documentation at [sveltekit.authjs.dev](https://sveltekit.authjs.dev).

View File

@@ -1,7 +1,17 @@
{ {
"name": "@auth/sveltekit", "name": "@auth/sveltekit",
"version": "0.1.7", "version": "0.1.10",
"description": "Authentication for SvelteKit.", "description": "Authentication for SvelteKit.",
"keywords": [
"authentication",
"authjs",
"jwt",
"sveltekit",
"oauth",
"oidc",
"passwordless",
"svelte"
],
"homepage": "https://sveltekit.authjs.dev", "homepage": "https://sveltekit.authjs.dev",
"repository": "https://github.com/nextauthjs/next-auth.git", "repository": "https://github.com/nextauthjs/next-auth.git",
"author": "Thang Huu Vu <hi@thvu.dev>", "author": "Thang Huu Vu <hi@thvu.dev>",
@@ -19,23 +29,14 @@
"preview": "vite preview", "preview": "vite preview",
"check": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json", "check": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json",
"check:watch": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json --watch", "check:watch": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json --watch",
"test:unit": "vitest", "test:unit": "vitest"
"lint": "prettier --plugin-search-dir . --check . && eslint .",
"format": "prettier --plugin-search-dir . --write ."
}, },
"devDependencies": { "devDependencies": {
"@playwright/test": "^1.28.1", "@playwright/test": "^1.28.1",
"@sveltejs/adapter-auto": "next", "@sveltejs/adapter-auto": "^1.0.0",
"@sveltejs/kit": "next", "@sveltejs/kit": "^1.0.0",
"@sveltejs/package": "1.0.0-next.6", "@sveltejs/package": "^1.0.0",
"@typescript-eslint/eslint-plugin": "^5.45.0",
"@typescript-eslint/parser": "^5.45.0",
"eslint": "^8.28.0",
"eslint-config-prettier": "^8.5.0",
"eslint-plugin-svelte3": "^4.0.0",
"next-auth": "workspace:*", "next-auth": "workspace:*",
"prettier": "2.8.1",
"prettier-plugin-svelte": "^2.8.1",
"svelte": "^3.54.0", "svelte": "^3.54.0",
"svelte-check": "^2.9.2", "svelte-check": "^2.9.2",
"tslib": "^2.4.1", "tslib": "^2.4.1",

View File

@@ -1,7 +1,7 @@
module.exports = { module.exports = {
plugins: [ plugins: [
require('autoprefixer'), require("autoprefixer"),
require('postcss-nested'), require("postcss-nested"),
require('cssnano')({ preset: 'default' }) require("cssnano")({ preset: "default" }),
] ],
} }

View File

@@ -42,12 +42,11 @@
"clean": "rm -rf coverage client css utils providers core jwt react next index.d.ts index.js adapters.d.ts middleware.d.ts middleware.js", "clean": "rm -rf coverage client css utils providers core jwt react next index.d.ts index.js adapters.d.ts middleware.d.ts middleware.js",
"build:css": "postcss --config config/postcss.config.js src/**/*.css --base src --dir . && node config/wrap-css.js", "build:css": "postcss --config config/postcss.config.js src/**/*.css --base src --dir . && node config/wrap-css.js",
"dev": "pnpm clean && pnpm generate-providers && concurrently \"pnpm watch:css\" \"pnpm watch:ts\"", "dev": "pnpm clean && pnpm generate-providers && concurrently \"pnpm watch:css\" \"pnpm watch:ts\"",
"watch:ts": "pnpm tsc --project tsconfig.dev.json", "watch:ts": "pnpm tsc",
"watch:css": "postcss --config config/postcss.config.js --watch src/**/*.css --base src --dir .", "watch:css": "postcss --config config/postcss.config.js --watch src/**/*.css --base src --dir .",
"test": "jest --config ./config/jest.config.js", "test": "jest --config ./config/jest.config.js",
"prepublishOnly": "pnpm build", "prepublishOnly": "pnpm build",
"generate-providers": "node ./config/generate-providers.js", "generate-providers": "node ./config/generate-providers.js"
"lint": "eslint src config tests"
}, },
"files": [ "files": [
"lib", "lib",
@@ -103,7 +102,7 @@
"@testing-library/dom": "^8.13.0", "@testing-library/dom": "^8.13.0",
"@testing-library/jest-dom": "^5.16.4", "@testing-library/jest-dom": "^5.16.4",
"@testing-library/react": "^13.3.0", "@testing-library/react": "^13.3.0",
"@testing-library/react-hooks": "^8.0.0", "@testing-library/react-hooks": "^8.0.1",
"@testing-library/user-event": "^14.2.0", "@testing-library/user-event": "^14.2.0",
"@types/jest": "^28.1.3", "@types/jest": "^28.1.3",
"@types/node": "^17.0.42", "@types/node": "^17.0.42",
@@ -120,7 +119,7 @@
"jest-environment-jsdom": "^28.1.1", "jest-environment-jsdom": "^28.1.1",
"jest-watch-typeahead": "^1.1.0", "jest-watch-typeahead": "^1.1.0",
"msw": "^0.42.3", "msw": "^0.42.3",
"next": "13.0.6", "next": "13.1.1",
"postcss": "^8.4.14", "postcss": "^8.4.14",
"postcss-cli": "^9.1.0", "postcss-cli": "^9.1.0",
"postcss-nested": "^5.0.6", "postcss-nested": "^5.0.6",
@@ -131,4 +130,4 @@
"engines": { "engines": {
"node": "^12.19.0 || ^14.15.0 || ^16.13.0 || ^18.12.0" "node": "^12.19.0 || ^14.15.0 || ^16.13.0 || ^18.12.0"
} }
} }

View File

@@ -181,11 +181,11 @@ export default async function callbackHandler(params: {
? await getUserByEmail(profile.email) ? await getUserByEmail(profile.email)
: null : null
if (userByEmail) { if (userByEmail) {
const provider = options.provider as OAuthConfig<any>; const provider = options.provider as OAuthConfig<any>
if (provider?.allowDangerousEmailAccountLinking) { if (provider?.allowDangerousEmailAccountLinking) {
// If you trust the oauth provider to correctly verify email addresses, you can opt-in to // If you trust the oauth provider to correctly verify email addresses, you can opt-in to
// account linking even when the user is not signed-in. // account linking even when the user is not signed-in.
user = userByEmail; user = userByEmail
} else { } else {
// We end up here when we don't have an account with the same [provider].id *BUT* // We end up here when we don't have an account with the same [provider].id *BUT*
// we do already have an account with the same email address as the one in the // we do already have an account with the same email address as the one in the

View File

@@ -114,7 +114,7 @@ export function defaultCookies(useSecureCookies: boolean): CookiesOptions {
path: "/", path: "/",
secure: useSecureCookies, secure: useSecureCookies,
}, },
} },
} }
} }

View File

@@ -5,7 +5,7 @@ import type { Cookie } from "../cookie"
const NONCE_MAX_AGE = 60 * 15 // 15 minutes in seconds const NONCE_MAX_AGE = 60 * 15 // 15 minutes in seconds
/** /**
* Returns nonce if the provider supports it * Returns nonce if the provider supports it
* and saves it in a cookie */ * and saves it in a cookie */
export async function createNonce(options: InternalOptions<"oauth">): Promise< export async function createNonce(options: InternalOptions<"oauth">): Promise<
@@ -62,7 +62,7 @@ export async function useNonce(
return return
} }
const value = (await jwt.decode({...options.jwt, token: nonce })) as any const value = (await jwt.decode({ ...options.jwt, token: nonce })) as any
return { return {
value: value?.nonce ?? undefined, value: value?.nonce ?? undefined,

View File

@@ -1,5 +1,5 @@
export { default as callback } from './callback' export { default as callback } from "./callback"
export { default as signin } from './signin' export { default as signin } from "./signin"
export { default as signout } from './signout' export { default as signout } from "./signout"
export { default as session } from './session' export { default as session } from "./session"
export { default as providers } from './providers' export { default as providers } from "./providers"

View File

@@ -4,7 +4,12 @@
import fs from "fs" import fs from "fs"
import path from "path" import path from "path"
const pathToCss = path.join(process.cwd(), process.env.NODE_ENV === "development" ? "node_modules/next-auth/css/index.css" : "/src/css/index.css") const pathToCss = path.join(
process.cwd(),
process.env.NODE_ENV === "development"
? "node_modules/next-auth/css/index.css"
: "/src/css/index.css"
)
export default function css() { export default function css() {
return fs.readFileSync(pathToCss, "utf8") return fs.readFileSync(pathToCss, "utf8")

View File

@@ -118,8 +118,9 @@ export default function Apple<P extends AppleProfile>(
}, },
checks: ["pkce"], checks: ["pkce"],
style: { style: {
logo: 'https://raw.githubusercontent.com/nextauthjs/next-auth/main/packages/next-auth/provider-logos/apple.svg', logo: "https://raw.githubusercontent.com/nextauthjs/next-auth/main/packages/next-auth/provider-logos/apple.svg",
logoDark: 'https://raw.githubusercontent.com/nextauthjs/next-auth/main/packages/next-auth/provider-logos/apple-dark.svg', logoDark:
"https://raw.githubusercontent.com/nextauthjs/next-auth/main/packages/next-auth/provider-logos/apple-dark.svg",
bg: "#fff", bg: "#fff",
text: "#000", text: "#000",
bgDark: "#000", bgDark: "#000",

View File

@@ -17,7 +17,8 @@ export default function EVEOnline<P extends EVEOnlineProfile>(
id: "eveonline", id: "eveonline",
name: "EVE Online", name: "EVE Online",
type: "oauth", type: "oauth",
authorization: "https://login.eveonline.com/v2/oauth/authorize?scope=publicData", authorization:
"https://login.eveonline.com/v2/oauth/authorize?scope=publicData",
token: "https://login.eveonline.com/v2/oauth/token", token: "https://login.eveonline.com/v2/oauth/token",
userinfo: "https://login.eveonline.com/oauth/verify", userinfo: "https://login.eveonline.com/oauth/verify",
profile(profile) { profile(profile) {

View File

@@ -34,8 +34,9 @@ export default function LINE<P extends LineProfile>(
id_token_signed_response_alg: "HS256", id_token_signed_response_alg: "HS256",
}, },
style: { style: {
logo: 'https://raw.githubusercontent.com/nextauthjs/next-auth/main/packages/next-auth/provider-logos/line.svg', logo: "https://raw.githubusercontent.com/nextauthjs/next-auth/main/packages/next-auth/provider-logos/line.svg",
logoDark: 'https://raw.githubusercontent.com/nextauthjs/next-auth/main/packages/next-auth/provider-logos/line.svg', logoDark:
"https://raw.githubusercontent.com/nextauthjs/next-auth/main/packages/next-auth/provider-logos/line.svg",
bg: "#fff", bg: "#fff",
text: "#00C300", text: "#00C300",
bgDark: "#00C300", bgDark: "#00C300",

View File

@@ -28,4 +28,4 @@ export default function UnitedEffects<P extends UnitedEffectsProfile>(
}, },
options, options,
} }
} }

View File

@@ -1,27 +0,0 @@
{
"extends": "./tsconfig.json",
"compilerOptions": {
"watch": true,
"emitDeclarationOnly": false
},
"watchOptions": {
"excludeDirectories": [
"lib",
"css",
"jwt",
"react",
"next",
"client",
"providers",
"core",
"utils"
],
"excludeFiles": [
"index.d.ts",
"index.js",
"adapters.d.ts",
"middleware.d.ts",
"middleware.js"
]
}
}

View File

@@ -1,8 +0,0 @@
{
"extends": "./tsconfig.json",
"compilerOptions": {
"types": ["@types/jest"],
"typeRoots": ["./node_modules/@types"]
},
"exclude": ["./coverage", "./*.js", "./*.d.ts"]
}

View File

@@ -4,6 +4,6 @@
"forceConsistentCasingInFileNames": true, "forceConsistentCasingInFileNames": true,
"esModuleInterop": true, "esModuleInterop": true,
"declaration": true, "declaration": true,
"skipLibCheck": true, "skipLibCheck": true
} }
} }

View File

@@ -0,0 +1,16 @@
diff --git a/dist/publish.js b/dist/publish.js
index 1d39a76a5625a10637e3cf23f3a652441702cfb2..4b69b30645db1d1e84c8b6987a23b53c06f66438 100644
--- a/dist/publish.js
+++ b/dist/publish.js
@@ -54,8 +54,9 @@ export async function publish(packages, options) {
console.log(`Creating git tag...`);
execSync(`git tag ${gitTag}`);
execSync("git push --tags");
- console.log(`Creating GitHub release notes...`);
- execSync(`gh release create ${gitTag} --notes '${changelog}'`);
+ const prerelease = name.startsWith("@auth") ? "--prerelease " : ""
+ console.log(`Creating GitHub release notes${prerelease ? " (as prerelease)" : ""}...`);
+ execSync(`gh release create ${gitTag} ${prerelease}--notes '${changelog}'`);
}
}
console.log("Pushing commits");

Some files were not shown because too many files have changed in this diff Show More