Compare commits

...

27 Commits

Author SHA1 Message Date
Balázs Orbán
354b03471c Delete index.md 2023-02-04 15:33:16 +01:00
Balázs Orbán
0a7286e857 remove CSS hacks 2023-02-03 15:56:50 +01:00
Balázs Orbán
cf544d6ec7 remove gitignored files 2023-02-03 15:55:54 +01:00
Balázs Orbán
84e14d76b3 fix paths 2023-02-03 15:24:57 +01:00
Balázs Orbán
7794b6dfbb pre-build packages before docs dev script with turbo 2023-02-03 15:16:44 +01:00
Balázs Orbán
d195381224 update gitignore 2023-02-03 15:16:31 +01:00
Balázs Orbán
b3d5ec596b update typedoc/docusaurus config 2023-02-03 15:16:27 +01:00
Balázs Orbán
34f8f36038 rename main entry points to index 2023-02-03 15:16:02 +01:00
Balázs Orbán
a79a5d6cbe update lock file 2023-02-03 15:15:35 +01:00
Balázs Orbán
cac71774a6 move nuxt postinstall to dev and build scripts 2023-02-03 15:15:22 +01:00
Balázs Orbán
7376f10cac chore: upgradde typedoc plugins 2023-02-03 15:15:08 +01:00
Mayvis
fb43c5da05 docs: enhance prisma mongodb doc to prevent warning (#6598)
Fixes https://github.com/nextauthjs/next-auth/issues/6597
2023-02-02 13:28:17 +01:00
Corey Jepperson
326eadf0ed fix: don't add /error to url pathname when email verification is successful (#6492)
fix handleAuthorized making bad pth when authorize

Co-authored-by: Corey Jepperson <corey@entropy.cc>
Co-authored-by: Thang Vu <hi@thvu.dev>
2023-01-31 17:37:38 +07:00
Thang Vu
a5e0db4bb3 feat(providers): add Notion provider (#6567)
* add notion provider along with logo and styles
"

* adjust notion documentation

* update issue template with Notion provider

* update docs and provider with code from TomYeoman

* feat: move Notion provider to core

* get it working

---------

Co-authored-by: Harrison Broadbent <harrisonbroadbent@gmail.com>
Co-authored-by: Harrison Broadbent <harrisonbroadbent@Harrisons-MacBook-Air.local>
Co-authored-by: Thang Vu <hi@thvu.dev>
2023-01-31 17:10:47 +07:00
Balázs Orbán
334e23343a chore: fix typo 2023-01-31 01:19:16 +01:00
OrJDev
be046a6cb2 chore: suggest using the correct command to seek for packages (#6570)
* fix: suggest using the correct command to seek for packages

* seek for adapter packages aswell

* cleanup: seek for auth org packages
2023-01-30 20:39:37 +01:00
Frank Dumont
bdee262abe fix: typo in log message (#6569) 2023-01-30 20:37:53 +01:00
Balázs Orbán
3f89e668ec fix(ts): mark options provider config option internal (#6564)
* chore(dev): use workspace modules in Svelte app

* fix(ts): mark `options` provider config option internal
2023-01-30 12:34:54 +00:00
Balázs Orbán
533320eb94 chore: generate oauth-types on build 2023-01-29 14:33:41 +01:00
James
dfe6509472 fix: comment Discord profile, fix @auth/sveltekit build on Windows (#6550)
* fix: discord types were inaccurate

* fix: build on windows computers

* Apply review suggestions

* Update discord.ts

---------

Co-authored-by: Balázs Orbán <info@balazsorban.com>
2023-01-29 12:05:14 +00:00
Oskar
1bde7cc8df fix(core): correct docs link (#6446) 2023-01-26 12:16:47 +00:00
Balázs Orbán
cef05d5e2d Merge branch 'main' of github.com:nextauthjs/next-auth 2023-01-26 13:11:14 +01:00
Balázs Orbán
c0dea283ba fix(core): avoid circular dependency
Fixes #6508
2023-01-26 13:11:04 +01:00
Balázs Orbán
0204766e0f fix(core): don't lock nodemailer version as peer dependency 2023-01-25 14:29:16 +00:00
Jérémie Sellam
a336ba762c fix(adapters): allow already initialized firebase app 🐛 (#6230)
* 🐛 Fix already initialized firebase app

* remove comment

Co-authored-by: Jérémie Sellam <jeremie@southpigalle.io>
Co-authored-by: Thang Vu <hi@thvu.dev>
2023-01-25 19:57:52 +07:00
Balázs Orbán
681d53c2f8 chore(core): cleanup 2023-01-24 14:01:40 +01:00
Thang Vu
06e891c0ea chore: cache output for @auth/sveltekit 2023-01-24 15:22:42 +07:00
46 changed files with 1493 additions and 970 deletions

View File

@@ -23,8 +23,8 @@ pnpm-lock.yaml
.docusaurus .docusaurus
build build
docs/docs/reference/03-core docs/docs/reference/core
docs/docs/reference/04-sveltekit docs/docs/reference/sveltekit
static static
# --------------- Packages --------------- # --------------- Packages ---------------

View File

@@ -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" npx envinfo --system --binaries --browsers --npmPackages "next,react,next-auth,@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:

View File

@@ -58,6 +58,7 @@ body:
- "Medium" - "Medium"
- "Naver" - "Naver"
- "Netlify" - "Netlify"
- "Notion"
- "Okta" - "Okta"
- "OneLogin" - "OneLogin"
- "Osso" - "Osso"
@@ -88,7 +89,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" npx envinfo --system --binaries --browsers --npmPackages "next,react,next-auth,@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:

View File

@@ -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" && npx envinfo --npmPackages "@next-auth/*" npx envinfo --system --binaries --browsers --npmPackages "next,react,next-auth,@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:

14
.gitignore vendored
View File

@@ -34,13 +34,10 @@ 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/next-auth/middleware.d.ts packages/*/*.js
packages/next-auth/middleware.js packages/*/*.d.ts
packages/*/*.d.ts.map
# Development app # Development app
apps/dev/src/css apps/dev/src/css
@@ -84,11 +81,12 @@ docs/providers.json
packages/core/*.js packages/core/*.js
packages/core/*.d.ts packages/core/*.d.ts
packages/core/*.d.ts.map packages/core/*.d.ts.map
packages/core/src/providers/oauth-types.ts
packages/core/lib packages/core/lib
packages/core/providers packages/core/providers
packages/core/src/lib/pages/styles.ts packages/core/src/lib/pages/styles.ts
docs/docs/reference/03-core docs/docs/reference/core
docs/docs/reference/04-sveltekit docs/docs/reference/sveltekit
# SvelteKit # SvelteKit

View File

@@ -20,8 +20,8 @@ pnpm-lock.yaml
.docusaurus .docusaurus
build build
docs/docs/reference/03-core docs/docs/reference/core
docs/docs/reference/04-sveltekit docs/docs/reference/sveltekit
static static
docs/providers.json docs/providers.json

View File

@@ -21,6 +21,10 @@ KEYCLOAK_ID=
KEYCLOAK_SECRET= KEYCLOAK_SECRET=
KEYCLOAK_ISSUER= KEYCLOAK_ISSUER=
NOTION_ID=
NOTION_SECRET=
NOTION_REDIRECT_URI=
IDS4_ID= IDS4_ID=
IDS4_SECRET= IDS4_SECRET=
IDS4_ISSUER= IDS4_ISSUER=

View File

@@ -24,6 +24,7 @@ import Instagram from "@auth/core/providers/instagram"
import Line from "@auth/core/providers/line" import Line from "@auth/core/providers/line"
import LinkedIn from "@auth/core/providers/linkedin" import LinkedIn from "@auth/core/providers/linkedin"
import Mailchimp from "@auth/core/providers/mailchimp" import Mailchimp from "@auth/core/providers/mailchimp"
import Notion from "@auth/core/providers/notion"
// import Okta from "@auth/core/providers/okta" // import Okta from "@auth/core/providers/okta"
import Osu from "@auth/core/providers/osu" import Osu from "@auth/core/providers/osu"
import Patreon from "@auth/core/providers/patreon" import Patreon from "@auth/core/providers/patreon"
@@ -69,7 +70,7 @@ import WorkOS from "@auth/core/providers/workos"
export const authConfig: AuthConfig = { export const authConfig: AuthConfig = {
// adapter, // adapter,
// debug: process.env.NODE_ENV !== "production", debug: process.env.NODE_ENV !== "production",
theme: { theme: {
logo: "https://next-auth.js.org/img/logo/logo-sm.png", logo: "https://next-auth.js.org/img/logo/logo-sm.png",
brandColor: "#1786fb", brandColor: "#1786fb",
@@ -107,6 +108,7 @@ export const authConfig: AuthConfig = {
Line({ clientId: process.env.LINE_ID, clientSecret: process.env.LINE_SECRET }), Line({ clientId: process.env.LINE_ID, clientSecret: process.env.LINE_SECRET }),
LinkedIn({ clientId: process.env.LINKEDIN_ID, clientSecret: process.env.LINKEDIN_SECRET }), LinkedIn({ clientId: process.env.LINKEDIN_ID, clientSecret: process.env.LINKEDIN_SECRET }),
Mailchimp({ clientId: process.env.MAILCHIMP_ID, clientSecret: process.env.MAILCHIMP_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 }), // 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 }), Osu({ clientId: process.env.OSU_CLIENT_ID, clientSecret: process.env.OSU_CLIENT_SECRET }),
Patreon({ clientId: process.env.PATREON_ID, clientSecret: process.env.PATREON_SECRET }), Patreon({ clientId: process.env.PATREON_ID, clientSecret: process.env.PATREON_SECRET }),

View File

@@ -19,8 +19,8 @@
"vite": "4.0.1" "vite": "4.0.1"
}, },
"dependencies": { "dependencies": {
"@auth/core": "0.2.5", "@auth/core": "workspace:*",
"@auth/sveltekit": "0.1.12" "@auth/sveltekit": "workspace:*"
}, },
"type": "module" "type": "module"
} }

View File

@@ -2,11 +2,10 @@
"name": "playground-nuxt", "name": "playground-nuxt",
"private": true, "private": true,
"scripts": { "scripts": {
"build": "nuxt build", "build": "nuxt prepare && nuxt build",
"dev": "export NODE_OPTIONS='--no-experimental-fetch' && nuxt dev", "dev": "nuxt prepare && export NODE_OPTIONS='--no-experimental-fetch' && nuxt dev",
"generate": "nuxt generate", "generate": "nuxt generate",
"preview": "nuxt preview", "preview": "nuxt preview"
"postinstall": "nuxt prepare"
}, },
"devDependencies": { "devDependencies": {
"@nuxt/eslint-config": "^0.1.1", "@nuxt/eslint-config": "^0.1.1",

View File

@@ -22,7 +22,7 @@ Using a JWT to store the `refresh_token` is less secure than saving it in a data
#### JWT strategy #### JWT strategy
Using the [jwt](../../reference/03-core/interfaces/types.CallbacksOptions.md#jwt) and [session](../../reference/03-core/interfaces/types.CallbacksOptions.md#session) callbacks, we can persist OAuth tokens and refresh them when they expire. Using the [jwt](../../reference/core/interfaces/types.CallbacksOptions.md#jwt) and [session](../../reference/core/interfaces/types.CallbacksOptions.md#session) callbacks, we can persist OAuth tokens and refresh them when they expire.
Below is a sample implementation using Google's Identity Provider. Please note that the OAuth 2.0 request in the `refreshAccessToken()` function will vary between different providers, but the core logic should remain similar. Below is a sample implementation using Google's Identity Provider. Please note that the OAuth 2.0 request in the `refreshAccessToken()` function will vary between different providers, but the core logic should remain similar.

View File

@@ -139,9 +139,10 @@ Prisma supports MongoDB, and so does Auth.js. Following the instructions of the
id String @id @default(auto()) @map("_id") @db.ObjectId id String @id @default(auto()) @map("_id") @db.ObjectId
``` ```
2. The Native database type attribute to `@db.String` from `@db.Text`. 2. The Native database type attribute to `@db.String` from `@db.Text` and userId to `@db.ObjectId`.
```prisma ```prisma
user_id String @db.ObjectId
refresh_token String? @db.String refresh_token String? @db.String
access_token String? @db.String access_token String? @db.String
id_token String? @db.String id_token String? @db.String

View File

@@ -1,25 +0,0 @@
---
title: Overview
sidebar_label: Overview
sidebar_position: 0
---
## Core
## Providers
- OAuth/OIDC
- Email/Passwordless
- Credentials
## Database Adapters
## Frameworks
- Next.js
- SvelteKit
- SolidStart
- Remix
- Nuxt
- Gatsby
- etc.

View File

@@ -62,7 +62,7 @@ const docusaurusConfig = {
position: "left", position: "left",
}, },
{ {
to: "/reference/core/modules/main", to: "/reference/core",
// TODO: change to this when the overview page looks better. // TODO: change to this when the overview page looks better.
// to: "/reference", // to: "/reference",
activeBasePath: "/reference", activeBasePath: "/reference",
@@ -101,7 +101,7 @@ const docusaurusConfig = {
announcementBar: { announcementBar: {
id: "new-major-announcement", id: "new-major-announcement",
content: content:
"<a target='_blank' rel='noopener noreferrer' href='https://next-auth.js.org'>NextAuth.js</a> is becoming Auth.js! 🎉 We're creating Authentication for the Web. Everyone included. Starting with SvelteKit, check out <a href='/reference/sveltekit'>the docs</a>.", "<a target='_blank' rel='noopener noreferrer' href='https://next-auth.js.org'>NextAuth.js</a> is becoming Auth.js! 🎉 We're creating Authentication for the Web. Everyone included. Starting with SvelteKit, check out <a href='/reference/sveltekit'>the docs</a>. Note, this site is under active development.",
backgroundColor: "#000", backgroundColor: "#000",
textColor: "#fff", textColor: "#fff",
}, },
@@ -182,10 +182,7 @@ const docusaurusConfig = {
lastVersion: "current", lastVersion: "current",
showLastUpdateAuthor: true, showLastUpdateAuthor: true,
showLastUpdateTime: true, showLastUpdateTime: true,
remarkPlugins: [ remarkPlugins: [require("@sapphire/docusaurus-plugin-npm2yarn2pnpm").npm2yarn2pnpm],
require("@sapphire/docusaurus-plugin-npm2yarn2pnpm").npm2yarn2pnpm,
require("remark-github"),
],
versions: { versions: {
current: { current: {
label: "experimental", label: "experimental",
@@ -204,20 +201,14 @@ const docusaurusConfig = {
{ {
...typedocConfig, ...typedocConfig,
id: "core", id: "core",
plugin: ["./tyepdoc"], plugin: [require.resolve("./typedoc-mdn-links")],
entryPoints: [
"index.ts",
"adapters.ts",
"errors.ts",
"jwt.ts",
"types.ts",
]
.map((e) => `${coreSrc}/${e}`)
.concat(providers),
tsconfig: "../packages/core/tsconfig.json",
out: "reference/03-core",
watch: process.env.TYPEDOC_WATCH, watch: process.env.TYPEDOC_WATCH,
includeExtension: false, entryPoints: ["index.ts", "adapters.ts", "errors.ts", "jwt.ts", "types.ts"].map((e) => `${coreSrc}/${e}`).concat(providers),
tsconfig: "../packages/core/tsconfig.json",
out: "reference/core",
sidebar: {
indexLabel: "index",
},
}, },
], ],
[ [
@@ -225,14 +216,14 @@ const docusaurusConfig = {
{ {
...typedocConfig, ...typedocConfig,
id: "sveltekit", id: "sveltekit",
plugin: ["./tyepdoc"], plugin: [require.resolve("./typedoc-mdn-links")],
entryPoints: ["index.ts", "client.ts"].map(
(e) => `../packages/frameworks-sveltekit/src/lib/${e}`
),
tsconfig: "../packages/frameworks-sveltekit/tsconfig.json",
out: "reference/04-sveltekit",
watch: process.env.TYPEDOC_WATCH, watch: process.env.TYPEDOC_WATCH,
includeExtension: false, entryPoints: ["index.ts", "client.ts"].map((e) => `../packages/frameworks-sveltekit/src/lib/${e}`),
tsconfig: "../packages/frameworks-sveltekit/tsconfig.json",
out: "reference/sveltekit",
sidebar: {
indexLabel: "index",
},
}, },
], ],
], ],

View File

@@ -3,7 +3,7 @@
"repository": "https://github.com/nextauthjs/next-auth", "repository": "https://github.com/nextauthjs/next-auth",
"name": "docs", "name": "docs",
"scripts": { "scripts": {
"start": "TYPEDOC_WATCH=true docusaurus start --no-open --port 8000", "start": "TYPEDOC_WATCH=true docusaurus start --no-open",
"dev": "pnpm providers && pnpm snippets && pnpm start", "dev": "pnpm providers && pnpm snippets && pnpm start",
"build": "pnpm providers && docusaurus build", "build": "pnpm providers && docusaurus build",
"docusaurus": "docusaurus", "docusaurus": "docusaurus",
@@ -27,7 +27,6 @@
"react": "^18.2.0", "react": "^18.2.0",
"react-dom": "^18.2.0", "react-dom": "^18.2.0",
"react-marquee-slider": "^1.1.5", "react-marquee-slider": "^1.1.5",
"remark-github": "10.1.0",
"styled-components": "5.3.6" "styled-components": "5.3.6"
}, },
"devDependencies": { "devDependencies": {
@@ -37,7 +36,9 @@
"@docusaurus/preset-classic": "2.2.0", "@docusaurus/preset-classic": "2.2.0",
"@docusaurus/theme-common": "2.2.0", "@docusaurus/theme-common": "2.2.0",
"@docusaurus/types": "2.2.0", "@docusaurus/types": "2.2.0",
"docusaurus-plugin-typedoc": "^0.18.0" "docusaurus-plugin-typedoc": "1.0.0-next.2",
"typedoc": "^0.23.24",
"typedoc-plugin-markdown": "4.0.0-next.2"
}, },
"browserslist": { "browserslist": {
"production": [ "production": [

View File

@@ -14,61 +14,28 @@ module.exports = {
}, },
], ],
referenceSidebar: [ referenceSidebar: [
"reference/index",
{ {
type: "category", type: "category",
label: "@auth/core", label: "@auth/core",
link: { link: { type: "doc", id: "reference/core/index" },
type: "doc", items: [{ type: "autogenerated", dirName: "reference/core" }],
id: "reference/core/modules/main",
},
items: [
{
type: "autogenerated",
dirName: "reference/03-core/modules",
// See: https://github.com/facebook/docusaurus/issues/5689
// exclude: ["index"],
},
{
type: "category",
label: "Reflections",
collapsed: true,
className: "reflection-category", // See src/index.css
items: [{ type: "autogenerated", dirName: "reference/03-core" }],
},
],
}, },
{ {
type: "category", type: "category",
label: "@auth/sveltekit", label: "@auth/sveltekit",
link: { type: "doc", id: "reference/sveltekit/modules/main" }, link: { type: "doc", id: "reference/sveltekit/index" },
items: [ items: [{ type: "autogenerated", dirName: "reference/sveltekit" }],
{ type: "autogenerated", dirName: "reference/04-sveltekit/modules" },
{
type: "category",
label: "Reflections",
collapsed: true,
className: "reflection-category", // See src/index.css
items: [{ type: "autogenerated", dirName: "reference/04-sveltekit" }],
},
],
}, },
{ {
type: "category", type: "category",
label: "@auth/solid-start", label: "@auth/solid-start",
link: { link: { type: "doc", id: "reference/solidstart/index" },
type: "doc", items: [{ type: "autogenerated", dirName: "reference/04-solidstart" }],
id: "reference/solidstart/index",
},
items: ["reference/solidstart/client", "reference/solidstart/protected"],
}, },
{ {
type: "category", type: "category",
label: "@auth/nextjs", label: "@auth/nextjs",
link: { link: { type: "doc", id: "reference/nextjs/index" },
type: "doc",
id: "reference/nextjs/index",
},
items: [ items: [
"reference/nextjs/client", "reference/nextjs/client",
{ {

View File

@@ -272,27 +272,4 @@ html[data-theme="dark"] #carbonads > span {
html[data-theme="dark"] #carbonads .carbon-poweredby { html[data-theme="dark"] #carbonads .carbon-poweredby {
color: #aaa; color: #aaa;
background: #1e2021; background: #1e2021;
} }
/*
This is a hack to hide the "Reflection" category and "main" module from the sidebar.
This is because:
1. opening any page under the "Reflection" category would hide the entire sidebar.
2. the "main" module would show up twice.
See sidebars.js
*/
.reflection-category,
.theme-doc-sidebar-item-link-level-2 [href="/reference/core/modules/main"],
.theme-doc-sidebar-item-link-level-2
[href="/reference/sveltekit/modules/main"] {
display: none;
}
/*
HACK: to hide the "Classes" header and duplicate items together with the "typedoc-plugin-markdown" patch.
See: https://github.com/TypeStrong/typedoc/issues/2006
*/
/* h3.anchor + p:has(code, strong), */ /** hack did not work as it hides property types elsewhere */
#classes {
display: none;
}

5
docs/static/img/providers/notion.svg vendored Normal file
View File

@@ -0,0 +1,5 @@
<svg width="32" height="32" viewBox="0 0 100 100" fill="none" xmlns="http://www.w3.org/2000/svg">
<title>Notion icon</title>
<path d="M6.017 4.313l55.333 -4.087c6.797 -0.583 8.543 -0.19 12.817 2.917l17.663 12.443c2.913 2.14 3.883 2.723 3.883 5.053v68.243c0 4.277 -1.553 6.807 -6.99 7.193L24.467 99.967c-4.08 0.193 -6.023 -0.39 -8.16 -3.113L3.3 79.94c-2.333 -3.113 -3.3 -5.443 -3.3 -8.167V11.113c0 -3.497 1.553 -6.413 6.017 -6.8z" fill="#fff"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M61.35 0.227l-55.333 4.087C1.553 4.7 0 7.617 0 11.113v60.66c0 2.723 0.967 5.053 3.3 8.167l13.007 16.913c2.137 2.723 4.08 3.307 8.16 3.113l64.257 -3.89c5.433 -0.387 6.99 -2.917 6.99 -7.193V20.64c0 -2.21 -0.873 -2.847 -3.443 -4.733L74.167 3.143c-4.273 -3.107 -6.02 -3.5 -12.817 -2.917zM25.92 19.523c-5.247 0.353 -6.437 0.433 -9.417 -1.99L8.927 11.507c-0.77 -0.78 -0.383 -1.753 1.557 -1.947l53.193 -3.887c4.467 -0.39 6.793 1.167 8.54 2.527l9.123 6.61c0.39 0.197 1.36 1.36 0.193 1.36l-54.933 3.307 -0.68 0.047zM19.803 88.3V30.367c0 -2.53 0.777 -3.697 3.103 -3.893L86 22.78c2.14 -0.193 3.107 1.167 3.107 3.693v57.547c0 2.53 -0.39 4.67 -3.883 4.863l-60.377 3.5c-3.493 0.193 -5.043 -0.97 -5.043 -4.083zm59.6 -54.827c0.387 1.75 0 3.5 -1.75 3.7l-2.91 0.577v42.773c-2.527 1.36 -4.853 2.137 -6.797 2.137 -3.107 0 -3.883 -0.973 -6.21 -3.887l-19.03 -29.94v28.967l6.02 1.363s0 3.5 -4.857 3.5l-13.39 0.777c-0.39 -0.78 0 -2.723 1.357 -3.11l3.497 -0.97v-38.3L30.48 40.667c-0.39 -1.75 0.58 -4.277 3.3 -4.473l14.367 -0.967 19.8 30.327v-26.83l-5.047 -0.58c-0.39 -2.143 1.163 -3.7 3.103 -3.89l13.4 -0.78z" fill="#000"/>
</svg>

After

Width:  |  Height:  |  Size: 1.6 KiB

View File

@@ -1,23 +1,16 @@
{ {
"excludeNotDocumented": true,
"$schema": "https://typedoc.org/schema.json", "$schema": "https://typedoc.org/schema.json",
"allReflectionsHaveOwnDocument": true, "cleanOutputDir": true,
"disableSources": true, "disableSources": true,
"hideBreadcrumbs": true,
"excludeExternals": true, "excludeExternals": true,
"excludeInternal": true, "excludeInternal": true,
"excludeNotDocumented": true,
"excludePrivate": true, "excludePrivate": true,
"cleanOutputDir": true,
"excludeProtected": true, "excludeProtected": true,
"hideHierarchy": true,
"gitRevision": "main", "gitRevision": "main",
"hideBreadcrumbs": true,
"hideGenerator": true, "hideGenerator": true,
"intentionallyNotExported": [
"ReturnTypes",
"CallbackParameters",
"JsonValue"
],
"readme": "none",
"sort": ["kind", "static-first", "required-first", "alphabetical"],
"kindSortOrder": [ "kindSortOrder": [
"Function", "Function",
"TypeAlias", "TypeAlias",
@@ -41,5 +34,13 @@
"IndexSignature", "IndexSignature",
"GetSignature", "GetSignature",
"SetSignature" "SetSignature"
] ],
} "readme": "none",
"sort": [
"kind",
"static-first",
"required-first",
"alphabetical"
],
"symbolsWithOwnFile": "none"
}

View File

@@ -41,8 +41,6 @@
"prettier": "2.8.1", "prettier": "2.8.1",
"prettier-plugin-svelte": "^2.8.1", "prettier-plugin-svelte": "^2.8.1",
"turbo": "1.6.3", "turbo": "1.6.3",
"typedoc": "^0.23.22",
"typedoc-plugin-markdown": "^3.14.0",
"typescript": "4.9.4" "typescript": "4.9.4"
}, },
"engines": { "engines": {
@@ -64,7 +62,6 @@
"undici": "5.11.0" "undici": "5.11.0"
}, },
"patchedDependencies": { "patchedDependencies": {
"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" "@balazsorban/monorepo-release@0.1.8": "patches/@balazsorban__monorepo-release@0.1.8.patch"
} }
} }

View File

@@ -0,0 +1,11 @@
import { initializeApp, getApps, FirebaseOptions } from "firebase/app"
export default function getFirebase(firebaseOptions: FirebaseOptions) {
const apps = getApps()
const app = apps.find((app) => app.name === firebaseOptions.projectId)
if (app) {
return app
} else {
return initializeApp(firebaseOptions)
}
}

View File

@@ -25,6 +25,7 @@ import type {
} from "next-auth/adapters" } from "next-auth/adapters"
import { getConverter } from "./converter" import { getConverter } from "./converter"
import getFirebase from "./getFirebase"
export type IndexableObject = Record<string, unknown> export type IndexableObject = Record<string, unknown>
@@ -39,7 +40,7 @@ export function FirestoreAdapter({
emulator, emulator,
...firebaseOptions ...firebaseOptions
}: FirebaseOptions & FirestoreAdapterOptions): Adapter { }: FirebaseOptions & FirestoreAdapterOptions): Adapter {
const firebaseApp = initializeApp(firebaseOptions) const firebaseApp = getFirebase(firebaseOptions)
const db = getFirestore(firebaseApp) const db = getFirestore(firebaseApp)
if (emulator) { if (emulator) {

View File

@@ -69,7 +69,7 @@
"preact-render-to-string": "5.2.3" "preact-render-to-string": "5.2.3"
}, },
"peerDependencies": { "peerDependencies": {
"nodemailer": "6.8.0" "nodemailer": "^6.8.0"
}, },
"peerDependenciesMeta": { "peerDependenciesMeta": {
"nodemailer": { "nodemailer": {
@@ -77,10 +77,11 @@
} }
}, },
"scripts": { "scripts": {
"build": "pnpm css && tsc", "build": "pnpm css && pnpm providers && tsc",
"clean": "rm -rf *.js *.d.ts* lib providers", "clean": "rm -rf *.js *.d.ts* lib providers",
"css": "node scripts/generate-css", "css": "node scripts/generate-css",
"dev": "pnpm css && tsc -w" "dev": "pnpm css && pnpm providers && tsc -w",
"providers": "node scripts/generate-providers"
}, },
"devDependencies": { "devDependencies": {
"@next-auth/tsconfig": "workspace:*", "@next-auth/tsconfig": "workspace:*",
@@ -92,4 +93,4 @@
"postcss": "8.4.19", "postcss": "8.4.19",
"postcss-nested": "6.0.0" "postcss-nested": "6.0.0"
} }
} }

