Compare commits

...

25 Commits

Author SHA1 Message Date
GitHub Actions
3245c02eac chore(release): bump package version(s) [skip ci] 2023-06-27 15:22:02 +00:00
Doron Sharon
a8dfc8ebb1 feat(providers): Add Descope provider (#7874)
* Add Descope provider

* Add Descope provider

* Remove dark logo, remove wellKnown, and fix user profile syntax

* Change to DESCOPE_SECRET

* Fix env comment

* Fix clientId extracting

* Change to client id
2023-06-26 18:18:58 +02:00
Esteve
1b80a18dd4 fix(adapters): Add .js file extension to relative imports (#7856)
Add .js file extension to relative imports
2023-06-24 10:21:50 +02:00
GitHub Actions
50a88bb878 chore(release): bump package version(s) [skip ci] 2023-06-22 12:50:36 +00:00
Balázs Orbán
a359a562ce fix: correctly assert protocol 2023-06-22 14:27:44 +02:00
GitHub Actions
7edb9cf53f chore(release): bump package version(s) [skip ci] 2023-06-21 07:57:50 +00:00
Balázs Orbán
018b086c4f chore: fix tests 2023-06-21 09:42:46 +02:00
Balázs Orbán
173000a068 fix: add .js extension
fixes #7826
2023-06-21 09:14:03 +02:00
Balázs Orbán
8fcd46b0fc fix(ts): loosen Profile type 2023-06-20 17:15:22 +02:00
GitHub Actions
d5d1313914 chore(release): bump package version(s) [skip ci] 2023-06-14 13:07:32 +00:00
Balázs Orbán
3285d04241 fix(build): use correct tsconfig 2023-06-14 14:51:50 +02:00
Balázs Orbán
fe442522ef fix(client): remove unused declaration 2023-06-14 14:48:22 +02:00
GitHub Actions
6c9dfff45f chore(release): bump package version(s) [skip ci] 2023-06-14 12:47:31 +00:00
Balázs Orbán
ef50916ec2 fix(ts): correct user type reference 2023-06-14 14:37:34 +02:00
GitHub Actions
8e771a2993 chore(release): bump package version(s) [skip ci] 2023-06-14 12:22:38 +00:00
Balázs Orbán
06a7149b66 feat: introduce @auth/supabase-adapter (#7807)
Database adapters are not dependent on Next.js features, so it makes sense to republish them under the `@auth/*` scope.

This PR is part of a series to convert adapters, using `@auth/core` for types.

If you are coming from the previous adapter, change your `package.json`:

```diff
-  "@next-auth/supabase-adapter": "0.0.0",
+  "@auth/supabase-adapter": "0.0.0",
```

And run `npm install`, `yarn install` or `pnpm install` respectively.

**Note:** This packages is published as ESM-only
2023-06-14 13:09:29 +01:00
Balázs Orbán
662e0942cb feat: introduce @auth/xata-adapter (#7808)
Database adapters are not dependent on Next.js features, so it makes sense to republish them under the `@auth/*` scope.

This PR is part of a series to convert adapters, using `@auth/core` for types.

If you are coming from the previous adapter, change your `package.json`:

```diff
-  "@next-auth/xata-adapter": "0.0.0",
+  "@auth/xata-adapter": "0.0.0",
```

And run `npm install`, `yarn install` or `pnpm install` respectively.

**Note:** This packages is published as ESM-only
2023-06-14 13:09:14 +01:00
Balázs Orbán
91c71a175b chore: fix version 2023-06-14 14:08:13 +02:00
Balázs Orbán
3b8c75297b fix: use correct import 2023-06-14 13:50:30 +02:00
Balázs Orbán
5d06fa5852 feat: introduce @auth/sequelize-adapter (#7806)
Database adapters are not dependent on Next.js features, so it makes sense to republish them under the `@auth/*` scope.

This PR is part of a series to convert adapters, using `@auth/core` for types.

BREAKING CHANGE:
If you are coming from the previous adapter, change your `package.json`:

```diff
-  "@next-auth/sequelize-adapter": "0.0.0",
+  "@auth/sequelize-adapter": "0.0.0",
```

And run `npm install`, `yarn install` or `pnpm install` respectively.

**Note:** This packages is published as ESM-only
2023-06-14 12:38:15 +01:00
Balázs Orbán
e7a52077c5 feat: introduce @auth/pouchdb-adapter (#7805)
Database adapters are not dependent on Next.js features, so it makes sense to republish them under the `@auth/*` scope.

This PR is part of a series to convert adapters, using `@auth/core` for types.

BREAKING CHANGE:
If you are coming from the previous adapter, change your `package.json`:

```diff
-  "@next-auth/pouchdb-adapter": "0.0.0",
+  "@auth/pouchdb-adapter": "0.0.0",
```

And run `npm install`, `yarn install` or `pnpm install` respectively.

**Note:** This packages is published as ESM-only

This package assumes that `globalThis.crypto` is available.

In older Node.js versions, you can polyfill by adding:

`globalThis.crypto ??= require("node:crypto").webcrypto`
2023-06-14 12:28:39 +01:00
Balázs Orbán
6e4516a9f8 feat: introduce @auth/neo4j-adapter (#7804)
Database adapters are not dependent on Next.js features, so it makes sense to republish them under the `@auth/*` scope.

This PR is part of a series to convert adapters, using `@auth/core` for types.

BREAKING CHANGE:
If you are coming from the previous adapter, change your `package.json`:

```diff
-  "@next-auth/neo4j-adapter": "0.0.0",
+  "@auth/neo4j-adapter": "0.0.0",
```

And run `npm install`, `yarn install` or `pnpm install` respectively.

**Note:** This packages is published as ESM-only

This package assumes that `globalThis.crypto` is available.

In older Node.js versions, you can polyfill by adding:

`globalThis.crypto ??= require("node:crypto").webcrypto`
2023-06-14 12:26:38 +01:00
Balázs Orbán
8a0b11fcd6 chore: reset version 2023-06-14 12:03:07 +01:00
Balázs Orbán
f925e0c2a5 feat: introduce @auth/firebase-adapter (#7803)
Database adapters are not dependent on Next.js features, so it makes sense to republish them under the `@auth/*` scope.

This PR is part of a series to convert adapters, using `@auth/core` for types.

BREAKING CHANGE:
If you are coming from the previous adapter, change your `package.json`:

```diff
-  "@next-auth/firebase-adapter": "0.0.0",
+  "@auth/firebase-adapter": "0.0.0",
```

And run `npm install`, `yarn install` or `pnpm install` respectively.

**Note:** This packages is published as ESM-only
2023-06-14 12:02:24 +01:00
Balázs Orbán
de4e20cc04 feat: introduce @auth/fauna-adapter (#7802)
* feat: introduce `@auth/fauna-adapter`

Database adapters are not dependent on Next.js features, so it makes sense to republish them under the `@auth/*` scope.

This PR is part of a series to convert adapters, using `@auth/core` for types.

BREAKING CHANGE:
If you are coming from the previous adapter, change your `package.json`:

```diff
-  "@next-auth/fauna-adapter": "0.0.0",
+  "@auth/fauna-adapter": "0.0.0",
```

And run `npm install`, `yarn install` or `pnpm install` respectively.

**Note:** This packages is published as ESM-only
2023-06-14 12:00:40 +01:00
64 changed files with 1851 additions and 588 deletions

View File

@@ -37,6 +37,7 @@ body:
- "Bungie" - "Bungie"
- "Cognito" - "Cognito"
- "Coinbase" - "Coinbase"
- "Descope"
- "Discord" - "Discord"
- "Dropbox" - "Dropbox"
- "EVE Online" - "EVE Online"

View File

@@ -23,18 +23,18 @@ body:
- "Custom adapter" - "Custom adapter"
- "@auth/dgraph-adapter" - "@auth/dgraph-adapter"
- "@auth/dynamodb-adapter" - "@auth/dynamodb-adapter"
- "@next-auth/fauna-adapter" - "@auth/fauna-adapter"
- "@next-auth/firebase-adapter" - "@auth/firebase-adapter"
- "@auth/mikro-orm-adapter" - "@auth/mikro-orm-adapter"
- "@auth/mongodb-adapter" - "@auth/mongodb-adapter"
- "@next-auth/neo4j-adapter" - "@auth/neo4j-adapter"
- "@next-auth/pouchdb-adapter" - "@auth/pouchdb-adapter"
- "@auth/prisma-adapter" - "@auth/prisma-adapter"
- "@next-auth/sequelize-adapter" - "@auth/sequelize-adapter"
- "@next-auth/supabase-adapter" - "@auth/supabase-adapter"
- "@auth/typeorm-adapter" - "@auth/typeorm-adapter"
- "@auth/upstash-redis-adapter" - "@auth/upstash-redis-adapter"
- "@next-auth/xata-adapter" - "@auth/xata-adapter"
validations: validations:
required: true required: true
- type: textarea - type: textarea

View File

@@ -7,10 +7,10 @@ dynamodb:
- "@auth/dynamodb-adapter" - "@auth/dynamodb-adapter"
fauna: fauna:
- "@next-auth/fauna-adapter" - "@auth/fauna-adapter"
firebase: firebase:
- "@next-auth/firebase-adapter" - "@auth/firebase-adapter"
mikro-orm: mikro-orm:
- "@auth/mikro-orm-adapter" - "@auth/mikro-orm-adapter"
@@ -19,19 +19,19 @@ mongodb:
- "@auth/mongodb-adapter" - "@auth/mongodb-adapter"
neo4j: neo4j:
- "@next-auth/neo4j-adapter" - "@auth/neo4j-adapter"
pouchdb: pouchdb:
- "@next-auth/pouchdb-adapter" - "@auth/pouchdb-adapter"
prisma: prisma:
- "@auth/prisma-adapter" - "@auth/prisma-adapter"
sequelize: sequelize:
- "@next-auth/sequelize-adapter" - "@auth/sequelize-adapter"
supabase: supabase:
- "@next-auth/supabase-adapter" - "@auth/supabase-adapter"
typeorm: typeorm:
- "@auth/typeorm-adapter" - "@auth/typeorm-adapter"
@@ -40,4 +40,4 @@ upstash-redis:
- "@auth/upstash-redis-adapter" - "@auth/upstash-redis-adapter"
xata: xata:
- "@next-auth/xata-adapter" - "@auth/xata-adapter"

View File

@@ -13,6 +13,9 @@ AUTH0_ID=
AUTH0_SECRET= AUTH0_SECRET=
AUTH0_ISSUER= AUTH0_ISSUER=
DESCOPE_ID=
DESCOPE_SECRET=
KEYCLOAK_ID= KEYCLOAK_ID=
KEYCLOAK_SECRET= KEYCLOAK_SECRET=
KEYCLOAK_ISSUER= KEYCLOAK_ISSUER=

View File

@@ -14,9 +14,9 @@
}, },
"license": "ISC", "license": "ISC",
"dependencies": { "dependencies": {
"@next-auth/fauna-adapter": "workspace:*", "@auth/fauna-adapter": "workspace:*",
"@auth/prisma-adapter": "workspace:*", "@auth/prisma-adapter": "workspace:*",
"@next-auth/supabase-adapter": "workspace:*", "@auth/supabase-adapter": "workspace:*",
"@auth/typeorm-adapter": "workspace:*", "@auth/typeorm-adapter": "workspace:*",
"@prisma/client": "^3", "@prisma/client": "^3",
"@supabase/supabase-js": "^2.0.5", "@supabase/supabase-js": "^2.0.5",

View File

@@ -44,7 +44,7 @@ import WorkOS from "next-auth/providers/workos"
// // Fauna // // Fauna
// import { Client as FaunaClient } from "faunadb" // import { Client as FaunaClient } from "faunadb"
// import { FaunaAdapter } from "@next-auth/fauna-adapter" // import { FaunaAdapter } from "@auth/fauna-adapter"
// const opts = { secret: process.env.FAUNA_SECRET, domain: process.env.FAUNA_DOMAIN } // const opts = { secret: process.env.FAUNA_SECRET, domain: process.env.FAUNA_DOMAIN }
// const client = globalThis.fauna || new FaunaClient(opts) // const client = globalThis.fauna || new FaunaClient(opts)
// if (process.env.NODE_ENV !== "production") globalThis.fauna = client // if (process.env.NODE_ENV !== "production") globalThis.fauna = client
@@ -60,7 +60,7 @@ import WorkOS from "next-auth/providers/workos"
// }) // })
// // Supabase // // Supabase
// import { SupabaseAdapter } from "@next-auth/supabase-adapter" // import { SupabaseAdapter } from "@auth/supabase-adapter"
// const adapter = SupabaseAdapter({ // const adapter = SupabaseAdapter({
// url: process.env.NEXT_PUBLIC_SUPABASE_URL, // url: process.env.NEXT_PUBLIC_SUPABASE_URL,
// secret: process.env.SUPABASE_SERVICE_ROLE_KEY, // secret: process.env.SUPABASE_SERVICE_ROLE_KEY,
@@ -78,45 +78,130 @@ export const authOptions: NextAuthOptions = {
credentials: { password: { label: "Password", type: "password" } }, credentials: { password: { label: "Password", type: "password" } },
async authorize(credentials) { async authorize(credentials) {
if (credentials.password !== "pw") return null if (credentials.password !== "pw") return null
return { name: "Fill Murray", email: "bill@fillmurray.com", image: "https://www.fillmurray.com/64/64", id: "1", foo: "" } return {
name: "Fill Murray",
email: "bill@fillmurray.com",
image: "https://www.fillmurray.com/64/64",
id: "1",
foo: "",
}
}, },
}), }),
Apple({ clientId: process.env.APPLE_ID, clientSecret: process.env.APPLE_SECRET }), Apple({
Auth0({ clientId: process.env.AUTH0_ID, clientSecret: process.env.AUTH0_SECRET, issuer: process.env.AUTH0_ISSUER }), clientId: process.env.APPLE_ID,
clientSecret: process.env.APPLE_SECRET,
}),
Auth0({
clientId: process.env.AUTH0_ID,
clientSecret: process.env.AUTH0_SECRET,
issuer: process.env.AUTH0_ISSUER,
}),
AzureAD({ AzureAD({
clientId: process.env.AZURE_AD_CLIENT_ID, clientId: process.env.AZURE_AD_CLIENT_ID,
clientSecret: process.env.AZURE_AD_CLIENT_SECRET, clientSecret: process.env.AZURE_AD_CLIENT_SECRET,
tenantId: process.env.AZURE_AD_TENANT_ID, tenantId: process.env.AZURE_AD_TENANT_ID,
}), }),
AzureB2C({ clientId: process.env.AZURE_B2C_ID, clientSecret: process.env.AZURE_B2C_SECRET, issuer: process.env.AZURE_B2C_ISSUER }), AzureB2C({
BoxyHQSAML({ issuer: "https://jackson-demo.boxyhq.com", clientId: "tenant=boxyhq.com&product=saml-demo.boxyhq.com", clientSecret: "dummy" }), clientId: process.env.AZURE_B2C_ID,
clientSecret: process.env.AZURE_B2C_SECRET,
issuer: process.env.AZURE_B2C_ISSUER,
}),
BoxyHQSAML({
issuer: "https://jackson-demo.boxyhq.com",
clientId: "tenant=boxyhq.com&product=saml-demo.boxyhq.com",
clientSecret: "dummy",
}),
// Cognito({ clientId: process.env.COGNITO_ID, clientSecret: process.env.COGNITO_SECRET, issuer: process.env.COGNITO_ISSUER }), // Cognito({ clientId: process.env.COGNITO_ID, clientSecret: process.env.COGNITO_SECRET, issuer: process.env.COGNITO_ISSUER }),
Discord({ clientId: process.env.DISCORD_ID, clientSecret: process.env.DISCORD_SECRET }), Discord({
DuendeIDS6({ clientId: "interactive.confidential", clientSecret: "secret", issuer: "https://demo.duendesoftware.com" }), clientId: process.env.DISCORD_ID,
Facebook({ clientId: process.env.FACEBOOK_ID, clientSecret: process.env.FACEBOOK_SECRET }), clientSecret: process.env.DISCORD_SECRET,
Foursquare({ clientId: process.env.FOURSQUARE_ID, clientSecret: process.env.FOURSQUARE_SECRET }), }),
Freshbooks({ clientId: process.env.FRESHBOOKS_ID, clientSecret: process.env.FRESHBOOKS_SECRET }), DuendeIDS6({
GitHub({ clientId: process.env.GITHUB_ID, clientSecret: process.env.GITHUB_SECRET }), clientId: "interactive.confidential",
Gitlab({ clientId: process.env.GITLAB_ID, clientSecret: process.env.GITLAB_SECRET }), clientSecret: "secret",
Google({ clientId: process.env.GOOGLE_ID, clientSecret: process.env.GOOGLE_SECRET }), issuer: "https://demo.duendesoftware.com",
}),
Facebook({
clientId: process.env.FACEBOOK_ID,
clientSecret: process.env.FACEBOOK_SECRET,
}),
Foursquare({
clientId: process.env.FOURSQUARE_ID,
clientSecret: process.env.FOURSQUARE_SECRET,
}),
Freshbooks({
clientId: process.env.FRESHBOOKS_ID,
clientSecret: process.env.FRESHBOOKS_SECRET,
}),
GitHub({
clientId: process.env.GITHUB_ID,
clientSecret: process.env.GITHUB_SECRET,
}),
Gitlab({
clientId: process.env.GITLAB_ID,
clientSecret: process.env.GITLAB_SECRET,
}),
Google({
clientId: process.env.GOOGLE_ID,
clientSecret: process.env.GOOGLE_SECRET,
}),
// IDS4({ clientId: process.env.IDS4_ID, clientSecret: process.env.IDS4_SECRET, issuer: process.env.IDS4_ISSUER }), // IDS4({ clientId: process.env.IDS4_ID, clientSecret: process.env.IDS4_SECRET, issuer: process.env.IDS4_ISSUER }),
Instagram({ clientId: process.env.INSTAGRAM_ID, clientSecret: process.env.INSTAGRAM_SECRET }), Instagram({
clientId: process.env.INSTAGRAM_ID,
clientSecret: process.env.INSTAGRAM_SECRET,
}),
// Keycloak({ clientId: process.env.KEYCLOAK_ID, clientSecret: process.env.KEYCLOAK_SECRET, issuer: process.env.KEYCLOAK_ISSUER }), // Keycloak({ clientId: process.env.KEYCLOAK_ID, clientSecret: process.env.KEYCLOAK_SECRET, issuer: process.env.KEYCLOAK_ISSUER }),
Line({ clientId: process.env.LINE_ID, clientSecret: process.env.LINE_SECRET }), Line({
LinkedIn({ clientId: process.env.LINKEDIN_ID, clientSecret: process.env.LINKEDIN_SECRET }), clientId: process.env.LINE_ID,
Mailchimp({ clientId: process.env.MAILCHIMP_ID, clientSecret: process.env.MAILCHIMP_SECRET }), clientSecret: process.env.LINE_SECRET,
}),
LinkedIn({
clientId: process.env.LINKEDIN_ID,
clientSecret: process.env.LINKEDIN_SECRET,
}),
Mailchimp({
clientId: process.env.MAILCHIMP_ID,
clientSecret: process.env.MAILCHIMP_SECRET,
}),
// 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({
Patreon({ clientId: process.env.PATREON_ID, clientSecret: process.env.PATREON_SECRET }), clientId: process.env.OSU_CLIENT_ID,
Slack({ clientId: process.env.SLACK_ID, clientSecret: process.env.SLACK_SECRET }), clientSecret: process.env.OSU_CLIENT_SECRET,
Spotify({ clientId: process.env.SPOTIFY_ID, clientSecret: process.env.SPOTIFY_SECRET }), }),
Trakt({ clientId: process.env.TRAKT_ID, clientSecret: process.env.TRAKT_SECRET }), Patreon({
Twitch({ clientId: process.env.TWITCH_ID, clientSecret: process.env.TWITCH_SECRET }), clientId: process.env.PATREON_ID,
Twitter({ clientId: process.env.TWITTER_ID, clientSecret: process.env.TWITTER_SECRET }), clientSecret: process.env.PATREON_SECRET,
}),
Slack({
clientId: process.env.SLACK_ID,
clientSecret: process.env.SLACK_SECRET,
}),
Spotify({
clientId: process.env.SPOTIFY_ID,
clientSecret: process.env.SPOTIFY_SECRET,
}),
Trakt({
clientId: process.env.TRAKT_ID,
clientSecret: process.env.TRAKT_SECRET,
}),
Twitch({
clientId: process.env.TWITCH_ID,
clientSecret: process.env.TWITCH_SECRET,
}),
Twitter({
clientId: process.env.TWITTER_ID,
clientSecret: process.env.TWITTER_SECRET,
}),
// TwitterLegacy({ clientId: process.env.TWITTER_LEGACY_ID, clientSecret: process.env.TWITTER_LEGACY_SECRET }), // TwitterLegacy({ clientId: process.env.TWITTER_LEGACY_ID, clientSecret: process.env.TWITTER_LEGACY_SECRET }),
Vk({ clientId: process.env.VK_ID, clientSecret: process.env.VK_SECRET }), Vk({ clientId: process.env.VK_ID, clientSecret: process.env.VK_SECRET }),
Wikimedia({ clientId: process.env.WIKIMEDIA_ID, clientSecret: process.env.WIKIMEDIA_SECRET }), Wikimedia({
WorkOS({ clientId: process.env.WORKOS_ID, clientSecret: process.env.WORKOS_SECRET }), clientId: process.env.WIKIMEDIA_ID,
clientSecret: process.env.WIKIMEDIA_SECRET,
}),
WorkOS({
clientId: process.env.WORKOS_ID,
clientSecret: process.env.WORKOS_SECRET,
}),
], ],
} }

