mirror of
https://github.com/SrIzan10/next-auth.git
synced 2026-05-01 10:55:20 +00:00
Compare commits
27 Commits
@auth/core
...
docs/api-r
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
354b03471c | ||
|
|
0a7286e857 | ||
|
|
cf544d6ec7 | ||
|
|
84e14d76b3 | ||
|
|
7794b6dfbb | ||
|
|
d195381224 | ||
|
|
b3d5ec596b | ||
|
|
34f8f36038 | ||
|
|
a79a5d6cbe | ||
|
|
cac71774a6 | ||
|
|
7376f10cac | ||
|
|
fb43c5da05 | ||
|
|
326eadf0ed | ||
|
|
a5e0db4bb3 | ||
|
|
334e23343a | ||
|
|
be046a6cb2 | ||
|
|
bdee262abe | ||
|
|
3f89e668ec | ||
|
|
533320eb94 | ||
|
|
dfe6509472 | ||
|
|
1bde7cc8df | ||
|
|
cef05d5e2d | ||
|
|
c0dea283ba | ||
|
|
0204766e0f | ||
|
|
a336ba762c | ||
|
|
681d53c2f8 | ||
|
|
06e891c0ea |
@@ -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 ---------------
|
||||||
|
|||||||
2
.github/ISSUE_TEMPLATE/1_bug_framework.yml
vendored
2
.github/ISSUE_TEMPLATE/1_bug_framework.yml
vendored
@@ -30,7 +30,7 @@ body:
|
|||||||
Run this command in your project's root folder and paste the result:
|
Run this command in your project's root folder and paste the result:
|
||||||
|
|
||||||
```sh
|
```sh
|
||||||
npx envinfo --system --binaries --browsers --npmPackages "next,react,next-auth"
|
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:
|
||||||
|
|||||||
3
.github/ISSUE_TEMPLATE/2_bug_provider.yml
vendored
3
.github/ISSUE_TEMPLATE/2_bug_provider.yml
vendored
@@ -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:
|
||||||
|
|||||||
2
.github/ISSUE_TEMPLATE/3_bug_adapter.yml
vendored
2
.github/ISSUE_TEMPLATE/3_bug_adapter.yml
vendored
@@ -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
14
.gitignore
vendored
@@ -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
|
||||||
|
|||||||
@@ -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
|
||||||
|
|
||||||
|
|||||||
@@ -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=
|
||||||
|
|||||||
@@ -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 }),
|
||||||
|
|||||||
@@ -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"
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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",
|
||||||
|
|||||||
@@ -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.
|
||||||
|
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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.
|
|
||||||
@@ -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",
|
||||||
|
},
|
||||||
},
|
},
|
||||||
],
|
],
|
||||||
],
|
],
|
||||||
|
|||||||
@@ -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": [
|
||||||
|
|||||||
@@ -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",
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -273,26 +273,3 @@ 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
5
docs/static/img/providers/notion.svg
vendored
Normal 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 |
@@ -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"
|
||||||
}
|
}
|
||||||
@@ -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"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
11
packages/adapter-firebase/src/getFirebase.ts
Normal file
11
packages/adapter-firebase/src/getFirebase.ts
Normal 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)
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -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) {
|
||||||
|
|||||||
@@ -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:*",
|
||||||
|
|||||||
18
packages/core/scripts/generate-providers.js
Normal file
18
packages/core/scripts/generate-providers.js
Normal 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)
|
||||||
@@ -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")
|
|
||||||
|
|||||||
@@ -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")
|
||||||
|
|||||||
@@ -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 }
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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.
|
||||||
|
|||||||
@@ -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 }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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() }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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() }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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,
|
||||||
|
|||||||
@@ -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
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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).
|
||||||
|
|||||||
@@ -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>(
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|||||||
166
packages/core/src/providers/notion.ts
Normal file
166
packages/core/src/providers/notion.ts
Normal 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,
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -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"
|
|
||||||
@@ -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
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -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[]
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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")
|
||||||
|
|||||||
@@ -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" />
|
||||||
|
|||||||
@@ -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
1714
pnpm-lock.yaml
generated
File diff suppressed because it is too large
Load Diff
@@ -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
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user