View File

@@ -0,0 +1,18 @@
import { join } from "path"
import { readdirSync, writeFileSync } from "fs"
const providersPath = join(process.cwd(), "src/providers")
const files = readdirSync(providersPath, "utf8")
const providers = files.map((file) => {
const strippedProviderName = file.substring(0, file.indexOf("."))
return `"${strippedProviderName}"`
}).filter((provider) => provider !== '"oauth-types"' && provider !== '"index"')
const result = `
// THIS FILE IS AUTOGENERATED. DO NOT EDIT.
export type OAuthProviderType =
| ${providers.join("\n | ")}`
writeFileSync(join(providersPath, "oauth-types.ts"), result)

View File

@@ -27,14 +27,14 @@
* ## Resources * ## Resources
* *
* - [Getting started](https://authjs.dev/getting-started/introduction) * - [Getting started](https://authjs.dev/getting-started/introduction)
* - [Most common use case guides](https://authjs.dev/guides/overview) * - [Most common use case guides](https://authjs.dev/guides)
* *
* @module main * @module index
*/ */
import { assertConfig } from "./lib/assert.js" import { assertConfig } from "./lib/assert.js"
import { ErrorPageLoop } from "./errors.js" import { ErrorPageLoop } from "./errors.js"
import { AuthInternal } from "./lib/index.js" import { AuthInternal, skipCSRFCheck } from "./lib/index.js"
import renderPage from "./lib/pages/index.js" import renderPage from "./lib/pages/index.js"
import { logger, setLogger, type LoggerInstance } from "./lib/utils/logger.js" import { logger, setLogger, type LoggerInstance } from "./lib/utils/logger.js"
import { toInternalRequest, toResponse } from "./lib/web.js" import { toInternalRequest, toResponse } from "./lib/web.js"
@@ -51,6 +51,8 @@ import type {
import type { Provider } from "./providers/index.js" import type { Provider } from "./providers/index.js"
import { JWTOptions } from "./jwt.js" import { JWTOptions } from "./jwt.js"
export { skipCSRFCheck }
/** /**
* Core functionality provided by Auth.js. * Core functionality provided by Auth.js.
* *
@@ -298,14 +300,3 @@ export interface AuthConfig {
trustHost?: boolean trustHost?: boolean
skipCSRFCheck?: typeof skipCSRFCheck skipCSRFCheck?: typeof skipCSRFCheck
} }
/**
* :::danger
* This option is inteded for framework authors.
* :::
*
* Auth.js comes with built-in {@link https://authjs.dev/concepts/security#csrf CSRF} protection, but
* if you are implementing a framework that is already protected against CSRF attacks, you can skip this check by
* passing this value to {@link AuthConfig.skipCSRFCheck}.
*/
export const skipCSRFCheck = Symbol("skip-csrf-check")

View File

@@ -1,5 +1,4 @@
import { UnknownAction } from "../errors.js" import { UnknownAction } from "../errors.js"
import { skipCSRFCheck } from "../index.js"
import { SessionStore } from "./cookie.js" import { SessionStore } from "./cookie.js"
import { init } from "./init.js" import { init } from "./init.js"
import renderPage from "./pages/index.js" import renderPage from "./pages/index.js"
@@ -72,9 +71,9 @@ export async function AuthInternal<
if (pages.signIn) { if (pages.signIn) {
let signinUrl = `${pages.signIn}${ let signinUrl = `${pages.signIn}${
pages.signIn.includes("?") ? "&" : "?" pages.signIn.includes("?") ? "&" : "?"
}callbackUrl=${encodeURIComponent(options.callbackUrl)}` }${new URLSearchParams({ callbackUrl: options.callbackUrl })}`
if (error) if (error)
signinUrl = `${signinUrl}&error=${encodeURIComponent(error)}` signinUrl = `${signinUrl}&${new URLSearchParams({ error })}`
return { redirect: signinUrl, cookies } return { redirect: signinUrl, cookies }
} }
@@ -186,3 +185,14 @@ export async function AuthInternal<
} }
throw new UnknownAction(`Cannot handle action: ${action}`) throw new UnknownAction(`Cannot handle action: ${action}`)
} }
/**
* :::danger
* This option is intended for framework authors.
* :::
*
* Auth.js comes with built-in {@link https://authjs.dev/concepts/security#csrf CSRF} protection, but
* if you are implementing a framework that is already protected against CSRF attacks, you can skip this check by
* passing this value to {@link AuthConfig.skipCSRFCheck}.
*/
export const skipCSRFCheck = Symbol("skip-csrf-check")