View File

@@ -22,6 +22,9 @@ BEYOND_IDENTITY_CLIENT_ID=
BEYOND_IDENTITY_CLIENT_SECRET= BEYOND_IDENTITY_CLIENT_SECRET=
BEYOND_IDENTITY_ISSUER= BEYOND_IDENTITY_ISSUER=
DESCOPE_ID=
DESCOPE_SECRET=
GITHUB_ID= GITHUB_ID=
GITHUB_SECRET= GITHUB_SECRET=

View File

@@ -15,9 +15,9 @@
"license": "ISC", "license": "ISC",
"dependencies": { "dependencies": {
"@auth/core": "workspace:*", "@auth/core": "workspace:*",
"@next-auth/fauna-adapter": "workspace:*", "@auth/fauna-adapter": "workspace:*",
"@auth/prisma-adapter": "workspace:*", "@auth/prisma-adapter": "workspace:*",
"@next-auth/supabase-adapter": "workspace:*", "@auth/supabase-adapter": "workspace:*",
"@auth/typeorm-adapter": "workspace:*", "@auth/typeorm-adapter": "workspace:*",
"@prisma/client": "^3", "@prisma/client": "^3",
"@supabase/supabase-js": "^2.0.5", "@supabase/supabase-js": "^2.0.5",

View File

@@ -10,6 +10,7 @@ import BeyondIdentity from "@auth/core/providers/beyondidentity"
import BoxyHQSAML from "@auth/core/providers/boxyhq-saml" import BoxyHQSAML from "@auth/core/providers/boxyhq-saml"
// import Cognito from "@auth/core/providers/cognito" // import Cognito from "@auth/core/providers/cognito"
import Credentials from "@auth/core/providers/credentials" import Credentials from "@auth/core/providers/credentials"
import Descope from "@auth/core/providers/descope"
import Discord from "@auth/core/providers/discord" import Discord from "@auth/core/providers/discord"
import DuendeIDS6 from "@auth/core/providers/duende-identity-server6" import DuendeIDS6 from "@auth/core/providers/duende-identity-server6"
// import Email from "@auth/core/providers/email" // import Email from "@auth/core/providers/email"
@@ -48,7 +49,7 @@ import WorkOS from "@auth/core/providers/workos"
// // Fauna // // Fauna
// import { Client as FaunaClient } from "faunadb" // import { Client as FaunaClient } from "faunadb"
// import { FaunaAdapter } from "@next-auth/fauna-adapter" // import { FaunaAdapter } from "@auth/fauna-adapter"
// const opts = { secret: process.env.FAUNA_SECRET, domain: process.env.FAUNA_DOMAIN } // const opts = { secret: process.env.FAUNA_SECRET, domain: process.env.FAUNA_DOMAIN }
// const client = globalThis.fauna || new FaunaClient(opts) // const client = globalThis.fauna || new FaunaClient(opts)
// if (process.env.NODE_ENV !== "production") globalThis.fauna = client // if (process.env.NODE_ENV !== "production") globalThis.fauna = client
@@ -64,7 +65,7 @@ import WorkOS from "@auth/core/providers/workos"
// }) // })
// // Supabase // // Supabase
// import { SupabaseAdapter } from "@next-auth/supabase-adapter" // import { SupabaseAdapter } from "@auth/supabase-adapter"
// const adapter = SupabaseAdapter({ // const adapter = SupabaseAdapter({
// url: process.env.NEXT_PUBLIC_SUPABASE_URL, // url: process.env.NEXT_PUBLIC_SUPABASE_URL,
// secret: process.env.SUPABASE_SERVICE_ROLE_KEY, // secret: process.env.SUPABASE_SERVICE_ROLE_KEY,
@@ -94,9 +95,14 @@ export const authConfig: AuthConfig = {
tenantId: process.env.AZURE_AD_TENANT_ID, tenantId: process.env.AZURE_AD_TENANT_ID,
}), }),
AzureB2C({ clientId: process.env.AZURE_B2C_ID, clientSecret: process.env.AZURE_B2C_SECRET, issuer: process.env.AZURE_B2C_ISSUER }), AzureB2C({ clientId: process.env.AZURE_B2C_ID, clientSecret: process.env.AZURE_B2C_SECRET, issuer: process.env.AZURE_B2C_ISSUER }),
BeyondIdentity({ clientId: process.env.BEYOND_IDENTITY_CLIENT_ID, clientSecret: process.env.BEYOND_IDENTITY_CLIENT_SECRET, issuer: process.env.BEYOND_IDENTITY_ISSUER }), BeyondIdentity({
clientId: process.env.BEYOND_IDENTITY_CLIENT_ID,
clientSecret: process.env.BEYOND_IDENTITY_CLIENT_SECRET,
issuer: process.env.BEYOND_IDENTITY_ISSUER,
}),
BoxyHQSAML({ issuer: "https://jackson-demo.boxyhq.com", clientId: "tenant=boxyhq.com&product=saml-demo.boxyhq.com", clientSecret: "dummy" }), BoxyHQSAML({ issuer: "https://jackson-demo.boxyhq.com", clientId: "tenant=boxyhq.com&product=saml-demo.boxyhq.com", clientSecret: "dummy" }),
// Cognito({ clientId: process.env.COGNITO_ID, clientSecret: process.env.COGNITO_SECRET, issuer: process.env.COGNITO_ISSUER }), // Cognito({ clientId: process.env.COGNITO_ID, clientSecret: process.env.COGNITO_SECRET, issuer: process.env.COGNITO_ISSUER }),
Descope({ clientId: process.env.DESCOPE_ID, clientSecret: process.env.DESCOPE_SECRET }),
Discord({ clientId: process.env.DISCORD_ID, clientSecret: process.env.DISCORD_SECRET }), Discord({ clientId: process.env.DISCORD_ID, clientSecret: process.env.DISCORD_SECRET }),
DuendeIDS6({ clientId: "interactive.confidential", clientSecret: "secret", issuer: "https://demo.duendesoftware.com" }), DuendeIDS6({ clientId: "interactive.confidential", clientSecret: "secret", issuer: "https://demo.duendesoftware.com" }),
Facebook({ clientId: process.env.FACEBOOK_ID, clientSecret: process.env.FACEBOOK_SECRET }), Facebook({ clientId: process.env.FACEBOOK_ID, clientSecret: process.env.FACEBOOK_SECRET }),