View File

@@ -90,5 +90,5 @@ export async function getAuthorizationUrl(
} }
logger.debug("authorization url is ready", { url, cookies, provider }) logger.debug("authorization url is ready", { url, cookies, provider })
return { redirect: url, cookies } return { redirect: url.toString(), cookies }
} }

View File

@@ -203,7 +203,7 @@ async function getProfile(
// If we didn't get a response either there was a problem with the provider // If we didn't get a response either there was a problem with the provider
// response *or* the user cancelled the action with the provider. // response *or* the user cancelled the action with the provider.
// //
// Unfortuately, we can't tell which - at least not in a way that works for // Unfortunately, we can't tell which - at least not in a way that works for
// all providers, so we return an empty object; the user should then be // all providers, so we return an empty object; the user should then be
// redirected back to the sign up page. We log the error to help developers // redirected back to the sign up page. We log the error to help developers
// who might be trying to debug this when configuring a new provider. // who might be trying to debug this when configuring a new provider.

View File

@@ -53,7 +53,7 @@ export async function callback(params: {
cookies.push(...authorizationResult.cookies) cookies.push(...authorizationResult.cookies)
} }
logger.debug("authroization result", authorizationResult) logger.debug("authorization result", authorizationResult)
const { profile, account, OAuthProfile } = authorizationResult const { profile, account, OAuthProfile } = authorizationResult
@@ -149,7 +149,7 @@ export async function callback(params: {
return { return {
redirect: `${pages.newUser}${ redirect: `${pages.newUser}${
pages.newUser.includes("?") ? "&" : "?" pages.newUser.includes("?") ? "&" : "?"
}callbackUrl=${encodeURIComponent(callbackUrl)}`, }${new URLSearchParams({ callbackUrl })}`,
cookies, cookies,
} }
} }
@@ -256,7 +256,7 @@ export async function callback(params: {
return { return {
redirect: `${pages.newUser}${ redirect: `${pages.newUser}${
pages.newUser.includes("?") ? "&" : "?" pages.newUser.includes("?") ? "&" : "?"
}callbackUrl=${encodeURIComponent(callbackUrl)}`, }${new URLSearchParams({ callbackUrl })}`,
cookies, cookies,
} }
} }
@@ -350,6 +350,6 @@ export async function callback(params: {
logger.error(error) logger.error(error)
url.searchParams.set("error", CallbackRouteError.name) url.searchParams.set("error", CallbackRouteError.name)
url.pathname += "/error" url.pathname += "/error"
return { redirect: url, cookies } return { redirect: url.toString(), cookies }
} }
} }

View File

@@ -7,19 +7,20 @@ export async function handleAuthorized(
params: any, params: any,
{ url, logger, callbacks: { signIn } }: InternalOptions { url, logger, callbacks: { signIn } }: InternalOptions
) { ) {
url.pathname += "/error"
try { try {
const authorized = await signIn(params) const authorized = await signIn(params)
if (!authorized) { if (!authorized) {
url.pathname += "/error"
logger.debug("User not authorized", params) logger.debug("User not authorized", params)
url.searchParams.set("error", "AccessDenied") url.searchParams.set("error", "AccessDenied")
return { status: 403 as const, redirect: url } return { status: 403 as const, redirect: url.toString() }
} }
} catch (e) { } catch (e) {
url.pathname += "/error"
const error = new AuthorizedCallbackError(e as Error) const error = new AuthorizedCallbackError(e as Error)
logger.error(error) logger.error(error)
url.searchParams.set("error", "Configuration") url.searchParams.set("error", "Configuration")
return { status: 500 as const, redirect: url } return { status: 500 as const, redirect: url.toString() }
} }
} }

View File

@@ -54,7 +54,7 @@ export async function signin(
logger.error(error) logger.error(error)
url.searchParams.set("error", error.name) url.searchParams.set("error", error.name)
url.pathname += "/error" url.pathname += "/error"
return { redirect: url } return { redirect: url.toString() }
} }
} }