View File

@@ -6,6 +6,9 @@ AUTH0_ID=
AUTH0_SECRET= AUTH0_SECRET=
AUTH0_ISSUER= AUTH0_ISSUER=
DESCOPE_ID=
DESCOPE_SECRET=
FACEBOOK_ID= FACEBOOK_ID=
FACEBOOK_SECRET= FACEBOOK_SECRET=

View File

@@ -12,5 +12,7 @@ declare namespace NodeJS {
GOOGLE_SECRET: string GOOGLE_SECRET: string
AUTH0_ID: string AUTH0_ID: string
AUTH0_SECRET: string AUTH0_SECRET: string
DESCOPE_ID: string
DESCOPE_SECRET: string
} }
} }

View File

@@ -7,6 +7,7 @@ const icons = [
"/img/providers/apple.svg", "/img/providers/apple.svg",
"/img/providers/auth0.svg", "/img/providers/auth0.svg",
"/img/providers/cognito.svg", "/img/providers/cognito.svg",
"/img/providers/descope.svg",
"/img/providers/battlenet.svg", "/img/providers/battlenet.svg",
"/img/providers/box.svg", "/img/providers/box.svg",
"/img/providers/facebook.svg", "/img/providers/facebook.svg",

50
docs/static/img/providers/descope.svg vendored Normal file
View File

@@ -0,0 +1,50 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 26.2.1, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
width="194.7px" height="215.2px" viewBox="0 0 194.7 215.2" style="enable-background:new 0 0 194.7 215.2;" xml:space="preserve"
>
<style type="text/css">
.st0{fill:url(#SVGID_1_);}
.st1{fill:url(#SVGID_00000004519561486438896460000001266960168497785022_);}
.st2{fill:url(#SVGID_00000049204468076180615810000015113731544435055266_);}
.st3{fill:url(#SVGID_00000116951257355544416270000003794629356563808950_);}
</style>
<g>
<linearGradient id="SVGID_1_" gradientUnits="userSpaceOnUse" x1="68.3919" y1="222.1531" x2="185.0265" y2="41.0264">
<stop offset="1.481436e-07" style="stop-color:#0083B5"/>
<stop offset="0.4173" style="stop-color:#00FFFF"/>
<stop offset="0.9952" style="stop-color:#6FF12D"/>
</linearGradient>
<path class="st0" d="M129.8,174.7c7.6-1.6,14-4.8,19.2-9.7c7.7-7.3,8.8-17.1,8.8-29.4V80.7c0-12.3-1.1-22.1-8.8-29.4
c-5.2-4.9-11.6-8.1-19.2-9.7V15.4c12.5,1.8,22.9,6.5,31,14.2c10.6,10,19.9,23.5,19.9,40.5v75c0,17-9.3,30.5-19.9,40.5
c-8.1,7.7-18.5,12.4-31,14.2V174.7z"/>
<linearGradient id="SVGID_00000040544740507634666800000017273841385603649669_" gradientUnits="userSpaceOnUse" x1="5.037" y1="181.3564" x2="121.6716" y2="0.2297">
<stop offset="1.481436e-07" style="stop-color:#0083B5"/>
<stop offset="0.4173" style="stop-color:#00FFFF"/>
<stop offset="0.9952" style="stop-color:#6FF12D"/>
</linearGradient>
<path style="fill:url(#SVGID_00000040544740507634666800000017273841385603649669_);" d="M33.9,29.6c8.1-7.7,18.5-12.4,31-14.2
v26.3c-7.6,1.6-14,4.8-19.2,9.7c-7.7,7.3-8.8,17-8.8,29.2v55.1c0,12.3,1.1,22.1,8.8,29.4c5.2,4.9,11.6,8.1,19.2,9.7v25.1
c-12.5-1.8-22.9-6.5-31-14.2c-10.6-10-19.9-23.5-19.9-40.5V69.8C13.9,53,23.2,39.6,33.9,29.6z"/>
<g>
<linearGradient id="SVGID_00000060713993868866928010000000698955780952733088_" gradientUnits="userSpaceOnUse" x1="22.0278" y1="192.2974" x2="138.6624" y2="11.1707">
<stop offset="1.481436e-07" style="stop-color:#0083B5"/>
<stop offset="0.4173" style="stop-color:#00FFFF"/>
<stop offset="0.9952" style="stop-color:#6FF12D"/>
</linearGradient>
<path style="fill:url(#SVGID_00000060713993868866928010000000698955780952733088_);" d="M120.2,87.8l8.5-13.7l-17.8-9.4
l-7.5,14.2c-1.1,2.1-3.1,3.3-5.5,3.3c-2.3,0-4.4-1.2-5.5-3.3L85,64.7L67.3,74l12.3,19.7L120.2,87.8z"/>
<linearGradient id="SVGID_00000115475840050352750520000000840372054167564949_" gradientUnits="userSpaceOnUse" x1="37.9651" y1="202.5601" x2="154.5998" y2="21.4334">
<stop offset="1.481436e-07" style="stop-color:#0083B5"/>
<stop offset="0.4173" style="stop-color:#00FFFF"/>
<stop offset="0.9952" style="stop-color:#6FF12D"/>
</linearGradient>
<path style="fill:url(#SVGID_00000115475840050352750520000000840372054167564949_);" d="M142.4,97.7l-87.8,0.8v17.7l27.5-0.1
l-14.8,23.8l17.7,9.3l7.5-14.2c1.1-2.1,3.1-3.3,5.5-3.3c2.3,0,4.4,1.2,5.5,3.3l7.5,14.2l17.8-9.4l-12-19.3L93.7,116l48.7-0.2V97.7
z"/>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 3.1 KiB

View File

@@ -0,0 +1 @@
//registry.npmjs.org/:_authToken=${NPM_TOKEN}

View File

@@ -8,14 +8,14 @@
</a> </a>
<h3 align="center"><b>Fauna Adapter</b> - NextAuth.js / Auth.js</a></h3> <h3 align="center"><b>Fauna Adapter</b> - NextAuth.js / Auth.js</a></h3>
<p align="center" style="align: center;"> <p align="center" style="align: center;">
<a href="https://npm.im/@next-auth/fauna-adapter"> <a href="https://npm.im/@auth/fauna-adapter">
<img src="https://img.shields.io/badge/TypeScript-blue?style=flat-square" alt="TypeScript" /> <img src="https://img.shields.io/badge/TypeScript-blue?style=flat-square" alt="TypeScript" />
</a> </a>
<a href="https://npm.im/@next-auth/fauna-adapter"> <a href="https://npm.im/@auth/fauna-adapter">
<img alt="npm" src="https://img.shields.io/npm/v/@next-auth/fauna-adapter?color=green&label=@next-auth/fauna-adapter&style=flat-square"> <img alt="npm" src="https://img.shields.io/npm/v/@auth/fauna-adapter?color=green&label=@auth/fauna-adapter&style=flat-square">
</a> </a>
<a href="https://www.npmtrends.com/@next-auth/fauna-adapter"> <a href="https://www.npmtrends.com/@auth/fauna-adapter">
<img src="https://img.shields.io/npm/dm/@next-auth/fauna-adapter?label=%20downloads&style=flat-square" alt="Downloads" /> <img src="https://img.shields.io/npm/dm/@auth/fauna-adapter?label=%20downloads&style=flat-square" alt="Downloads" />
</a> </a>
<a href="https://github.com/nextauthjs/next-auth/stargazers"> <a href="https://github.com/nextauthjs/next-auth/stargazers">
<img src="https://img.shields.io/github/stars/nextauthjs/next-auth?style=flat-square" alt="Github Stars" /> <img src="https://img.shields.io/github/stars/nextauthjs/next-auth?style=flat-square" alt="Github Stars" />

View File

@@ -1,28 +1,30 @@
{ {
"name": "@next-auth/fauna-adapter", "name": "@auth/fauna-adapter",
"version": "1.0.4", "version": "1.0.0",
"description": "Fauna Adapter for NextAuth", "description": "Fauna Adapter for Auth.js",
"homepage": "https://authjs.dev", "homepage": "https://authjs.dev",
"repository": "https://github.com/nextauthjs/next-auth", "repository": "https://github.com/nextauthjs/next-auth",
"bugs": { "bugs": {
"url": "https://github.com/nextauthjs/next-auth/issues" "url": "https://github.com/nextauthjs/next-auth/issues"
}, },
"files": [
"dist",
"README.md"
],
"author": "Bhanu Teja P", "author": "Bhanu Teja P",
"contributors": [ "contributors": [
{ "Nico Domino <yo@ndo.dev>",
"name": "Nico Domino", "Balázs Orbán <info@balazsorban.com>"
"email": "yo@ndo.dev"
},
{
"name": "Balázs Orbán",
"email": "info@balazsorban.com"
}
], ],
"main": "dist/index.js", "type": "module",
"types": "./index.d.ts",
"files": [
"*.js",
"*.d.ts*",
"src"
],
"exports": {
".": {
"types": "./index.d.ts",
"import": "./index.js"
}
},
"license": "ISC", "license": "ISC",
"keywords": [ "keywords": [
"next-auth", "next-auth",
@@ -41,19 +43,20 @@
"migrate": "fauna-schema-migrate generate", "migrate": "fauna-schema-migrate generate",
"test": "./tests/test.sh" "test": "./tests/test.sh"
}, },
"dependencies": {
"@auth/core": "workspace:*"
},
"peerDependencies": { "peerDependencies": {
"faunadb": "^4.3.0", "faunadb": "^4.3.0"
"next-auth": "^4"
}, },
"devDependencies": { "devDependencies": {
"@fauna-labs/fauna-schema-migrate": "^2.1.3", "@fauna-labs/fauna-schema-migrate": "^2.1.3",
"@next-auth/adapter-test": "workspace:*", "@next-auth/adapter-test": "workspace:*",
"@next-auth/tsconfig": "workspace:*", "@next-auth/tsconfig": "workspace:*",
"faunadb": "^4.3.0", "faunadb": "^4.3.0",
"jest": "^27.4.3", "jest": "^27.4.3"
"next-auth": "workspace:*"
}, },
"jest": { "jest": {
"preset": "@next-auth/adapter-test/jest" "preset": "@next-auth/adapter-test/jest"
} }
} }

View File

@@ -10,10 +10,10 @@
* ## Installation * ## Installation
* *
* ```bash npm2yarn2pnpm * ```bash npm2yarn2pnpm
* npm install next-auth @next-auth/fauna-adapter faunadb * npm install @auth/fauna-adapter faunadb
* ``` * ```
* *
* @module @next-auth/fauna-adapter * @module @auth/fauna-adapter
*/ */
import { import {
Client as FaunaClient, Client as FaunaClient,
@@ -44,7 +44,7 @@ import {
AdapterSession, AdapterSession,
AdapterUser, AdapterUser,
VerificationToken, VerificationToken,
} from "next-auth/adapters" } from "@auth/core/adapters"
export const collections = { export const collections = {
Users: Collection("users"), Users: Collection("users"),
@@ -137,7 +137,7 @@ export function query(f: FaunaClient, format: (...args: any) => any) {
* ```javascript title="pages/api/auth/[...nextauth].js" * ```javascript title="pages/api/auth/[...nextauth].js"
* import NextAuth from "next-auth" * import NextAuth from "next-auth"
* import { Client as FaunaClient } from "faunadb" * import { Client as FaunaClient } from "faunadb"
* import { FaunaAdapter } from "@next-auth/fauna-adapter" * import { FaunaAdapter } from "@auth/fauna-adapter"
* *
* const client = new FaunaClient({ * const client = new FaunaClient({
* secret: "secret", * secret: "secret",

View File

@@ -1,8 +1,25 @@
{ {
"extends": "@next-auth/tsconfig/tsconfig.adapters.json", "extends": "@next-auth/tsconfig/tsconfig.base.json",
"compilerOptions": { "compilerOptions": {
"allowJs": true,
"baseUrl": ".",
"isolatedModules": true,
"target": "ES2020",
"module": "ESNext",
"moduleResolution": "node",
"outDir": ".",
"rootDir": "src", "rootDir": "src",
"outDir": "dist" "skipDefaultLibCheck": true,
"strictNullChecks": true,
"stripInternal": true,
"declarationMap": true,
"declaration": true
}, },
"exclude": ["tests", "dist", "jest.config.js"] "include": [
} "src/**/*"
],
"exclude": [
"*.js",
"*.d.ts",
]
}

View File

@@ -0,0 +1 @@
//registry.npmjs.org/:_authToken=${NPM_TOKEN}

View File

@@ -8,14 +8,14 @@
</a> </a>
<h3 align="center"><b>Firebase Adapter</b> - NextAuth.js / Auth.js</a></h3> <h3 align="center"><b>Firebase Adapter</b> - NextAuth.js / Auth.js</a></h3>
<p align="center" style="align: center;"> <p align="center" style="align: center;">
<a href="https://npm.im/@next-auth/firebase-adapter"> <a href="https://npm.im/@auth/firebase-adapter">
<img src="https://img.shields.io/badge/TypeScript-blue?style=flat-square" alt="TypeScript" /> <img src="https://img.shields.io/badge/TypeScript-blue?style=flat-square" alt="TypeScript" />
</a> </a>
<a href="https://npm.im/@next-auth/firebase-adapter"> <a href="https://npm.im/@auth/firebase-adapter">
<img alt="npm" src="https://img.shields.io/npm/v/@next-auth/firebase-adapter?color=green&label=@next-auth/firebase-adapter&style=flat-square"> <img alt="npm" src="https://img.shields.io/npm/v/@auth/firebase-adapter?color=green&label=@auth/firebase-adapter&style=flat-square">
</a> </a>
<a href="https://www.npmtrends.com/@next-auth/firebase-adapter"> <a href="https://www.npmtrends.com/@auth/firebase-adapter">
<img src="https://img.shields.io/npm/dm/@next-auth/firebase-adapter?label=%20downloads&style=flat-square" alt="Downloads" /> <img src="https://img.shields.io/npm/dm/@auth/firebase-adapter?label=%20downloads&style=flat-square" alt="Downloads" />
</a> </a>
<a href="https://github.com/nextauthjs/next-auth/stargazers"> <a href="https://github.com/nextauthjs/next-auth/stargazers">
<img src="https://img.shields.io/github/stars/nextauthjs/next-auth?style=flat-square" alt="Github Stars" /> <img src="https://img.shields.io/github/stars/nextauthjs/next-auth?style=flat-square" alt="Github Stars" />

View File

@@ -1,7 +1,7 @@
{ {
"name": "@next-auth/firebase-adapter", "name": "@auth/firebase-adapter",
"version": "2.0.1", "version": "1.0.0",
"description": "Firebase adapter for next-auth.", "description": "Firebase adapter for Auth.js",
"homepage": "https://authjs.dev", "homepage": "https://authjs.dev",
"repository": "https://github.com/nextauthjs/next-auth", "repository": "https://github.com/nextauthjs/next-auth",
"bugs": { "bugs": {
@@ -13,17 +13,18 @@
"Alex Meuer <github@alexmeuer.com>" "Alex Meuer <github@alexmeuer.com>"
], ],
"type": "module", "type": "module",
"types": "./index.d.ts",
"files": [
"*.js",
"*.d.ts*",
"src"
],
"exports": { "exports": {
".": { ".": {
"types": "./index.d.ts", "types": "./index.d.ts",
"import": "./index.js" "import": "./index.js"
} }
}, },
"files": [
"src",
"*.js",
"*.d.ts*"
],
"license": "ISC", "license": "ISC",
"keywords": [ "keywords": [
"next-auth", "next-auth",
@@ -40,16 +41,17 @@
"build": "tsc", "build": "tsc",
"test": "firebase emulators:exec --only firestore --project next-auth-test 'jest -c tests/jest.config.js'" "test": "firebase emulators:exec --only firestore --project next-auth-test 'jest -c tests/jest.config.js'"
}, },
"dependencies": {
"@auth/core": "workspace:*"
},
"peerDependencies": { "peerDependencies": {
"firebase-admin": "^11.4.1", "firebase-admin": "^11.4.1"
"next-auth": "^4"
}, },
"devDependencies": { "devDependencies": {
"@next-auth/adapter-test": "workspace:*", "@next-auth/adapter-test": "workspace:*",
"@next-auth/tsconfig": "workspace:*", "@next-auth/tsconfig": "workspace:*",
"firebase-admin": "^11.4.1", "firebase-admin": "^11.4.1",
"firebase-tools": "^11.16.1", "firebase-tools": "^11.16.1",
"jest": "^29.3.1", "jest": "^29.3.1"
"next-auth": "workspace:*"
} }
} }

View File

@@ -12,10 +12,10 @@
* ## Installation * ## Installation
* *
* ```bash npm2yarn2pnpm * ```bash npm2yarn2pnpm
* npm install next-auth @next-auth/firebase-adapter firebase-admin * npm install @auth/firebase-adapter firebase-admin
* ``` * ```
* *
* @module @next-auth/firebase-adapter * @module @auth/firebase-adapter
*/ */
import { type AppOptions, getApps, initializeApp } from "firebase-admin/app" import { type AppOptions, getApps, initializeApp } from "firebase-admin/app"
@@ -33,7 +33,7 @@ import type {
AdapterAccount, AdapterAccount,
AdapterSession, AdapterSession,
VerificationToken, VerificationToken,
} from "next-auth/adapters" } from "@auth/core/adapters"
/** Configure the Firebase Adapter. */ /** Configure the Firebase Adapter. */
export interface FirebaseAdapterConfig extends AppOptions { export interface FirebaseAdapterConfig extends AppOptions {
@@ -52,7 +52,7 @@ export interface FirebaseAdapterConfig extends AppOptions {
* @example * @example
* ```ts title="pages/api/auth/[...nextauth].ts" * ```ts title="pages/api/auth/[...nextauth].ts"
* import NextAuth from "next-auth" * import NextAuth from "next-auth"
* import { FirestoreAdapter } from "@next-auth/firebase-adapter" * import { FirestoreAdapter } from "@auth/firebase-adapter"
* *
* export default NextAuth({ * export default NextAuth({
* adapter: FirestoreAdapter({ namingStrategy: "snake_case" }) * adapter: FirestoreAdapter({ namingStrategy: "snake_case" })
@@ -78,7 +78,7 @@ export interface FirebaseAdapterConfig extends AppOptions {
* @example * @example
* ```ts title="pages/api/auth/[...nextauth].ts" * ```ts title="pages/api/auth/[...nextauth].ts"
* import NextAuth from "next-auth" * import NextAuth from "next-auth"
* import { FirestoreAdapter } from "@next-auth/firebase-adapter" * import { FirestoreAdapter } from "@auth/firebase-adapter"
* *
* export default NextAuth({ * export default NextAuth({
* adapter: FirestoreAdapter(), * adapter: FirestoreAdapter(),
@@ -95,7 +95,7 @@ export interface FirebaseAdapterConfig extends AppOptions {
* @example * @example
* ```ts title="pages/api/auth/[...nextauth].ts" * ```ts title="pages/api/auth/[...nextauth].ts"
* import NextAuth from "next-auth" * import NextAuth from "next-auth"
* import { FirestoreAdapter } from "@next-auth/firebase-adapter" * import { FirestoreAdapter } from "@auth/firebase-adapter"
* import { cert } from "firebase-admin/app" * import { cert } from "firebase-admin/app"
* *
* export default NextAuth({ * export default NextAuth({
@@ -125,7 +125,7 @@ export interface FirebaseAdapterConfig extends AppOptions {
* @example * @example
* ```ts title="pages/api/auth/[...nextauth].ts" * ```ts title="pages/api/auth/[...nextauth].ts"
* import NextAuth from "next-auth" * import NextAuth from "next-auth"
* import { FirestoreAdapter } from "@next-auth/firebase-adapter" * import { FirestoreAdapter } from "@auth/firebase-adapter"
* import { firestore } from "lib/firestore" * import { firestore } from "lib/firestore"
* *
* export default NextAuth({ * export default NextAuth({
@@ -428,7 +428,7 @@ export function collectionsFactory(
* *
* @example * @example
* ```ts title="lib/firestore.ts" * ```ts title="lib/firestore.ts"
* import { initFirestore } from "@next-auth/firebase-adapter" * import { initFirestore } from "@auth/firebase-adapter"
* import { cert } from "firebase-admin/app" * import { cert } from "firebase-admin/app"
* *
* export const firestore = initFirestore({ * export const firestore = initFirestore({

View File

@@ -1,8 +1,9 @@
{ {
"extends": "@next-auth/tsconfig/tsconfig.adapters.json", "extends": "@next-auth/tsconfig/tsconfig.base.json",
"compilerOptions": { "compilerOptions": {
"strict": true, "allowJs": true,
"noUncheckedIndexedAccess": true, "baseUrl": ".",
"isolatedModules": true,
"target": "ES2020", "target": "ES2020",
"module": "ESNext", "module": "ESNext",
"moduleResolution": "node", "moduleResolution": "node",
@@ -18,6 +19,7 @@
"src/**/*" "src/**/*"
], ],
"exclude": [ "exclude": [
"tests" "*.js",
"*.d.ts",
] ]
} }

View File

@@ -8,14 +8,14 @@
</a> </a>
<h3 align="center"><b>Neo4j Adapter</b> - NextAuth.js / Auth.js</a></h3> <h3 align="center"><b>Neo4j Adapter</b> - NextAuth.js / Auth.js</a></h3>
<p align="center" style="align: center;"> <p align="center" style="align: center;">
<a href="https://npm.im/@next-auth/neo4j-adapter"> <a href="https://npm.im/@auth/neo4j-adapter">
<img src="https://img.shields.io/badge/TypeScript-blue?style=flat-square" alt="TypeScript" /> <img src="https://img.shields.io/badge/TypeScript-blue?style=flat-square" alt="TypeScript" />
</a> </a>
<a href="https://npm.im/@next-auth/neo4j-adapter"> <a href="https://npm.im/@auth/neo4j-adapter">
<img alt="npm" src="https://img.shields.io/npm/v/@next-auth/neo4j-adapter?color=green&label=@next-auth/neo4j-adapter&style=flat-square"> <img alt="npm" src="https://img.shields.io/npm/v/@auth/neo4j-adapter?color=green&label=@auth/neo4j-adapter&style=flat-square">
</a> </a>
<a href="https://www.npmtrends.com/@next-auth/neo4j-adapter"> <a href="https://www.npmtrends.com/@auth/neo4j-adapter">
<img src="https://img.shields.io/npm/dm/@next-auth/neo4j-adapter?label=%20downloads&style=flat-square" alt="Downloads" /> <img src="https://img.shields.io/npm/dm/@auth/neo4j-adapter?label=%20downloads&style=flat-square" alt="Downloads" />
</a> </a>
<a href="https://github.com/nextauthjs/next-auth/stargazers"> <a href="https://github.com/nextauthjs/next-auth/stargazers">
<img src="https://img.shields.io/github/stars/nextauthjs/next-auth?style=flat-square" alt="Github Stars" /> <img src="https://img.shields.io/github/stars/nextauthjs/next-auth?style=flat-square" alt="Github Stars" />

View File

@@ -1,7 +1,7 @@
{ {
"name": "@next-auth/neo4j-adapter", "name": "@auth/neo4j-adapter",
"version": "1.0.6", "version": "1.0.0",
"description": "neo4j adapter for next-auth.", "description": "neo4j adapter for Auth.js",
"homepage": "https://authjs.dev", "homepage": "https://authjs.dev",
"repository": "https://github.com/nextauthjs/next-auth", "repository": "https://github.com/nextauthjs/next-auth",
"bugs": { "bugs": {
@@ -11,7 +11,19 @@
"contributors": [ "contributors": [
"Balázs Orbán <info@balazsorban.com>" "Balázs Orbán <info@balazsorban.com>"
], ],
"main": "dist/index.js", "type": "module",
"types": "./index.d.ts",
"files": [
"*.js",
"*.d.ts*",
"src"
],
"exports": {
".": {
"types": "./index.d.ts",
"import": "./index.js"
}
},
"license": "ISC", "license": "ISC",
"keywords": [ "keywords": [
"next-auth", "next-auth",
@@ -28,24 +40,18 @@
"test": "./tests/test.sh", "test": "./tests/test.sh",
"build": "tsc" "build": "tsc"
}, },
"files": [
"README.md",
"dist"
],
"peerDependencies": { "peerDependencies": {
"neo4j-driver": "^4.0.0 || ^5.7.0", "neo4j-driver": "^4.0.0 || ^5.7.0"
"next-auth": "^4"
}, },
"devDependencies": { "devDependencies": {
"@next-auth/adapter-test": "workspace:*", "@next-auth/adapter-test": "workspace:*",
"@next-auth/tsconfig": "workspace:*", "@next-auth/tsconfig": "workspace:*",
"@types/uuid": "^8.3.3", "@types/uuid": "^8.3.3",
"jest": "^27.4.3", "jest": "^27.4.3",
"neo4j-driver": "^5.7.0", "neo4j-driver": "^5.7.0"
"next-auth": "workspace:*"
}, },
"dependencies": { "dependencies": {
"uuid": "^8.3.2" "@auth/core": "workspace:*"
}, },
"jest": { "jest": {
"preset": "@next-auth/adapter-test/jest" "preset": "@next-auth/adapter-test/jest"

View File

@@ -9,17 +9,13 @@
* ## Installation * ## Installation
* *
* ```bash npm2yarn2pnpm * ```bash npm2yarn2pnpm
* npm install next-auth @next-auth/neo4j-adapter neo4j-driver * npm install @auth/neo4j-adapter neo4j-driver
* ``` * ```
* *
* @module @next-auth/neo4j-adapter * @module @auth/neo4j-adapter
*/ */
import type { Session } from "neo4j-driver" import { type Session, isInt, integer } from "neo4j-driver"
import type { Adapter } from "next-auth/adapters" import type { Adapter } from "@auth/core/adapters"
import { v4 as uuid } from "uuid"
import { client, format } from "./utils"
export { format }
/** This is the interface of the Neo4j adapter options. The Neo4j adapter takes a {@link https://neo4j.com/docs/bolt/current/driver-api/#driver-session Neo4j session} as its only argument. */ /** This is the interface of the Neo4j adapter options. The Neo4j adapter takes a {@link https://neo4j.com/docs/bolt/current/driver-api/#driver-session Neo4j session} as its only argument. */
export interface Neo4jOptions extends Session {} export interface Neo4jOptions extends Session {}
@@ -31,7 +27,7 @@ export interface Neo4jOptions extends Session {}
* *
* ```javascript title="pages/api/auth/[...nextauth].js" * ```javascript title="pages/api/auth/[...nextauth].js"
* import neo4j from "neo4j-driver" * import neo4j from "neo4j-driver"
* import { Neo4jAdapter } from "@next-auth/neo4j-adapter" * import { Neo4jAdapter } from "@auth/neo4j-adapter"
* *
* const driver = neo4j.driver( * const driver = neo4j.driver(
* "bolt://localhost", * "bolt://localhost",
@@ -134,7 +130,7 @@ export function Neo4jAdapter(session: Session): Adapter {
return { return {
async createUser(data) { async createUser(data) {
const user: any = { id: uuid(), ...data } const user = { id: crypto.randomUUID(), ...data }
await write(`CREATE (u:User $data)`, user) await write(`CREATE (u:User $data)`, user)
return user return user
}, },
@@ -288,3 +284,69 @@ export function Neo4jAdapter(session: Session): Adapter {
}, },
} }
} }
// https://github.com/honeinc/is-iso-date/blob/master/index.js
const isoDateRE =
/(\d{4}-[01]\d-[0-3]\dT[0-2]\d:[0-5]\d:[0-5]\d\.\d+([+-][0-2]\d:[0-5]\d|Z))|(\d{4}-[01]\d-[0-3]\dT[0-2]\d:[0-5]\d:[0-5]\d([+-][0-2]\d:[0-5]\d|Z))|(\d{4}-[01]\d-[0-3]\dT[0-2]\d:[0-5]\d([+-][0-2]\d:[0-5]\d|Z))/
function isDate(value: any) {
return value && isoDateRE.test(value) && !isNaN(Date.parse(value))
}
export const format = {
/** Takes a plain old JavaScript object and turns it into a Neo4j compatible object */
to(object: Record<string, any>) {
const newObject: Record<string, unknown> = {}
for (const key in object) {
const value = object[key]
if (value instanceof Date) newObject[key] = value.toISOString()
else newObject[key] = value
}
return newObject
},
/** Takes a Neo4j object and returns a plain old JavaScript object */
from<T = Record<string, unknown>>(object?: Record<string, any>): T | null {
const newObject: Record<string, unknown> = {}
if (!object) return null
for (const key in object) {
const value = object[key]
if (isDate(value)) {
newObject[key] = new Date(value)
} else if (isInt(value)) {
if (integer.inSafeRange(value)) newObject[key] = value.toNumber()
else newObject[key] = value.toString()
} else {
newObject[key] = value
}
}
return newObject as T
},
}
function client(session: Session) {
return {
/** Reads values from the database */
async read<T>(statement: string, values?: any): Promise<T | null> {
const result = await session.readTransaction((tx) =>
tx.run(statement, values)
)
return format.from<T>(result?.records[0]?.get(0)) ?? null
},
/**
* Reads/writes values from/to the database.
* Properties are available under `$data`
*/
async write<T extends Record<string, any>>(
statement: string,
values: T
): Promise<any> {
const result = await session.writeTransaction((tx) =>
tx.run(statement, { data: format.to(values) })
)
return format.from<T>(result?.records[0]?.toObject())
},
}
}

View File

@@ -1,68 +0,0 @@
import type { Session } from "neo4j-driver"
import { isInt, integer } from "neo4j-driver"
// https://github.com/honeinc/is-iso-date/blob/master/index.js
const isoDateRE =
/(\d{4}-[01]\d-[0-3]\dT[0-2]\d:[0-5]\d:[0-5]\d\.\d+([+-][0-2]\d:[0-5]\d|Z))|(\d{4}-[01]\d-[0-3]\dT[0-2]\d:[0-5]\d:[0-5]\d([+-][0-2]\d:[0-5]\d|Z))|(\d{4}-[01]\d-[0-3]\dT[0-2]\d:[0-5]\d([+-][0-2]\d:[0-5]\d|Z))/
function isDate(value: any) {
return value && isoDateRE.test(value) && !isNaN(Date.parse(value))
}
export const format = {
/** Takes a plain old JavaScript object and turns it into a Neo4j compatible object */
to(object: Record<string, any>) {
const newObject: Record<string, unknown> = {}
for (const key in object) {
const value = object[key]
if (value instanceof Date) newObject[key] = value.toISOString()
else newObject[key] = value
}
return newObject
},
/** Takes a Neo4j object and returns a plain old JavaScript object */
from<T = Record<string, unknown>>(object?: Record<string, any>): T | null {
const newObject: Record<string, unknown> = {}
if (!object) return null
for (const key in object) {
const value = object[key]
if (isDate(value)) {
newObject[key] = new Date(value)
} else if (isInt(value)) {
if (integer.inSafeRange(value)) newObject[key] = value.toNumber()
else newObject[key] = value.toString()
} else {
newObject[key] = value
}
}
return newObject as T
},
}
export function client(session: Session) {
return {
/** Reads values from the database */
async read<T>(statement: string, values?: any): Promise<T | null> {
const result = await session.readTransaction((tx) =>
tx.run(statement, values)
)
return format.from<T>(result?.records[0]?.get(0)) ?? null
},
/**
* Reads/writes values from/to the database.
* Properties are available under `$data`
*/
async write<T extends Record<string, any>>(
statement: string,
values: T
): Promise<any> {
const result = await session.writeTransaction((tx) =>
tx.run(statement, { data: format.to(values) })
)
return format.from<T>(result?.records[0]?.toObject())
},
}
}

View File

@@ -4,6 +4,8 @@ import statements from "./resources/statements"
import { Neo4jAdapter, format } from "../src" import { Neo4jAdapter, format } from "../src"
globalThis.crypto ??= require("node:crypto").webcrypto
const driver = neo4j.driver( const driver = neo4j.driver(
"bolt://localhost", "bolt://localhost",
neo4j.auth.basic("neo4j", "password") neo4j.auth.basic("neo4j", "password")

View File

@@ -1,8 +1,25 @@
{ {
"extends": "@next-auth/tsconfig/tsconfig.adapters.json", "extends": "@next-auth/tsconfig/tsconfig.base.json",
"compilerOptions": { "compilerOptions": {
"allowJs": true,
"baseUrl": ".",
"isolatedModules": true,
"target": "ES2020",
"module": "ESNext",
"moduleResolution": "node",
"outDir": ".",
"rootDir": "src", "rootDir": "src",
"outDir": "dist" "skipDefaultLibCheck": true,
"strictNullChecks": true,
"stripInternal": true,
"declarationMap": true,
"declaration": true
}, },
"exclude": ["tests", "dist", "jest.config.js"] "include": [
} "src/**/*"
],
"exclude": [
"*.js",
"*.d.ts",
]
}

View File

@@ -8,14 +8,14 @@
</a> </a>
<h3 align="center"><b>PouchDB Adapter</b> - NextAuth.js / Auth.js</a></h3> <h3 align="center"><b>PouchDB Adapter</b> - NextAuth.js / Auth.js</a></h3>
<p align="center" style="align: center;"> <p align="center" style="align: center;">
<a href="https://npm.im/@next-auth/pouchdb-adapter"> <a href="https://npm.im/@auth/pouchdb-adapter">
<img src="https://img.shields.io/badge/TypeScript-blue?style=flat-square" alt="TypeScript" /> <img src="https://img.shields.io/badge/TypeScript-blue?style=flat-square" alt="TypeScript" />
</a> </a>
<a href="https://npm.im/@next-auth/pouchdb-adapter"> <a href="https://npm.im/@auth/pouchdb-adapter">
<img alt="npm" src="https://img.shields.io/npm/v/@next-auth/pouchdb-adapter?color=green&label=@next-auth/pouchdb-adapter&style=flat-square"> <img alt="npm" src="https://img.shields.io/npm/v/@auth/pouchdb-adapter?color=green&label=@auth/pouchdb-adapter&style=flat-square">
</a> </a>
<a href="https://www.npmtrends.com/@next-auth/pouchdb-adapter"> <a href="https://www.npmtrends.com/@auth/pouchdb-adapter">
<img src="https://img.shields.io/npm/dm/@next-auth/pouchdb-adapter?label=%20downloads&style=flat-square" alt="Downloads" /> <img src="https://img.shields.io/npm/dm/@auth/pouchdb-adapter?label=%20downloads&style=flat-square" alt="Downloads" />
</a> </a>
<a href="https://github.com/nextauthjs/next-auth/stargazers"> <a href="https://github.com/nextauthjs/next-auth/stargazers">
<img src="https://img.shields.io/github/stars/nextauthjs/next-auth?style=flat-square" alt="Github Stars" /> <img src="https://img.shields.io/github/stars/nextauthjs/next-auth?style=flat-square" alt="Github Stars" />

View File

@@ -1,5 +1,5 @@
{ {
"name": "@next-auth/pouchdb-adapter", "name": "@auth/pouchdb-adapter",
"version": "1.0.0", "version": "1.0.0",
"description": "PouchDB adapter for next-auth.", "description": "PouchDB adapter for next-auth.",
"homepage": "https://authjs.dev", "homepage": "https://authjs.dev",
@@ -38,19 +38,17 @@
"src" "src"
], ],
"peerDependencies": { "peerDependencies": {
"next-auth": "^4",
"pouchdb": "^8.0.1", "pouchdb": "^8.0.1",
"pouchdb-find": "^8.0.1" "pouchdb-find": "^8.0.1"
}, },
"dependencies": { "dependencies": {
"ulid": "2.3.0" "@auth/core": "workspace:*"
}, },
"devDependencies": { "devDependencies": {
"@next-auth/adapter-test": "workspace:*", "@next-auth/adapter-test": "workspace:*",
"@next-auth/tsconfig": "workspace:*", "@next-auth/tsconfig": "workspace:*",
"@types/pouchdb": "^6.4.0", "@types/pouchdb": "^6.4.0",
"jest": "^27.4.3", "jest": "^27.4.3",
"next-auth": "workspace:*",
"pouchdb": "^8.0.1", "pouchdb": "^8.0.1",
"pouchdb-adapter-memory": "^8.0.1", "pouchdb-adapter-memory": "^8.0.1",
"pouchdb-find": "^8.0.1" "pouchdb-find": "^8.0.1"

View File

@@ -9,10 +9,10 @@
* ## Installation * ## Installation
* *
* ```bash npm2yarn2pnpm * ```bash npm2yarn2pnpm
* npm install next-auth pouchdb pouchdb-find @next-auth/pouchdb-adapter * npm install pouchdb pouchdb-find @auth/pouchdb-adapter
* ``` * ```
* *
* @module @next-auth/pouchdb-adapter * @module @auth/pouchdb-adapter
*/ */
import type { import type {
@@ -21,8 +21,7 @@ import type {
AdapterSession, AdapterSession,
AdapterUser, AdapterUser,
VerificationToken, VerificationToken,
} from "next-auth/adapters" } from "@auth/core/adapters"
import { ulid } from "ulid"
type PrefixConfig = Record< type PrefixConfig = Record<
"user" | "account" | "session" | "verificationToken", "user" | "account" | "session" | "verificationToken",
@@ -99,7 +98,7 @@ export interface PouchDBAdapterOptions {
* ```javascript title="pages/api/auth/[...nextauth].js" * ```javascript title="pages/api/auth/[...nextauth].js"
* import NextAuth from "next-auth" * import NextAuth from "next-auth"
* import GoogleProvider from "next-auth/providers/google" * import GoogleProvider from "next-auth/providers/google"
* import { PouchDBAdapter } from "@next-auth/pouchdb-adapter" * import { PouchDBAdapter } from "@auth/pouchdb-adapter"
* import PouchDB from "pouchdb" * import PouchDB from "pouchdb"
* *
* // Setup your PouchDB instance and database * // Setup your PouchDB instance and database
@@ -154,7 +153,7 @@ export function PouchDBAdapter(options: PouchDBAdapterOptions): Adapter {
return { return {
async createUser(user) { async createUser(user) {
const doc = { ...user, _id: [userPrefix, ulid()].join("_") } const doc = { ...user, _id: [userPrefix, crypto.randomUUID()].join("_") }
await pouchdb.put(doc) await pouchdb.put(doc)
return { ...user, id: doc._id } return { ...user, id: doc._id }
}, },
@@ -220,7 +219,10 @@ export function PouchDBAdapter(options: PouchDBAdapterOptions): Adapter {
async deleteUser(id) {}, async deleteUser(id) {},
async linkAccount(account) { async linkAccount(account) {
const doc = { ...account, _id: [accountPrefix, ulid()].join("_") } const doc = {
...account,
_id: [accountPrefix, crypto.randomUUID()].join("_"),
}
await (pouchdb as unknown as PouchDB.Database<AdapterAccount>).put(doc) await (pouchdb as unknown as PouchDB.Database<AdapterAccount>).put(doc)
return { ...account, id: doc._id } return { ...account, id: doc._id }
@@ -245,7 +247,7 @@ export function PouchDBAdapter(options: PouchDBAdapterOptions): Adapter {
async createSession(data) { async createSession(data) {
const doc = { const doc = {
_id: [sessionPrefix, ulid()].join("_"), _id: [sessionPrefix, crypto.randomUUID()].join("_"),
...data, ...data,
} }
await (pouchdb as unknown as PouchDB.Database<AdapterSession>).put(doc) await (pouchdb as unknown as PouchDB.Database<AdapterSession>).put(doc)
@@ -317,7 +319,7 @@ export function PouchDBAdapter(options: PouchDBAdapterOptions): Adapter {
async createVerificationToken(data) { async createVerificationToken(data) {
await (pouchdb as unknown as PouchDB.Database<VerificationToken>).put({ await (pouchdb as unknown as PouchDB.Database<VerificationToken>).put({
_id: [verificationTokenPrefix, ulid()].join("_"), _id: [verificationTokenPrefix, crypto.randomUUID()].join("_"),
...data, ...data,
}) })

View File

@@ -10,13 +10,14 @@ import {
import PouchDB from "pouchdb" import PouchDB from "pouchdb"
import find from "pouchdb-find" import find from "pouchdb-find"
import memoryAdapter from "pouchdb-adapter-memory" import memoryAdapter from "pouchdb-adapter-memory"
import { ulid } from "ulid"
import { import {
AdapterAccount, AdapterAccount,
AdapterSession, AdapterSession,
AdapterUser, AdapterUser,
VerificationToken, VerificationToken,
} from "next-auth/adapters" } from "@auth/core/adapters"
globalThis.crypto ??= require("node:crypto").webcrypto
// pouchdb setup // pouchdb setup
PouchDB.plugin(memoryAdapter).plugin(find) PouchDB.plugin(memoryAdapter).plugin(find)
@@ -31,7 +32,7 @@ PouchDB.on("destroyed", function () {
const disconnect = async () => { const disconnect = async () => {
if (!pouchdbIsDestroyed) await pouchdb.destroy() if (!pouchdbIsDestroyed) await pouchdb.destroy()
} }
pouchdb = new PouchDB(ulid(), { adapter: "memory" }) pouchdb = new PouchDB(crypto.randomUUID(), { adapter: "memory" })
// Basic tests // Basic tests
runBasicTests({ runBasicTests({

View File

@@ -1,17 +1,25 @@
{ {
"extends": "@next-auth/tsconfig/tsconfig.adapters.json", "extends": "@next-auth/tsconfig/tsconfig.base.json",
"compilerOptions": { "compilerOptions": {
"rootDir": "src", "allowJs": true,
"allowSyntheticDefaultImports": true, "baseUrl": ".",
"outDir": ".", "isolatedModules": true,
"target": "ES2020", "target": "ES2020",
"module": "ESNext", "module": "ESNext",
"moduleResolution": "node", "moduleResolution": "node",
"outDir": ".",
"rootDir": "src",
"skipDefaultLibCheck": true, "skipDefaultLibCheck": true,
"strictNullChecks": true, "strictNullChecks": true,
"stripInternal": true, "stripInternal": true,
"declarationMap": true, "declarationMap": true,
"declaration": true "declaration": true
}, },
"exclude": ["tests", "jest.config.js"] "include": [
} "src/**/*"
],
"exclude": [
"*.js",
"*.d.ts",
]
}

View File

@@ -8,14 +8,14 @@
</a> </a>
<h3 align="center"><b>Sequelize Adapter</b> - NextAuth.js / Auth.js</a></h3> <h3 align="center"><b>Sequelize Adapter</b> - NextAuth.js / Auth.js</a></h3>
<p align="center" style="align: center;"> <p align="center" style="align: center;">
<a href="https://npm.im/@next-auth/sequelize-adapter"> <a href="https://npm.im/@auth/sequelize-adapter">
<img src="https://img.shields.io/badge/TypeScript-blue?style=flat-square" alt="TypeScript" /> <img src="https://img.shields.io/badge/TypeScript-blue?style=flat-square" alt="TypeScript" />
</a> </a>
<a href="https://npm.im/@next-auth/sequelize-adapter"> <a href="https://npm.im/@auth/sequelize-adapter">
<img alt="npm" src="https://img.shields.io/npm/v/@next-auth/sequelize-adapter?color=green&label=@next-auth/sequelize-adapter&style=flat-square"> <img alt="npm" src="https://img.shields.io/npm/v/@auth/sequelize-adapter?color=green&label=@auth/sequelize-adapter&style=flat-square">
</a> </a>
<a href="https://www.npmtrends.com/@next-auth/sequelize-adapter"> <a href="https://www.npmtrends.com/@auth/sequelize-adapter">
<img src="https://img.shields.io/npm/dm/@next-auth/sequelize-adapter?label=%20downloads&style=flat-square" alt="Downloads" /> <img src="https://img.shields.io/npm/dm/@auth/sequelize-adapter?label=%20downloads&style=flat-square" alt="Downloads" />
</a> </a>
<a href="https://github.com/nextauthjs/next-auth/stargazers"> <a href="https://github.com/nextauthjs/next-auth/stargazers">
<img src="https://img.shields.io/github/stars/nextauthjs/next-auth?style=flat-square" alt="Github Stars" /> <img src="https://img.shields.io/github/stars/nextauthjs/next-auth?style=flat-square" alt="Github Stars" />

View File

@@ -1,14 +1,26 @@
{ {
"name": "@next-auth/sequelize-adapter", "name": "@auth/sequelize-adapter",
"version": "1.0.8", "version": "1.0.1",
"description": "Sequelize adapter for next-auth.", "description": "Sequelize adapter for Auth.js",
"homepage": "https://authjs.dev", "homepage": "https://authjs.dev",
"repository": "https://github.com/nextauthjs/next-auth", "repository": "https://github.com/nextauthjs/next-auth",
"bugs": { "bugs": {
"url": "https://github.com/nextauthjs/next-auth/issues" "url": "https://github.com/nextauthjs/next-auth/issues"
}, },
"author": "github.com/luke-j", "author": "github.com/luke-j",
"main": "dist/index.js", "type": "module",
"types": "./index.d.ts",
"files": [
"*.js",
"*.d.ts*",
"src"
],
"exports": {
".": {
"types": "./index.d.ts",
"import": "./index.js"
}
},
"license": "ISC", "license": "ISC",
"keywords": [ "keywords": [
"next-auth", "next-auth",
@@ -21,22 +33,19 @@
"access": "public" "access": "public"
}, },
"scripts": { "scripts": {
"test:wip": "jest", "test": "jest",
"build": "tsc" "build": "tsc"
}, },
"files": [ "dependencies": {
"README.md", "@auth/core": "workspace:*"
"dist" },
],
"peerDependencies": { "peerDependencies": {
"next-auth": "^4",
"sequelize": "^6.6.5" "sequelize": "^6.6.5"
}, },
"devDependencies": { "devDependencies": {
"@next-auth/adapter-test": "workspace:*", "@next-auth/adapter-test": "workspace:*",
"@next-auth/tsconfig": "workspace:*", "@next-auth/tsconfig": "workspace:*",
"jest": "^27.4.3", "jest": "^27.4.3",
"next-auth": "workspace:*",
"sequelize": "^6.6.5" "sequelize": "^6.6.5"
}, },
"jest": { "jest": {

View File

@@ -9,10 +9,10 @@
* ## Installation * ## Installation
* *
* ```bash npm2yarn2pnpm * ```bash npm2yarn2pnpm
* npm install next-auth @next-auth/sequelize-adapter sequelize * npm install next-auth @auth/sequelize-adapter sequelize
* ``` * ```
* *
* @module @next-auth/sequelize-adapter * @module @auth/sequelize-adapter
*/ */
import type { import type {
Adapter, Adapter,
@@ -20,13 +20,14 @@ import type {
AdapterAccount, AdapterAccount,
AdapterSession, AdapterSession,
VerificationToken, VerificationToken,
} from "next-auth/adapters" } from "@auth/core/adapters"
import { Sequelize, Model, ModelCtor } from "sequelize" import { Sequelize, Model, ModelCtor } from "sequelize"
import * as defaultModels from "./models" import * as defaultModels from "./models.js"
export { defaultModels as models } export { defaultModels as models }
// @see https://sequelize.org/master/manual/typescript.html // @see https://sequelize.org/master/manual/typescript.html
//@ts-expect-error
interface AccountInstance interface AccountInstance
extends Model<AdapterAccount, Partial<AdapterAccount>>, extends Model<AdapterAccount, Partial<AdapterAccount>>,
AdapterAccount {} AdapterAccount {}
@@ -70,7 +71,7 @@ export interface SequelizeAdapterOptions {
* *
* ```javascript title="pages/api/auth/[...nextauth].js" * ```javascript title="pages/api/auth/[...nextauth].js"
* import NextAuth from "next-auth" * import NextAuth from "next-auth"
* import SequelizeAdapter from "@next-auth/sequelize-adapter" * import SequelizeAdapter from "@auth/sequelize-adapter"
* import { Sequelize } from "sequelize" * import { Sequelize } from "sequelize"
* *
* // https://sequelize.org/master/manual/getting-started.html#connecting-to-a-database * // https://sequelize.org/master/manual/getting-started.html#connecting-to-a-database
@@ -93,7 +94,7 @@ export interface SequelizeAdapterOptions {
* *
* ```js * ```js
* import NextAuth from "next-auth" * import NextAuth from "next-auth"
* import SequelizeAdapter from "@next-auth/sequelize-adapter" * import SequelizeAdapter from "@auth/sequelize-adapter"
* import Sequelize from 'sequelize' * import Sequelize from 'sequelize'
* *
* const sequelize = new Sequelize("sqlite::memory:") * const sequelize = new Sequelize("sqlite::memory:")
@@ -117,7 +118,7 @@ export interface SequelizeAdapterOptions {
* *
* ```js * ```js
* import NextAuth from "next-auth" * import NextAuth from "next-auth"
* import SequelizeAdapter, { models } from "@next-auth/sequelize-adapter" * import SequelizeAdapter, { models } from "@auth/sequelize-adapter"
* import Sequelize, { DataTypes } from "sequelize" * import Sequelize, { DataTypes } from "sequelize"
* *
* const sequelize = new Sequelize("sqlite::memory:") * const sequelize = new Sequelize("sqlite::memory:")
@@ -218,6 +219,7 @@ export default function SequelizeAdapter(
await sync() await sync()
const accountInstance = await Account.findOne({ const accountInstance = await Account.findOne({
// @ts-expect-error
where: { provider, providerAccountId }, where: { provider, providerAccountId },
}) })

View File

@@ -1,8 +1,25 @@
{ {
"extends": "@next-auth/tsconfig/tsconfig.adapters.json", "extends": "@next-auth/tsconfig/tsconfig.base.json",
"compilerOptions": { "compilerOptions": {
"allowJs": true,
"baseUrl": ".",
"isolatedModules": true,
"target": "ES2020",
"module": "ESNext",
"moduleResolution": "node",
"outDir": ".",
"rootDir": "src", "rootDir": "src",
"outDir": "dist" "skipDefaultLibCheck": true,
"strictNullChecks": true,
"stripInternal": true,
"declarationMap": true,
"declaration": true
}, },
"exclude": ["tests", "dist", "jest.config.js"] "include": [
} "src/**/*"
],
"exclude": [
"*.js",
"*.d.ts",
]
}

View File

@@ -0,0 +1 @@
//registry.npmjs.org/:_authToken=${NPM_TOKEN}

View File

@@ -8,14 +8,14 @@
</a> </a>
<h3 align="center"><b>Supabase Adapter</b> - NextAuth.js / Auth.js</a></h3> <h3 align="center"><b>Supabase Adapter</b> - NextAuth.js / Auth.js</a></h3>
<p align="center" style="align: center;"> <p align="center" style="align: center;">
<a href="https://npm.im/@next-auth/supabase-adapter"> <a href="https://npm.im/@auth/supabase-adapter">
<img src="https://img.shields.io/badge/TypeScript-blue?style=flat-square" alt="TypeScript" /> <img src="https://img.shields.io/badge/TypeScript-blue?style=flat-square" alt="TypeScript" />
</a> </a>
<a href="https://npm.im/@next-auth/supabase-adapter"> <a href="https://npm.im/@auth/supabase-adapter">
<img alt="npm" src="https://img.shields.io/npm/v/@next-auth/supabase-adapter?color=green&label=@next-auth/supabase-adapter&style=flat-square"> <img alt="npm" src="https://img.shields.io/npm/v/@auth/supabase-adapter?color=green&label=@auth/supabase-adapter&style=flat-square">
</a> </a>
<a href="https://www.npmtrends.com/@next-auth/supabase-adapter"> <a href="https://www.npmtrends.com/@auth/supabase-adapter">
<img src="https://img.shields.io/npm/dm/@next-auth/supabase-adapter?label=%20downloads&style=flat-square" alt="Downloads" /> <img src="https://img.shields.io/npm/dm/@auth/supabase-adapter?label=%20downloads&style=flat-square" alt="Downloads" />
</a> </a>
<a href="https://github.com/nextauthjs/next-auth/stargazers"> <a href="https://github.com/nextauthjs/next-auth/stargazers">
<img src="https://img.shields.io/github/stars/nextauthjs/next-auth?style=flat-square" alt="Github Stars" /> <img src="https://img.shields.io/github/stars/nextauthjs/next-auth?style=flat-square" alt="Github Stars" />

View File

@@ -1,14 +1,26 @@
{ {
"name": "@next-auth/supabase-adapter", "name": "@auth/supabase-adapter",
"version": "0.2.1", "version": "0.1.2",
"description": "Supabase adapter for next-auth.", "description": "Supabase adapter for Auth.js",
"homepage": "https://authjs.dev", "homepage": "https://authjs.dev",
"repository": "https://github.com/nextauthjs/next-auth", "repository": "https://github.com/nextauthjs/next-auth",
"bugs": { "bugs": {
"url": "https://github.com/nextauthjs/next-auth/issues" "url": "https://github.com/nextauthjs/next-auth/issues"
}, },
"author": "Martin Sonnberger <martin.sonnberger@icloud.com>", "author": "Martin Sonnberger <martin.sonnberger@icloud.com>",
"main": "dist/index.js", "type": "module",
"types": "./index.d.ts",
"files": [
"*.js",
"*.d.ts*",
"src"
],
"exports": {
".": {
"types": "./index.d.ts",
"import": "./index.js"
}
},
"keywords": [ "keywords": [
"next-auth", "next-auth",
"next.js", "next.js",
@@ -23,18 +35,19 @@
"build": "tsc", "build": "tsc",
"test": "./tests/test.sh" "test": "./tests/test.sh"
}, },
"dependencies": {
"@auth/core": "workspace:*"
},
"peerDependencies": { "peerDependencies": {
"@supabase/supabase-js": "^2.0.5", "@supabase/supabase-js": "^2.0.5"
"next-auth": "^4.18.7"
}, },
"devDependencies": { "devDependencies": {
"@next-auth/adapter-test": "workspace:^0.0.0", "@next-auth/adapter-test": "workspace:^0.0.0",
"@next-auth/tsconfig": "workspace:^0.0.0", "@next-auth/tsconfig": "workspace:^0.0.0",
"@supabase/supabase-js": "^2.0.5", "@supabase/supabase-js": "^2.0.5",
"jest": "^27.4.3", "jest": "^27.4.3"
"next-auth": "workspace:*"
}, },
"jest": { "jest": {
"preset": "@next-auth/adapter-test/jest" "preset": "@next-auth/adapter-test/jest"
} }
} }

View File

@@ -1,139 +0,0 @@
export type Json =
| string
| number
| boolean
| null
| { [key: string]: Json }
| Json[]
export interface Database {
next_auth: {
Tables: {
accounts: {
Row: {
id: string
type: string | null
provider: string | null
providerAccountId: string | null
refresh_token: string | null
access_token: string | null
expires_at: number | null
token_type: string | null
scope: string | null
id_token: string | null
session_state: string | null
oauth_token_secret: string | null
oauth_token: string | null
userId: string | null
}
Insert: {
id?: string
type?: string | null
provider?: string | null
providerAccountId?: string | null
refresh_token?: string | null
access_token?: string | null
expires_at?: number | null
token_type?: string | null
scope?: string | null
id_token?: string | null
session_state?: string | null
oauth_token_secret?: string | null
oauth_token?: string | null
userId?: string | null
}
Update: {
id?: string
type?: string | null
provider?: string | null
providerAccountId?: string | null
refresh_token?: string | null
access_token?: string | null
expires_at?: number | null
token_type?: string | null
scope?: string | null
id_token?: string | null
session_state?: string | null
oauth_token_secret?: string | null
oauth_token?: string | null
userId?: string | null
}
}
sessions: {
Row: {
expires: string | null
sessionToken: string | null
userId: string | null
id: string
}
Insert: {
expires?: string | null
sessionToken?: string | null
userId?: string | null
id?: string
}
Update: {
expires?: string | null
sessionToken?: string | null
userId?: string | null
id?: string
}
}
users: {
Row: {
name: string | null
email: string | null
emailVerified: string | null
image: string | null
id: string
}
Insert: {
name?: string | null
email?: string | null
emailVerified?: string | null
image?: string | null
id?: string
}
Update: {
name?: string | null
email?: string | null
emailVerified?: string | null
image?: string | null
id?: string
}
}
verification_tokens: {
Row: {
id: number
identifier: string | null
token: string | null
expires: string | null
}
Insert: {
id?: number
identifier?: string | null
token?: string | null
expires?: string | null
}
Update: {
id?: number
identifier?: string | null
token?: string | null
expires?: string | null
}
}
}
Views: {
[_ in never]: never
}
Functions: {
uid: {
Args: Record<PropertyKey, never>
Returns: string
}
}
Enums: {
[_ in never]: never
}
}
}

View File

@@ -9,19 +9,18 @@
* ## Installation * ## Installation
* *
* ```bash npm2yarn2pnpm * ```bash npm2yarn2pnpm
* npm install @supabase/supabase-js next-auth @next-auth/supabase-adapter * npm install @supabase/supabase-js @auth/supabase-adapter
* ``` * ```
* *
* @module @next-auth/supabase-adapter * @module @auth/supabase-adapter
*/ */
import { createClient } from "@supabase/supabase-js" import { createClient } from "@supabase/supabase-js"
import { Database } from "./database.types"
import { import {
Adapter, Adapter,
AdapterSession, AdapterSession,
AdapterUser, AdapterUser,
VerificationToken, VerificationToken,
} from "next-auth/adapters" } from "@auth/core/adapters"
function isDate(date: any) { function isDate(date: any) {
return ( return (
@@ -61,7 +60,7 @@ export interface SupabaseAdapterOptions {
* :::note * :::note
* This adapter is developed by the community and not officially maintained or supported by Supabase. It uses the Supabase Database to store user and session data in a separate `next_auth` schema. It is a standalone Auth server that does not interface with Supabase Auth and therefore provides a different feature set. * This adapter is developed by the community and not officially maintained or supported by Supabase. It uses the Supabase Database to store user and session data in a separate `next_auth` schema. It is a standalone Auth server that does not interface with Supabase Auth and therefore provides a different feature set.
* *
* If youre looking for an officially maintained Auth server with additional features like [built-in email server](https://supabase.com/docs/guides/auth/auth-email#configure-email-settings?utm_source=authjs-docs&medium=referral&campaign=authjs), [phone auth](https://supabase.com/docs/guides/auth/auth-twilio?utm_source=authjs-docs&medium=referral&campaign=authjs), and [Multi Factor Authentication (MFA / 2FA)](https://supabase.com/contact/mfa?utm_source=authjs-docs&medium=referral&campaign=authjs), please use [Supabase Auth](https://supabase.com/auth) with the [Auth Helpers for Next.js](https://supabase.com/docs/guides/auth/auth-helpers/nextjs?utm_source=authjs-docs&medium=referral&campaign=authjs). * If you're looking for an officially maintained Auth server with additional features like [built-in email server](https://supabase.com/docs/guides/auth/auth-email#configure-email-settings?utm_source=authjs-docs&medium=referral&campaign=authjs), [phone auth](https://supabase.com/docs/guides/auth/auth-twilio?utm_source=authjs-docs&medium=referral&campaign=authjs), and [Multi Factor Authentication (MFA / 2FA)](https://supabase.com/contact/mfa?utm_source=authjs-docs&medium=referral&campaign=authjs), please use [Supabase Auth](https://supabase.com/auth) with the [Auth Helpers for Next.js](https://supabase.com/docs/guides/auth/auth-helpers/nextjs?utm_source=authjs-docs&medium=referral&campaign=authjs).
* ::: * :::
* *
* ## Setup * ## Setup
@@ -72,7 +71,7 @@ export interface SupabaseAdapterOptions {
* *
* ```js title="pages/api/auth/[...nextauth].js" * ```js title="pages/api/auth/[...nextauth].js"
* import NextAuth from "next-auth" * import NextAuth from "next-auth"
* import { SupabaseAdapter } from "@next-auth/supabase-adapter" * import { SupabaseAdapter } from "@auth/supabase-adapter"
* *
* // For more information on each option (and a full list of options) go to * // For more information on each option (and a full list of options) go to
* // https://authjs.dev/reference/configuration/auth-config * // https://authjs.dev/reference/configuration/auth-config
@@ -224,7 +223,7 @@ export interface SupabaseAdapterOptions {
* *
* ```js title="pages/api/auth/[...nextauth].js" * ```js title="pages/api/auth/[...nextauth].js"
* import NextAuth from "next-auth" * import NextAuth from "next-auth"
* import { SupabaseAdapter } from "@next-auth/supabase-adapter" * import { SupabaseAdapter } from "@auth/supabase-adapter"
* import jwt from "jsonwebtoken" * import jwt from "jsonwebtoken"
* *
* // For more information on each option (and a full list of options) go to * // For more information on each option (and a full list of options) go to
@@ -350,9 +349,7 @@ export function SupabaseAdapter(options: SupabaseAdapterOptions): Adapter {
const { url, secret } = options const { url, secret } = options
const supabase = createClient<Database, "next_auth">(url, secret, { const supabase = createClient<Database, "next_auth">(url, secret, {
db: { schema: "next_auth" }, db: { schema: "next_auth" },
global: { global: { headers: { "X-Client-Info": "@auth/supabase-adapter" } },
headers: { "X-Client-Info": "@next-auth/supabase-adapter@0.1.0" },
},
}) })
return { return {
async createUser(user) { async createUser(user) {
@@ -463,7 +460,7 @@ export function SupabaseAdapter(options: SupabaseAdapterOptions): Adapter {
return { return {
user: format<AdapterUser>( user: format<AdapterUser>(
user as Database["next_auth"]["Tables"]["users"]["Row"] user as Database["next_auth"]["Tables"]["users"]["Row"][]
), ),
session: format<AdapterSession>(session), session: format<AdapterSession>(session),
} }
@@ -524,3 +521,135 @@ export function SupabaseAdapter(options: SupabaseAdapterOptions): Adapter {
}, },
} }
} }
interface Database {
next_auth: {
Tables: {
accounts: {
Row: {
id: string
type: string | null
provider: string | null
providerAccountId: string | null
refresh_token: string | null
access_token: string | null
expires_at: number | null
token_type: string | null
scope: string | null
id_token: string | null
session_state: string | null
oauth_token_secret: string | null
oauth_token: string | null
userId: string | null
}
Insert: {
id?: string
type?: string | null
provider?: string | null
providerAccountId?: string | null
refresh_token?: string | null
access_token?: string | null
expires_at?: number | null
token_type?: string | null
scope?: string | null
id_token?: string | null
session_state?: string | null
oauth_token_secret?: string | null
oauth_token?: string | null
userId?: string | null
}
Update: {
id?: string
type?: string | null
provider?: string | null
providerAccountId?: string | null
refresh_token?: string | null
access_token?: string | null
expires_at?: number | null
token_type?: string | null
scope?: string | null
id_token?: string | null
session_state?: string | null
oauth_token_secret?: string | null
oauth_token?: string | null
userId?: string | null
}
}
sessions: {
Row: {
expires: string | null
sessionToken: string | null
userId: string | null
id: string
}
Insert: {
expires?: string | null
sessionToken?: string | null
userId?: string | null
id?: string
}
Update: {
expires?: string | null
sessionToken?: string | null
userId?: string | null
id?: string
}
}
users: {
Row: {
name: string | null
email: string | null
emailVerified: string | null
image: string | null
id: string
}
Insert: {
name?: string | null
email?: string | null
emailVerified?: string | null
image?: string | null
id?: string
}
Update: {
name?: string | null
email?: string | null
emailVerified?: string | null
image?: string | null
id?: string
}
}
verification_tokens: {
Row: {
id: number
identifier: string | null
token: string | null
expires: string | null
}
Insert: {
id?: number
identifier?: string | null
token?: string | null
expires?: string | null
}
Update: {
id?: number
identifier?: string | null
token?: string | null
expires?: string | null
}
}
}
Views: {
[_ in never]: never
}
Functions: {
uid: {
Args: Record<PropertyKey, never>
Returns: string
}
}
Enums: {
[_ in never]: never
}
}
}

View File

@@ -5,8 +5,8 @@ import type {
AdapterSession, AdapterSession,
AdapterUser, AdapterUser,
VerificationToken, VerificationToken,
} from "next-auth/adapters" } from "@auth/core/adapters"
import type { Account } from "next-auth" import type { Account } from "@auth/core/types"
const url = process.env.SUPABASE_URL ?? "http://localhost:54321" const url = process.env.SUPABASE_URL ?? "http://localhost:54321"
const secret = const secret =

View File

@@ -1,8 +1,25 @@
{ {
"extends": "@next-auth/tsconfig/tsconfig.adapters.json", "extends": "@next-auth/tsconfig/tsconfig.base.json",
"compilerOptions": { "compilerOptions": {
"allowJs": true,
"baseUrl": ".",
"isolatedModules": true,
"target": "ES2020",
"module": "ESNext",
"moduleResolution": "node",
"outDir": ".",
"rootDir": "src", "rootDir": "src",
"outDir": "dist" "skipDefaultLibCheck": true,
"strictNullChecks": true,
"stripInternal": true,
"declarationMap": true,
"declaration": true
}, },
"exclude": ["tests", "dist", "jest.config.js"] "include": [
} "src/**/*"
],
"exclude": [
"*.js",
"*.d.ts",
]
}

View File

@@ -1,9 +1,14 @@
// @ts-check
/** @type {import("@swc/core").Config} */
const swcConfig = { const swcConfig = {
jsc: { jsc: {
parser: { syntax: "typescript", decorators: true }, parser: { syntax: "typescript", decorators: true },
transform: { legacyDecorator: true, decoratorMetadata: true }, transform: { legacyDecorator: true, decoratorMetadata: true },
}, },
} }
/** @type {import("jest").Config} */
module.exports = { module.exports = {
transform: { transform: {
".(ts|tsx)$": ["@swc/jest", swcConfig], ".(ts|tsx)$": ["@swc/jest", swcConfig],
@@ -16,4 +21,7 @@ module.exports = {
// collectCoverageFrom: ["<rootDir>/packages/*/src/**/*.{ts,tsx}"], // collectCoverageFrom: ["<rootDir>/packages/*/src/**/*.{ts,tsx}"],
testURL: "http://localhost/", testURL: "http://localhost/",
moduleDirectories: ["node_modules"], moduleDirectories: ["node_modules"],
moduleNameMapper: {
'^(\\.{1,2}/.*)\\.js$': '$1',
},
} }

View File

@@ -16,9 +16,10 @@
"@babel/cli": "^7.14.3", "@babel/cli": "^7.14.3",
"@babel/plugin-transform-runtime": "^7.14.3", "@babel/plugin-transform-runtime": "^7.14.3",
"@babel/preset-env": "^7.14.2", "@babel/preset-env": "^7.14.2",
"@types/jest": "^26.0.23", "@swc/core": "^1.2.198",
"@types/jest": "^29.5.2",
"@types/nodemailer": "^6.4.4", "@types/nodemailer": "^6.4.4",
"jest": "^27.0.3", "jest": "^29.5.0",
"ts-jest": "^27.0.3", "ts-jest": "^27.0.3",
"typescript": "^4.2.4" "typescript": "^4.2.4"
} }

View File

@@ -1,6 +1,6 @@
{ {
"name": "@auth/typeorm-adapter", "name": "@auth/typeorm-adapter",
"version": "1.0.0", "version": "1.0.1",
"description": "TypeORM adapter for Auth.js.", "description": "TypeORM adapter for Auth.js.",
"homepage": "https://authjs.dev/reference/adapter/typeorm", "homepage": "https://authjs.dev/reference/adapter/typeorm",
"repository": "https://github.com/nextauthjs/next-auth", "repository": "https://github.com/nextauthjs/next-auth",

View File

@@ -21,8 +21,8 @@ import type {
AdapterSession, AdapterSession,
} from "@auth/core/adapters" } from "@auth/core/adapters"
import { DataSourceOptions, DataSource, EntityManager } from "typeorm" import { DataSourceOptions, DataSource, EntityManager } from "typeorm"
import * as defaultEntities from "./entities" import * as defaultEntities from "./entities.js"
import { parseDataSourceConfig, updateConnectionEntities } from "./utils" import { parseDataSourceConfig, updateConnectionEntities } from "./utils.js"
export const entities = defaultEntities export const entities = defaultEntities

View File

@@ -1,5 +1,5 @@
import type { DataSource, DataSourceOptions } from "typeorm" import type { DataSource, DataSourceOptions } from "typeorm"
import * as defaultEntities from "./entities" import * as defaultEntities from "./entities.js"
/** Ensure configOrString is normalized to an object. */ /** Ensure configOrString is normalized to an object. */
export function parseDataSourceConfig( export function parseDataSourceConfig(

View File

@@ -0,0 +1 @@
//registry.npmjs.org/:_authToken=${NPM_TOKEN}

View File

@@ -8,14 +8,14 @@
</a> </a>
<h3 align="center"><b>Xata Adapter</b> - NextAuth.js / Auth.js</a></h3> <h3 align="center"><b>Xata Adapter</b> - NextAuth.js / Auth.js</a></h3>
<p align="center" style="align: center;"> <p align="center" style="align: center;">
<a href="https://npm.im/@next-auth/xata-adapter"> <a href="https://npm.im/@auth/xata-adapter">
<img src="https://img.shields.io/badge/TypeScript-blue?style=flat-square" alt="TypeScript" /> <img src="https://img.shields.io/badge/TypeScript-blue?style=flat-square" alt="TypeScript" />
</a> </a>
<a href="https://npm.im/@next-auth/xata-adapter"> <a href="https://npm.im/@auth/xata-adapter">
<img alt="npm" src="https://img.shields.io/npm/v/@next-auth/xata-adapter?color=green&label=@next-auth/xata-adapter&style=flat-square"> <img alt="npm" src="https://img.shields.io/npm/v/@auth/xata-adapter?color=green&label=@auth/xata-adapter&style=flat-square">
</a> </a>
<a href="https://www.npmtrends.com/@next-auth/xata-adapter"> <a href="https://www.npmtrends.com/@auth/xata-adapter">
<img src="https://img.shields.io/npm/dm/@next-auth/xata-adapter?label=%20downloads&style=flat-square" alt="Downloads" /> <img src="https://img.shields.io/npm/dm/@auth/xata-adapter?label=%20downloads&style=flat-square" alt="Downloads" />
</a> </a>
<a href="https://github.com/nextauthjs/next-auth/stargazers"> <a href="https://github.com/nextauthjs/next-auth/stargazers">
<img src="https://img.shields.io/github/stars/nextauthjs/next-auth?style=flat-square" alt="Github Stars" /> <img src="https://img.shields.io/github/stars/nextauthjs/next-auth?style=flat-square" alt="Github Stars" />

View File

@@ -1,14 +1,26 @@
{ {
"name": "@next-auth/xata-adapter", "name": "@auth/xata-adapter",
"version": "0.2.2", "version": "0.1.0",
"description": "Xata adapter for next-auth.", "description": "Xata adapter for Auth.js",
"homepage": "https://authjs.dev", "homepage": "https://authjs.dev",
"repository": "https://github.com/nextauthjs/next-auth", "repository": "https://github.com/nextauthjs/next-auth",
"bugs": { "bugs": {
"url": "https://github.com/nextauthjs/next-auth/issues" "url": "https://github.com/nextauthjs/next-auth/issues"
}, },
"author": "Tejas Kumar", "author": "Tejas Kumar",
"main": "dist/index.js", "type": "module",
"types": "./index.d.ts",
"files": [
"*.js",
"*.d.ts*",
"src"
],
"exports": {
".": {
"types": "./index.d.ts",
"import": "./index.js"
}
},
"license": "ISC", "license": "ISC",
"keywords": [ "keywords": [
"next-auth", "next-auth",
@@ -24,19 +36,16 @@
"build": "tsc", "build": "tsc",
"test": "jest" "test": "jest"
}, },
"files": [ "dependencies": {
"README.md", "@auth/core": "workspace:*"
"dist" },
],
"peerDependencies": { "peerDependencies": {
"@xata.io/client": ">=0.13.0", "@xata.io/client": ">=0.13.0"
"next-auth": "^4"
}, },
"devDependencies": { "devDependencies": {
"@next-auth/adapter-test": "workspace:^0.0.0", "@next-auth/adapter-test": "workspace:^0.0.0",
"@next-auth/tsconfig": "workspace:^0.0.0", "@next-auth/tsconfig": "workspace:^0.0.0",
"jest": "^27.4.3", "jest": "^27.4.3",
"next-auth": "workspace:*",
"@xata.io/client": "^0.13.0", "@xata.io/client": "^0.13.0",
"typescript": "^4.7.4" "typescript": "^4.7.4"
}, },

View File

@@ -10,7 +10,7 @@
* *
* ```bash npm2yarn2pnpm * ```bash npm2yarn2pnpm
* # Install Auth.js and the Xata adapter * # Install Auth.js and the Xata adapter
* npm install next-auth @next-auth/xata-adapter * npm install @auth/xata-adapter
* *
* # Install the Xata CLI globally if you don't already have it * # Install the Xata CLI globally if you don't already have it
* npm install --location=global @xata.io/cli * npm install --location=global @xata.io/cli
@@ -19,9 +19,9 @@
* xata auth login * xata auth login
* ``` * ```
* *
* @module @next-auth/xata-adapter * @module @auth/xata-adapter
*/ */
import type { Adapter } from "next-auth/adapters" import type { Adapter } from "@auth/core/adapters"
import type { XataClient } from "./xata" import type { XataClient } from "./xata"
@@ -220,7 +220,7 @@ import type { XataClient } from "./xata"
* ```diff * ```diff
* import NextAuth from "next-auth" * import NextAuth from "next-auth"
* import GoogleProvider from "next-auth/providers/google" * import GoogleProvider from "next-auth/providers/google"
* +import { XataAdapter } from "@next-auth/xata-adapter" * +import { XataAdapter } from "@auth/xata-adapter"
* +import { XataClient } from "../../../xata" // or wherever you've chosen to create the client * +import { XataClient } from "../../../xata" // or wherever you've chosen to create the client
* *
* +const client = new XataClient() * +const client = new XataClient()

View File

@@ -1,9 +1,25 @@
{ {
"extends": "@next-auth/tsconfig/tsconfig.adapters.json", "extends": "@next-auth/tsconfig/tsconfig.base.json",
"compilerOptions": { "compilerOptions": {
"allowJs": true,
"baseUrl": ".",
"isolatedModules": true,
"target": "ES2020",
"module": "ESNext",
"moduleResolution": "node",
"outDir": ".",
"rootDir": "src", "rootDir": "src",
"outDir": "dist" "skipDefaultLibCheck": true,
"strictNullChecks": true,
"stripInternal": true,
"declarationMap": true,
"declaration": true
}, },
"include": ["."], "include": [
"exclude": ["tests", "dist", "jest.config.js"] "src/**/*"
} ],
"exclude": [
"*.js",
"*.d.ts",
]
}

View File

@@ -1,6 +1,6 @@
{ {
"name": "@auth/core", "name": "@auth/core",
"version": "0.8.2", "version": "0.9.0",
"description": "Authentication for the Web.", "description": "Authentication for the Web.",
"keywords": [ "keywords": [
"authentication", "authentication",

View File

@@ -88,7 +88,7 @@ export function assertConfig(
} }
const { callbackUrl: defaultCallbackUrl } = defaultCookies( const { callbackUrl: defaultCallbackUrl } = defaultCookies(
options.useSecureCookies ?? url.protocol === "https://" options.useSecureCookies ?? url.protocol === "https:"
) )
const callbackUrlCookie = const callbackUrlCookie =
request.cookies?.[ request.cookies?.[

View File

@@ -0,0 +1,111 @@
/**
* <div style={{display: "flex", justifyContent: "space-between", alignItems: "center"}}>
* <span style={{fontSize: "1.35rem" }}>
* Built-in sign in with <b>Descope</b> integration.
* </span>
* <a href="https://descope.com" style={{backgroundColor: "#000000", padding: "12px", borderRadius: "100%" }}>
* <img style={{display: "block"}} src="https://authjs.dev/img/providers/descope.svg" width="24"/>
* </a>
* </div>
*
* @module providers/descope
*/
import type { OIDCConfig, OIDCUserConfig } from "./index.js"
/** The returned user profile from Descope when using the profile callback. */
export interface DescopeProfile {
/** The user Descope ID */
sub: string
name: string
email: string
email_verified: boolean
phone_number: string
phone_number_verified: boolean
picture: string
/** Custom user's attributes */
[claim: string]: unknown
}
/**
*
* ### Setup
*
* #### Callback URL
* ```
* https://example.com/api/auth/callback/descope
* ```
*
* #### Configuration
*
* Import the provider and configure it in your **Auth.js** initialization file:
*
* ```ts title="pages/api/auth/[...nextauth].ts"
* import NextAuth from "next-auth"
* import DescopeProvider from "next-auth/providers/descope";
*
* export default NextAuth({
* providers: [
* DescopeProvider({
* clientId: process.env.DESCOPE_ID,
* clientSecret: process.env.DESCOPE_SECRET,
* }),
* ],
* })
* ```
*
* ### Configuring Descope
*
* Follow these steps:
*
* 1. Log into the [Descope console](https://app.descope.com)
* 2. Follow the [OIDC instructions](https://docs.descope.com/customize/auth/oidc)
*
* Then, create a `.env.local` file in the project root add the following entries:
*
* Get the following from the Descope's console:
* ```
* DESCOPE_ID="<Descope Issuer's last url segment>" # Descope's Issuer can be found in "Authentication Methods > SSO > Identity Provider" (Can also be taken from "Project > Project ID")
* DESCOPE_SECRET="<Descope Access Key>" # Manage > Access Keys
* ```
*
* ### Resources
*
* - [Descope OIDC](https://docs.descope.com/customize/auth/oidc)
* - [Descope Flows](https://docs.descope.com/customize/flows)
*
* ### Notes
*
* The Descope provider comes with a [default configuration](https://github.com/nextauthjs/next-auth/blob/main/packages/core/src/providers/descope.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
* By default, Auth.js assumes that the Descope provider is based on the [OIDC](https://openid.net/specs/openid-connect-core-1_0.html) spec
* :::
*
* ## Help
*
* 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 Descope(
config: OIDCUserConfig<DescopeProfile>
): OIDCConfig<DescopeProfile> {
return {
id: "descope",
name: "Descope",
type: "oidc",
clientId: `https://api.descope.com/${config.clientId}`,
style: {
logo: "/descope.svg",
logoDark: "/descope.svg",
bg: "#1C1C23",
text: "#ffffff",
bgDark: "#1C1C23",
textDark: "#ffffff",
},
options: config,
}
}

View File

@@ -62,7 +62,7 @@ interface InternalProviderOptions {
* @see [Email (Passwordless) guide](https://authjs.dev/guides/providers/email) * @see [Email (Passwordless) guide](https://authjs.dev/guides/providers/email)
* @see [Credentials guide](https://authjs.dev/guides/providers/credentials) * @see [Credentials guide](https://authjs.dev/guides/providers/credentials)
*/ */
export type Provider<P extends Profile = Profile> = ( export type Provider<P extends Profile = any> = (
| ((OIDCConfig<P> | OAuth2Config<P> | EmailConfig | CredentialsConfig) & | ((OIDCConfig<P> | OAuth2Config<P> | EmailConfig | CredentialsConfig) &
InternalProviderOptions) InternalProviderOptions)
| (( | ((

View File

@@ -1,6 +1,6 @@
{ {
"name": "@auth/sveltekit", "name": "@auth/sveltekit",
"version": "0.3.2", "version": "0.3.3",
"description": "Authentication for SvelteKit.", "description": "Authentication for SvelteKit.",
"keywords": [ "keywords": [
"authentication", "authentication",

View File

@@ -61,7 +61,6 @@ export async function signIn<
}) })
const data = await res.clone().json() const data = await res.clone().json()
const error = new URL(data.url).searchParams.get("error")
if (redirect || !isSupportingReturn) { if (redirect || !isSupportingReturn) {
// TODO: Do not redirect for Credentials and Email providers by default in next major // TODO: Do not redirect for Credentials and Email providers by default in next major

1065
pnpm-lock.yaml generated

File diff suppressed because it is too large Load Diff

View File

@@ -57,17 +57,17 @@
"@auth/sveltekit#build", "@auth/sveltekit#build",
"@auth/dgraph-adapter#build", "@auth/dgraph-adapter#build",
"@auth/dynamodb-adapter#build", "@auth/dynamodb-adapter#build",
"@next-auth/fauna-adapter#build", "@auth/fauna-adapter#build",
"@next-auth/firebase-adapter#build", "@auth/firebase-adapter#build",
"@auth/mikro-orm-adapter#build", "@auth/mikro-orm-adapter#build",
"@auth/mongodb-adapter#build", "@auth/mongodb-adapter#build",
"@next-auth/neo4j-adapter#build", "@auth/neo4j-adapter#build",
"@next-auth/pouchdb-adapter#build", "@auth/pouchdb-adapter#build",
"@next-auth/sequelize-adapter#build", "@auth/sequelize-adapter#build",
"@next-auth/supabase-adapter#build", "@auth/supabase-adapter#build",
"@auth/typeorm-adapter#build", "@auth/typeorm-adapter#build",
"@auth/upstash-redis-adapter#build", "@auth/upstash-redis-adapter#build",
"@next-auth/xata-adapter#build", "@auth/xata-adapter#build",
"^build", "^build",
"next-auth#build" "next-auth#build"
], ],
@@ -80,17 +80,17 @@
"@auth/sveltekit#build", "@auth/sveltekit#build",
"@auth/dgraph-adapter#build", "@auth/dgraph-adapter#build",
"@auth/dynamodb-adapter#build", "@auth/dynamodb-adapter#build",
"@next-auth/fauna-adapter#build", "@auth/fauna-adapter#build",
"@next-auth/firebase-adapter#build", "@auth/firebase-adapter#build",
"@auth/mikro-orm-adapter#build", "@auth/mikro-orm-adapter#build",
"@auth/mongodb-adapter#build", "@auth/mongodb-adapter#build",
"@next-auth/neo4j-adapter#build", "@auth/neo4j-adapter#build",
"@next-auth/pouchdb-adapter#build", "@auth/pouchdb-adapter#build",
"@next-auth/sequelize-adapter#build", "@auth/sequelize-adapter#build",
"@next-auth/supabase-adapter#build", "@auth/supabase-adapter#build",
"@auth/typeorm-adapter#build", "@auth/typeorm-adapter#build",
"@auth/upstash-redis-adapter#build", "@auth/upstash-redis-adapter#build",
"@next-auth/xata-adapter#build", "@auth/xata-adapter#build",
"^build", "^build",
"next-auth#build" "next-auth#build"
], ],