View File

@@ -8,7 +8,7 @@ import type { SessionStore } from "../cookie.js"
* If the session strategy is database, * If the session strategy is database,
* The session is also deleted from the database. * The session is also deleted from the database.
* In any case, the session cookie is cleared and * In any case, the session cookie is cleared and
* an `events.signOut` is emitted. * {@link EventCallbacks.signOut} is emitted.
*/ */
export async function signout( export async function signout(
sessionStore: SessionStore, sessionStore: SessionStore,

View File

@@ -76,27 +76,22 @@ export function toResponse(res: ResponseInternal): Response {
res.cookies?.forEach((cookie) => { res.cookies?.forEach((cookie) => {
const { name, value, options } = cookie const { name, value, options } = cookie
const cookieHeader = serialize(name, value, options) const cookieHeader = serialize(name, value, options)
if (headers.has("Set-Cookie")) { if (headers.has("Set-Cookie")) headers.append("Set-Cookie", cookieHeader)
headers.append("Set-Cookie", cookieHeader) else headers.set("Set-Cookie", cookieHeader)
} else {
headers.set("Set-Cookie", cookieHeader)
}
// headers.set("Set-Cookie", cookieHeader) // TODO: Remove. Seems to be a bug with Headers in the runtime // headers.set("Set-Cookie", cookieHeader) // TODO: Remove. Seems to be a bug with Headers in the runtime
}) })
const body = let body = res.body
headers.get("content-type") === "application/json"
? JSON.stringify(res.body)
: res.body
const response = new Response(body, { if (headers.get("content-type") === "application/json")
headers, body = JSON.stringify(res.body)
status: res.redirect ? 302 : res.status ?? 200, else if (headers.get("content-type") === "application/x-www-form-urlencoded")
}) body = new URLSearchParams(res.body).toString()
if (res.redirect) { const status = res.redirect ? 302 : res.status ?? 200
response.headers.set("Location", res.redirect.toString()) const response = new Response(body, { headers, status })
}
if (res.redirect) response.headers.set("Location", res.redirect)
return response return response
} }

View File

@@ -49,10 +49,6 @@ export interface CredentialsConfig<
export type CredentialsProviderType = "Credentials" export type CredentialsProviderType = "Credentials"
export type CredentialsConfigInternal<
C extends Record<string, CredentialInput> = Record<string, CredentialInput>
> = CredentialsConfig<C> & { options: CredentialsConfig<C> }
/** /**
* The Credentials provider allows you to handle signing in with arbitrary credentials, * The Credentials provider allows you to handle signing in with arbitrary credentials,
* such as a username and password, domain, or two factor authentication or hardware device (e.g. YubiKey U2F / FIDO). * such as a username and password, domain, or two factor authentication or hardware device (e.g. YubiKey U2F / FIDO).

View File

@@ -1,21 +1,77 @@
import type { OAuthConfig, OAuthUserConfig } from "./index.js" import type { OAuthConfig, OAuthUserConfig } from "./index.js"
/**
* Corresponds to the user structure documented here:
* https://discord.com/developers/docs/resources/user#user-object-user-structure
*/
export interface DiscordProfile extends Record<string, any> { export interface DiscordProfile extends Record<string, any> {
accent_color: number /** the user's id (i.e. the numerical snowflake) */
avatar: string
banner: string
banner_color: string
discriminator: string
email: string
flags: number
id: string id: string
image_url: string /** the user's username, not unique across the platform */
locale: string
mfa_enabled: boolean
premium_type: number
public_flags: number
username: string username: string
/** the user's 4-digit discord-tag */
discriminator: string
/**
* the user's avatar hash:
* https://discord.com/developers/docs/reference#image-formatting
*/
avatar: string | null
/** whether the user belongs to an OAuth2 application */
bot?: boolean
/**
* whether the user is an Official Discord System user (part of the urgent
* message system)
*/
system?: boolean
/** whether the user has two factor enabled on their account */
mfa_enabled: boolean
/**
* the user's banner hash:
* https://discord.com/developers/docs/reference#image-formatting
*/
banner: string | null
/** the user's banner color encoded as an integer representation of hexadecimal color code */
accent_color: number | null
/**
* the user's chosen language option:
* https://discord.com/developers/docs/reference#locales
*/
locale: string
/** whether the email on this account has been verified */
verified: boolean verified: boolean
/** the user's email */
email: string | null
/**
* the flags on a user's account:
* https://discord.com/developers/docs/resources/user#user-object-user-flags
*/
flags: number
/**
* the type of Nitro subscription on a user's account:
* https://discord.com/developers/docs/resources/user#user-object-premium-types
*/
premium_type: number
/**
* the public flags on a user's account:
* https://discord.com/developers/docs/resources/user#user-object-user-flags
*/
public_flags: number
/** undocumented field; corresponds to the user's custom nickname */
display_name: string | null
/**
* undocumented field; corresponds to the Discord feature where you can e.g.
* put your avatar inside of an ice cube
*/
avatar_decoration: string | null
/**
* undocumented field; corresponds to the premium feature where you can
* select a custom banner color
*/
banner_color: string | null
/** undocumented field; the CDN URL of their profile picture */
image_url: string
} }
export default function Discord<P extends DiscordProfile>( export default function Discord<P extends DiscordProfile>(

View File

@@ -65,12 +65,16 @@ export type Provider<P extends Profile = Profile> = (
| EmailConfig | EmailConfig
| CredentialsConfig | CredentialsConfig
) & { ) & {
/**
* Used to deep merge user-provided config with the default config
* @internal
*/
options: Record<string, unknown> options: Record<string, unknown>
} }
export type BuiltInProviders = Record< export type BuiltInProviders = Record<
OAuthProviderType, OAuthProviderType,
(options: Partial<OAuthConfig<any>>) => OAuthConfig<any> (config: Partial<OAuthConfig<any>>) => OAuthConfig<any>
> & > &
Record<CredentialsProviderType, typeof CredentialsProvider> & Record<CredentialsProviderType, typeof CredentialsProvider> &
Record<EmailProviderType, typeof EmailProvider> Record<EmailProviderType, typeof EmailProvider>

View File

@@ -0,0 +1,166 @@
/**
* <div style={{backgroundColor: "#000", display: "flex", justifyContent: "space-between", color: "#fff", padding: 16}}>
* <span>Built-in <b>Notion</b> integration.</span>
* <a href="https://notion.so">
* <img style={{display: "block"}} src="https://authjs.dev/img/providers/notion.svg" height="48" width="48"/>
* </a>
* </div>
*
* ---
* @module providers/notion
*/
import type { OAuthConfig, OAuthUserConfig } from "."
export interface Person extends Record<string, any> {
email: string
}
// https://developers.notion.com/reference/user
export interface User extends Record<string, any> {
object: "user" | "bot"
id: string
type: string
name: string
avatar_url: null | string
person: Person
owner?: {
type: "workspace" | "user"
workspace: string
}
workspace_name?: string | null
}
export interface Owner {
type: string
user: User
}
// Notion responds with an access_token + some additional information, which we define here
// More info - https://developers.notion.com/docs/authorization#step-4-notion-responds-with-an-access_token-and-some-additional-information
export interface NotionProfile extends Record<string, any> {
access_token: string
bot_id: string
duplicated_template_id: string
owner?: Owner
workspace_icon: string
workspace_id: number
workspace_name: string
}
// Any config required that isn't part of the `OAuthUserConfig` spec should belong here
// For example, we must pass a `redirectUri` to the Notion API when requesting tokens, therefore we add it here
interface AdditionalConfig {
redirectUri: string
}
const NOTION_HOST = "https://api.notion.com"
const NOTION_API_VERSION = "2022-06-28"
/**
* Add Notion login to your page.
*
* ## Example
*
* ```ts
* import { Auth } from "@auth/core"
* import Notion from "@auth/core/providers/notion"
*
* const request = new Request("https://example.com")
* const response = await Auth(request, {
* providers: [Notion({ clientId: "", clientSecret: "", redirectUri: "" })],
* })
* ```
*
* ---
*
* ## Resources
* - [Notion Docs](https://developers.notion.com/docs)
* - [Notion Authorization Docs](https://developers.notion.com/docs/authorization)
* - [Notion Integrations](https://www.notion.so/my-integrations)
*
* ---
*
* ## Notes
* You need to select "Public Integration" on the configuration page to get an `oauth_id` and `oauth_secret`. Private integrations do not provide these details.
* You must provide a `clientId` and `clientSecret` to use this provider, as-well as a redirect URI (due to this being required by Notion endpoint to fetch tokens).
*
* :::tip
*
* The Notion provider comes with a [default configuration](https://github.com/nextauthjs/next-auth/blob/main/packages/core/src/providers/notion.ts).
* To override the defaults for your use case, check out [customizing a built-in OAuth provider](https://authjs.dev/guides/providers/custom-provider#override-default-options).
*
* :::
*
* :::info **Disclaimer**
*
* If you think you found a bug in the default configuration, you can [open an issue](https://authjs.dev/new/provider-issue).
*
* Auth.js strictly adheres to the specification and it cannot take responsibility for any deviation from
* the spec by the provider. You can open an issue, but if the problem is non-compliance with the spec,
* we might not pursue a resolution. You can ask for more help in [Discussions](https://authjs.dev/new/github-discussions).
*
* :::
*/
export default function NotionProvider<P extends NotionProfile>(
options: OAuthUserConfig<P> & AdditionalConfig
): OAuthConfig<P> {
return {
id: "notion",
name: "Notion",
type: "oauth",
token: {
url: `${NOTION_HOST}/v1/oauth/token`,
},
userinfo: {
url: `${NOTION_HOST}/v1/users`,
// The result of this method will be the input to the `profile` callback.
// We use a custom request handler, since we need to do things such as pass the "Notion-Version" header
// More info: https://next-auth.js.org/configuration/providers/oauth
async request(context) {
const profile = await fetch(`${NOTION_HOST}/v1/users/me`, {
headers: {
Authorization: `Bearer ${context.tokens.access_token}`,
"Notion-Version": NOTION_API_VERSION,
},
})
const {
bot: {
owner: { user },
},
} = await profile.json()
return user
},
},
authorization: {
params: {
client_id: options.clientId,
response_type: "code",
owner: "user",
redirect_uri: options.redirectUri,
},
url: `${NOTION_HOST}/v1/oauth/authorize`,
},
async profile(profile, tokens) {
return {
id: profile.id,
name: profile.name,
email: profile.person.email,
image: profile.avatar_url,
}
},
style: {
logo: "/notion.svg",
logoDark: "/notion.svg",
bg: "#fff",
text: "#000",
bgDark: "#fff",
textDark: "#000",
},
options,
}
}

View File

@@ -1,69 +0,0 @@
// THIS FILE IS AUTOGENERATED. DO NOT EDIT.
export type OAuthProviderType =
| "42-school"
| "apple"
| "atlassian"
| "auth0"
| "authentik"
| "azure-ad-b2c"
| "azure-ad"
| "battlenet"
| "box"
| "boxyhq-saml"
| "bungie"
| "cognito"
| "coinbase"
| "credentials"
| "discord"
| "dropbox"
| "duende-identity-server6"
| "email"
| "eveonline"
| "facebook"
| "faceit"
| "foursquare"
| "freshbooks"
| "fusionauth"
| "github"
| "gitlab"
| "google"
| "hubspot"
| "identity-server4"
| "index"
| "instagram"
| "kakao"
| "keycloak"
| "line"
| "linkedin"
| "mailchimp"
| "mailru"
| "medium"
| "naver"
| "netlify"
| "oauth-types.js"
| "oauth"
| "okta"
| "onelogin"
| "osso"
| "osu"
| "patreon"
| "pinterest"
| "pipedrive"
| "reddit"
| "salesforce"
| "slack"
| "spotify"
| "strava"
| "todoist"
| "trakt"
| "twitch"
| "twitter"
| "united-effects"
| "vk"
| "wikimedia"
| "wordpress"
| "workos"
| "yandex"
| "zitadel"
| "zoho"
| "zoom"

View File

@@ -66,7 +66,7 @@ export type TokenEndpointHandler = EndpointHandler<
params: CallbackParamsType params: CallbackParamsType
/** /**
* When using this custom flow, make sure to do all the necessary security checks. * When using this custom flow, make sure to do all the necessary security checks.
* Thist object contains parameters you have to match against the request to make sure it is valid. * This object contains parameters you have to match against the request to make sure it is valid.
*/ */
checks: OAuthChecks checks: OAuthChecks
}, },

View File

@@ -203,7 +203,7 @@ export interface CallbacksOptions<P = Profile, A = Account> {
* Its content is forwarded to the `session` callback, * Its content is forwarded to the `session` callback,
* where you can control what should be returned to the client. * where you can control what should be returned to the client.
* Anything else will be kept inaccessible from the client. * Anything else will be kept inaccessible from the client.
* *
* Returning `null` will invalidate the JWT session by clearing * Returning `null` will invalidate the JWT session by clearing
* the user's cookies. You'll still have to monitor and invalidate * the user's cookies. You'll still have to monitor and invalidate
* unexpired tokens from future requests yourself to prevent * unexpired tokens from future requests yourself to prevent
@@ -220,7 +220,7 @@ export interface CallbacksOptions<P = Profile, A = Account> {
account?: A | null account?: A | null
profile?: P profile?: P
isNewUser?: boolean isNewUser?: boolean
}) => Awaitable<JWT|null> }) => Awaitable<JWT | null>
} }
/** [Documentation](https://authjs.dev/reference/configuration/auth-config#cookies) */ /** [Documentation](https://authjs.dev/reference/configuration/auth-config#cookies) */
@@ -452,7 +452,7 @@ export interface ResponseInternal<
status?: number status?: number
headers?: Headers | HeadersInit headers?: Headers | HeadersInit
body?: Body body?: Body
redirect?: URL | string redirect?: string
cookies?: Cookie[] cookies?: Cookie[]
} }

View File

@@ -1,8 +1,16 @@
// After build, copy the files in ./package to the root directory, excluding the package.json file. // After build, copy the files in ./package to the root directory, excluding the package.json file.
import fs from "fs/promises" import fs from "fs/promises"
import path from "path" import path from "path"
const __dirname = path.dirname(new URL(import.meta.url).pathname) let __dirname = path.dirname(new URL(import.meta.url).pathname)
// The above hack to polyfill "__dirname" for ESM does not work on Windows computers,
// so we might have to manually perform more steps.
__dirname = __dirname.split(path.sep).join(path.posix.sep)
if (__dirname.match(/^\/\w:\//)) {
__dirname = __dirname.slice(3) // Remove the drive prefix.
}
const root = path.join(__dirname, "..") const root = path.join(__dirname, "..")
const pkgDir = path.join(root, "package") const pkgDir = path.join(root, "package")

View File

@@ -81,7 +81,7 @@
* return { * return {
* session: await event.locals.getSession() * session: await event.locals.getSession()
* }; * };
* }; * };
* ``` * ```
* *
* What you return in the function `LayoutServerLoad` will be available inside the `$page` store, in the `data` property: `$page.data`. * What you return in the function `LayoutServerLoad` will be available inside the `$page` store, in the `data` property: `$page.data`.
@@ -106,7 +106,7 @@
* return {}; * return {};
* }; * };
* ``` * ```
* *
* :::danger * :::danger
* Make sure to ALWAYS grab the session information from the parent instead of using the store in the case of a `PageLoad`. * Make sure to ALWAYS grab the session information from the parent instead of using the store in the case of a `PageLoad`.
* Not doing so can lead to users being able to incorrectly access protected information in the case the `+layout.server.ts` does not run for that page load. * Not doing so can lead to users being able to incorrectly access protected information in the case the `+layout.server.ts` does not run for that page load.
@@ -130,14 +130,14 @@
* The handle hook, available in `hooks.server.ts`, is a function that receives ALL requests sent to your SvelteKit webapp. * The handle hook, available in `hooks.server.ts`, is a function that receives ALL requests sent to your SvelteKit webapp.
* You may intercept them inside the handle hook, add and modify things in the request, block requests, etc. * You may intercept them inside the handle hook, add and modify things in the request, block requests, etc.
* Some readers may notice we are already using this handle hook for SvelteKitAuth which returns a handle itself, so we are going to use SvelteKit's sequence to provide middleware-like functions that set the handle hook. * Some readers may notice we are already using this handle hook for SvelteKitAuth which returns a handle itself, so we are going to use SvelteKit's sequence to provide middleware-like functions that set the handle hook.
* *
* ```ts * ```ts
* 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';
* import { redirect, type Handle } from '@sveltejs/kit'; * import { redirect, type Handle } from '@sveltejs/kit';
* import { sequence } from '@sveltejs/kit/hooks'; * import { sequence } from '@sveltejs/kit/hooks';
* *
* async function authorization({ event, resolve }) { * async function authorization({ event, resolve }) {
* // Protect any routes under /authenticated * // Protect any routes under /authenticated
* if (event.url.pathname.startsWith('/authenticated')) { * if (event.url.pathname.startsWith('/authenticated')) {
@@ -146,14 +146,14 @@
* throw redirect(303, '/auth'); * throw redirect(303, '/auth');
* } * }
* } * }
* *
* // If the request is still here, just proceed as normally * // If the request is still here, just proceed as normally
* const result = await resolve(event, { * const result = await resolve(event, {
* transformPageChunk: ({ html }) => html * transformPageChunk: ({ html }) => html
* }); * });
* return result; * return result;
* } * }
* *
* // First handle authentication, then authorization * // First handle authentication, then authorization
* // Each function acts as a middleware, receiving the request handle * // Each function acts as a middleware, receiving the request handle
* // And returning a handle which gets passed to the next function * // And returning a handle which gets passed to the next function
@@ -183,7 +183,7 @@
* PRs to improve this documentation are welcome! See [this file](https://github.com/nextauthjs/next-auth/blob/main/packages/frameworks-sveltekit/src/lib/index.ts). * PRs to improve this documentation are welcome! See [this file](https://github.com/nextauthjs/next-auth/blob/main/packages/frameworks-sveltekit/src/lib/index.ts).
* ::: * :::
* *
* @module main * @module index
*/ */
/// <reference types="@sveltejs/kit" /> /// <reference types="@sveltejs/kit" />

View File

@@ -1,23 +0,0 @@
diff --git a/dist/theme.js b/dist/theme.js
index 1483a4b4ec69583aa3086eac83b2b31ae8bb6777..c30e7a4f7785fc230099e8b904040dd4aa57c38e 100644
--- a/dist/theme.js
+++ b/dist/theme.js
@@ -221,12 +221,12 @@ class MarkdownTheme extends typedoc_1.Theme {
directory: 'enums',
template: this.getReflectionTemplate(),
},
- {
- kind: [typedoc_1.ReflectionKind.Class],
- isLeaf: false,
- directory: 'classes',
- template: this.getReflectionTemplate(),
- },
+ // {
+ // kind: [typedoc_1.ReflectionKind.Class],
+ // isLeaf: false,
+ // directory: 'classes',
+ // template: this.getReflectionTemplate(),
+ // },
{
kind: [typedoc_1.ReflectionKind.Interface],
isLeaf: false,

1714
pnpm-lock.yaml generated

File diff suppressed because it is too large Load Diff

View File

@@ -25,6 +25,10 @@
"dependsOn": ["^build"], "dependsOn": ["^build"],
"outputs": ["lib/**", "providers/**", "*.js", "*.d.ts", "*.d.ts.map"] "outputs": ["lib/**", "providers/**", "*.js", "*.d.ts", "*.d.ts.map"]
}, },
"@auth/sveltekit#build": {
"dependsOn": ["^build"],
"outputs": ["client.*", "index.*"]
},
"clean": { "clean": {
"cache": false "cache": false
}, },
@@ -39,6 +43,10 @@
}, },
"@next-auth/upstash-redis-adapter#test": { "@next-auth/upstash-redis-adapter#test": {
"env": ["UPSTASH_REDIS_KEY", "UPSTASH_REDIS_URL"] "env": ["UPSTASH_REDIS_KEY", "UPSTASH_REDIS_URL"]
},
"docs#dev": {
"dependsOn": ["^build"],
"cache": false
} }
} }
} }